2010-09-21 5 views
6

Estoy usando gdiplus para "trazar" un texto. En determinadas circunstancias, vemos un "pico" que aparece en la parte superior o inferior del gráfico, y no estoy muy seguro de por qué. Podemos minimizar esto ajustando el ancho de trazo y el tamaño de fuente, pero esa no es una buena solución. Espero que alguien me explique el problema.FileModeWinding y DrawPath hacen que aparezcan picos impares

Spikey Bug

Y el ejemplo de código que genera este 4, su contorno, y la púa (no intencional)

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

Estoy convencido de que el Spike en la parte superior de la 4 se debe a la región de forma similar dentro de los cuatro. La documentación sobre fillmodewinding parece apuntar a esto. También probé FillModeAlternate, sin cambios. No estoy seguro de cómo recuperarse de este problema. ¿Alguna sugerencia? – reuscam

+0

Dudo que el modo de llenado sea el problema. ¿Has intentado ejecutarlo en una máquina con un controlador de video diferente? –

+0

Sí, tengo, los mismos problemas. La fuente de arriba es Impacto. El problema no ocurre con Arial con el mismo tamaño de letra, ancho de trazo. – reuscam

Respuesta

3

Estoy de acuerdo que el modo de relleno no es la cuestión, creo que es justo el ancho del lápiz utilizado para dibujar el contorno. Para los personajes que tienen espacios cerrados con esquinas puntiagudas (como 4 y 'A'), a medida que aumenta el ancho del lápiz utilizado para dibujar el contorno, el tamaño de la forma interna (el pequeño triángulo en el caso de los cuatro) también aumenta. .

Eventualmente la forma interior será demasiado grande para ser contenida por la forma exterior, y comenzará a abrirse paso, lo que dará como resultado el artefacto que ve.

Aquí hay una ilustración de un tamaño de fuente fijo (la fuente Impact nuevamente) a medida que el ancho del contorno aumenta. No hay ningún relleno aquí, sólo una llamada a Graphics.drawPath():

alt text

La operación de relleno no se preocupa por el ancho del contorno, y utiliza la forma original de la carta.

Esto enmascara parcialmente el problema cubriendo parte del contorno desordenado. Aquí está con el relleno de encendido:

alt text

Algo similar ocurrirá con el carácter 'A':

alt text alt text

EDIT: llamar SetLineJoin, como se indica en la otra respuesta , es la forma de evitar que esto suceda.

+0

+1 para explicar claramente cuál es la causa. Es como usar un gran bolígrafo para dibujar algo. A veces, el bolígrafo puede ser más grande que lo que dibujas. –

Cuestiones relacionadas