Skip to content

Commit b4acfaf

Browse files
committed
Add DWrite grid fit mode (to control aligning vertex control points to pixels). Disabling works best with overscale 6x5 rendering mode.
1 parent c1356f5 commit b4acfaf

2 files changed

Lines changed: 59 additions & 11 deletions

File tree

DrawableObject.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ enum DrawableObjectAttribute : uint32_t
6767
DrawableObjectAttributeGdiRenderingMode,
6868
DrawableObjectAttributeGdiPlusRenderingMode,
6969
DrawableObjectAttributeDWriteMeasuringMode,
70+
DrawableObjectAttributeDWriteGridFitMode,
7071
DrawableObjectAttributeDWriteVerticalGlyphOrientation,
7172
DrawableObjectAttributeLanguageList,
7273
DrawableObjectAttributeTextColor,
@@ -226,6 +227,7 @@ class DrawableObject : public ComObject
226227
static const Attribute::PredefinedValue justifications[2];
227228
static const Attribute::PredefinedValue wrappingModes[4];
228229
static const Attribute::PredefinedValue dwriteMeasuringModes[3];
230+
static const Attribute::PredefinedValue dwriteGridFitModes[3];
229231
static const Attribute::PredefinedValue dwriteRenderingModes[7];
230232
static const Attribute::PredefinedValue dwriteVerticalGlyphOrientation[2];
231233
static const Attribute::PredefinedValue gdiRenderingModes[7];
@@ -292,6 +294,7 @@ struct CachedDWriteRenderingParams
292294
{
293295
ComPtr<IDWriteRenderingParams> renderingParams;
294296
uint32_t cookieRenderingMode = ~0;
297+
uint32_t cookieGridFitMode = ~0;
295298

296299
HRESULT Update(IAttributeSource& attributeSource, DrawingCanvas& drawingCanvas);
297300
void Invalidate() { renderingParams.clear(); }

DrawableObject.ixx

Lines changed: 56 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ const Attribute DrawableObject::attributeList[DrawableObjectAttributeTotal] =
5757
{Attribute::TypeUInteger32, Attribute::SemanticEnumExclusive,0, DrawableObjectAttributeGdiRenderingMode, u"gdi_rendering_mode", u"GDI rendering mode", u"", gdiRenderingModes },
5858
{Attribute::TypeUInteger32, Attribute::SemanticEnumExclusive,0, DrawableObjectAttributeGdiPlusRenderingMode, u"gdiplus_rendering_mode", u"GDI+ rendering mode", u"", gdiPlusRenderingModes },
5959
{Attribute::TypeUInteger32, Attribute::SemanticEnumExclusive,0 , DrawableObjectAttributeDWriteMeasuringMode, u"dwrite_measuring_mode", u"DWrite measuring mode", u"", dwriteMeasuringModes },
60+
{Attribute::TypeUInteger32, Attribute::SemanticEnumExclusive,0 , DrawableObjectAttributeDWriteGridFitMode, u"dwrite_grid_fit_mode", u"DWrite grid fit mode", u"", dwriteGridFitModes },
6061
{Attribute::TypeUInteger32, Attribute::SemanticEnumExclusive,0 , DrawableObjectAttributeDWriteVerticalGlyphOrientation, u"dwrite_vertical_glyph_orientation", u"DWrite vertical glyph orientation", u"", dwriteVerticalGlyphOrientation },
6162
{Attribute::TypeString16, Attribute::SemanticNone, CategoryLight, DrawableObjectAttributeLanguageList, u"language_list", u"Language list", u"", languages },
6263
{Attribute::TypeUInteger32, Attribute::SemanticColor, 0 , DrawableObjectAttributeTextColor, u"text_color", u"Text color", u"000000", textColors, u"Color as #FFFFFFFF, 255 128 0, or name" },
@@ -79,7 +80,7 @@ const Attribute DrawableObject::attributeList[DrawableObjectAttributeTotal] =
7980
{Attribute::TypeArrayFloat32, Attribute::SemanticNone, 0 , DrawableObjectAttributeAxisValues, u"axis_values", u"Axis values", u"", {} },
8081
{Attribute::TypeUInteger32, Attribute::SemanticEnumExclusive,0 , DrawableObjectAttributeDWriteFontFamilyModel, u"dwrite_font_family_model", u"DWrite font family model", u"Weight Style Stretch", dwriteFontFamilyModels },
8182
};
82-
static_assert(DrawableObjectAttributeTotal == 53, "A new attribute enum has been added. Update this table.");
83+
static_assert(DrawableObjectAttributeTotal == 54, "A new attribute enum has been added. Update this table.");
8384

8485

8586
const Attribute::PredefinedValue DrawableObject::functions[] = {
@@ -812,6 +813,12 @@ const Attribute::PredefinedValue DrawableObject::dwriteMeasuringModes[] = {
812813
{uint32_t(DWRITE_MEASURING_MODE_GDI_NATURAL), u"GDI compatible natural" },
813814
};
814815

816+
const Attribute::PredefinedValue DrawableObject::dwriteGridFitModes[] = {
817+
{uint32_t(DWRITE_GRID_FIT_MODE_DEFAULT), u"Default" },
818+
{uint32_t(DWRITE_GRID_FIT_MODE_DISABLED), u"Disabled" },
819+
{uint32_t(DWRITE_GRID_FIT_MODE_ENABLED), u"Enabled" },
820+
};
821+
815822
const Attribute::PredefinedValue DrawableObject::dwriteRenderingModes[] = {
816823
{uint32_t(DWRITE_RENDERING_MODE_DEFAULT), u"Default" },
817824
{uint32_t(DWRITE_RENDERING_MODE_ALIASED), u"Aliased" },
@@ -1920,35 +1927,73 @@ HRESULT CachedDWriteRenderingParams::Update(IAttributeSource& attributeSource, D
19201927
{
19211928
// Invalidate the cached rendering params.
19221929
if (attributeSource.IsCookieSame(DrawableObjectAttributeDWriteRenderingMode, IN OUT cookieRenderingMode)
1930+
& attributeSource.IsCookieSame(DrawableObjectAttributeDWriteGridFitMode, IN OUT cookieGridFitMode)
19231931
& (renderingParams != nullptr))
19241932
{
19251933
return S_OK;
19261934
}
19271935

19281936
renderingParams.clear();
19291937

1930-
// Get the rendering mode and check with the one the canvas is already using.
1931-
// If compatible, just use it directly.
19321938
auto dwriteRenderingMode = attributeSource.GetValue(DrawableObjectAttributeDWriteRenderingMode, DWRITE_RENDERING_MODE_DEFAULT);
1939+
auto dwriteGridFitMode = attributeSource.GetValue(DrawableObjectAttributeDWriteGridFitMode, DWRITE_GRID_FIT_MODE_DEFAULT);
1940+
1941+
// Get the rendering mode and check with the one the canvas is already using.
1942+
// If all settings are compatible, just use it directly.
1943+
// Otherwise create a new one.
19331944
auto* canvasRenderingParams = drawingCanvas.GetDirectWriteRenderingParamsWeakRef();
1934-
if (canvasRenderingParams != nullptr && canvasRenderingParams->GetRenderingMode() == dwriteRenderingMode)
1945+
ComPtr<IDWriteRenderingParams2> renderingParams2;
1946+
canvasRenderingParams->QueryInterface(&renderingParams2);
1947+
1948+
if (canvasRenderingParams != nullptr
1949+
&& canvasRenderingParams->GetRenderingMode() == dwriteRenderingMode
1950+
&& (renderingParams2 == nullptr || renderingParams2->GetGridFitMode() == dwriteGridFitMode))
19351951
{
19361952
renderingParams = canvasRenderingParams;
19371953
return S_OK;
19381954
}
19391955

19401956
// Otherwise create custom one, using the default one as a template for any unspecified parameters.
19411957
auto* dwriteFactory = drawingCanvas.GetDWriteFactoryWeakRef();
1958+
ComPtr<IDWriteFactory2> dwriteFactory2;
1959+
IFR(drawingCanvas.GetDWriteFactoryWeakRef()->QueryInterface(OUT &dwriteFactory2));
1960+
1961+
// Get defaults for gamma, contrast, CT level, pixel geometry...
19421962
ComPtr<IDWriteRenderingParams> defaultRenderingParams;
1963+
ComPtr<IDWriteRenderingParams1> defaultRenderingParams1;
19431964
IFR(dwriteFactory->CreateRenderingParams(OUT &defaultRenderingParams));
1944-
return dwriteFactory->CreateCustomRenderingParams(
1945-
defaultRenderingParams->GetGamma(), // default=1.8f
1946-
defaultRenderingParams->GetEnhancedContrast(), // default=0.5f
1947-
defaultRenderingParams->GetClearTypeLevel(), // default=0.5f
1948-
defaultRenderingParams->GetPixelGeometry(), // default=RGB for most monitors
1949-
dwriteRenderingMode,
1950-
OUT &renderingParams
1965+
defaultRenderingParams->QueryInterface(&defaultRenderingParams1);
1966+
1967+
auto gamma = defaultRenderingParams->GetGamma(); // default=1.8f
1968+
auto contrast = defaultRenderingParams->GetEnhancedContrast(); // default=0.5f
1969+
auto clearTypeLevel = defaultRenderingParams->GetClearTypeLevel(); // default=0.5f
1970+
auto pixelGeometry = defaultRenderingParams->GetPixelGeometry(); // default=RGB for most monitors
1971+
auto grayscaleContrast = defaultRenderingParams1 ? defaultRenderingParams1->GetGrayscaleEnhancedContrast() : 0.5f; // default=0.5f
1972+
1973+
if (dwriteFactory2)
1974+
{
1975+
return dwriteFactory2->CreateCustomRenderingParams(
1976+
gamma,
1977+
contrast,
1978+
grayscaleContrast,
1979+
clearTypeLevel,
1980+
pixelGeometry,
1981+
dwriteRenderingMode,
1982+
dwriteGridFitMode,
1983+
OUT reinterpret_cast<IDWriteRenderingParams2**>(&renderingParams)
1984+
);
1985+
}
1986+
else
1987+
{
1988+
return dwriteFactory->CreateCustomRenderingParams(
1989+
gamma,
1990+
contrast,
1991+
clearTypeLevel,
1992+
pixelGeometry,
1993+
dwriteRenderingMode,
1994+
OUT &renderingParams
19511995
);
1996+
}
19521997
}
19531998

19541999

0 commit comments

Comments
 (0)