Nikolay Sivov : dwrite: Support optional glyph offsets for color runs.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Feb 9 10:46:51 CST 2016
Module: wine
Branch: master
Commit: ce526d15ec1e5aef3d27627f615f91abe553d531
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ce526d15ec1e5aef3d27627f615f91abe553d531
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Tue Feb 9 17:11:19 2016 +0300
dwrite: Support optional glyph offsets for color runs.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/dwrite/font.c | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 6cea760..f350936 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -191,6 +191,8 @@ struct dwrite_colorglyphenum {
UINT32 palette; /* palette index to get layer color from */
FLOAT *advances; /* original or measured advances for base glyphs */
FLOAT *color_advances; /* returned color run points to this */
+ DWRITE_GLYPH_OFFSET *offsets; /* original offsets, or NULL */
+ DWRITE_GLYPH_OFFSET *color_offsets; /* returned color run offsets, or NULL */
UINT16 *glyphindices; /* returned color run points to this */
struct dwrite_colorglyph *glyphs; /* current glyph color info */
BOOL has_regular_glyphs; /* TRUE if there's any glyph without a color */
@@ -4629,6 +4631,8 @@ static ULONG WINAPI colorglyphenum_Release(IDWriteColorGlyphRunEnumerator *iface
if (!ref) {
heap_free(This->advances);
heap_free(This->color_advances);
+ heap_free(This->offsets);
+ heap_free(This->color_offsets);
heap_free(This->glyphindices);
heap_free(This->glyphs);
if (This->colr.context)
@@ -4672,6 +4676,8 @@ static BOOL colorglyphenum_build_color_run(struct dwrite_colorglyphenum *glyphen
else
glyphenum->glyphindices[g] = 1;
glyphenum->color_advances[g] = glyphenum->advances[g];
+ if (glyphenum->color_offsets)
+ glyphenum->color_offsets[g] = glyphenum->offsets[g];
}
colorrun->baselineOriginX = glyphenum->origin_x + get_glyph_origin(glyphenum, first_glyph);
@@ -4716,6 +4722,9 @@ static BOOL colorglyphenum_build_color_run(struct dwrite_colorglyphenum *glyphen
}
glyphenum->glyphindices[index] = glyphenum->glyphs[g].glyph;
+ /* offsets are relative to glyph origin, nothing to fix up */
+ if (glyphenum->color_offsets)
+ glyphenum->color_offsets[index] = glyphenum->offsets[g];
opentype_colr_next_glyph(glyphenum->colr.data, glyphenum->glyphs + g);
if (index)
glyphenum->color_advances[index-1] += advance_adj;
@@ -4846,10 +4855,15 @@ HRESULT create_colorglyphenum(FLOAT originX, FLOAT originY, const DWRITE_GLYPH_R
colorglyphenum->advances = heap_alloc(run->glyphCount * sizeof(FLOAT));
colorglyphenum->color_advances = heap_alloc(run->glyphCount * sizeof(FLOAT));
colorglyphenum->glyphindices = heap_alloc(run->glyphCount * sizeof(UINT16));
+ if (run->glyphOffsets) {
+ colorglyphenum->offsets = heap_alloc(run->glyphCount * sizeof(*colorglyphenum->offsets));
+ colorglyphenum->color_offsets = heap_alloc(run->glyphCount * sizeof(*colorglyphenum->color_offsets));
+ memcpy(colorglyphenum->offsets, run->glyphOffsets, run->glyphCount * sizeof(*run->glyphOffsets));
+ }
colorglyphenum->colorrun.glyphRun.glyphIndices = colorglyphenum->glyphindices;
colorglyphenum->colorrun.glyphRun.glyphAdvances = colorglyphenum->color_advances;
- colorglyphenum->colorrun.glyphRun.glyphOffsets = NULL; /* FIXME */
+ colorglyphenum->colorrun.glyphRun.glyphOffsets = colorglyphenum->color_offsets;
colorglyphenum->colorrun.glyphRunDescription = NULL; /* FIXME */
if (run->glyphAdvances)
More information about the wine-cvs
mailing list