@@ -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
8586const 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+
815822const 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