mirror of
https://github.com/QB64Official/qb64.git
synced 2024-08-22 02:05:08 +00:00
146 lines
6.1 KiB
Text
146 lines
6.1 KiB
Text
The [[PAINT]] statement is used to fill a delimited area in a graphic screen mode with color.
|
|
|
|
|
|
{{PageSyntax}}
|
|
: [[PAINT]] ['''STEP'''] ({{Parameter|column%}}, {{Parameter|row%}}), {{Parameter|fillColor}}[, {{Parameter|borderColor%}}]
|
|
|
|
|
|
{{PageParameters}}
|
|
* Can use the [[STEP]] keyword for relative coordinate placements. See example 1 below.
|
|
* {{Parameter|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 {{Parameter|borderColor%}} is the color of the border of the shape to be filled when this is different from the fill color.
|
|
* {{Parameter|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.
|
|
|
|
|
|
{{PageDescription}}
|
|
* Graphic {{Parameter|column%}} and {{Parameter|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 {{Parameter|fillColor}}, {{Parameter|borderColor}}". Use a "B" blind move to offset from the shape's border.
|
|
|
|
|
|
{{PageExamples}}
|
|
''Example 1:'' Painting a [[CIRCLE]] immediately after it is drawn using [[STEP]](0, 0) to paint from the circle's center point.
|
|
{{CodeStart}} '' ''
|
|
{{Cl|SCREEN (statement)|SCREEN}} 12
|
|
x = 200: y = 200
|
|
{{Cl|CIRCLE}} (x, y), 100, 10
|
|
{{Cl|PAINT}} {{Cl|STEP}}(0, 0), 2, 10 '' ''
|
|
{{CodeEnd}}
|
|
:''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.
|
|
|
|
|
|
''Example 2:'' Routine to check a [[DRAW]] string to make sure that the drawn shape is fully closed so that a PAINT does not "leak".
|
|
{{CodeStart}} '' ''
|
|
{{Cl|SCREEN}} 12
|
|
drw$ = "C15S20R9D4R6U3R3D3R7U5H3U2R9D3G2D6F1D3F5L10D1G1L4H2L7G2L3H2L3U8L2U5R1BF4"
|
|
|
|
{{Cl|FOR...NEXT|FOR}} i = 1 {{Cl|TO}} {{Cl|LEN}}(drw$)
|
|
tmp$ = {{Cl|UCASE$}}({{Cl|MID$}}(drw$, i, 1))
|
|
check = 1
|
|
{{Cl|SELECT CASE}} tmp$
|
|
{{Cl|CASE}} "U": ver = -1: hor = 0
|
|
{{Cl|CASE}} "D": ver = 1: hor = 0
|
|
{{Cl|CASE}} "E": ver = -1: hor = 1
|
|
{{Cl|CASE}} "F": ver = 1: hor = 1
|
|
{{Cl|CASE}} "G": ver = 1: hor = -1
|
|
{{Cl|CASE}} "H": ver = -1: hor = -1
|
|
{{Cl|CASE}} "L": ver = 0: hor = -1
|
|
{{Cl|CASE}} "R": ver = 0: hor = 1
|
|
{{Cl|CASE ELSE}}: check = 0
|
|
{{Cl|END SELECT}}
|
|
{{Cl|IF...THEN|IF}} check {{Cl|THEN}}
|
|
snum$ = ""
|
|
{{Cl|FOR...NEXT|FOR}} j = i + 1 {{Cl|TO}} i + 4 'set for up to 4 digits and spaces
|
|
{{Cl|IF...THEN|IF}} j > {{Cl|LEN}}(drw$) {{Cl|THEN}} {{Cl|EXIT}} {{Cl|FOR...NEXT|FOR}}
|
|
n$ = {{Cl|MID$}}(drw$, j, 1)
|
|
num = {{Cl|ASC}}(n$)
|
|
{{Cl|IF...THEN|IF}} (num > 47 {{Cl|AND (boolean)|AND}} num < 58) {{Cl|OR (boolean)|OR}} num = 32 {{Cl|THEN}}
|
|
snum$ = snum$ + n$
|
|
{{Cl|ELSE}}: {{Cl|EXIT}} {{Cl|FOR...NEXT|FOR}}
|
|
{{Cl|END IF}}
|
|
{{Cl|NEXT}}
|
|
vertical = vertical + (ver * {{Cl|VAL}}(snum$))
|
|
horizont = horizont + (hor * {{Cl|VAL}}(snum$))
|
|
{{Cl|END IF}}
|
|
{{Cl|PRINT}} tmp$, horizont, vertical
|
|
'{{Cl|SLEEP}}
|
|
{{Cl|NEXT}}
|
|
{{Cl|PSET}} (300, 300): {{Cl|DRAW}} drw$ '' ''
|
|
{{CodeEnd}}
|
|
: ''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.
|
|
|
|
|
|
''Example 3:'' Tiling using PAINT to create a red brick pattern inside a yellow border:
|
|
{{CodeStart}}
|
|
{{Cl|DIM}} Row$(1 {{Cl|TO}} 8)
|
|
{{Cl|SCREEN}} 12
|
|
|
|
'make red-brick wall
|
|
Row$(1) = {{Cl|CHR$}}({{Cl|&H}}0) + {{Cl|CHR$}}({{Cl|&H}}0) + {{Cl|CHR$}}({{Cl|&H}}FE) + {{Cl|CHR$}}({{Cl|&H}}FE)
|
|
Row$(2) = Row$(1)
|
|
Row$(3) = Row$(1)
|
|
Row$(4) = {{Cl|CHR$}}({{Cl|&H}}0) + {{Cl|CHR$}}({{Cl|&H}}0) + {{Cl|CHR$}}({{Cl|&H}}0) + {{Cl|CHR$}}({{Cl|&H}}0)
|
|
Row$(5) = {{Cl|CHR$}}({{Cl|&H}}0) + {{Cl|CHR$}}({{Cl|&H}}0) + {{Cl|CHR$}}({{Cl|&H}}EF) + {{Cl|CHR$}}({{Cl|&H}}EF)
|
|
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)
|
|
|
|
{{Cl|LINE}} (59, 124)-(581, 336), 14, B 'yellow box border to paint inside
|
|
{{Cl|PAINT}} (320, 240), Tile$, 14 'paints brick tiles within yellow border
|
|
{{CodeEnd}}
|
|
|
|
|
|
''Example 4:'' Generating a tiling pattern for PAINT from [[DATA]] statements:
|
|
{{CodeStart}}
|
|
ptndata:
|
|
{{Cl|DATA}} "c4444444"
|
|
{{Cl|DATA}} "c4444444"
|
|
{{Cl|DATA}} "cccccccc"
|
|
{{Cl|DATA}} "444c4444"
|
|
{{Cl|DATA}} "444c4444"
|
|
{{Cl|DATA}} "444c4444"
|
|
{{Cl|DATA}} "cccccccc"
|
|
{{Cl|DATA}} "c4444444"
|
|
{{Cl|DATA}} ---
|
|
|
|
{{Cl|RESTORE}} ptndata: ptn$ = loadpattern$
|
|
|
|
{{Cl|SCREEN}} 7
|
|
{{Cl|DRAW}} "c15l15f10g10r30g10f10l50u80r100m160,100"
|
|
{{Cl|PAINT}} (160, 90), ptn$, 15
|
|
|
|
{{Cl|FUNCTION}} loadpattern$
|
|
{{Cl|DIM}} quad(0 TO 3) {{Cl|AS}} {{Cl|INTEGER}}
|
|
res$ = ""
|
|
{{Cl|DO}}
|
|
{{Cl|READ}} row$
|
|
{{Cl|IF}} {{Cl|LEFT$}}(row$, 3) = "---" {{Cl|THEN}} {{Cl|EXIT}} {{Cl|DO}}
|
|
{{Cl|FOR}} x = 0 {{Cl|TO}} 7
|
|
pixel = {{Cl|VAL}}("&h" + {{Cl|MID$}}(row$, x + 1, 1))
|
|
{{Cl|FOR}} bit = 0 {{Cl|TO}} 3
|
|
{{Cl|IF}} pixel {{Cl|AND}} 2 ^ bit {{Cl|THEN}}
|
|
quad(bit) = quad(bit) {{Cl|OR}} (2 ^ (7 - x))
|
|
{{Cl|END}} {{Cl|IF}}
|
|
{{Cl|NEXT}}
|
|
{{Cl|NEXT}}
|
|
{{Cl|FOR}} i = 0 {{Cl|TO}} 3
|
|
res$ = res$ + {{Cl|CHR$}}(quad(i))
|
|
quad(i) = 0
|
|
{{Cl|NEXT}}
|
|
{{Cl|LOOP}}
|
|
loadpattern$ = res$
|
|
{{Cl|END}} {{Cl|FUNCTION}}
|
|
{{CodeEnd}}
|
|
:: ''Code provided by collaborator https://github.com/NEONTEC75''
|
|
|
|
|
|
{{PageSeeAlso}}
|
|
* [[PSET]], [[PRESET]]
|
|
* [[CIRCLE]], [[LINE]], [[DRAW]]
|
|
* [[SCREEN]], [[CHR$]]
|
|
|
|
|
|
{{PageNavigation}}
|