[Back to SCREEN SWAG index] [Back to Main SWAG index] [Original]

    UNIT FWColor;
    { This unit prints a string using John O'Harrow's FWrite and  }
    { has the ability to change color from within the string. The }
    { demo program is at the end of this unit.                    }

    { If you have any questions, improvements, or comments, etc., }
    { E-Mail me (Orlando Llanes) either via NetMail at 1:369/68   }
    { or via the Internet at a010111t@bcfreenet.seflin.lib.fl.us  }

    { Thanks go to -> John O'Harrow <- for his "Universal FastWrite"   }
    { routine! Compilation of this unit requires his FWrite unit       }
    { found in SWAG9411 in SCREEN.SWG (Love the new format SWAG Team!) }

    { Possible enhancements:                             }
    {  - Use a different character for the color marker. }
    {  - Optimizations.                                  }
    {  - Use character equivalent of FastWrite(?)        }

    { Notes:                                                    }
    {  - Coordinates are *not* zero based as in the FWrite,     }
    {    unit, the upper left corner is (1,1).                  }
    {  - The marker character is ASCII character 0, hopefully,  }
    {    this will not interfere with anything.                 }
    {  - Sorry for the Boolean and type-casting in the demo,    }
    {    I didn't feel like doing the math for the attributes,  }
    {    and type-casting makes things faster when converting   }
    {    between similar types, i.e. Char <--> Byte.            }

    INTERFACE
    USES FWrite;

    PROCEDURE FastWriteColor( X, Y : Byte; Str : String );

    IMPLEMENTATION

    PROCEDURE FastWriteColor( X, Y : Byte; Str : String );
    VAR
      _X, Index, FWCAttr : Byte;

    BEGIN
      _X := X;  Index := 1;
      WHILE Index <= Byte( Str[ 0 ] ) DO
      { ^^ Loop from 1 to length of string }
        BEGIN
          IF Str[ Index ] = #0 THEN
          { ^^ Is the current character the marker? }
            BEGIN
              FWCAttr := Byte( Str[ Index + 1 ] );
              { ^^ Set Text Attributes }
              Inc( Index, 2 );
              { ^^ Point past marker and the color }
            END { of Str[ Index ] = marker }
          ELSE
            BEGIN
              FastWrite( _X - 1, Y - 1, FWCAttr, Str[ Index ] );
              { ^^ Zero based, so decrement _X and Y }
              Inc( _X );
              { ^^ Increment reference to next screen position }
              Inc( Index );
              { ^^ Increment reference to next character }
            END; { of ELSE }
        END; { of WHILE..DO }
    END; { of FastWriteColor }
    END. { of UNIT FWColor }

    PROGRAM FWCDemo;
    USES Crt, FWColor;
    BEGIN { Main program }
      ClrScr;
      FastWriteColor( 1, 1,
        #0#$4F'This '#0#9'is'#0#$3F' so'#0#15' cool!' );
      FastWriteColor( 1, 2,
        #0 + Char((NOT 15) AND NOT 128) + 'You '#0#4'can '#0 +
          Char(33 OR 128) + 'change' );
      FastWriteColor( 1, 3,
        #0#14'colors '#0#10'on '#0#13'the '#0#$FF'fly!' );
      FastWriteColor( 1, 4,
        #0#$25'And you can even write control characters! ' +
          #12#4#7#2#1#0#14#14#13#27#26 );
      GoToXY( 1, 5 );
    END. { of demo }

[Back to SCREEN SWAG index] [Back to Main SWAG index] [Original]