This is an old version from the tos.hyp. The new is on GitHub!

HomeLine-AFilled rectangleBit block transfer

6.11 Filled polygon

Name: »Filled polygon«
Line-A number: $A006
Syntax: See 'Bindings for filled_polygon'
Description: This Line-A function draws one line of a filled polygon through calls of the horizontal line function. For drawing the whole polygon this function must be called for any possible Y-coordinate. In addition, as for filled rectangle, there is the option to permit drawing of the polygon only within a passed clipping rectangle.

All vertices of the polygon are passed in the field ptsin, the number of vertices is contained in the second element of the contrl field. In C this means that contrl[1] will hold the number of vertices, ptsin[0] the X-coordinate of the first vertex, ptsin[1] the Y-coordinate of the first vertex, ptsin[2] the X-coordinate of the second vertex, ... The last vertex in ptsin must be the first one again, so that the polygon is closed! The Y-coordinate of the line to be drawn is passed in the Line-A parameter block in y1.

The following Line-A variables are used:
Variable Meaning
   
y1 Y-coordinate of the line to be drawn
fg_bp_1 Bit value of the first plane for the colour to be used for the fill
fg_bp_2 Bit value of the second plane (only low or medium resolution)
fg_bp_3 Bit value of the third plane (only low resolution)
fg_bp_4 Bit value of the fourth plane (only low resolution)
patptr Pointer to a field with 16-bit line patterns
patmsk Number of line patterns - 1. Depending on the Y-coordinate one pattern will be selected now from the field of line patterns. The index of the line pattern used can be calculated with (y mod (patmsk + 1)). By specifying several line patterns and using multiple calls of this function for consecutive lines, it is easy to draw complex patterns as well.
wrt_mode Writing mode; the following modes are possible:
REPLACE 0 Replace
TRANS 1 Transparent (OR)
XOR 2 Inverse (XOR)
INVERS 3 Inverse Transparent (XOR with not(LN_MASK))
clip 1 if clipping is desired, else 0
xmn_clip X-coordinate of the top left corner of the clipping region, if clipping is switched on
ymn_clip y-coordinate of the top left corner of the clipping region, if clipping is switched on
xmx_clip X-coordinate of the bottom right corner of the clipping region, if clipping is switched on
ymx_clip Y-coordinate of the bottom right corner of the clipping region, if clipping is switched on


The binding from TC passes the line pattern, the writing mode and colour not to the filled_polygon function, but uses separate functions set_fg_bp, set_wrt_mode, set_pattern and set_clipping for setting the parameters in the Line-A parameter block.
Return value: The function does not return a result.
Availability: All TOS versions.
See also: Binding   Horizontal line   Filled rectangle

6.11.1 Bindings for filled_polygon

Pure-C: void filled_polygon( int16_t *xy, int16_t count );
Assembler: It is assumed that the contrl field has already been entered in the Line-A parameter block.
movem.l   D0-D2/A0-A2,-(A7)  ; Save registers
move.l    pParamblk,A0       ; Pointer parameter block LINEA
move.w    (4,A0),A1          ; contrl to a1
move.w    count,(2,A1)       ; No. or vertexes to contrl[1]
move.l    (12,A0),-(A7)      ; Save old value of the ptsin field
move.l    xy,(12,A0)         ; Field with coordinates of vertexes in LINEA.ptsin
move.w    y1,(40,A0)         ; Line to be drawn, Y-coordinate in LINEA.y1
move.w    colbit0,(24,A0)    ; Bit for first plane in LINEA.fg_bp_1
move.w    colbit1,(26,A0)    ; Bit for first plane in LINEA.fg_bp_2
move.w    colbit2,(28,A0)    ; Bit for first plane in LINEA.fg_bp_3
move.w    colbit3,(30,A0)    ; Bit for first plane in LINEA.fg_bp_4
move.w    wmode,(36,A0)      ; Writing mode in LINEA.wrt_mode
move.w    patptr,(46,A0)     ; Line pattern in LINEA.patptr
move.w    patmsk,(50,A0)     ; No. of patterns in LINEA.patmsk
move.w    mode,(54,A0)       ; Clipmode in LINEA.clip
move.w    cx1,(56,A0)        ; Top left clip corner, X-coordinate in LINEA.xmn_clip
move.w    cy1,(58,A0)        ; Top left clip corner, Y-coordinate in LINEA.ymn_clip
move.w    cx2,(60,A0)        ; Bottom right clip corner, X-coordinate in LINEA.xmx_clip
move.w    cy2,(62,A0)        ; Bottom right clip corner, Y-coordinate in LINEA.ymx_clip
dc.w      $A006              ; Line-A opcode
move.l    pParamblk,A0       ; Pointer parameter block LINEA
move.l    (A7)+,(12,A0)      ; Restore old value of the ptsin field
movem.l   (A7)+,D0-D2/A0-A2  ; Restore registers

HomeLine-AFilled rectangleBit block transfer