Domanda

Il modo comune per creare un font con GDI è quello di utilizzare la dimensione punto desiderato e risoluzione verticale del dispositivo di destinazione (DPI) come questo:

LOGFONT lf = {0};
lf.lfHeight = -MulDiv(point_size, GetDeviceCaps(hdc, LOGPIXELSY), 72);
...
HFONT hfont = CreateFontIndirect(&lf);

Supponendo che la modalità di mapping predefinita MM_TEXT, questo converte point_size nell'altezza pixel per il dispositivo desiderato. (Questa è un'approssimazione comune. In realtà ci sono 72,27 punti in un pollice, non 72.) (Il segno meno significa che voglio specificare l'altezza del carattere reale, non l'altezza della cella.)

Se voglio creare un tipo di carattere di lato - che è, uno con un orientamento e scappamento di 90 gradi - posso utilizzare LOGPIXELSX piuttosto che LOGPIXELSY? Per alcune delle stampanti che sto targeting, le risoluzioni orizzontali e verticali sono diversi.

In generale, se voglio un angolo di theta, fare combino LOGPIXELSX e LOGPIXELSY? Sto pensando a qualcosa di simile a questo:

// Given theta in degrees (e.g., theta = 45.0) ...
double theta_radians = theta * 2.0 * pi / 360.0;
int dpi = static_cast<int>(GetDeviceCaps(hdc, LOGPIXELSX) * sin(theta_radians) +
                           GetDeviceCaps(hdc, LOGPIXELSY) * cos(theta_radians) +
                           0.5);
LOGFONT lf = {0};
lf.lfHeight = -MulDiv(point_size, dpi, 72);
// Set escapement and orientation to theta in tenths of a degree.
lf.lfEscapement = lf.lfOrientation = static_cast<LONG>(theta * 10.0 + 0.5);
...

Questo ha senso intuitivo per me, ma mi chiedo se questo è davvero come funzionano i driver del carattere mapper e stampante GDI.

Nessuna soluzione corretta

Altri suggerimenti

1) Ci sono 72 punti / pollice. (È usato per essere 72.27, ma è stato cambiato.) 2) La combinazione di LOGPIXELSX e LOGPIXELSY nel modo in cui lo fai va bene, ma 3) Il mapping di carattere non guarda scappamento e l'orientamento per la mappatura dei font. I valori LOGPIXELS vengono utilizzati solo come parte della trasformazione di coordinate.

http://msdn.microsoft.com/en- us / library / ms969909 (loband) aspx

Non sono sicuro di come i "driver di stampa funzionano" perché l'istruzione potrebbe includere molti piloti possibili e stampanti.

Potrebbero rasterizzare con pixel quadrati, quindi allungare a non quadrati. Essi potrebbero trasformare le curve dei glifi. Si potrebbe fare qualcosa di diverso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top