HomeLine-AFilled rectangleBit block transfer

6.11 Filled polygon

Name: »Filled polygon«
Line-A Nummer: $A006
Binding: Bindings für filled_polygon
Beschreibung: Diese Line-A Funktion zeichnet eine Zeile eine ausgefüllten Polygons durch Aufrufe der Horizontal line Funktion. Zum Zeichnen des gesamten Polygons muß diese Funktion für jede mögliche Y-Koordinate aufgerufen werden. Zusätzlich besteht wie bei Filled rectangle die Möglichkeit, das Zeichnen des Rechtecks nur in einem zusätzlich übergebenen Clip-Bereich zuzulassen.

Sämtliche Punkte des Polygons werden in dem Feld ptsin übergeben, die Anzahl der Punkte steht im zweiten Element des contrl Feldes. In C steht damit in contrl[1] die Anzahl Punkte, ptsin[0] die X-Koordinate des ersten Punkts, ptsin[1] die Y-Koordinate des ersten Punkts, ptsin[2] die X-Koordinate des zweiten Punkts, ... Der letzte Punkt in ptsin muß wieder der erste Punkt sein, damit das Polygon geschlossen ist! Die Y-Koordinate der zu zeichnenden Zeile wird in dem Line-A Parameterblock in y1 übergeben.

Die folgenden Line-A Variablen werden benutzt:
Variable Bedeutung
   
y1 Y-Koordinate der zu zeichnenden Zeile.
fg_bp_1 Bitwert der ersten Plane für die Farbe, mit der gefüllt werden soll.
fg_bp_2 Bitwert der zweiten Plane (nur niedrige oder mittlere Auflösung).
fg_bp_3 Bitwert der dritten Plane (nur niedrige Auflösung).
fg_bp_4 Bitwert der vierten Plane (nur niedrige Auflösung).
patptr Zeiger auf ein Feld mit 16 Bit Linienmustern.
patmsk Anzahl Linienmuster - 1. In Abhängigkeit von der y-Koordinate wird nun aus dem Feld mit den Linienmustern eines ausgewählt. Der Index des verwendeten Linienmusters läßt sich durch (y mod (patmsk + 1)) berechnen. Durch die Angabe mehrerer Linienmuster und mehrmaliges Aufrufen dieser Funktion für aufeinanderfolgende Zeilen lassen sich leicht auch komplexe Muster zeichnen.
wrt_mode Schreibmodes, es sind die folgenden Modie möglich:
REPLACE 0 Replace
TRANS 1 Transparent (OR)
XOR 2 Inverse (XOR)
INVERS 3 Inverse Transparent (XOR mit not(LN_MASK))
clip 1 wenn Clipping gewünscht wird, 0 sonst.
xmn_clip X-Koordinate der linken oberen Ecke des Clipping Bereichs, wenn Clipping eingeschaltet ist.
ymn_clip Y-Koordinate der linken oberen Ecke des Clipping Bereichs, wenn Clipping eingeschaltet ist.
xmx_clip X-Koordinate der rechten unteren Ecke des Clipping Bereichs, wenn Clipping eingeschaltet ist.
ymx_clip Y-Koordinate der rechten unteren Ecke des Clipping Bereichs, wenn Clipping eingeschaltet ist.


Das Binding von TC übergibt Linienmuster, Schreibmodus und Farbe nicht an die filled_polygon() Funktion, sondern benutzt separate Funktionen set_fg_bp(), set_wrt_mode(), set_pattern() und set_clipping() zum Setzen der Parameter in dem Line-A Parameterblock.
Ergebnis: Die Funktion liefert keinen Returnwert.
Verfügbar: Alle TOS-Versionen.
Querverweis: Binding   Horizontal line   Filled rectangle

6.11.1 Bindings für filled_polygon

Pure-C: void filled_polygon( int16_t *xy, int16_t count );
Assembler: Es wird angenommen, daß das contrl Feld schon in den Line-A Parameterblock eingetragen wurde.
movem.l   D0-D2/A0-A2,-(A7)  ; Register retten
move.l    pParamblk,A0       ; Zeiger Parameterblock LINEA
move.w    (4,A0),A1          ; contrl nach A1
move.w    count,(2,A1)       ; Anzahl Punkte nach contrl[1]
move.l    (12,A0),-(A7)      ; alten Wert des ptsin Feldes retten
move.l    xy,(12,A0)         ; Feld mit Koordinaten der Ecken in LINEA.ptsin
move.w    y1,(40,A0)         ; zu zeichnende Zeile, Y-Koordinate in LINEA.y1
move.w    colbit0,(24,A0)    ; Bit für erste Plane in LINEA.fg_bp_1
move.w    colbit1,(26,A0)    ; Bit für erste Plane in LINEA.fg_bp_2
move.w    colbit2,(28,A0)    ; Bit für erste Plane in LINEA.fg_bp_3
move.w    colbit3,(30,A0)    ; Bit für erste Plane in LINEA.fg_bp_4
move.w    wmode,(36,A0)      ; Writemode in LINEA.wrt_mode
move.w    patptr,(46,A0)     ; Linienmuster in LINEA.patptr
move.w    patmsk,(50,A0)     ; Anzahl Muster in LINEA.patmsk
move.w    mode,(54,A0)       ; Clipmode in LINEA.clip
move.w    cx1,(56,A0)        ; linke obere Clip-Ecke, X-Koordinate in LINEA.xmn_clip
move.w    cy1,(58,A0)        ; linke obere Clip-Ecke, Y-Koordinate in LINEA.ymn_clip
move.w    cx2,(60,A0)        ; rechte untere Clip-Ecke, X-Koordinate in LINEA.xmx_clip
move.w    cy2,(62,A0)        ; rechte untere Clip-Ecke, Y-Koordinate in LINEA.ymx_clip
dc.w      $A006              ; Line-A Opcode
move.l    pParamblk,A0       ; Zeiger Parameterblock LINEA
move.l    (A7)+,(12,A0)      ; alten Wert des ptsin Feldes restaurieren
movem.l   (A7)+,D0-D2/A0-A2  ; Register restaurieren

HomeLine-AFilled rectangleBit block transfer