COLOR
Jump to navigation
Jump to search
The COLOR statement is used to change the foreground and background colors for printing text.
Syntax
- COLOR [foreground&][, background&][, , destHandle&]
Description
- All arguments are optional, if none is given COLOR will do nothing.
- foreground& and background& colors are available in all QB64(PE) color SCREEN modes.
- SCREEN mode 10 has only 3 white foreground attributes including flashing.
- To change the background& color only, use a comma and the desired color. Ex: COLOR , background&
- Graphic drawing statements like PSET, PRESET, LINE, etc, also use the colors set by the COLOR statement if no color is passed when they are called.
- destHandle& may be specified to set the colors in another image than the current write page. Note that an empty comma place is required before this argument to serve an old GW-Basic parameter, which is not supported in QB64(PE). See also Availability below.
- The $COLOR metacommand adds named color constants for both text and 32-bit modes.
Screen Mode Attributes
- SCREEN 0 background& colors 0 to 7 can be changed each text character without affecting other text. Use CLS after a background color statement to create a fullscreen background color. 64 DAC hues with 16 high intensity blinking foreground (16 to 31) color attributes. See _BLINK.
- See example 7 below for more SCREEN 0 background colors.
- SCREEN 1 has 4 background color attributes: 0 = black, 1 = blue, 2 = green, 3 = grey. White foreground color only.
- SCREEN 2 is monochrome with white forecolor and black background.
- SCREEN 7 can use 16 (DAC) colors with background colors. RGB settings can be changed in colors 0 to 7 using _PALETTECOLOR.
- SCREEN 8 has 16 color attributes with 16 background colors.
- SCREEN 9 can use up to 64 DAC color hues in 16 color attributes with background colors assigned to attribute 0 with a _PALETTECOLOR swap. RGB settings can be changed in colors 0 to 5 and 7 using _PALETTECOLOR.
- SCREEN 10 has only 4 color attributes with black background. COLOR 0 = black, 1 = grey, 2 = flash white and 3 = bright white.
- SCREEN 11 is monochrome with white forecolor and a black background.
- SCREEN 12 can use 16 color attributes with a black background. 256K possible RGB color hues. Background colors can be used with QB64.
- SCREEN 13 can use 256 color attributes with a black background. 256K possible RGB hues.
- PALETTE swaps can be made in SCREEN 7 and 9 only. Those screens were DAC screen modes in QBasic.
- _DEST can be used to set the destination page or image to color using QB64.
- _DEFAULTCOLOR returns the current color being used on an image or screen page handle.
24/32-Bit colors using QB64
- Pixel color intensities for red, green, blue and alpha range from 0 to 255 when used with _RGB, _RGBA, _RGB32 and RGBA32.
- Combined RGB function values returned are LONG values. Blue intensity values may be cut off using SINGLE variables.
- _ALPHA transparency values can range from 0 as transparent up to 255 which is fully opaque.
- _CLEARCOLOR can also be used to set a color as transparent.
- Colors can be mixed by using _BLEND (default) in 32-bit screen modes. _DONTBLEND disables blending.
- NOTE: Default 32-bit backgrounds are clear black or _RGBA(0, 0, 0, 0). Use CLS to make the black opaque.
Availability
-
all
-
all
-
yes
-
yes
-
yes
- The optional destHandle& was introduced in QB64-PE v4.5.0.
RGB Palette Intensities
RGB intensity values can be converted to hexadecimal values to create the LONG _PALETTECOLOR value in non-32-bit screens:
SCREEN 12 alpha$ = "FF" 'solid alpha colors only PRINT "Attribute = Hex value Red Green Blue " PRINT COLOR 7 FOR attribute = 1 TO 15 OUT &H3C7, attribute 'set color attribute to read red$ = HEX$(INP(&H3C9) * 255 / 63) 'convert port setting to 32 bit values grn$ = HEX$(INP(&H3C9) * 255 / 63) blu$ = HEX$(INP(&H3C9) * 255 / 63) IF LEN(red$) = 1 THEN red$ = "0" + red$ '2 hex digits required IF LEN(grn$) = 1 THEN grn$ = "0" + grn$ 'for low or zero hex values IF LEN(blu$) = 1 THEN blu$ = "0" + blu$ hex32$ = "&H" + alpha$ + red$ + grn$ + blu$ _PALETTECOLOR attribute, VAL(hex32$) 'VAL converts hex string to a LONG 32 bit value IF attribute THEN COLOR attribute 'exclude black color print PRINT "COLOR" + STR$(attribute) + " = " + hex32$, red$, grn$, blu$ 'returns closest attribute NEXT |
Attribute Hex value Red Green Blue COLOR 1 = &HFF0000AA 00 00 AA COLOR 2 = &HFF00AA00 00 AA 00 COLOR 3 = &HFF00AAAA 00 AA AA COLOR 4 = &HFFAA0000 AA 00 00 COLOR 5 = &HFFAA00AA AA 00 AA COLOR 6 = &HFFAA5500 AA 55 00 COLOR 7 = &HFFAAAAAA AA AA AA COLOR 8 = &HFF555555 55 55 55 COLOR 9 = &HFF5555FF 55 55 FF COLOR 10 = &HFF55FF55 55 FF 55 COLOR 11 = &HFF55FFFF 55 FF FF COLOR 12 = &HFFFF5555 FF 55 55 COLOR 13 = &HFFFF55FF FF 55 FF COLOR 14 = &HFFFFFF55 FF FF 55 COLOR 15 = &HFFFFFFFF FF FF FF |
- Explanation: The DAC intensity values are multiplied by (255 / 63) to get the _RGB intensity values as hexadecimal values. The individual 2 digit HEX$ intensity values can be added to "&HFF" to make up the 32-bit hexadecimal string value necessary for VAL to return to _PALETTECOLOR. The statement is only included in the example to show how that can be done with any 32-bit color value.
- Legacy code may use INP and OUT to read or set color port intensities. QB64 emulates VGA memory to maintain compatibility.
- The same can be achieved using _PALETTECOLOR (recommended practice).
- OUT &H3C7, attribute 'Set port to read RGB settings with:
- color_intensity = INP(&H3C9) 'reads present intensity setting
- OUT &H3C8, attribute 'Set port to write RGB settings with:
- OUT &H3C9, color_intensity 'writes new intensity setting
- After every 3 reads or writes, changes to next higher color attribute. Loops can be used to set more than one attribute's intensities.
- Color port setting of red, green and blue intensities can be done in ascending order.
- Color port attribute intensity values range from 0 to 63 (1/4 of the 32-bit values) in QBasic's legacy 4 and 8 bit screen modes.
Examples
Example 1: Reading the default RGB color settings of color attribute 15.
OUT &H3C7, 15 red% = INP(&H3C9) green% = INP(&H3C9) blue% = INP(&H3C9) PRINT red%, green%, blue% |
63 63 63 |
Example 2: Changing the color settings of attribute 0 (the background) to blue in SCREENs 12 or 13.
SCREEN 12 OUT &H3C8, 0 'set color port attribute to write OUT &H3C9, 0 'red intensity OUT &H3C9, 0 'green intensity OUT &H3C9, 42 'blue intensity OUT &H3C7, 0 PRINT INP(&H3C9); INP(&H3C9); INP(&H3C9) END |
0 0 42
|
Example 3: Printing in fullscreen SCREEN 0 mode with a color background under the text only.
SCREEN 0: _FULLSCREEN ' used for fullscreen instead of window COLOR 14, 6: LOCATE 4, 4: PRINT "Hello!" |
Hello!
|
Example 4: Using CLS after setting the background color in SCREEN 0 to make the color cover the entire screen.
SCREEN 0: _FULLSCREEN COLOR , 7: CLS COLOR 9: PRINT "Hello" |
Hello
|
Example 5: Using a different foreground color for each letter:
SCREEN 0 COLOR 1: PRINT "H"; COLOR 3: PRINT "E"; COLOR 4: PRINT "L"; COLOR 5: PRINT "L"; COLOR 6: PRINT "O" COLOR 9: PRINT "W"; COLOR 11: PRINT "O"; COLOR 12: PRINT "R"; COLOR 13: PRINT "L"; COLOR 14: PRINT "D" |
HELLO WORLD |
See also
- $COLOR (metacommand)
- _RGB, _RGBA, _RGB32, RGBA32.
- _RED, _GREEN, _BLUE
- _RED32, _GREEN32, _BLUE32
- _ALPHA, _ALPHA32, _CLEARCOLOR
- PRINT, LOCATE, SCREEN
- POINT, SCREEN (function)
- OUT, INP, PALETTE
- _BLINK
- _DEFAULTCOLOR
- _BACKGROUNDCOLOR
- _PALETTECOLOR
- Color Dialog Box
- $COLOR:0 Name Table
- $COLOR:32 Name Table