aboutsummaryrefslogtreecommitdiffhomepage
path: root/win32/PlatWin.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'win32/PlatWin.cxx')
-rw-r--r--win32/PlatWin.cxx53
1 files changed, 20 insertions, 33 deletions
diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx
index 3d8595b1d..af1e41b5f 100644
--- a/win32/PlatWin.cxx
+++ b/win32/PlatWin.cxx
@@ -72,8 +72,6 @@ UINT CodePageFromCharSet(CharacterSet characterSet, UINT documentCodePage) noexc
#if defined(USE_D2D)
IDWriteFactory *pIDWriteFactory = nullptr;
ID2D1Factory *pD2DFactory = nullptr;
-IDWriteRenderingParams *defaultRenderingParams = nullptr;
-IDWriteRenderingParams *customClearTypeRenderingParams = nullptr;
D2D1_DRAW_TEXT_OPTIONS d2dDrawTextOptions = D2D1_DRAW_TEXT_OPTIONS_NONE;
static HMODULE hDLLD2D {};
@@ -123,24 +121,6 @@ void LoadD2DOnce() noexcept {
reinterpret_cast<IUnknown**>(&pIDWriteFactory));
}
}
-
- if (pIDWriteFactory) {
- const HRESULT hr = pIDWriteFactory->CreateRenderingParams(&defaultRenderingParams);
- if (SUCCEEDED(hr)) {
- unsigned int clearTypeContrast = 0;
- if (::SystemParametersInfo(SPI_GETFONTSMOOTHINGCONTRAST, 0, &clearTypeContrast, 0)) {
-
- FLOAT gamma;
- if (clearTypeContrast >= 1000 && clearTypeContrast <= 2200)
- gamma = static_cast<FLOAT>(clearTypeContrast) / 1000.0f;
- else
- gamma = defaultRenderingParams->GetGamma();
-
- pIDWriteFactory->CreateCustomRenderingParams(gamma, defaultRenderingParams->GetEnhancedContrast(), defaultRenderingParams->GetClearTypeLevel(),
- defaultRenderingParams->GetPixelGeometry(), defaultRenderingParams->GetRenderingMode(), &customClearTypeRenderingParams);
- }
- }
- }
}
bool LoadD2D() {
@@ -1294,7 +1274,7 @@ constexpr D2D1_RECT_F RectangleInset(D2D1_RECT_F rect, FLOAT inset) noexcept {
class BlobInline;
-class SurfaceD2D : public Surface {
+class SurfaceD2D : public Surface, public ISetRenderingParams {
SurfaceMode mode;
ID2D1RenderTarget *pRenderTarget = nullptr;
@@ -1304,8 +1284,10 @@ class SurfaceD2D : public Surface {
ID2D1SolidColorBrush *pBrush = nullptr;
- FontQuality fontQuality = FontQuality::QualityMask;
+ static constexpr FontQuality invalidFontQuality = FontQuality::QualityMask;
+ FontQuality fontQuality = invalidFontQuality;
int logPixelsY = USER_DEFAULT_SCREEN_DPI;
+ std::shared_ptr<RenderingParams> renderingParams;
void Clear() noexcept;
void SetFontQuality(FontQuality extraFontFlag);
@@ -1379,6 +1361,8 @@ public:
void PopClip() override;
void FlushCachedState() override;
void FlushDrawing() override;
+
+ void SetRenderingParams(std::shared_ptr<RenderingParams> renderingParams_) override;
};
SurfaceD2D::SurfaceD2D() noexcept {
@@ -1430,7 +1414,7 @@ void SurfaceD2D::Release() noexcept {
}
void SurfaceD2D::SetScale(WindowID wid) noexcept {
- fontQuality = FontQuality::QualityMask;
+ fontQuality = invalidFontQuality;
logPixelsY = DpiForWindow(wid);
}
@@ -1458,7 +1442,9 @@ void SurfaceD2D::Init(SurfaceID sid, WindowID wid) {
}
std::unique_ptr<Surface> SurfaceD2D::AllocatePixMap(int width, int height) {
- return std::make_unique<SurfaceD2D>(pRenderTarget, width, height, mode, logPixelsY);
+ std::unique_ptr<SurfaceD2D> surf = std::make_unique<SurfaceD2D>(pRenderTarget, width, height, mode, logPixelsY);
+ surf->SetRenderingParams(renderingParams);
+ return surf;
}
void SurfaceD2D::SetMode(SurfaceMode mode_) {
@@ -1485,15 +1471,14 @@ void SurfaceD2D::D2DPenColourAlpha(ColourRGBA fore) noexcept {
}
void SurfaceD2D::SetFontQuality(FontQuality extraFontFlag) {
- if (fontQuality != extraFontFlag) {
+ if ((fontQuality != extraFontFlag) && renderingParams) {
fontQuality = extraFontFlag;
const D2D1_TEXT_ANTIALIAS_MODE aaMode = DWriteMapFontQuality(extraFontFlag);
-
- if (aaMode == D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE && customClearTypeRenderingParams)
- pRenderTarget->SetTextRenderingParams(customClearTypeRenderingParams);
- else if (defaultRenderingParams)
- pRenderTarget->SetTextRenderingParams(defaultRenderingParams);
-
+ if (aaMode == D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE && renderingParams->customRenderingParams) {
+ pRenderTarget->SetTextRenderingParams(renderingParams->customRenderingParams.get());
+ } else if (renderingParams->defaultRenderingParams) {
+ pRenderTarget->SetTextRenderingParams(renderingParams->defaultRenderingParams.get());
+ }
pRenderTarget->SetTextAntialiasMode(aaMode);
}
}
@@ -2629,6 +2614,10 @@ void SurfaceD2D::FlushDrawing() {
}
}
+void SurfaceD2D::SetRenderingParams(std::shared_ptr<RenderingParams> renderingParams_) {
+ renderingParams = renderingParams_;
+}
+
#endif
std::unique_ptr<Surface> Surface::Allocate(Technology technology) {
@@ -3863,8 +3852,6 @@ void Platform_Initialise(void *hInstance) noexcept {
void Platform_Finalise(bool fromDllMain) noexcept {
#if defined(USE_D2D)
if (!fromDllMain) {
- ReleaseUnknown(defaultRenderingParams);
- ReleaseUnknown(customClearTypeRenderingParams);
ReleaseUnknown(pIDWriteFactory);
ReleaseUnknown(pD2DFactory);
if (hDLLDWrite) {