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@CIB.de>
Tested-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
diff --git a/drawinglayer/source/tools/emfphelperdata.cxx b/drawinglayer/source/tools/emfphelperdata.cxx
index 99d88a2..3a0ffc4 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 a656035..76e4b65 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;