Freigeben über


Formatierte kosmetische Linien

Die DrvStrokePath-Funktion muss das Zeichnen kosmetischer Linien mit beliebigem Clipping mit einem Volltonpinsel unterstützen. Der Treiber kann den GDI-Dienst aufrufen PATHOBJ_vEnumStartClipLines , um den Clipping vorab zu berechnen.

Das Formatieren einer kosmetischen Linie ähnelt dem einer geometrischen breiten Linie, da sie durch ein sich wiederholendes Array angegeben wird. Bei einer formatierten kosmetischen Linie sind die Arrayeinträge LONG-Werte, die die Längen in Stilschritten enthalten. Die Beziehung zwischen Stilschritten und Pixeln wird durch die Felder xStyleStep, yStyleStep und denStyleStep in der GDIINFO-Struktur definiert, die von der DrvEnablePDEV-Funktion zurückgegeben wird.

Wenn der Treiber PATHOBJ_bEnumClipLines aufruft, ändert GDI den Wert des iStyleState-Elements der CLIPLINE-Struktur, um formatierte kosmetische Linien durch komplexe Beschneidung zu verarbeiten, um den Stilzustand darzustellen. Der Stilzustand ist der Offset zurück zum ersten Pixel des Zeilensegments. d. h. das erste Pixel, das gerendert würde, wenn die Zeile nicht beschnitten würde. Der Formatzustand besteht aus zwei 16-Bit-Werten, die in einen ULONG-Wert gepackt sind. Wenn HIGH und LOW die hohe Reihenfolge und die 16 Bits in niedriger Reihenfolge des Formatzustands sind, kann eine Bruchteilversion des Formatzustands, die als Formatposition bezeichnet wird, wie folgt berechnet werden:

style position = HIGH + LOW/denStyleStep

Wenn die Werte in iStyleState beispielsweise 1 und 2 und denStyleStep 3 sind, ist die Stilposition 5/3. Um genau zu bestimmen, wo die Zeichnung des Stils im Formatvorlagenarray beginnt, verwenden Sie das Produkt:

style position * denStyleStep

In diesem Beispiel wird bei einem denStyleStep-Wert von 3 die Zeichnungsposition berechnet, um die ersten fünf (5/3 x 3) Pixel des Stilarrays auszuschließen. Das heißt, das Zeichnen beginnt beim sechsten Pixel im Stilarray dieser beschnittenen Linie.

Es gibt y-stilierte kosmetische Linien und x-stilierte kosmetische Linien. Wenn eine Linie dx-Geräteeinheiten in x-Richtung und Dy-Einheiten in y-Richtung erweitert, wird die Zeile y-formatiert, wenn Folgendes zutrifft:

(dy * yStyleStep) >= (dx * xStyleStep)

In diesem Fall wird die Stilposition durch yStyleStep/denStyleStep für jedes Pixel erweitert, das in y-Richtung erweitert wird.

Umgekehrt wird eine Zeile im X-Format dargestellt, und die Stilposition wird um xStyleStep/denStyleStep für jedes Pixel erweitert, das in die x-Richtung erweitert wird, wenn Folgendes zutrifft:

(dx * xStyleStep) > (dy * yStyleStep)

Wenn die Stilposition zu einer neuen ganzen Zahl wechselt, wird im Stilschritt eine Einheit im Stilarray ausgeführt.

Die folgende Abbildung zeigt mehrere kosmetische Linien mit unterschiedlichen Hängen.

Diagramm, das verschiedene formatierte kosmetische Linien mit unterschiedlichen Hängen auf einem nicht quadratischen Pixelraster zeigt.

In dieser Abbildung ist das angezeigte Pixelraster nicht quadratisch, sondern wird wie bei einer EGA-Anzeige dargestellt, bei der vier Pixel in x-Richtung den gleichen Abstand wie drei Pixel in y-Richtung darstellen. Die Formatvorlagenschritte in der GDIINFO-Struktur stellen sicher, dass formatierte Linien bei jeder Steigung auf Displays, deren Pixel nicht quadratisch sind, gleich angezeigt werden. In dieser Abbildung ist das Formatierungsarray (definiert durch das pstyle-Element der LINEATTRS-Struktur ) , was eine gebrochene Linie mit gleich großen Punkten und Lücken ist {1,1}. Der Treiberwert von xStyleStep ist 3, yStyleStep ist 4 und denStyleStep ist 12.

Nehmen wir zur weiteren Veranschaulichung an, dass ein Punktmatrixdrucker eine horizontale Auflösung von 144 dpi und eine vertikale Auflösung von 72 dpi aufweist. Angenommen, die Punktlänge des minimalen Punkts beträgt 1/24 Zoll. Wählen Sie zur Unterstützung dieses Druckers die kleinsten Zahlen für xStyleStep und yStyleStep aus, die das Seitenverhältnis des Druckers kompensieren können, z. B. 1 für xStyleStep und 2 (144/72) für yStyleStep und 6 (144/24) für denStyleStep.

Wenn das LA_ALTERNATE Bit im Flag in der LINEATTRS-Struktur festgelegt ist, wird für eine kosmetische Linie eine spezielle Formatvorlage verwendet. In diesem Fall ist jedes andere Pixel aktiviert, unabhängig von der Richtung oder dem Seitenverhältnis. Der Stilzustand wird zurückgegeben, als ob das Formatarray lautet {1,1} und xStyleStep, yStyleStep und denStyleStep eins sind. Anders ausgedrückt: Wenn lStyleState null ist, ist das erste Pixel aktiviert; Wenn lStyleState eins ist, ist das erste Pixel deaktiviert.

Wenn das LA_STARTGAP Bit im LINEATTRS-Flag festgelegt ist, wird der Sinn der Elemente im Stilarray invertiert. Der erste Arrayeintrag gibt die Länge der ersten Lücke an, der zweite Eintrag gibt die Länge des ersten Bindestrichs an usw.