forlang.hlp (Table of Contents; Topic list)
Important Notice
The pages on this site contain documentation for very old MS-DOS software, purely for historical purposes. If you're looking for up-to-date documentation, particularly for programming, you should not rely on the information found here, as it will be woefully out of date.
PALETTE.FOR
                                             Up Contents Index Back
────────────────────────────────────────────────────────────────────────────
 
CC  PALETTE.FOR - Illustrates functions for assigning color values
CC                to color indices.  Functions include:
CC                remapallpalette    remappalette
 
      INCLUDE  'FGRAPH.FI'
      INCLUDE  'FGRAPH.FD'
 
      INTEGER*2            status2, mode, cells, x, y, xinc, yinc, i
      INTEGER*4            status4, pal(256), iblue, ired, igreen
      INTEGER*4            RGB, tmp, inc
      CHARACTER*3          str1, str2
      RECORD /videoconfig/ vc
 
C
C     Make sure all palette numbers are valid.
C
      DO i = 1, 256
         pal(i) = $BLACK
      END DO
C
C     Loop through each graphics mode that supports palettes.
C
 
      DO mode = $MRES4COLOR, $MRES256COLOR
         IF( mode .EQ. $ERESNOCOLOR ) CYCLE
         IF( setvideomode( mode ) .EQ. 0 ) CYCLE
 
C
C        Get configuration variables for current mode.
C
         CALL getvideoconfig( vc )
         SELECT CASE( vc.numcolors )
 
            CASE( 256 )
C
C              Active bits in this order:
C              ???????? ??bbbbbb ??gggggg ??rrrrrr
C
               cells = 13
               inc   = 12
 
            CASE( 16 )
C
C              If $ERES or $VRES16, active bits in this order:
C              ???????? ??????bb ??????gg ??????rr
C
C              Else in this order:
C              ???????? ??????Bb ??????Gg ??????Rr
C
               cells = 4
               inc   = 32
               IF( (vc.mode .EQ. $ERESCOLOR)  .OR.
     +             (vc.mode .EQ. $VRES16COLOR)) inc = 16
 
            CASE( 4 )
C
C              Active bits in this order:
C              ???????? ??????Bb ??????Gg ??????Rr
C
               cells = 2
               inc   = 32
 
            CASE DEFAULT
               CYCLE
 
         END SELECT
 
         xinc = vc.numxpixels / cells
         yinc = vc.numypixels / cells
 
C
C        Fill palette arrays in BGR order.
C
         i = 1
         DO iblue = 0, 63, inc
            DO igreen = 0, 63, inc
               DO ired = 0, 63, inc
                  pal(i) = RGB( ired, igreen, iblue )
C
C                 Special case: using 6 bits to represent 16 colors
C                 If both bits are on for a color, intensity is set
C                 If one bit is set for a color, the color is on.
C
                  IF( inc .EQ. 32 )
     +                pal(i + 8) = pal(i) .OR. (pal(i) / 2)
                  i = i + 1
               END DO
            END DO
         END DO
C
C        If palettes available, remap all palettes at once.
C        Otherwise, quit.
C
         IF( remapallpalette( pal ) .EQ. 0 ) THEN
            status2 = setvideomode( $DEFAULTMODE )
            STOP 'Palettes not available with this adapter'
         END IF
C
C        Draw colored squares.
C
         i = 0
         DO x = 0, ( xinc * cells ) - 1, xinc
            DO y = 0, ( yinc * cells ) - 1, yinc
               status2 = setcolor( INT4( i ) )
               status2 = rectangle( $GFILLINTERIOR, x, y, x + xinc,
     +                             y + yinc )
               i      = i + 1
            END DO
         END DO
 
         status2 = setcolor( INT4( vc.numcolors / 2 ) )
         WRITE (str1, '(I3)') vc.mode
         WRITE (str2, '(I3)') vc.numcolors
         CALL outtext( 'Mode' // str1 // ' has' //
     +                  str2 // ' colors' )
         READ (*,*)
 
C
C        Change each palette entry separately in GRB order.
C
         i = 0
         DO igreen = 0, 63, inc
            DO ired = 0, 63, inc
               DO iblue = 0, 63, inc
                  tmp    = RGB( ired, igreen, iblue )
                  status4 = remappalette( i, tmp )
                  IF( inc .EQ. 32 )
     +               status4 = remappalette(i + 8, tmp.OR.(tmp / 2))
                  i = i + 1
               END DO
            END DO
         END DO
 
READ (*,*)      ! Wait for ENTER to be pressed
      END DO
 
      status2 = setvideomode( $DEFAULTMODE )
      END
 
 
 
CC  RGB - Function for mixing red, green, and blue color elements.
CC
CC  Params:r,g,b-Valuesforred,green,and blue, respectively
CC
CC  Return:Mixed color value
 
      INTEGER*4 FUNCTION RGB( r, g, b )
      INTEGER*4 r, g, b
 
      RGB = ISHL( ISHL( b, 8 ) .OR. g, 8 ) .OR. r
      RETURN
      END