2012-05-24 12 views
5

Ho lavorato al mio rendering di font bitmap e mentre credo che il carattere potrebbe avere la spaziatura corretta, non sono sicuro di come determinare la posizione del carattere . Ad esempio, se la lettera 'a' ha una posizione y pari a 0, allora cosa sarebbe "*" o ","? Ho usato la funzione winapi GetCharABCWidthsFloatW per determinare la spaziatura tra i caratteri, c'è un'altra funzione che posso usare per determinare una sorta di offset y?Determinazione della posizione di un carattere per il rendering del testo

Sto facendo il meglio sulle mie immagini bitmap, quindi non hanno sempre le stesse dimensioni.

+0

Le bitmap del font non hanno la stessa altezza? –

+0

Buon punto, sto facendo il miglior adattamento alle mie immagini bitmap, quindi non sono sempre della stessa dimensione .. – jack

+0

Forse hai qualche tipo di tavolo offset? Con offset dalla baseline, quindi puoi usare la stessa tabella per posizionare anche lettere come 'g'. –

risposta

0

Ogni carattere deve essere spostato in direzione Y dalle API di rendering del testo in modo corretto (TextOut, DrawText, ecc.), Pertanto è necessario disporre di un offset costante. Ottengo sempre le metriche della stringa "Ag" utilizzando GetTextExtentPoint32 per ottenere le metriche in generale, inoltre è possibile provare GetTextMetrics.

+0

Ho esaminato 'GetTextMetrics', ma ho bisogno di ottenere informazioni specifiche sul carattere, e questa era l'informazione del font. Come posso utilizzare le informazioni da "GetTextExtentPoint32" per compensare la y? – jack

0

GetTextMetrics è la risposta corretta. Ma potrebbe darsi che Demorge volesse dire che i campi che devi usare per la coordinata Y è tmAscent (guarda la struttura.)

L'altezza totale è tmHeight. tmAscent è la distanza dalla cima alla linea di base. E tmDescent è la distanza tra la linea di base e il fondo del font.

Quindi nella maggior parte dei casi si desidera aggiungere tmAscent se si (x, y) si fa riferimento all'angolo superiore sinistro del testo. Se la coordinata y è inferiore, sottrarre tmDescent (il + o - dipende anche dall'inversione del viewport, ma puoi testare e vedere ciò che ottieni)

Queste informazioni funzionano sia che tu scriva un "a" , un "*" o una "j". La linea di base è la stessa per tutti i personaggi.

+0

Come posso scoprire quanto ha un personaggio specifico per una salita o una discesa? Scrivo un personaggio in una bitmap, quindi creo una migliore bitmap per carattere e lo salvo. Quindi, sulla bitmap, ognuno ha un'altezza diversa. – jack

+0

Tutti i caratteri di un font hanno la stessa ascesa e discesa. Se vuoi ottimizzare la bitmap, dovrai fare del lavoro extra da solo (ovvero fare un ritaglio automatico sulla bitmap risultante). Inoltre, non puoi creare un rettangolo piccolo e aspettarti che il personaggio si adatti perfettamente (a meno che non si usi al terminale come font come Courier). La maggior parte dei caratteri "perde" dappertutto. È davvero difficile calcolare la casella corretta. –

0

Se ho capito bene: le bitmap per ciascun glifo hanno inizialmente la stessa altezza. Quindi ritagli tutto lo spazio libero attorno a ciascun glifo per creare una bitmap minima per ciascun carattere.

La risposta in questo caso è semplice. Quando crei la bitmap tagliata, ricorda quanti pixel rimuovi da sinistra e dall'alto (o da sinistra e da sotto, a seconda di come stai posizionando i glifi). Quando si disegnano i bitmap, è possibile regolare le coordinate utilizzando i valori salvati.

Tuttavia, se si sta tentando di utilizzare le metriche dei caratteri per determinare quanto tagliare da ciascuna bitmap, non è possibile.

0

generali informazioni sui font:

ciò che si sta cercando è come normalizzare il posizionamento del testo alla "base" o "origine" (stesso concetto). Puoi farlo con la salita (ascesa) o discesa (discensore) a seconda del tuo sistema di coordinate.

http://www.freetype.org/freetype2/docs/tutorial/step2.html

che fornisce un buon set di immagini di esempio relativi alla tipografia.

bitmap generale informazioni sui font:

Ora, per quanto riguarda un'immagine bitmap il modo più semplice per assicurarsi che essi sono tutti allineati correttamente è quello di avere la stessa altezza per rappresentazione bitmap di ogni personaggio nel foglio sprite (le larghezze dovrebbero essere diverse ma basate sulla larghezza del carattere reale).Se lo fai, puoi semplicemente allineare tutto in base all'altezza condivisa.

Se si taglia lo spazio bianco in eccesso attorno a un carattere, tuttavia, sarà necessario memorizzare i valori ritagliati in alcune strutture insieme al glifo in modo da poter determinare l'offset. Se un'API sta facendo questo per te, probabilmente avranno il metodo ascender/discender, origine/baseline o tipo altezza linea in cui puoi ottenere le dimensioni complete in base a un personaggio in modo da poterlo fare correttamente. informazioni specifiche

Api
Edit: Sulla base di altre risposte ecco i link rilevanti per domanda specifica tua API:

GetTextMetrics:
http://msdn.microsoft.com/en-us/library/dd144941(v=vs.85).aspx

TEXTMETRIC struct:
http://msdn.microsoft.com/en-us/library/dd145132(v=vs.85).aspx

tmAscent o tmDescent possono essere usati per compensare il tuo y coord spo.

Problemi correlati