Module: wine Branch: master Commit: 9793ab9fa678d703e290dfa85400399657fe32ab URL: http://source.winehq.org/git/wine.git/?a=commit;h=9793ab9fa678d703e290dfa854...
Author: Vincent Povirk vincent@codeweavers.com Date: Mon May 23 16:35:41 2011 -0500
gdiplus: Implement DriverStringOptionsRealizedAdvance in software.
---
dlls/gdiplus/graphics.c | 43 ++++++++++++++++++++++++++----------------- 1 files changed, 26 insertions(+), 17 deletions(-)
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index 867889d..8c6a042 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -5674,9 +5674,9 @@ static GpStatus SOFTWARE_GdipDrawDriverString(GpGraphics *graphics, GDIPCONST UI GDIPCONST PointF *positions, INT flags, GDIPCONST GpMatrix *matrix ) { - static const INT unsupported_flags = ~(DriverStringOptionsCmapLookup); + static const INT unsupported_flags = ~(DriverStringOptionsCmapLookup|DriverStringOptionsRealizedAdvance); GpStatus stat; - PointF *real_positions; + PointF *real_positions, real_position; POINT *pti; HFONT hfont; HDC hdc; @@ -5695,12 +5695,6 @@ static GpStatus SOFTWARE_GdipDrawDriverString(GpGraphics *graphics, GDIPCONST UI if (length <= 0) return Ok;
- if (flags & DriverStringOptionsRealizedAdvance) - { - FIXME("Not implemented for DriverStringOptionsRealizedAdvance\n"); - return NotImplemented; - } - if (!(flags & DriverStringOptionsCmapLookup)) ggo_flags |= GGO_GLYPH_INDEX;
@@ -5710,22 +5704,31 @@ static GpStatus SOFTWARE_GdipDrawDriverString(GpGraphics *graphics, GDIPCONST UI if (matrix) FIXME("Ignoring matrix\n");
- real_positions = GdipAlloc(sizeof(PointF) * length); - if (!real_positions) - return OutOfMemory; - pti = GdipAlloc(sizeof(POINT) * length); if (!pti) - { - GdipFree(real_positions); return OutOfMemory; + + if (flags & DriverStringOptionsRealizedAdvance) + { + real_position = positions[0]; + + transform_and_round_points(graphics, pti, &real_position, 1); } + else + { + real_positions = GdipAlloc(sizeof(PointF) * length); + if (!real_positions) + { + GdipFree(pti); + return OutOfMemory; + }
- memcpy(real_positions, positions, sizeof(PointF) * length); + memcpy(real_positions, positions, sizeof(PointF) * length);
- transform_and_round_points(graphics, pti, real_positions, length); + transform_and_round_points(graphics, pti, real_positions, length);
- GdipFree(real_positions); + GdipFree(real_positions); + }
get_font_hfont(graphics, font, &hfont);
@@ -5762,6 +5765,12 @@ static GpStatus SOFTWARE_GdipDrawDriverString(GpGraphics *graphics, GDIPCONST UI if (top < min_y) min_y = top; if (right > max_x) max_x = right; if (bottom > max_y) max_y = bottom; + + if (i+1 < length && (flags & DriverStringOptionsRealizedAdvance) == DriverStringOptionsRealizedAdvance) + { + pti[i+1].x = pti[i].x + glyphmetrics.gmCellIncX; + pti[i+1].y = pti[i].y + glyphmetrics.gmCellIncY; + } }
glyph_mask = GdipAlloc(max_glyphsize);