DWriteShapepy es una extensión de Python construida usando Cython. Proporciona enlaces simplificados para el motor de conformación de DirectWrite. El modelo es similar al modelo proporcionado por Uharfbuzz, pero algunas diferencias debido a las diferencias en los modelos API entre DirectWrite y HarfBuzz.
DWriteShapepy se desarrolló inicialmente para admitir un entorno de prueba de fuentes basado en Python donde se ejecutan pruebas similares utilizando DirectWrite y HarfBuzz.
El repositorio contiene dos métodos para construir la extensión. El método estándar de Python/Cython usando Setup.py y una solución de Visual Studio. Setup.py se utiliza para construir, instalar y crear paquetes de distribución. La solución de Visual Studio es para la depuración de modo cruzado de la extensión y del cliente.
Setup.py construye el paquete con el nombre de extensión "dWriteShapepy". Líneas de comando útiles al usar Setup.py para construir, instalar y crear paquetes de distribución son:
Construya la extensión en la máquina local. Python setup.py Build
Instale la extensión construida en el entorno Python actual. Python setup.py instalación
Crear paquete de distribución. Python setup.py bdist_wheel
El directorio DWriteShape en el repositorio contiene la solución y los proyectos de Visual Studio. La solución DWriteShape contiene dos proyectos. El proyecto DWriteShape y el proyecto del cliente. El proyecto DWriteShape construye el paquete como el nombre de la extensión "DWriteShape". Tenga en cuenta la diferencia entre la compilación de extensión usando Setup.py. Esto es necesario porque Visual Studio no tiene el mismo nivel de control que Setup.py y parece requerir que el nombre de la extensión sea el mismo que el del archivo .pyx. También podría ser útil para evitar colisiones de nombres. El proyecto Visual Studio solo debe usarse para crear construcciones de depuración de la extensión para el desarrollo. El proyecto del cliente es un cliente de prueba simple para el proyecto DWriteShape.
Para construir la extensión con el proyecto Visual Studio, primero debe usar Cython para crear el archivo .cpp a partir de los archivos .pyx y .pxd. Hay una compilación. El archivo generado DWriteShape.cpp debe eliminarse si cambia de edificio con Visual Studio o Setup.py o Versa Versa. Al construir con Setup.py, el archivo .cpp se genera automáticamente, por lo que Build.bat no es necesario.
El directorio SRC CPP contiene la capa de abstracción de DWrite de la extensión básicamente de fontanería entre la API exportada y la dWrite. Este código es común entre los métodos de construcción.
import sys
import dwriteshapepy as dw
from pathlib import Path
with open ( sys . argv [ 1 ], 'rb' ) as fontfile :
fontdata = fontfile . read ()
text = sys . argv [ 2 ]
face = dw . Face ( fontdata )
font = dw . Font ( face )
upm = font . upem
print ( upm )
buf = dw . Buffer ()
buf . add_str ( text )
features = { "kern" : True , "liga" : True }
dw . shape ( font , buf , features )
glyph_names = [ font . glyph_to_string ( g . codepoint ) for g in buf . glyph_infos ]
infos = [( g . codepoint , g . cluster ) for g in buf . glyph_infos ]
print ( glyph_names )
print ( infos )
advance = [( adv . x_advance , adv . y_advance , adv . x_offset , adv . y_offset ) for adv in buf . glyph_positions ]
print ( advance )
infos = buf . glyph_infos
positions = buf . glyph_positions
for info , pos in zip ( infos , positions ):
gid = info . codepoint
cluster = info . cluster
x_advance = pos . x_advance
x_offset = pos . x_offset
y_offset = pos . y_offset
print ( f"gid { gid } = { cluster } @ { x_advance } , { x_offset } + { y_offset } " )Este proyecto da la bienvenida a las contribuciones y sugerencias. La mayoría de las contribuciones requieren que acepte un Acuerdo de Licencia de Contributor (CLA) que declare que tiene derecho y realmente hacernos los derechos para utilizar su contribución. Para más detalles, visite https://cla.opensource.microsoft.com.
Cuando envíe una solicitud de extracción, un BOT CLA determinará automáticamente si necesita proporcionar un CLA y decorar el PR adecuadamente (por ejemplo, verificación de estado, comentario). Simplemente siga las instrucciones proporcionadas por el bot. Solo necesitará hacer esto una vez en todos los reposos usando nuestro CLA.
Este proyecto ha adoptado el Código de Conducta Open Open Microsoft. Para obtener más información, consulte el Código de Conducta Preguntas frecuentes o comuníquese con [email protected] con cualquier pregunta o comentario adicional.
Este proyecto puede contener marcas comerciales o logotipos para proyectos, productos o servicios. El uso autorizado de marcas o logotipos de Microsoft está sujeto y debe seguir las pautas de marca y marca de Microsoft. El uso de marcas registradas de Microsoft o logotipos en versiones modificadas de este proyecto no debe causar confusión o implicar el patrocinio de Microsoft. Cualquier uso de marcas comerciales o logotipos de terceros está sujeto a las políticas de esas partes de terceros.