drawinglayer/source/tools/emfphelperdata.cxx | 173 +++++++++++++-------------- drawinglayer/source/tools/emfphelperdata.hxx | 4 2 files changed, 90 insertions(+), 87 deletions(-)
New commits: commit 50553df006f5fe8ac59cad3dcde0856735535b40 Author: Patrick Jaap <patrick.j...@tu-dresden.de> Date: Mon Aug 7 17:05:27 2017 +0200 new EMF+ Parser: Implementation of EmfPlusRecordTypeDrawDriverString The Implementation follows closely EmfPlusRecordTypeDrawString. For each set of characters with the same PosY a TextSimplePortionPrimitive2D is created. Change-Id: I04e4d11dc3c4e1e5bd16aefa8e7f00556aa5282b Reviewed-on: https://gerrit.libreoffice.org/40716 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Thorsten Behrens <thorsten.behr...@cib.de> diff --git a/drawinglayer/source/tools/emfphelperdata.cxx b/drawinglayer/source/tools/emfphelperdata.cxx index 335d5634880d..12e3a42b3e9c 100644 --- a/drawinglayer/source/tools/emfphelperdata.cxx +++ b/drawinglayer/source/tools/emfphelperdata.cxx @@ -35,6 +35,8 @@ #include <drawinglayer/attribute/fontattribute.hxx> #include <basegfx/matrix/b2dhommatrixtools.hxx> #include <basegfx/polygon/b2dpolygontools.hxx> +#include <vcl/svapp.hxx> +#include <vcl/settings.hxx> namespace emfplushelper { @@ -329,6 +331,24 @@ namespace emfplushelper return maMapTransform * ::basegfx::B2DSize(iwidth, iheight); } + ::basegfx::BColor EmfPlusHelperData::EMFPGetBrushColorOrARGBColor(sal_uInt16 flags, sal_uInt32 brushIndexOrColor){ + basegfx::BColor color; + if (flags & 0x8000) // we use a color + { + color = Color(0xff - (brushIndexOrColor >> 24), (brushIndexOrColor >> 16) & 0xff, + (brushIndexOrColor >> 8) & 0xff, brushIndexOrColor & 0xff).getBColor(); + } + else // we use a pen + { + const EMFPPen* pen = static_cast<EMFPPen*>(maEMFPObjects[brushIndexOrColor & 0xff].get()); + if (pen) + { + color = pen->GetColor().getBColor(); + } + } + return color; + } + void EmfPlusHelperData::EMFPPlusDrawPolygon(const ::basegfx::B2DPolyPolygon& polygon, sal_uInt32 penIndex) { const EMFPPen* pen = static_cast<EMFPPen*>(maEMFPObjects[penIndex & 0xff].get()); @@ -1131,54 +1151,6 @@ namespace emfplushelper fontAttribute, locale, color)); - - // OUString text = read_uInt16s_ToOUString(rMS, stringLength); - // EMFPStringFormat *stringFormat = static_cast< EMFPStringFormat* >(maEMFPObjects[formatId & 0xff].get()); - // css::rendering::FontRequest aFontRequest; - // - // if (stringFormat) - // { - // LanguageTag aLanguageTag(static_cast< LanguageType >(stringFormat->language)); - // aFontRequest.Locale = aLanguageTag.getLocale(false); - // SAL_INFO("cppcanvas.emf", "EMF+\t\t Font locale, Country:" << aLanguageTag.getCountry() << " Language:" << aLanguageTag.getLanguage()); - // } - // - // SAL_INFO("cppcanvas.emf", "EMF+\t\t TODO Use all string formatting attributes during drawing"); - // - // double cellSize = setFont(aFontRequest, flags & 0xff, rFactoryParms, rState); - // rState.textColor = COLOR(brushId); - // - // ::basegfx::B2DPoint point(Map(lx + 0.15*cellSize, ly + cellSize)); - // - // ActionSharedPtr pTextAction( - // TextActionFactory::createTextAction( - // // position is just rough guess for now - // // we should calculate it exactly from layoutRect or font - // vcl::unotools::pointFromB2DPoint(point), - // ::Size(), - // ::Color(), - // ::Size(), - // ::Color(), - // text, - // 0, - // stringLength, - // nullptr, - // rFactoryParms.mrVDev, - // rFactoryParms.mrCanvas, - // rState, - // rFactoryParms.mrParms, - // false)); - // if (pTextAction) - // { - // SAL_INFO("cppcanvas.emf", "EMF+\t\tadd text action"); - // - // maActions.push_back( - // MtfAction( - // pTextAction, - // rFactoryParms.mrCurrActionIndex)); - // - // rFactoryParms.mrCurrActionIndex += pTextAction->getActionCount() - 1; - // } } else { @@ -1500,6 +1472,7 @@ namespace emfplushelper std::unique_ptr<float[]> charsPosX(new float[glyphsCount]); std::unique_ptr<float[]> charsPosY(new float[glyphsCount]); OUString text = read_uInt16s_ToOUString(rMS, glyphsCount); + SAL_INFO("cppcanvas.emf", "EMF+ DrawDriverString string: " << text); for (sal_uInt32 i = 0; i<glyphsCount; i++) { @@ -1517,45 +1490,71 @@ namespace emfplushelper ", " << transform.get(0,2) << ", " << transform.get(1,2)); } - (void)text; // avoid warning - - // rendering::FontRequest aFontRequest; - // // add the text action - // setFont(aFontRequest, flags & 0xff, rFactoryParms, rState); - // - // if (flags & 0x8000) - // rState.textColor = COLOR(brushIndexOrColor); - // - // ::basegfx::B2DPoint point(Map(charsPosX[0], charsPosY[0])); - // - // ActionSharedPtr pTextAction( - // TextActionFactory::createTextAction( - // vcl::unotools::pointFromB2DPoint(point), - // ::Size(), - // ::Color(), - // ::Size(), - // ::Color(), - // text, - // 0, - // glyphsCount, - // nullptr, - // rFactoryParms.mrVDev, - // rFactoryParms.mrCanvas, - // rState, - // rFactoryParms.mrParms, - // false)); - // - // if (pTextAction) - // { - // SAL_INFO("cppcanvas.emf", "EMF+\t\tadd text action"); - // - // maActions.push_back( - // MtfAction( - // pTextAction, - // rFactoryParms.mrCurrActionIndex)); - // - // rFactoryParms.mrCurrActionIndex += pTextAction->getActionCount() - 1; - // } + // get the font from the flags + EMFPFont *font = static_cast< EMFPFont* >( maEMFPObjects[flags & 0xff].get() ); + if (!font) + { + break; + } + // done reading + + const OUString emptyString; + drawinglayer::attribute::FontAttribute fontAttribute( + font->family, // font family + emptyString, // (no) font style + font->Bold() ? 8u : 1u, // weight: 8 = bold + font->family.compareTo("SYMBOL") == 0, // symbol + optionFlags & 0x2, // vertical + font->Italic(), // italic + false, // monospaced + false, // outline = false, no such thing in MS-EMFPLUS + false, // right-to-left + false); // BiDiStrong + + basegfx::BColor color = EMFPGetBrushColorOrARGBColor(flags,brushIndexOrColor); + std::vector<double> aDXArray; // dummy for DX array (not used) + + // generate TextSimplePortionPrimitive2Ds for all portions of text with + // the same charsPosY values + sal_uInt32 pos = 0; + while (pos < glyphsCount) + { + //determine the current length + sal_uInt32 aLength = 1; + while (pos + aLength < glyphsCount && std::abs( charsPosY[pos + aLength] - charsPosY[pos] ) < std::numeric_limits< float >::epsilon()) + aLength++; + + // generate the DX-Array + aDXArray.clear(); + double mappedPosX = Map(charsPosX[pos],charsPosY[pos]).getX(); + for (size_t i=0; i<aLength-1; i++) + { + aDXArray.push_back(Map(charsPosX[pos+i+1],charsPosY[pos+i+1]).getX() - mappedPosX); + } + // last entry + aDXArray.push_back(0); + + // prepare transform matrix + basegfx::B2DHomMatrix transformMatrix = basegfx::tools::createScaleTranslateB2DHomMatrix( + MapSize(font->emSize,font->emSize),Map(charsPosX[pos],charsPosY[pos])); + if (hasMatrix) + transformMatrix *= transform; + + //generate TextSimplePortionPrimitive2D + mrTargetHolders.Current().append( + new drawinglayer::primitive2d::TextSimplePortionPrimitive2D( + transformMatrix, + text, + pos, // take character at current pos + aLength, // use determined length + aDXArray, // generated DXArray + fontAttribute, + Application::GetSettings().GetLanguageTag().getLocale(), + color)); + + // update pos + pos += aLength; + } } else { diff --git a/drawinglayer/source/tools/emfphelperdata.hxx b/drawinglayer/source/tools/emfphelperdata.hxx index 21f5dcdddabd..7a6d8b1f89ee 100644 --- a/drawinglayer/source/tools/emfphelperdata.hxx +++ b/drawinglayer/source/tools/emfphelperdata.hxx @@ -25,6 +25,7 @@ #include <tools/stream.hxx> #include <basegfx/point/b2dpoint.hxx> #include <basegfx/vector/b2dsize.hxx> +#include <basegfx/color/bcolor.hxx> // predefines class SvStream; @@ -232,6 +233,9 @@ namespace emfplushelper void EMFPPlusDrawPolygon(const ::basegfx::B2DPolyPolygon& polygon, sal_uInt32 penIndex); void EMFPPlusFillPolygon(const ::basegfx::B2DPolyPolygon& polygon, bool isColor, sal_uInt32 brushIndexOrColor); + // helper functions + ::basegfx::BColor EMFPGetBrushColorOrARGBColor(sal_uInt16 flags, sal_uInt32 brushIndexOrColor); + public: EmfPlusHelperData( SvMemoryStream& rMS, _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits