FileModeWinding и DrawPath вызывают появление нечетных шипов - PullRequest
6 голосов
/ 21 сентября 2010

Я использую gdiplus для «обводки» текста.В определенных обстоятельствах мы видим «всплеск», появляющийся в верхней или нижней части графика, и я не совсем уверен, почему.Мы можем минимизировать это, регулируя ширину обводки и размер шрифта, но это не очень хорошее решение.Я надеюсь, что кто-то может объяснить мне проблему.

Spikey Bug

И пример кода, генерирующий это 4, его схему и всплеск (непреднамеренный)

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);

Ответы [ 2 ]

7 голосов
/ 06 октября 2010

Используйте Pen :: SetLineJoin на ручке, которую вы используете для рисования контура, и используйте что-то отличное от LineJoinMiter .

3 голосов
/ 06 октября 2010

Я согласен, что режим заливки не проблема, я думаю, что это просто ширина пера, используемого для рисования контура.Для символов с закрытыми пробелами с заостренными углами (например, 4 и 'A'), когда ширина пера, используемого для рисования контура, становится больше, размер внутренней фигуры (маленький треугольник в случае четырех) также увеличивается,

В конечном счете внутренняя форма станет слишком большой, чтобы удерживаться внешней формой, и начнет проталкиваться, в результате чего вы увидите артефакт.

Вот иллюстрация фиксированного шрифтаразмер (снова шрифт Impact) по мере увеличения ширины контура.Здесь нет заливки, просто вызов graphics.DrawPath ():

alt text

Операция заливки не заботится о ширине контура и использует исходную формуписьмо.

Это частично маскирует проблему, скрывая некоторые грязные очертания.Вот с включенной заливкой:

alt text

Нечто подобное произойдет с символом 'A':

alt text alt text

РЕДАКТИРОВАТЬ: вызов SetLineJoin, как указано в другом ответе, является способом предотвратить это.

...