[Libreoffice-commits] core.git: drawinglayer/source

Chris Sherlock (via logerrit) logerrit at kemper.freedesktop.org
Thu Dec 19 16:52:42 UTC 2019


 drawinglayer/source/tools/emfphelperdata.cxx |   50 ++++++++++++++++++++++++---
 drawinglayer/source/tools/emfphelperdata.hxx |    2 +
 2 files changed, 47 insertions(+), 5 deletions(-)

New commits:
commit ac793c7d9d3dda330aa25345f092b188e2a79a6d
Author:     Chris Sherlock <chris.sherlock79 at gmail.com>
AuthorDate: Wed Dec 4 19:51:30 2019 +1100
Commit:     Thorsten Behrens <Thorsten.Behrens at CIB.de>
CommitDate: Thu Dec 19 17:51:45 2019 +0100

    tdf#129188 drawinglayer: implement EMF+ SetTextContrast
    
    Change-Id: I5e249d5ba85df020ab90c6e543c0d8aefe0b572f
    Reviewed-on: https://gerrit.libreoffice.org/84455
    Tested-by: Jenkins
    Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
    Tested-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>

diff --git a/drawinglayer/source/tools/emfphelperdata.cxx b/drawinglayer/source/tools/emfphelperdata.cxx
index 99d88a27bdb4..3a0ffc4d793b 100644
--- a/drawinglayer/source/tools/emfphelperdata.cxx
+++ b/drawinglayer/source/tools/emfphelperdata.cxx
@@ -39,6 +39,7 @@
 #include <drawinglayer/primitive2d/transformprimitive2d.hxx>
 #include <drawinglayer/attribute/fontattribute.hxx>
 #include <basegfx/color/bcolor.hxx>
+#include <basegfx/color/bcolormodifier.hxx>
 #include <basegfx/matrix/b2dhommatrixtools.hxx>
 #include <basegfx/polygon/b2dpolygonclipper.hxx>
 #include <basegfx/polygon/b2dpolygontools.hxx>
@@ -49,6 +50,8 @@
 #include <vcl/settings.hxx>
 #include <i18nlangtag/languagetag.hxx>
 
+#include <algorithm>
+
 namespace emfplushelper
 {
     const char* emfTypeToName(sal_uInt16 type)
@@ -79,7 +82,7 @@ namespace emfplushelper
             case EmfPlusRecordTypeSetRenderingOrigin: return "EmfPlusRecordTypeSetRenderingOrigin";
             case EmfPlusRecordTypeSetAntiAliasMode: return "EmfPlusRecordTypeSetAntiAliasMode";
             case EmfPlusRecordTypeSetTextRenderingHint: return "EmfPlusRecordTypeSetTextRenderingHint";
-            case EmfPlusRecordTypeSetTextContrast: return "EmfPlusRectordTypeSetTextContrast";
+            case EmfPlusRecordTypeSetTextContrast: return "EmfPlusRecordTypeSetTextContrast";
             case EmfPlusRecordTypeSetInterpolationMode: return "EmfPlusRecordTypeSetInterpolationMode";
             case EmfPlusRecordTypeSetPixelOffsetMode: return "EmfPlusRecordTypeSetPixelOffsetMode";
             case EmfPlusRecordTypeSetCompositingQuality: return "EmfPlusRecordTypeSetCompositingQuality";
@@ -899,6 +902,7 @@ namespace emfplushelper
         mnOriginY(0),
         mnHDPI(0),
         mnVDPI(0),
+        mbSetTextContrast(false),
         mnFrameLeft(0),
         mnFrameTop(0),
         mnFrameRight(0),
@@ -1537,7 +1541,29 @@ namespace emfplushelper
                                         ::basegfx::B2DSize(font->emSize, font->emSize),
                                         ::basegfx::B2DPoint(lx + stringAlignmentHorizontalOffset, ly + font->emSize));
 
-                            const Color color = EMFPGetBrushColorOrARGBColor(flags, brushId);
+                            Color uncorrectedColor = EMFPGetBrushColorOrARGBColor(flags, brushId);
+                            Color color;
+
+                            if (mbSetTextContrast)
+                            {
+                                const auto gammaVal = mnTextContrast / 1000;
+                                const basegfx::BColorModifier_gamma gamma(gammaVal);
+
+                                // gamma correct transparency color
+                                sal_uInt16 alpha = uncorrectedColor.GetTransparency();
+                                alpha = std::clamp(std::pow(alpha, 1.0 / gammaVal), 0.0, 1.0) * 255;
+
+                                basegfx::BColor modifiedColor(gamma.getModifiedColor(uncorrectedColor.getBColor()));
+                                color.SetRed(modifiedColor.getRed() * 255);
+                                color.SetGreen(modifiedColor.getGreen() * 255);
+                                color.SetBlue(modifiedColor.getBlue() * 255);
+                                color.SetTransparency(alpha);
+                            }
+                            else
+                            {
+                                color = uncorrectedColor;
+                            }
+
                             mrPropertyHolders.Current().setTextColor(color.getBColor());
                             mrPropertyHolders.Current().setTextColorActive(true);
 
@@ -1620,11 +1646,25 @@ namespace emfplushelper
                         SAL_INFO("drawinglayer", "EMF+ SetRenderingOrigin, [x,y]: " << mnOriginX << "," << mnOriginY);
                         break;
                     }
+                    case EmfPlusRecordTypeSetTextContrast:
+                    {
+                        const sal_uInt16 LOWERGAMMA = 1000;
+                        const sal_uInt16 UPPERGAMMA = 2200;
+
+                        mbSetTextContrast = true;
+                        mnTextContrast = flags & 0xFFF;
+                        SAL_WARN_IF(mnTextContrast > UPPERGAMMA || mnTextContrast < LOWERGAMMA,
+                            "drawinglayer", "Gamma value is not with bounds 1000 to 2200, value is " << mnTextContrast);
+                        mnTextContrast = std::min(mnTextContrast, UPPERGAMMA);
+                        mnTextContrast = std::max(mnTextContrast, LOWERGAMMA);
+                        SAL_INFO("drawinglayer", "EMF+\t Text contrast: " << (mnTextContrast / 1000) << " gamma");
+                        break;
+                    }
                     case EmfPlusRecordTypeSetTextRenderingHint:
                     {
                         sal_uInt8 nTextRenderingHint = (flags & 0xFF) >> 1;
                         SAL_INFO("drawinglayer", "EMF+\t Text rendering hint: " << TextRenderingHintToString(nTextRenderingHint));
-                        SAL_INFO("drawinglayer", "TODO\t EMF+ SetTextRenderingHint");
+                        SAL_WARN("drawinglayer", "TODO\t EMF+ SetTextRenderingHint");
                         break;
                     }
                     case EmfPlusRecordTypeSetAntiAliasMode:
@@ -1633,14 +1673,14 @@ namespace emfplushelper
                         sal_uInt8 nSmoothingMode = (flags & 0xFE00) >> 1;
                         SAL_INFO("drawinglayer", "EMF+\t Antialiasing: " << (bUseAntiAlias ? "enabled" : "disabled"));
                         SAL_INFO("drawinglayer", "EMF+\t Smoothing mode: " << SmoothingModeToString(nSmoothingMode));
-                        SAL_INFO("drawinglayer", "TODO\t EMF+ SetAntiAliasMode");
+                        SAL_WARN("drawinglayer", "TODO\t EMF+ SetAntiAliasMode");
                         break;
                     }
                     case EmfPlusRecordTypeSetInterpolationMode:
                     {
                         sal_uInt16 nInterpolationMode = flags & 0xFF;
                         SAL_INFO("drawinglayer", "EMF+\t Interpolation mode: " << InterpolationModeToString(nInterpolationMode));
-                        SAL_INFO("drawinglayer", "TODO\t EMF+ InterpolationMode");
+                        SAL_WARN("drawinglayer", "TODO\t EMF+ InterpolationMode");
                         break;
                     }
                     case EmfPlusRecordTypeSetPixelOffsetMode:
diff --git a/drawinglayer/source/tools/emfphelperdata.hxx b/drawinglayer/source/tools/emfphelperdata.hxx
index a6560359fe52..76e4b657dbe1 100644
--- a/drawinglayer/source/tools/emfphelperdata.hxx
+++ b/drawinglayer/source/tools/emfphelperdata.hxx
@@ -189,6 +189,8 @@ namespace emfplushelper
         sal_Int32                   mnOriginY;
         sal_uInt32                  mnHDPI;
         sal_uInt32                  mnVDPI;
+        bool                        mbSetTextContrast;
+        sal_uInt16                  mnTextContrast;
 
         /* EMF+ emf header info */
         sal_Int32                   mnFrameLeft;


More information about the Libreoffice-commits mailing list