Commit 7e0d1025 authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

dwrite: Multiply run analysis transform by dpi scale factor.

parent 32b35f80
...@@ -117,9 +117,7 @@ struct glyphrunanalysis_desc ...@@ -117,9 +117,7 @@ struct glyphrunanalysis_desc
DWRITE_MEASURING_MODE measuring_mode; DWRITE_MEASURING_MODE measuring_mode;
DWRITE_GRID_FIT_MODE gridfit_mode; DWRITE_GRID_FIT_MODE gridfit_mode;
DWRITE_TEXT_ANTIALIAS_MODE aa_mode; DWRITE_TEXT_ANTIALIAS_MODE aa_mode;
FLOAT origin_x; D2D_POINT_2F origin;
FLOAT origin_y;
FLOAT ppdip;
}; };
struct fontface_desc struct fontface_desc
......
...@@ -5397,7 +5397,6 @@ HRESULT create_glyphrunanalysis(const struct glyphrunanalysis_desc *desc, IDWrit ...@@ -5397,7 +5397,6 @@ HRESULT create_glyphrunanalysis(const struct glyphrunanalysis_desc *desc, IDWrit
analysis->max_glyph_bitmap_size = 0; analysis->max_glyph_bitmap_size = 0;
SetRectEmpty(&analysis->bounds); SetRectEmpty(&analysis->bounds);
analysis->run = *desc->run; analysis->run = *desc->run;
analysis->run.fontEmSize *= desc->ppdip;
IDWriteFontFace_AddRef(analysis->run.fontFace); IDWriteFontFace_AddRef(analysis->run.fontFace);
analysis->glyphs = heap_alloc(desc->run->glyphCount * sizeof(*analysis->glyphs)); analysis->glyphs = heap_alloc(desc->run->glyphCount * sizeof(*analysis->glyphs));
analysis->origins = heap_alloc(desc->run->glyphCount * sizeof(*analysis->origins)); analysis->origins = heap_alloc(desc->run->glyphCount * sizeof(*analysis->origins));
...@@ -5433,14 +5432,14 @@ HRESULT create_glyphrunanalysis(const struct glyphrunanalysis_desc *desc, IDWrit ...@@ -5433,14 +5432,14 @@ HRESULT create_glyphrunanalysis(const struct glyphrunanalysis_desc *desc, IDWrit
if (FAILED(hr = IDWriteFontFace_QueryInterface(desc->run->fontFace, &IID_IDWriteFontFace1, (void **)&fontface1))) if (FAILED(hr = IDWriteFontFace_QueryInterface(desc->run->fontFace, &IID_IDWriteFontFace1, (void **)&fontface1)))
WARN("Failed to get IDWriteFontFace1, %#x.\n", hr); WARN("Failed to get IDWriteFontFace1, %#x.\n", hr);
origin.x = desc->origin_x * desc->ppdip; origin.x = desc->origin.x;
origin.y = desc->origin_y * desc->ppdip; origin.y = desc->origin.y;
for (i = 0; i < desc->run->glyphCount; i++) { for (i = 0; i < desc->run->glyphCount; i++) {
FLOAT advance; FLOAT advance;
/* Use nominal advances if not provided by caller. */ /* Use nominal advances if not provided by caller. */
if (desc->run->glyphAdvances) if (desc->run->glyphAdvances)
advance = rtl_factor * desc->run->glyphAdvances[i] * desc->ppdip; advance = rtl_factor * desc->run->glyphAdvances[i];
else { else {
INT32 a; INT32 a;
...@@ -5450,14 +5449,14 @@ HRESULT create_glyphrunanalysis(const struct glyphrunanalysis_desc *desc, IDWrit ...@@ -5450,14 +5449,14 @@ HRESULT create_glyphrunanalysis(const struct glyphrunanalysis_desc *desc, IDWrit
case DWRITE_MEASURING_MODE_NATURAL: case DWRITE_MEASURING_MODE_NATURAL:
if (SUCCEEDED(IDWriteFontFace1_GetDesignGlyphAdvances(fontface1, 1, desc->run->glyphIndices + i, &a, if (SUCCEEDED(IDWriteFontFace1_GetDesignGlyphAdvances(fontface1, 1, desc->run->glyphIndices + i, &a,
desc->run->isSideways))) desc->run->isSideways)))
advance = rtl_factor * get_scaled_advance_width(a, desc->run->fontEmSize, &metrics) * desc->ppdip; advance = rtl_factor * get_scaled_advance_width(a, desc->run->fontEmSize, &metrics);
break; break;
case DWRITE_MEASURING_MODE_GDI_CLASSIC: case DWRITE_MEASURING_MODE_GDI_CLASSIC:
case DWRITE_MEASURING_MODE_GDI_NATURAL: case DWRITE_MEASURING_MODE_GDI_NATURAL:
if (SUCCEEDED(IDWriteFontFace1_GetGdiCompatibleGlyphAdvances(fontface1, desc->run->fontEmSize, if (SUCCEEDED(IDWriteFontFace1_GetGdiCompatibleGlyphAdvances(fontface1, desc->run->fontEmSize,
desc->ppdip, desc->transform, desc->measuring_mode == DWRITE_MEASURING_MODE_GDI_NATURAL, 1.0f, desc->transform, desc->measuring_mode == DWRITE_MEASURING_MODE_GDI_NATURAL,
desc->run->isSideways, 1, desc->run->glyphIndices + i, &a))) desc->run->isSideways, 1, desc->run->glyphIndices + i, &a)))
advance = rtl_factor * floorf(a * desc->run->fontEmSize * desc->ppdip / metrics.designUnitsPerEm + 0.5f); advance = rtl_factor * floorf(a * desc->run->fontEmSize / metrics.designUnitsPerEm + 0.5f);
break; break;
default: default:
; ;
...@@ -5468,8 +5467,8 @@ HRESULT create_glyphrunanalysis(const struct glyphrunanalysis_desc *desc, IDWrit ...@@ -5468,8 +5467,8 @@ HRESULT create_glyphrunanalysis(const struct glyphrunanalysis_desc *desc, IDWrit
/* Offsets are optional, appled to pre-transformed origin. */ /* Offsets are optional, appled to pre-transformed origin. */
if (desc->run->glyphOffsets) { if (desc->run->glyphOffsets) {
FLOAT advanceoffset = rtl_factor * desc->run->glyphOffsets[i].advanceOffset * desc->ppdip; FLOAT advanceoffset = rtl_factor * desc->run->glyphOffsets[i].advanceOffset;
FLOAT ascenderoffset = -desc->run->glyphOffsets[i].ascenderOffset * desc->ppdip; FLOAT ascenderoffset = -desc->run->glyphOffsets[i].ascenderOffset;
if (desc->run->isSideways) { if (desc->run->isSideways) {
analysis->origins[i].x += ascenderoffset; analysis->origins[i].x += ascenderoffset;
......
...@@ -1222,12 +1222,25 @@ static HRESULT WINAPI dwritefactory_CreateNumberSubstitution(IDWriteFactory5 *if ...@@ -1222,12 +1222,25 @@ static HRESULT WINAPI dwritefactory_CreateNumberSubstitution(IDWriteFactory5 *if
return create_numbersubstitution(method, locale, ignore_user_override, substitution); return create_numbersubstitution(method, locale, ignore_user_override, substitution);
} }
static inline void dwrite_matrix_multiply(DWRITE_MATRIX *a, const DWRITE_MATRIX *b)
{
DWRITE_MATRIX tmp = *a;
a->m11 = tmp.m11 * b->m11 + tmp.m12 * b->m21;
a->m12 = tmp.m11 * b->m12 + tmp.m12 * b->m22;
a->m21 = tmp.m21 * b->m11 + tmp.m22 * b->m21;
a->m22 = tmp.m21 * b->m12 + tmp.m22 * b->m22;
a->dx = tmp.dx * b->m11 + tmp.dy * b->m21 + b->dx;
a->dy = tmp.dy * b->m12 + tmp.dy * b->m22 + b->dx;
}
static HRESULT WINAPI dwritefactory_CreateGlyphRunAnalysis(IDWriteFactory5 *iface, DWRITE_GLYPH_RUN const *run, static HRESULT WINAPI dwritefactory_CreateGlyphRunAnalysis(IDWriteFactory5 *iface, DWRITE_GLYPH_RUN const *run,
FLOAT ppdip, DWRITE_MATRIX const* transform, DWRITE_RENDERING_MODE rendering_mode, FLOAT ppdip, DWRITE_MATRIX const* transform, DWRITE_RENDERING_MODE rendering_mode,
DWRITE_MEASURING_MODE measuring_mode, FLOAT originX, FLOAT originY, IDWriteGlyphRunAnalysis **analysis) DWRITE_MEASURING_MODE measuring_mode, FLOAT originX, FLOAT originY, IDWriteGlyphRunAnalysis **analysis)
{ {
struct dwritefactory *This = impl_from_IDWriteFactory5(iface); struct dwritefactory *This = impl_from_IDWriteFactory5(iface);
struct glyphrunanalysis_desc desc; struct glyphrunanalysis_desc desc;
DWRITE_MATRIX m, scale = { 0 };
TRACE("(%p)->(%p %.2f %p %d %d %.2f %.2f %p)\n", This, run, ppdip, transform, rendering_mode, TRACE("(%p)->(%p %.2f %p %d %d %.2f %.2f %p)\n", This, run, ppdip, transform, rendering_mode,
measuring_mode, originX, originY, analysis); measuring_mode, originX, originY, analysis);
...@@ -1237,15 +1250,18 @@ static HRESULT WINAPI dwritefactory_CreateGlyphRunAnalysis(IDWriteFactory5 *ifac ...@@ -1237,15 +1250,18 @@ static HRESULT WINAPI dwritefactory_CreateGlyphRunAnalysis(IDWriteFactory5 *ifac
return E_INVALIDARG; return E_INVALIDARG;
} }
m = transform ? *transform : identity;
scale.m11 = ppdip;
scale.m22 = ppdip;
dwrite_matrix_multiply(&m, &scale);
desc.run = run; desc.run = run;
desc.ppdip = ppdip; desc.transform = &m;
desc.transform = transform;
desc.rendering_mode = (DWRITE_RENDERING_MODE1)rendering_mode; desc.rendering_mode = (DWRITE_RENDERING_MODE1)rendering_mode;
desc.measuring_mode = measuring_mode; desc.measuring_mode = measuring_mode;
desc.gridfit_mode = DWRITE_GRID_FIT_MODE_DEFAULT; desc.gridfit_mode = DWRITE_GRID_FIT_MODE_DEFAULT;
desc.aa_mode = DWRITE_TEXT_ANTIALIAS_MODE_CLEARTYPE; desc.aa_mode = DWRITE_TEXT_ANTIALIAS_MODE_CLEARTYPE;
desc.origin_x = originX; desc.origin.x = originX;
desc.origin_y = originY; desc.origin.y = originY;
return create_glyphrunanalysis(&desc, analysis); return create_glyphrunanalysis(&desc, analysis);
} }
...@@ -1363,27 +1379,35 @@ static HRESULT WINAPI dwritefactory2_CreateCustomRenderingParams(IDWriteFactory5 ...@@ -1363,27 +1379,35 @@ static HRESULT WINAPI dwritefactory2_CreateCustomRenderingParams(IDWriteFactory5
return hr; return hr;
} }
static HRESULT factory_create_glyphrun_analysis(const DWRITE_GLYPH_RUN *run, const DWRITE_MATRIX *transform,
DWRITE_RENDERING_MODE1 rendering_mode, DWRITE_MEASURING_MODE measuring_mode, DWRITE_GRID_FIT_MODE gridfit_mode,
DWRITE_TEXT_ANTIALIAS_MODE aa_mode, FLOAT originX, FLOAT originY, IDWriteGlyphRunAnalysis **analysis)
{
struct glyphrunanalysis_desc desc;
desc.run = run;
desc.transform = transform;
desc.rendering_mode = rendering_mode;
desc.measuring_mode = measuring_mode;
desc.gridfit_mode = gridfit_mode;
desc.aa_mode = aa_mode;
desc.origin.x = originX;
desc.origin.y = originY;
return create_glyphrunanalysis(&desc, analysis);
}
static HRESULT WINAPI dwritefactory2_CreateGlyphRunAnalysis(IDWriteFactory5 *iface, const DWRITE_GLYPH_RUN *run, static HRESULT WINAPI dwritefactory2_CreateGlyphRunAnalysis(IDWriteFactory5 *iface, const DWRITE_GLYPH_RUN *run,
const DWRITE_MATRIX *transform, DWRITE_RENDERING_MODE rendering_mode, DWRITE_MEASURING_MODE measuring_mode, const DWRITE_MATRIX *transform, DWRITE_RENDERING_MODE rendering_mode, DWRITE_MEASURING_MODE measuring_mode,
DWRITE_GRID_FIT_MODE gridfit_mode, DWRITE_TEXT_ANTIALIAS_MODE aa_mode, FLOAT originX, FLOAT originY, DWRITE_GRID_FIT_MODE gridfit_mode, DWRITE_TEXT_ANTIALIAS_MODE aa_mode, FLOAT originX, FLOAT originY,
IDWriteGlyphRunAnalysis **analysis) IDWriteGlyphRunAnalysis **analysis)
{ {
struct dwritefactory *This = impl_from_IDWriteFactory5(iface); struct dwritefactory *This = impl_from_IDWriteFactory5(iface);
struct glyphrunanalysis_desc desc;
TRACE("(%p)->(%p %p %d %d %d %d %.2f %.2f %p)\n", This, run, transform, rendering_mode, measuring_mode, TRACE("(%p)->(%p %p %d %d %d %d %.2f %.2f %p)\n", This, run, transform, rendering_mode, measuring_mode,
gridfit_mode, aa_mode, originX, originY, analysis); gridfit_mode, aa_mode, originX, originY, analysis);
desc.run = run; return factory_create_glyphrun_analysis(run, transform, (DWRITE_RENDERING_MODE1)rendering_mode, measuring_mode,
desc.ppdip = 1.0f; gridfit_mode, aa_mode, originX, originY, analysis);
desc.transform = transform;
desc.rendering_mode = (DWRITE_RENDERING_MODE1)rendering_mode;
desc.measuring_mode = measuring_mode;
desc.gridfit_mode = gridfit_mode;
desc.aa_mode = aa_mode;
desc.origin_x = originX;
desc.origin_y = originY;
return create_glyphrunanalysis(&desc, analysis);
} }
static HRESULT WINAPI dwritefactory3_CreateGlyphRunAnalysis(IDWriteFactory5 *iface, DWRITE_GLYPH_RUN const *run, static HRESULT WINAPI dwritefactory3_CreateGlyphRunAnalysis(IDWriteFactory5 *iface, DWRITE_GLYPH_RUN const *run,
...@@ -1392,21 +1416,12 @@ static HRESULT WINAPI dwritefactory3_CreateGlyphRunAnalysis(IDWriteFactory5 *ifa ...@@ -1392,21 +1416,12 @@ static HRESULT WINAPI dwritefactory3_CreateGlyphRunAnalysis(IDWriteFactory5 *ifa
IDWriteGlyphRunAnalysis **analysis) IDWriteGlyphRunAnalysis **analysis)
{ {
struct dwritefactory *This = impl_from_IDWriteFactory5(iface); struct dwritefactory *This = impl_from_IDWriteFactory5(iface);
struct glyphrunanalysis_desc desc;
TRACE("(%p)->(%p %p %d %d %d %d %.2f %.2f %p)\n", This, run, transform, rendering_mode, measuring_mode, TRACE("(%p)->(%p %p %d %d %d %d %.2f %.2f %p)\n", This, run, transform, rendering_mode, measuring_mode,
gridfit_mode, aa_mode, originX, originY, analysis); gridfit_mode, aa_mode, originX, originY, analysis);
desc.run = run; return factory_create_glyphrun_analysis(run, transform, rendering_mode, measuring_mode, gridfit_mode,
desc.ppdip = 1.0f; aa_mode, originX, originY, analysis);
desc.transform = transform;
desc.rendering_mode = rendering_mode;
desc.measuring_mode = measuring_mode;
desc.gridfit_mode = gridfit_mode;
desc.aa_mode = aa_mode;
desc.origin_x = originX;
desc.origin_y = originY;
return create_glyphrunanalysis(&desc, analysis);
} }
static HRESULT WINAPI dwritefactory3_CreateCustomRenderingParams(IDWriteFactory5 *iface, FLOAT gamma, FLOAT contrast, static HRESULT WINAPI dwritefactory3_CreateCustomRenderingParams(IDWriteFactory5 *iface, FLOAT gamma, FLOAT contrast,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment