2010-09-21 7 views
6

Sto usando gdiplus per "tracciare" un textout. In alcune circostanze, vediamo un "picco" che appare nella parte superiore o inferiore del grafico, e non sono davvero sicuro del perché. Possiamo minimizzare questo aggiustando la larghezza del tratto e la dimensione del carattere, ma questa non è una buona soluzione. Spero che qualcuno possa spiegarmi il problema.FileModeWinding e DrawPath causano picchi dispari

Spikey Bug

E il codice di esempio generare questo 4, il suo contorno, e il picco (involontario)

GraphicsPath path(FillModeWinding); 

     path.AddString(text,wcslen(text),&fontFamily,StateInfo.TheFont.TheWeight,(REAL)minSize,PointF((REAL)ptStart.x, (REAL)ptStart.y),&sf); 
     // Draw the outline first 
     if (StateInfo.StrokeWidth > 0) { 
     Gdiplus::Color strokecolor(GetRValue(StateInfo.StrokeColor), GetGValue(StateInfo.StrokeColor), GetBValue(StateInfo.StrokeColor)); 
     Pen pen(strokecolor,(REAL)StateInfo.StrokeWidth);  
     graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); 
     graphics.SetPixelOffsetMode(Gdiplus::PixelOffsetModeHighQuality); 
     graphics.DrawPath(&pen, &path); 
     } 
     // Draw the text by filling the path   
     graphics.FillPath(&solidBrush, &path); 
+1

Sono convinto che lo Spike in cima al 4 sia dovuto alla regione di forma simile all'interno dei quattro. La documentazione sulla modellatura a macchina sembra indicare questo. Ho anche provato FillModeAlternate, senza modifiche. Non sono sicuro di come recuperare da questo problema. Eventuali suggerimenti? – reuscam

+0

Dubito che la modalità di riempimento sia il problema. Hai provato a eseguirlo su una macchina con un driver video diverso? –

+0

Sì, ho, stessi problemi. Il carattere sopra riportato è Impatto. Problema non si verifica con Arial con le stesse dimensioni del carattere, larghezza del tratto. – reuscam

risposta

7

Utilizzare Pen::SetLineJoin sulla penna che si sta utilizzando per disegnare il contorno e utilizzare qualcosa di diverso da LineJoinMiter.

+0

+1 per fornire una risposta corretta. –

3

Sono d'accordo che la modalità di riempimento non è il problema, penso che sia solo la larghezza della penna utilizzata per disegnare il contorno. Per i personaggi che hanno spazi chiusi con angoli appuntiti (come 4 e 'A'), mentre la larghezza della penna usata per disegnare il contorno diventa più grande, anche la dimensione della forma interna (il piccolo triangolo nel caso dei quattro) diventa più grande .

Alla fine la forma interna diventerà troppo grande per essere contenuta dalla forma esterna e inizierà a penetrare, producendo l'artefatto che vedi.

Questa è un'illustrazione di una dimensione di carattere fissa (il carattere Impatto di nuovo) quando la larghezza del contorno aumenta. Non v'è alcun riempimento qui, solo una chiamata a Graphics.drawPath():

alt text

L'operazione di riempimento non si preoccupa circa la larghezza contorno, e usa la forma originale della lettera.

Questo maschera parzialmente il problema nascondendo alcuni dei contorni disordinati. Qui viene con il riempimento attivato:

alt text

Qualcosa di simile accadrà con il carattere 'A':

alt text alt text

EDIT: chiamando SetLineJoin, come indicato in altra risposta , è il modo per impedire che ciò accada.

+0

+1 per spiegare chiaramente qual è la causa. È come usare una penna enorme per disegnare qualcosa. A volte la penna può essere più grande di quello che disegni. –

Problemi correlati