diff options
author | Ashod Nakashian <ashod.nakashian@collabora.co.uk> | 2018-04-22 17:01:18 -0400 |
---|---|---|
committer | Jan Holesovsky <kendy@collabora.com> | 2018-06-01 08:59:21 +0200 |
commit | 8e55f000d0f2a99843246eecda5a931f24ef12bf (patch) | |
tree | ba87da361af407fa4c4a55570651a3e0d4e6c07b | |
parent | 31a0ea06df7773b8654ac9a941b45366ae8f9548 (diff) |
svx: support sub-paths in PDF import
Change-Id: Ibcfd30383db6846e791aea7609ab196c4f3f2da4
-rw-r--r-- | svx/source/svdraw/svdpdf.cxx | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/svx/source/svdraw/svdpdf.cxx b/svx/source/svdraw/svdpdf.cxx index 4b0ad0820472..e2dc149e333a 100644 --- a/svx/source/svdraw/svdpdf.cxx +++ b/svx/source/svdraw/svdpdf.cxx @@ -1316,17 +1316,19 @@ void ImpSdrPdfImport::ImportImage(FPDF_PAGEOBJECT pPageObject, int nPageObjectIn void ImpSdrPdfImport::ImportPath(FPDF_PAGEOBJECT pPageObject, int nPageObjectIndex) { - SAL_WARN("sd.filter", "Got page object PATH: " << nPageObjectIndex); - double a, b, c, d, e, f; FPDFPath_GetMatrix(pPageObject, &a, &b, &c, &d, &e, &f); Matrix aPathMatrix(a, b, c, d, e, f); aPathMatrix.Concatinate(mCurMatrix); + basegfx::B2DPolyPolygon aPolyPoly; basegfx::B2DPolygon aPoly; std::vector<basegfx::B2DPoint> aBezier; const int nSegments = FPDFPath_CountSegments(pPageObject); + SAL_WARN("sd.filter", + "Got page object PATH: " << nPageObjectIndex << " with " << nSegments << " segments."); + for (int nSegmentIndex = 0; nSegmentIndex < nSegments; ++nSegmentIndex) { FPDF_PATHSEGMENT pPathSegment = FPDFPath_GetPathSegment(pPageObject, nSegmentIndex); @@ -1341,16 +1343,16 @@ void ImpSdrPdfImport::ImportPath(FPDF_PAGEOBJECT pPageObject, int nPageObjectInd double x = fx; double y = fy; - SAL_WARN("sd.filter", "Got point (" << x << ", " << y << ") matrix (" << a << ", " << b - << ", " << c << ", " << d << ", " << e << ", " << f - << ')'); aPathMatrix.Transform(x, y); - const bool bClose = FPDFPathSegment_GetClose(pPathSegment); if (bClose) aPoly.setClosed(bClose); // TODO: Review - SAL_WARN("sd.filter", - "Point corrected (" << x << ", " << y << "): " << (bClose ? "CLOSE" : "OPEN")); + + SAL_WARN("sd.filter", "Got " << (bClose ? "CLOSE" : "OPEN") << " point (" << fx << ", " + << fy << ") matrix (" << a << ", " << b << ", " << c + << ", " << d << ", " << e << ", " << f << ") -> (" << x + << ", " << y << ")"); + Point aPoint = PointsToLogic(x, y); x = aPoint.X(); y = aPoint.Y(); @@ -1375,6 +1377,13 @@ void ImpSdrPdfImport::ImportPath(FPDF_PAGEOBJECT pPageObject, int nPageObjectInd case FPDF_SEGMENT_MOVETO: SAL_WARN("sd.filter", "Got MoveTo Segment."); + // New Poly. + if (aPoly.count() > 0) + { + aPolyPoly.append(aPoly, 1); + aPoly.clear(); + } + aPoly.append(basegfx::B2DPoint(x, y)); break; @@ -1392,6 +1401,12 @@ void ImpSdrPdfImport::ImportPath(FPDF_PAGEOBJECT pPageObject, int nPageObjectInd aBezier.clear(); } + if (aPoly.count() > 0) + { + aPolyPoly.append(aPoly, 1); + aPoly.clear(); + } + const basegfx::B2DHomMatrix aTransform( basegfx::utils::createScaleTranslateB2DHomMatrix(mfScaleX, mfScaleY, maOfs.X(), maOfs.Y())); aPoly.transform(aTransform); @@ -1424,7 +1439,7 @@ void ImpSdrPdfImport::ImportPath(FPDF_PAGEOBJECT pPageObject, int nPageObjectInd // if(!mbLastObjWasPolyWithoutLine || !CheckLastPolyLineAndFillMerge(basegfx::B2DPolyPolygon(aSource))) - SdrPathObj* pPath = new SdrPathObj(OBJ_POLY, basegfx::B2DPolyPolygon(aPoly)); + SdrPathObj* pPath = new SdrPathObj(OBJ_POLY, aPolyPoly); SetAttributes(pPath); InsertObj(pPath, false); } |