The PAINT statement is used to fill a delimited area in a graphic screen mode with color.
Syntax
PAINT [STEP] (column%, row%), fillColor[, borderColor%]
Parameter(s)
- Can use the STEP keyword for relative coordinate placements. See example 1 below.
- fillColor is an INTEGER or LONG 32-bit value to paint the inside of an object. Colors are limited to the SCREEN mode used.
- Optional INTEGER or LONG 32-bit borderColor% is the color of the border of the shape to be filled when this is different from the fill color.
- fillColor can be a string made up of a sequence of CHR$ values, each representing a tiling pattern to fill the shape. See Example 3 below.
Description
- Graphic column% and row% INTEGER pixel coordinates should be inside of a fully closed “shape”, whether it’s a rectangle, circle or custom-drawn shape using DRAW.
- If the coordinates passed to the PAINT statement are on a pixel that matches the border colors, no filling will occur.
- If the shape’s border isn’t continuous, the “paint” will “leak”.
- If the shape is not totally closed, every color except the border color may be painted over.
- DRAW shapes can be filled using the string “P fillColor, borderColor”. Use a “B” blind move to offset from the shape’s border.
Example(s)
Painting a CIRCLE immediately after it is drawn using STEP(0, 0) to paint from the circle’s center point.
SCREEN 12
x = 200: y = 200
CIRCLE (x, y), 100, 10
PAINT STEP(0, 0), 2, 10
Results: A circle located at x and y with a bright green border filled in dark green. The last coordinate used was the circle’s center point and PAINT used it also with the STEP relative coordinates being zero.
Routine to check a DRAW string to make sure that the drawn shape is fully closed so that a PAINT does not “leak”.
SCREEN 12
drw$ = "C15S20R9D4R6U3R3D3R7U5H3U2R9D3G2D6F1D3F5L10D1G1L4H2L7G2L3H2L3U8L2U5R1BF4"
FOR i = 1 TO LEN(drw$)
tmp$ = UCASE$(MID$(drw$, i, 1))
check = 1
SELECT CASE tmp$
CASE "U": ver = -1: hor = 0
CASE "D": ver = 1: hor = 0
CASE "E": ver = -1: hor = 1
CASE "F": ver = 1: hor = 1
CASE "G": ver = 1: hor = -1
CASE "H": ver = -1: hor = -1
CASE "L": ver = 0: hor = -1
CASE "R": ver = 0: hor = 1
CASE ELSE: check = 0
END SELECT
IF check THEN
snum$ = ""
FOR j = i + 1 TO i + 4 'set for up to 4 digits and spaces
IF j > LEN(drw$) THEN EXIT FOR
n$ = MID$(drw$, j, 1)
num = ASC(n$)
IF (num > 47 AND num < 58) OR num = 32 THEN
snum$ = snum$ + n$
ELSE: EXIT FOR
END IF
NEXT
vertical = vertical + (ver * VAL(snum$))
horizont = horizont + (hor * VAL(snum$))
END IF
PRINT tmp$, horizont, vertical
'SLEEP
NEXT
PSET (300, 300): DRAW drw$
Explanation: If the DRAW string is fully closed, the end values should each be 0. In the example, the proper result should be 4, 4 as there is a BF4 offset for PAINT which cannot be on a border. The result is 4, 5 because the shape is not completely closed.
Tiling using PAINT to create a red brick pattern inside a yellow border:
DIM Row$(1 TO 8)
SCREEN 12
'make red-brick wall
Row$(1) = CHR$(&H0) + CHR$(&H0) + CHR$(&HFE) + CHR$(&HFE)
Row$(2) = Row$(1)
Row$(3) = Row$(1)
Row$(4) = CHR$(&H0) + CHR$(&H0) + CHR$(&H0) + CHR$(&H0)
Row$(5) = CHR$(&H0) + CHR$(&H0) + CHR$(&HEF) + CHR$(&HEF)
Row$(6) = Row$(5)
Row$(7) = Row$(5)
Row$(8) = Row$(4)
Tile$ = Row$(1) + Row$(2) + Row$(3) + Row$(4) + Row$(5) + Row$(6) + Row$(7) + Row$(8)
LINE (59, 124)-(581, 336), 14, B 'yellow box border to paint inside
PAINT (320, 240), Tile$, 14 'paints brick tiles within yellow border
Generating a tiling pattern for PAINT from DATA statements:
ptndata:
DATA "c4444444"
DATA "c4444444"
DATA "cccccccc"
DATA "444c4444"
DATA "444c4444"
DATA "444c4444"
DATA "cccccccc"
DATA "c4444444"
DATA ---
RESTORE ptndata: ptn$ = loadpattern$
SCREEN 7
DRAW "c15l15f10g10r30g10f10l50u80r100m160,100"
PAINT (160, 90), ptn$, 15
FUNCTION loadpattern$
DIM quad(0 TO 3) AS INTEGER
res$ = ""
DO
READ row$
IF LEFT$(row$, 3) = "---" THEN EXIT DO
FOR x = 0 TO 7
pixel = VAL("&h" + MID$(row$, x + 1, 1))
FOR bit = 0 TO 3
IF pixel AND 2 ^ bit THEN
quad(bit) = quad(bit) OR (2 ^ (7 - x))
END IF
NEXT
NEXT
FOR i = 0 TO 3
res$ = res$ + CHR$(quad(i))
quad(i) = 0
NEXT
LOOP
loadpattern$ = res$
END FUNCTION