sd/qa/unit/PNGExportTests.cxx |   41 +++++++++++++++++++++++++++++++++++++++++
 vcl/inc/win/salgdi.h          |    2 +-
 vcl/win/gdi/salfont.cxx       |   10 ++++++----
 vcl/win/window/salframe.cxx   |    2 +-
 4 files changed, 49 insertions(+), 6 deletions(-)

New commits:
commit 52a2dd0eea2ecf62b1db5f379cf65aed705446cb
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Sat Aug 17 10:50:06 2024 +0500
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Sat Aug 17 12:36:13 2024 +0200

    Support for non-AA text on Windows
    
    In commit 3ecd8f19a91ed7141304a2080fb11612b5ff30b3 (vcl cairo text
    renderer: support non-AA text, 2018-07-26) and its follow-up commit
    e6538f5bdd876911ea30f84a6512c03908e620fd (tdf#118966 vcl: add a flag
    to determine if AA of fonts is used from the system, 2018-07-28),
    non-antialiased text got supported in bitmap export using cairo.
    
    This change makes that support available on Windiws, including Skia.
    
    Change-Id: I1fae726539347f826e2d62246d35315e7954cf83
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171967
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>
    Tested-by: Jenkins

diff --git a/sd/qa/unit/PNGExportTests.cxx b/sd/qa/unit/PNGExportTests.cxx
index 305bf108b7b8..94eb4ff19c14 100644
--- a/sd/qa/unit/PNGExportTests.cxx
+++ b/sd/qa/unit/PNGExportTests.cxx
@@ -941,6 +941,47 @@ CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf155048)
     }
 }
 
+CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testNoAntiAliasExport)
+{
+#ifdef MACOSX
+// See comment in testTdf155048
+#else
+    loadFromFile(u"svg/tdf162259.svg");
+
+    auto xGraphicExporter = 
drawing::GraphicExportFilter::create(getComponentContext());
+    CPPUNIT_ASSERT(xGraphicExporter);
+
+    auto xSupplier = 
mxComponent.queryThrow<css::drawing::XDrawPagesSupplier>();
+    auto xPage = 
xSupplier->getDrawPages()->getByIndex(0).queryThrow<css::lang::XComponent>();
+    xGraphicExporter->setSourceDocument(xPage);
+
+    // 101 x 151 is current width x height ratio of the loaded SVG. FIXME: it 
should be 100 x 150.
+    css::uno::Sequence<css::beans::PropertyValue> aFilterData{
+        comphelper::makePropertyValue(u"PixelWidth"_ustr, sal_Int32(101)),
+        comphelper::makePropertyValue(u"PixelHeight"_ustr, sal_Int32(151)),
+        comphelper::makePropertyValue(u"AntiAliasing"_ustr, false),
+    };
+
+    css::uno::Sequence<css::beans::PropertyValue> aDescriptor{
+        comphelper::makePropertyValue(u"URL"_ustr, maTempFile.GetURL()),
+        comphelper::makePropertyValue(u"FilterName"_ustr, u"PNG"_ustr),
+        comphelper::makePropertyValue(u"FilterData"_ustr, aFilterData)
+    };
+
+    xGraphicExporter->filter(aDescriptor);
+    BitmapEx bmp = 
vcl::PngImageReader(*maTempFile.GetStream(StreamMode::READ)).read();
+
+    std::set<Color> colors;
+
+    for (tools::Long x = 0; x < bmp.GetSizePixel().Width(); ++x)
+        for (tools::Long y = 0; y < bmp.GetSizePixel().Height(); ++y)
+            colors.insert(bmp.GetPixelColor(x, y));
+
+    // With AntiAliasing = false, the text must be rendered aliased
+    CPPUNIT_ASSERT_EQUAL(size_t(2), colors.size());
+#endif
+}
+
 CPPUNIT_TEST_FIXTURE(SdPNGExportTest, testTdf162259)
 {
     // The top X in the SVG, having no skew, used a fast rendering path, and 
was output much wider
diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h
index 19edee0f4440..f8107a4a2a00 100644
--- a/vcl/inc/win/salgdi.h
+++ b/vcl/inc/win/salgdi.h
@@ -372,7 +372,7 @@ public:
 void    ImplUpdateSysColorEntries();
 int     ImplIsSysColorEntry( Color nColor );
 void    ImplGetLogFontFromFontSelect( const vcl::font::FontSelectPattern&,
-            const vcl::font::PhysicalFontFace*, LOGFONTW& );
+            const vcl::font::PhysicalFontFace*, LOGFONTW&, bool bAntiAliased);
 
 #define MAX_64KSALPOINTS    ((((sal_uInt16)0xFFFF)-8)/sizeof(POINTS))
 
diff --git a/vcl/win/gdi/salfont.cxx b/vcl/win/gdi/salfont.cxx
index 2a70d671fd8e..b18b842b3b26 100644
--- a/vcl/win/gdi/salfont.cxx
+++ b/vcl/win/gdi/salfont.cxx
@@ -676,7 +676,7 @@ static int CALLBACK SalEnumQueryFontProcExW( const 
LOGFONTW*, const TEXTMETRICW*
 
 void ImplGetLogFontFromFontSelect( const vcl::font::FontSelectPattern& rFont,
                                    const vcl::font::PhysicalFontFace* 
pFontFace,
-                                   LOGFONTW& rLogFont )
+                                   LOGFONTW& rLogFont, bool bAntiAliased)
 {
     OUString aName;
     if (pFontFace)
@@ -712,7 +712,6 @@ void ImplGetLogFontFromFontSelect( const 
vcl::font::FontSelectPattern& rFont,
     rLogFont.lfEscapement      = rFont.mnOrientation.get();
     rLogFont.lfOrientation     = rLogFont.lfEscapement;
     rLogFont.lfClipPrecision   = CLIP_DEFAULT_PRECIS;
-    rLogFont.lfQuality         = DEFAULT_QUALITY;
     rLogFont.lfOutPrecision    = OUT_TT_PRECIS;
     if ( rFont.mnOrientation )
         rLogFont.lfClipPrecision |= CLIP_LH_ANGLES;
@@ -720,7 +719,10 @@ void ImplGetLogFontFromFontSelect( const 
vcl::font::FontSelectPattern& rFont,
     // disable antialiasing if requested
     if ( rFont.mbNonAntialiased )
         rLogFont.lfQuality = NONANTIALIASED_QUALITY;
-
+    else if (bAntiAliased || 
Application::GetSettings().GetStyleSettings().GetUseFontAAFromSystem())
+        rLogFont.lfQuality = DEFAULT_QUALITY;
+    else
+        rLogFont.lfQuality = NONANTIALIASED_QUALITY;
 }
 
 std::tuple<HFONT,bool,sal_Int32> WinSalGraphics::ImplDoSetFont(HDC hDC, 
vcl::font::FontSelectPattern const & i_rFont,
@@ -730,7 +732,7 @@ std::tuple<HFONT,bool,sal_Int32> 
WinSalGraphics::ImplDoSetFont(HDC hDC, vcl::fon
     HFONT hNewFont = nullptr;
 
     LOGFONTW aLogFont;
-    ImplGetLogFontFromFontSelect( i_rFont, i_pFontFace, aLogFont );
+    ImplGetLogFontFromFontSelect( i_rFont, i_pFontFace, aLogFont, 
getAntiAlias());
 
     bool    bIsCJKVerticalFont = false;
     // select vertical mode for printing if requested and available
diff --git a/vcl/win/window/salframe.cxx b/vcl/win/window/salframe.cxx
index 6e029a5c2361..eeb588c2a228 100644
--- a/vcl/win/window/salframe.cxx
+++ b/vcl/win/window/salframe.cxx
@@ -2265,7 +2265,7 @@ static void ImplSalFrameSetInputContext( HWND hWnd, const 
SalInputContext* pCont
             {
                 LOGFONTW aLogFont;
                 
ImplGetLogFontFromFontSelect(pContext->mpFont->GetFontSelectPattern(),
-                                             nullptr, aLogFont);
+                                             nullptr, aLogFont, true);
                 ImmSetCompositionFontW( hIMC, &aLogFont );
                 ImmReleaseContext( pFrame->mhWnd, hIMC );
             }

Reply via email to