PAINT: Difference between revisions

From QB64 Phoenix Edition Wiki
Jump to navigation Jump to search
(Created page with "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%}}] {{Parameters}} * 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 SCRE...")
 
No edit summary
Line 9: Line 9:
* Can use the [[STEP]] keyword for relative coordinate placements. See example 1 below.
* 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.
* {{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.  
* 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.
* {{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.


Line 16: Line 16:
* 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]].
* 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 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'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.
* 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.
* [[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.
Line 23: Line 23:
{{PageExamples}}
{{PageExamples}}
''Example 1:'' Painting a [[CIRCLE]] immediately after it is drawn using [[STEP]](0, 0) to paint from the circle's center point.
''Example 1:'' Painting a [[CIRCLE]] immediately after it is drawn using [[STEP]](0, 0) to paint from the circle's center point.
{{CodeStart}} '' ''
{{CodeStart}}
{{Cl|SCREEN (statement)|SCREEN}} 12
{{Cl|SCREEN (statement)|SCREEN}} 12
x = 200: y = 200
x = 200: y = 200
{{Cl|CIRCLE}} (x, y), 100, 10
{{Cl|CIRCLE}} (x, y), 100, 10
{{Cl|PAINT}} {{Cl|STEP}}(0, 0), 2, 10 '' ''
{{Cl|PAINT}} {{Cl|STEP}}(0, 0), 2, 10
{{CodeEnd}}
{{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.
:''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.
Line 33: Line 33:


''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".
''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}} '' ''
{{CodeStart}}
{{Cl|SCREEN}} 12
{{Cl|SCREEN}} 12
drw$ = "C15S20R9D4R6U3R3D3R7U5H3U2R9D3G2D6F1D3F5L10D1G1L4H2L7G2L3H2L3U8L2U5R1BF4"
drw$ = "C15S20R9D4R6U3R3D3R7U5H3U2R9D3G2D6F1D3F5L10D1G1L4H2L7G2L3H2L3U8L2U5R1BF4"
Line 68: Line 68:
   '{{Cl|SLEEP}}
   '{{Cl|SLEEP}}
{{Cl|NEXT}}
{{Cl|NEXT}}
{{Cl|PSET}} (300, 300): {{Cl|DRAW}} drw$ '' ''
{{Cl|PSET}} (300, 300): {{Cl|DRAW}} drw$
{{CodeEnd}}
{{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.
: ''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.
Line 75: Line 75:
''Example 3:'' Tiling using PAINT to create a red brick pattern inside a yellow border:
''Example 3:'' Tiling using PAINT to create a red brick pattern inside a yellow border:
{{CodeStart}}
{{CodeStart}}
{{Cl|DIM}} Row$(1 {{Cl|TO}} 8)  
{{Cl|DIM}} Row$(1 {{Cl|TO}} 8)
{{Cl|SCREEN}} 12
{{Cl|SCREEN}} 12
 
   'make red-brick wall
   '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$(1) = {{Cl|CHR$}}({{Cl|&H}}0) + {{Cl|CHR$}}({{Cl|&H}}0) + {{Cl|CHR$}}({{Cl|&H}}FE) + {{Cl|CHR$}}({{Cl|&H}}FE)
Line 88: Line 88:
     Row$(8) = Row$(4)
     Row$(8) = Row$(4)
     Tile$ = Row$(1) + Row$(2) + Row$(3) + Row$(4) + Row$(5) + Row$(6) + Row$(7) + Row$(8)
     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|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
     {{Cl|PAINT}} (320, 240), Tile$, 14 'paints brick tiles within yellow border

Revision as of 02:17, 23 January 2023

The PAINT statement is used to fill a delimited area in a graphic screen mode with color.


Syntax

PAINT [STEP] (column%, row%), fillColor[, borderColor%]


Template:Parameters

  • 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.


Examples

Example 1: 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.


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".

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.


Example 3: 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


Example 4: 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
Code provided by collaborator https://github.com/NEONTEC75


See also



Navigation:
Main Page with Articles and Tutorials
Keyword Reference - Alphabetical
Keyword Reference - By usage