Compartir a través de


Líneas estéticas con estilo

La función DrvStrokePath debe admitir el dibujo de líneas cosméticas con recorte arbitrario mediante un pincel de color sólido. El controlador puede realizar una llamada al servicio GDI PATHOBJ_vEnumStartClipLines para precompletar el recorte.

El estilo de una línea cosmética es similar al de una línea ancha geométrica porque se especifica mediante una matriz de repetición. Para una línea estética con estilo, las entradas de matriz son valores LONG que contienen las longitudes en los pasos de estilo. La relación entre los pasos de estilo y los píxeles se define mediante los campos xStyleStep, yStyleStep y denStyleStep en la estructura GDIINFO devuelta por la función DrvEnablePDEV .

Cuando el controlador llama a PATHOBJ_bEnumClipLines, para controlar líneas estéticas con estilo a través de recortes complejos, GDI modifica el valor del miembro iStyleState de la estructura CLIPLINE para representar el estado de estilo. El estado de estilo es el desplazamiento hacia atrás al primer píxel del segmento de línea; es decir, el primer píxel que se representaría si la línea no se recortase. El estado de estilo consta de dos valores de 16 bits empaquetados en un valor de ULONG. Si HIGH y LOW son el orden alto y los 16 bits de orden bajo del estado de estilo, una versión fraccionaria del estado de estilo, denominada posición de estilo, se puede calcular como:

style position = HIGH + LOW/denStyleStep

Por ejemplo, si los valores de iStyleState son 1 y 2, y denStyleStep es 3, la posición de estilo es 5/3. Para determinar exactamente dónde comienza el dibujo del estilo en la matriz de estilos, tome el producto:

style position * denStyleStep

En este ejemplo, con un valor denStyleStep de 3, la posición del dibujo se calcula para excluir los cinco primeros píxeles (5/3 * 3) de la matriz de estilos. Es decir, el dibujo comienza en el sexto píxel de la matriz de estilo de esta línea recortada.

Hay líneas estéticas de estilo y y líneas cosméticas de estilo x. Si una línea extiende las unidades de dispositivo dx en la dirección x y las unidades dy en la dirección y, la línea tiene el estilo y cuando se cumple lo siguiente:

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

En este caso, la posición de estilo está avanzada por yStyleStepdenStyleStep/ para cada píxel avanzado en la dirección y.

Por el contrario, una línea tiene estilo x y la posición del estilo está avanzada por xStyleStepdenStyleStep/ para cada píxel avanzado en la dirección x cuando se cumple lo siguiente:

(dx * xStyleStep) > (dy * yStyleStep)

Cuando la posición de estilo avanza a un nuevo entero, el paso de estilo avanza una unidad en la matriz de estilos.

En la ilustración siguiente se muestran varias líneas de estilo cosmético que tienen diferentes pendientes.

Diagrama que muestra varias líneas estéticas con estilo con diferentes pendientes en una cuadrícula de píxeles no cuadrados.

En esta ilustración, la cuadrícula de píxeles que se muestra no es cuadrada, pero se muestra como sería para una pantalla EGA en la que cuatro píxeles en la dirección x representan la misma distancia que tres píxeles en la dirección y. Los pasos de estilo de la estructura GDIINFO garantizan que las líneas con estilo aparezcan iguales en cualquier pendiente en las pantallas cuyos píxeles no sean cuadrados. En esta ilustración, la matriz de estilos (definida por el miembro pstyle de la estructura LINEATTRS ) es {1,1}, que es una línea rota que tiene puntos y espacios de tamaño igual. El valor del controlador de xStyleStep es 3, yStyleStep es 4 y denStyleStep es 12.

Para ilustrar más, supongamos que una impresora de matriz de puntos tiene una resolución horizontal de 144 ppp y una resolución vertical de 72 ppp. Además, supongamos que la longitud del punto mínimo es de 1/24 pulgadas. Para admitir esta impresora, seleccione los números más pequeños para xStyleStep y yStyleStep que pueden compensar la relación de aspecto de la impresora, como 1 para xStyleStep y 2 (144/72) para yStyleStep y 6 (144/24) para denStyleStep.

Si el bit de LA_ALTERNATE se establece en la marca de la estructura LINEATTRS , se usa un estilo especial para una línea cosmética. En este caso, todos los demás píxeles están activados, independientemente de la dirección o la relación de aspecto. El estado de estilo se devuelve como si la matriz de estilo es {1,1} y xStyleStep, yStyleStep y denStyleStep son todas. En otras palabras, si lStyleState es cero, el primer píxel está activado; si lStyleState es uno, el primer píxel está desactivado.

Si el bit de LA_STARTGAP se establece en la marca LINEATTRS, se invierte el sentido de los elementos de la matriz de estilos. La primera entrada de matriz especifica la longitud de la primera brecha, la segunda entrada especifica la longitud del primer guión, etc.