From: Nikolay Sivov Subject: [PATCH 1/3] dwrite: Translate rendered bitmap bounds to given origin Message-Id: <55BAA553.4050307@codeweavers.com> Date: Fri, 31 Jul 2015 01:29:39 +0300 --- From ccae75cba0865d562f5aabd95cec161e7c7046f4 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Wed, 29 Jul 2015 19:54:23 +0300 Subject: [PATCH 1/3] dwrite: Translate rendered bitmap bounds to given origin --- dlls/dwrite/dwrite_private.h | 2 +- dlls/dwrite/font.c | 10 +++++++++- dlls/dwrite/main.c | 8 ++++---- dlls/dwrite/tests/font.c | 23 ++++++++++++++++++++++- 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h index 0c25483..59bef03 100644 --- a/dlls/dwrite/dwrite_private.h +++ b/dlls/dwrite/dwrite_private.h @@ -124,7 +124,7 @@ extern HRESULT create_font_file(IDWriteFontFileLoader *loader, const void *refer extern HRESULT create_localfontfileloader(IDWriteLocalFontFileLoader** iface) DECLSPEC_HIDDEN; extern HRESULT create_fontface(DWRITE_FONT_FACE_TYPE,UINT32,IDWriteFontFile* const*,UINT32,DWRITE_FONT_SIMULATIONS,IDWriteFontFace2**) DECLSPEC_HIDDEN; extern HRESULT create_font_collection(IDWriteFactory2*,IDWriteFontFileEnumerator*,BOOL,IDWriteFontCollection**) DECLSPEC_HIDDEN; -extern HRESULT create_glyphrunanalysis(DWRITE_RENDERING_MODE,DWRITE_GLYPH_RUN const*,FLOAT,IDWriteGlyphRunAnalysis**) DECLSPEC_HIDDEN; +extern HRESULT create_glyphrunanalysis(DWRITE_RENDERING_MODE,DWRITE_GLYPH_RUN const*,FLOAT,FLOAT,FLOAT,IDWriteGlyphRunAnalysis**) DECLSPEC_HIDDEN; extern BOOL is_system_collection(IDWriteFontCollection*) DECLSPEC_HIDDEN; extern HRESULT get_local_refkey(const WCHAR*,const FILETIME*,void**,UINT32*) DECLSPEC_HIDDEN; extern HRESULT get_filestream_from_file(IDWriteFontFile*,IDWriteFontFileStream**) DECLSPEC_HIDDEN; diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index a3f58b9..5f32c31 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -117,6 +117,8 @@ struct dwrite_glyphrunanalysis { DWRITE_RENDERING_MODE rendering_mode; DWRITE_GLYPH_RUN run; FLOAT ppdip; + FLOAT originX; + FLOAT originY; UINT16 *glyphs; FLOAT *advances; DWRITE_GLYPH_OFFSET *offsets; @@ -2956,6 +2958,9 @@ static void glyphrunanalysis_get_texturebounds(struct dwrite_glyphrunanalysis *a IDWriteFontFace2_Release(fontface2); + /* translate to given run origin */ + OffsetRect(&analysis->bounds, analysis->originX, analysis->originY); + analysis->ready |= RUNANALYSIS_BOUNDS; *bounds = analysis->bounds; } @@ -3075,7 +3080,8 @@ static const struct IDWriteGlyphRunAnalysisVtbl glyphrunanalysisvtbl = { glyphrunanalysis_GetAlphaBlendParams }; -HRESULT create_glyphrunanalysis(DWRITE_RENDERING_MODE rendering_mode, DWRITE_GLYPH_RUN const *run, FLOAT ppdip, IDWriteGlyphRunAnalysis **ret) +HRESULT create_glyphrunanalysis(DWRITE_RENDERING_MODE rendering_mode, DWRITE_GLYPH_RUN const *run, FLOAT ppdip, + FLOAT originX, FLOAT originY, IDWriteGlyphRunAnalysis **ret) { struct dwrite_glyphrunanalysis *analysis; @@ -3094,6 +3100,8 @@ HRESULT create_glyphrunanalysis(DWRITE_RENDERING_MODE rendering_mode, DWRITE_GLY analysis->rendering_mode = rendering_mode; analysis->ready = 0; analysis->ppdip = ppdip; + analysis->originX = originX; + analysis->originY = originY; SetRectEmpty(&analysis->bounds); analysis->run = *run; IDWriteFontFace_AddRef(analysis->run.fontFace); diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c index 9f8454f..5a8c026 100644 --- a/dlls/dwrite/main.c +++ b/dlls/dwrite/main.c @@ -1072,14 +1072,14 @@ static HRESULT WINAPI dwritefactory_CreateNumberSubstitution(IDWriteFactory2 *if static HRESULT WINAPI dwritefactory_CreateGlyphRunAnalysis(IDWriteFactory2 *iface, DWRITE_GLYPH_RUN const *run, FLOAT ppdip, DWRITE_MATRIX const* transform, DWRITE_RENDERING_MODE rendering_mode, - DWRITE_MEASURING_MODE measuring_mode, FLOAT baseline_x, FLOAT baseline_y, IDWriteGlyphRunAnalysis **analysis) + DWRITE_MEASURING_MODE measuring_mode, FLOAT originX, FLOAT originY, IDWriteGlyphRunAnalysis **analysis) { struct dwritefactory *This = impl_from_IDWriteFactory2(iface); - TRACE("(%p)->(%p %.2f %p %d %d %f %f %p)\n", This, run, ppdip, transform, rendering_mode, - measuring_mode, baseline_x, baseline_y, analysis); + TRACE("(%p)->(%p %.2f %p %d %d %.2f %.2f %p)\n", This, run, ppdip, transform, rendering_mode, + measuring_mode, originX, originY, analysis); - return create_glyphrunanalysis(rendering_mode, run, ppdip, analysis); + return create_glyphrunanalysis(rendering_mode, run, ppdip, originX, originY, analysis); } static HRESULT WINAPI dwritefactory1_GetEudcFontCollection(IDWriteFactory2 *iface, IDWriteFontCollection **collection, diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c index aeb84bb..c132159 100644 --- a/dlls/dwrite/tests/font.c +++ b/dlls/dwrite/tests/font.c @@ -3435,7 +3435,7 @@ static void test_CreateGlyphRunAnalysis(void) FLOAT advance; HRESULT hr; UINT32 ch; - RECT rect; + RECT rect, rect2; DWRITE_GLYPH_OFFSET offset; DWRITE_GLYPH_METRICS metrics; DWRITE_FONT_METRICS fm; @@ -3489,8 +3489,29 @@ static void test_CreateGlyphRunAnalysis(void) ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); ok(rect.left == 0 && rect.right == 0 && rect.top == 0 && rect.bottom == 0, "unexpected rect\n"); + + /* check how origin affects bounds */ + memset(&rect, 0, sizeof(rect)); + hr = IDWriteGlyphRunAnalysis_GetAlphaTextureBounds(analysis, DWRITE_TEXTURE_ALIASED_1x1, &rect); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(!IsRectEmpty(&rect), "got empty rect\n"); + IDWriteGlyphRunAnalysis_Release(analysis); + + hr = IDWriteFactory_CreateGlyphRunAnalysis(factory, &run, 1.0, NULL, + DWRITE_RENDERING_MODE_ALIASED, DWRITE_MEASURING_MODE_NATURAL, + 10.0, -5.0, &analysis); + ok(hr == S_OK, "got 0x%08x\n", hr); + + memset(&rect2, 0, sizeof(rect2)); + hr = IDWriteGlyphRunAnalysis_GetAlphaTextureBounds(analysis, DWRITE_TEXTURE_ALIASED_1x1, &rect2); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(!IsRectEmpty(&rect2), "got empty rect\n"); IDWriteGlyphRunAnalysis_Release(analysis); + ok(!EqualRect(&rect, &rect2), "got equal bounds\n"); + OffsetRect(&rect, 10, -5); + ok(EqualRect(&rect, &rect2), "got different bounds\n"); + for (i = 0; i < sizeof(rendermodes)/sizeof(rendermodes[0]); i++) { hr = IDWriteFactory_CreateGlyphRunAnalysis(factory, &run, 1.0, NULL, rendermodes[i], DWRITE_MEASURING_MODE_NATURAL, -- 2.1.4