[Libreoffice-commits] core.git: Branch 'private/Ashod/pdfium' - 9 commits - external/pdfium sd/source svx/source vcl/source

Ashod Nakashian ashod.nakashian at collabora.co.uk
Mon Apr 16 03:25:25 UTC 2018


 external/pdfium/edit.patch.1         |  382 ++++++++++++++++++++++++++++++++---
 sd/source/filter/pdf/sdpdffilter.cxx |    3 
 svx/source/svdraw/svdpdf.cxx         |  260 ++++++++++++++---------
 svx/source/svdraw/svdpdf.hxx         |   13 -
 vcl/source/gdi/impgraph.cxx          |    4 
 5 files changed, 524 insertions(+), 138 deletions(-)

New commits:
commit a0565df5d7592d47b73cfd44f2caadcb9dd5285b
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Sun Apr 15 21:56:49 2018 -0400

    svx: support importing forms from PDFs
    
    Still missing the context matrix transformations.
    
    Change-Id: Id9457c6475463127d3bc444f36fa373a6ec8fcb6

diff --git a/external/pdfium/edit.patch.1 b/external/pdfium/edit.patch.1
index 02e0b44c3e87..09f609320169 100644
--- a/external/pdfium/edit.patch.1
+++ b/external/pdfium/edit.patch.1
@@ -110,6 +110,31 @@ index 8bb5bf5..9b5e2ce 100644
 +  fprintf(stderr, "PageObject BB: %f, %f, %f, %f\n", rc.left, rc.right, rc.top, rc.bottom);
    return rect.GetOuterRect();
  }
+diff --git a/core/fpdfapi/page/cpdf_pageobjectlist.cpp b/core/fpdfapi/page/cpdf_pageobjectlist.cpp
+index afd2c98..2c8e061 100644
+--- a/core/fpdfapi/page/cpdf_pageobjectlist.cpp
++++ b/core/fpdfapi/page/cpdf_pageobjectlist.cpp
+@@ -8,6 +8,6 @@
+ 
+ #include "third_party/base/stl_util.h"
+ 
+-CPDF_PageObject* CPDF_PageObjectList::GetPageObjectByIndex(int index) {
++CPDF_PageObject* CPDF_PageObjectList::GetPageObjectByIndex(int index) const {
+   return pdfium::IndexInBounds(*this, index) ? (*this)[index].get() : nullptr;
+ }
+diff --git a/core/fpdfapi/page/cpdf_pageobjectlist.h b/core/fpdfapi/page/cpdf_pageobjectlist.h
+index b450537..77c7d81 100644
+--- a/core/fpdfapi/page/cpdf_pageobjectlist.h
++++ b/core/fpdfapi/page/cpdf_pageobjectlist.h
+@@ -15,7 +15,7 @@ class CPDF_PageObject;
+ class CPDF_PageObjectList
+     : public std::deque<std::unique_ptr<CPDF_PageObject>> {
+  public:
+-  CPDF_PageObject* GetPageObjectByIndex(int index);
++  CPDF_PageObject* GetPageObjectByIndex(int index) const;
+ };
+ 
+ #endif  // CORE_FPDFAPI_PAGE_CPDF_PAGEOBJECTLIST_H_
 diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
 index 0a01ae0..6947e3a 100644
 --- a/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -174,7 +199,7 @@ index 0d7ba56..37bdf99 100644
  FPDFImageObj_GetImageDataDecoded(FPDF_PAGEOBJECT image_object,
                                   void* buffer,
 diff --git a/fpdfsdk/fpdfeditpage.cpp b/fpdfsdk/fpdfeditpage.cpp
-index ca2cf3f..f86201d 100644
+index ca2cf3f..8ecab60 100644
 --- a/fpdfsdk/fpdfeditpage.cpp
 +++ b/fpdfsdk/fpdfeditpage.cpp
 @@ -11,12 +11,14 @@
@@ -192,7 +217,7 @@ index ca2cf3f..f86201d 100644
  #include "core/fpdfapi/page/cpdf_shadingobject.h"
  #include "core/fpdfapi/parser/cpdf_array.h"
  #include "core/fpdfapi/parser/cpdf_document.h"
-@@ -363,3 +365,157 @@ FPDFPageObj_GetBounds(FPDF_PAGEOBJECT pageObject,
+@@ -363,3 +365,187 @@ FPDFPageObj_GetBounds(FPDF_PAGEOBJECT pageObject,
    *top = bbox.top;
    return true;
  }
@@ -350,6 +375,36 @@ index ca2cf3f..f86201d 100644
 +
 +  return true;
 +}
++
++FPDF_EXPORT int FPDF_CALLCONV
++FPDFFormObj_CountSubObjects(FPDF_PAGEOBJECT form_object)
++{
++  CPDF_FormObject* pFrmObj = CPDFFormObjectFromFPDFPageObject(form_object);
++  if (pFrmObj)
++  {
++    const CPDF_PageObjectList* pObjectList = pFrmObj->form()->GetPageObjectList();
++    if (pObjectList)
++        return pObjectList->size();
++  }
++
++  return 0;
++}
++
++FPDF_EXPORT FPDF_PAGEOBJECT FPDF_CALLCONV
++FPDFFormObj_GetSubObject(FPDF_PAGEOBJECT form_object, int index)
++{
++  CPDF_FormObject* pFrmObj = CPDFFormObjectFromFPDFPageObject(form_object);
++  if (pFrmObj)
++  {
++    const CFX_Matrix& matrix = pFrmObj->form_matrix();
++    fprintf(stderr, "Form matrix a: %f, b: %f, c: %f, d: %f, e: %f, f: %f\n", matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, matrix.f);
++    const CPDF_PageObjectList* pObjectList = pFrmObj->form()->GetPageObjectList();
++    if (pObjectList)
++        return pObjectList->GetPageObjectByIndex(index);
++  }
++
++  return nullptr;
++}
 diff --git a/fpdfsdk/fpdfeditpath.cpp b/fpdfsdk/fpdfeditpath.cpp
 index a291987..0202284 100644
 --- a/fpdfsdk/fpdfeditpath.cpp
@@ -462,10 +517,10 @@ index 68bf4f8..e073b20 100644
                                                          int index,
                                                          double* left,
 diff --git a/fpdfsdk/fpdfview.cpp b/fpdfsdk/fpdfview.cpp
-index e890aa0..709bea3 100644
+index e890aa0..b62283f 100644
 --- a/fpdfsdk/fpdfview.cpp
 +++ b/fpdfsdk/fpdfview.cpp
-@@ -336,6 +336,11 @@ CPDF_Page* CPDFPageFromFPDFPage(FPDF_PAGE page) {
+@@ -336,6 +336,16 @@ CPDF_Page* CPDFPageFromFPDFPage(FPDF_PAGE page) {
  #endif  // PDF_ENABLE_XFA
  }
  
@@ -474,32 +529,40 @@ index e890aa0..709bea3 100644
 +  return obj ? obj->AsText() : nullptr;
 +}
 +
++CPDF_FormObject* CPDFFormObjectFromFPDFPageObject(FPDF_PAGEOBJECT page_object) {
++  auto* obj = CPDFPageObjectFromFPDFPageObject(page_object);
++  return obj ? obj->AsForm() : nullptr;
++}
++
  CPDF_PathObject* CPDFPathObjectFromFPDFPageObject(FPDF_PAGEOBJECT page_object) {
    auto* obj = CPDFPageObjectFromFPDFPageObject(page_object);
    return obj ? obj->AsPath() : nullptr;
 diff --git a/fpdfsdk/fsdk_define.h b/fpdfsdk/fsdk_define.h
-index 77c2315..db3e734 100644
+index 77c2315..b61f447 100644
 --- a/fpdfsdk/fsdk_define.h
 +++ b/fpdfsdk/fsdk_define.h
-@@ -25,6 +25,7 @@ class CPDF_Annot;
+@@ -25,6 +25,8 @@ class CPDF_Annot;
  class CPDF_Page;
  class CPDF_PageObject;
  class CPDF_PageRenderContext;
 +class CPDF_TextObject;
++class CPDF_FormObject;
  class CPDF_PathObject;
  class CPDF_Stream;
  class IFSDK_PAUSE_Adapter;
-@@ -65,6 +66,8 @@ FPDF_DOCUMENT FPDFDocumentFromCPDFDocument(CPDF_Document* doc);
+@@ -65,6 +67,10 @@ FPDF_DOCUMENT FPDFDocumentFromCPDFDocument(CPDF_Document* doc);
  
  CPDF_Page* CPDFPageFromFPDFPage(FPDF_PAGE page);
  
 +CPDF_TextObject* CPDFTextObjectFromFPDFPageObject(FPDF_PAGEOBJECT page_object);
 +
++CPDF_FormObject* CPDFFormObjectFromFPDFPageObject(FPDF_PAGEOBJECT page_object);
++
  CPDF_PathObject* CPDFPathObjectFromFPDFPageObject(FPDF_PAGEOBJECT page_object);
  
  CPDF_PageObject* CPDFPageObjectFromFPDFPageObject(FPDF_PAGEOBJECT page_object);
 diff --git a/public/fpdf_edit.h b/public/fpdf_edit.h
-index 54735a3..c0231c2 100644
+index 54735a3..1b933bb 100644
 --- a/public/fpdf_edit.h
 +++ b/public/fpdf_edit.h
 @@ -520,6 +520,15 @@ FPDFPath_GetStrokeColor(FPDF_PAGEOBJECT path,
@@ -555,7 +618,7 @@ index 54735a3..c0231c2 100644
  // Create a new text object using one of the standard PDF fonts.
  //
  // document   - handle to the document.
-@@ -761,6 +800,77 @@ FPDFPageObj_CreateTextObj(FPDF_DOCUMENT document,
+@@ -761,6 +800,94 @@ FPDFPageObj_CreateTextObj(FPDF_DOCUMENT document,
                            FPDF_FONT font,
                            float font_size);
  
@@ -630,6 +693,23 @@ index 54735a3..c0231c2 100644
 +                     unsigned int* B,
 +                     unsigned int* A);
 +
++// Get number of page objects inside the form object.
++//
++// form_object - Handle to a form object. Returned by FPDFPage_GetObject.
++// Return value:
++// The number of the page objects.
++FPDF_EXPORT int FPDF_CALLCONV
++FPDFFormObj_CountSubObjects(FPDF_PAGEOBJECT form_object);
++
++// Get the page object from a form object.
++//
++// form_object - Handle to a form object. Returned by FPDFPage_GetObject.
++// index - The index of a page object.
++// Return value:
++// The handle of the page object. Null for failed.
++FPDF_EXPORT FPDF_PAGEOBJECT FPDF_CALLCONV
++FPDFFormObj_GetSubObject(FPDF_PAGEOBJECT form_object, int index);
++
  #ifdef __cplusplus
  }  // extern "C"
  #endif  // __cplusplus
diff --git a/svx/source/svdraw/svdpdf.cxx b/svx/source/svdraw/svdpdf.cxx
index 58568666bf5a..c1e9734a5d8e 100644
--- a/svx/source/svdraw/svdpdf.cxx
+++ b/svx/source/svdraw/svdpdf.cxx
@@ -229,32 +229,7 @@ void ImpSdrPdfImport::DoLoopActions(SvdProgressInfo* pProgrInfo, sal_uInt32* pAc
         for (int nPageObjectIndex = 0; nPageObjectIndex < nPageObjectCount; ++nPageObjectIndex)
         {
             FPDF_PAGEOBJECT pPageObject = FPDFPage_GetObject(pPdfPage, nPageObjectIndex);
-            if (pPageObject == nullptr)
-                continue;
-
-            const int nPageObjectType = FPDFPageObj_GetType(pPageObject);
-            switch (nPageObjectType)
-            {
-                case FPDF_PAGEOBJ_TEXT:
-                    ImportText(pPageObject, nPageObjectIndex);
-                    break;
-                case FPDF_PAGEOBJ_PATH:
-                    ImportPath(pPageObject, nPageObjectIndex);
-                    break;
-                case FPDF_PAGEOBJ_IMAGE:
-                    ImportImage(pPageObject, nPageObjectIndex);
-                    break;
-                case FPDF_PAGEOBJ_SHADING:
-                    SAL_WARN("sd.filter", "Got page object SHADING: " << nPageObjectIndex);
-                    break;
-                case FPDF_PAGEOBJ_FORM:
-                    SAL_WARN("sd.filter", "Got page object FORM: " << nPageObjectIndex);
-                    break;
-                default:
-                    SAL_WARN("sd.filter", "Unknown PDF page object type: "
-                                              << nPageObjectType << ": " << nPageObjectIndex);
-                    break;
-            }
+            ImportPdfObject(pPageObject, nPageObjectIndex);
         }
 
 #if 0
@@ -1015,6 +990,49 @@ void ImpSdrPdfImport::checkClip()
 }
 
 bool ImpSdrPdfImport::isClip() const { return !maClip.getB2DRange().isEmpty(); }
+
+void ImpSdrPdfImport::ImportPdfObject(FPDF_PAGEOBJECT pPageObject, int nPageObjectIndex)
+{
+    if (pPageObject == nullptr)
+        return;
+
+    const int nPageObjectType = FPDFPageObj_GetType(pPageObject);
+    switch (nPageObjectType)
+    {
+        case FPDF_PAGEOBJ_TEXT:
+            ImportText(pPageObject, nPageObjectIndex);
+            break;
+        case FPDF_PAGEOBJ_PATH:
+            ImportPath(pPageObject, nPageObjectIndex);
+            break;
+        case FPDF_PAGEOBJ_IMAGE:
+            ImportImage(pPageObject, nPageObjectIndex);
+            break;
+        case FPDF_PAGEOBJ_SHADING:
+            SAL_WARN("sd.filter", "Got page object SHADING: " << nPageObjectIndex);
+            break;
+        case FPDF_PAGEOBJ_FORM:
+            ImportForm(pPageObject, nPageObjectIndex);
+            break;
+        default:
+            SAL_WARN("sd.filter", "Unknown PDF page object #" << nPageObjectIndex
+                                                              << " of type: " << nPageObjectType);
+            break;
+    }
+}
+
+void ImpSdrPdfImport::ImportForm(FPDF_PAGEOBJECT pPageObject, int nPageObjectIndex)
+{
+    SAL_WARN("sd.filter", "Got page object FORM: " << nPageObjectIndex);
+
+    const int nCount = FPDFFormObj_CountSubObjects(pPageObject);
+    for (int nIndex = 0; nIndex < nCount; ++nIndex)
+    {
+        FPDF_PAGEOBJECT pFormObject = FPDFFormObj_GetSubObject(pPageObject, nIndex);
+        ImportPdfObject(pFormObject, -1);
+    }
+}
+
 void ImpSdrPdfImport::ImportText(FPDF_PAGEOBJECT pPageObject, int nPageObjectIndex)
 {
     SAL_WARN("sd.filter", "Got page object TEXT: " << nPageObjectIndex);
diff --git a/svx/source/svdraw/svdpdf.hxx b/svx/source/svdraw/svdpdf.hxx
index 2063788290d9..d98f97d8cd09 100644
--- a/svx/source/svdraw/svdpdf.hxx
+++ b/svx/source/svdraw/svdpdf.hxx
@@ -100,13 +100,14 @@ class ImpSdrPdfImport final
     void checkClip();
     bool isClip() const;
 
+    void ImportPdfObject(FPDF_PAGEOBJECT pPageObject, int nPageObjectIndex);
+    void ImportForm(FPDF_PAGEOBJECT pPageObject, int nPageObjectIndex);
     void ImportImage(FPDF_PAGEOBJECT pPageObject, int nPageObjectIndex);
-    void SetupPageScale(const double dPageWidth, const double dPageHeight);
-
     void ImportPath(FPDF_PAGEOBJECT pPageObject, int nPageObjectIndex);
-
     void ImportText(FPDF_PAGEOBJECT pPageObject, int nPageObjectIndex);
     void ImportText(const Point& rPos, const Size& rSize, const OUString& rStr);
+
+    void SetupPageScale(const double dPageWidth, const double dPageHeight);
     void SetAttributes(SdrObject* pObj, bool bForceTextAttr = false);
     void InsertObj(SdrObject* pObj, bool bScale = true);
     void MapScaling();
commit d9613326d8ed09899940c1bbfcd01f273fe9c0f5
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Sun Apr 15 20:32:52 2018 -0400

    sd: support breaking any PDF page
    
    Change-Id: Ifa5f58163bef209a988fc0f88e2b609b1973e0d4

diff --git a/svx/source/svdraw/svdpdf.cxx b/svx/source/svdraw/svdpdf.cxx
index 48ab0641ffcb..58568666bf5a 100644
--- a/svx/source/svdraw/svdpdf.cxx
+++ b/svx/source/svdraw/svdpdf.cxx
@@ -207,16 +207,17 @@ ImpSdrPdfImport::~ImpSdrPdfImport()
     FPDF_DestroyLibrary();
 }
 
-void ImpSdrPdfImport::DoLoopActions(SvdProgressInfo* pProgrInfo, sal_uInt32* pActionsToReport)
+void ImpSdrPdfImport::DoLoopActions(SvdProgressInfo* pProgrInfo, sal_uInt32* pActionsToReport,
+                                    int nPageIndex)
 {
     const int nPageCount = FPDF_GetPageCount(mpPdfDocument);
-    SAL_WARN("sd.filter", "Pages: " << nPageCount);
-    for (size_t nPageIndex = 0; nPageIndex <= 0; ++nPageIndex)
+    SAL_WARN("sd.filter", "Importing page " << nPageIndex << " of " << nPageCount);
+    if (nPageCount > 0 && nPageIndex >= 0 && nPageIndex < nPageCount)
     {
         // Render next page.
         FPDF_PAGE pPdfPage = FPDF_LoadPage(mpPdfDocument, nPageIndex);
         if (pPdfPage == nullptr)
-            break;
+            return;
 
         const double dPageWidth = FPDF_GetPageWidth(pPdfPage);
         const double dPageHeight = FPDF_GetPageHeight(pPdfPage);
@@ -482,7 +483,7 @@ void ImpSdrPdfImport::SetupPageScale(const double dPageWidth, const double dPage
                                      << "(" << mfScaleY << ")");
 }
 
-size_t ImpSdrPdfImport::DoImport(SdrObjList& rOL, size_t nInsPos, size_t nPageNumber,
+size_t ImpSdrPdfImport::DoImport(SdrObjList& rOL, size_t nInsPos, int nPageNumber,
                                  SvdProgressInfo* pProgrInfo)
 {
     if (pProgrInfo)
@@ -493,7 +494,7 @@ size_t ImpSdrPdfImport::DoImport(SdrObjList& rOL, size_t nInsPos, size_t nPageNu
     sal_uInt32 nActionsToReport(0);
 
     // execute
-    DoLoopActions(pProgrInfo, &nActionsToReport);
+    DoLoopActions(pProgrInfo, &nActionsToReport, nPageNumber);
 
     if (pProgrInfo)
     {
diff --git a/svx/source/svdraw/svdpdf.hxx b/svx/source/svdraw/svdpdf.hxx
index dc62b234a688..2063788290d9 100644
--- a/svx/source/svdraw/svdpdf.hxx
+++ b/svx/source/svdraw/svdpdf.hxx
@@ -115,7 +115,7 @@ class ImpSdrPdfImport final
     bool CheckLastLineMerge(const basegfx::B2DPolygon& rSrcPoly);
     bool CheckLastPolyLineAndFillMerge(const basegfx::B2DPolyPolygon& rPolyPolygon);
 
-    void DoLoopActions(SvdProgressInfo* pProgrInfo, sal_uInt32* pActionsToReport);
+    void DoLoopActions(SvdProgressInfo* pProgrInfo, sal_uInt32* pActionsToReport, int nPageIndex);
 
     // Copy assignment is forbidden and not implemented.
     ImpSdrPdfImport(const ImpSdrPdfImport&) = delete;
@@ -128,7 +128,7 @@ public:
 
     int GetPageCount() const { return mnPageCount; }
 
-    size_t DoImport(SdrObjList& rDestList, size_t nInsPos, size_t nPageNumber,
+    size_t DoImport(SdrObjList& rDestList, size_t nInsPos, int nPageNumber,
                     SvdProgressInfo* pProgrInfo = nullptr);
 };
 
diff --git a/vcl/source/gdi/impgraph.cxx b/vcl/source/gdi/impgraph.cxx
index efa6420864d4..c2e4d5d21a55 100644
--- a/vcl/source/gdi/impgraph.cxx
+++ b/vcl/source/gdi/impgraph.cxx
@@ -120,7 +120,7 @@ ImpGraphic::ImpGraphic(const ImpGraphic& rImpGraphic)
     , mnSizeBytes(rImpGraphic.mnSizeBytes)
     , mbSwapOut(rImpGraphic.mbSwapOut)
     , mbDummyContext(rImpGraphic.mbDummyContext)
-    , mnPageNumber(-1)
+    , mnPageNumber(rImpGraphic.mnPageNumber)
     , maVectorGraphicData(rImpGraphic.maVectorGraphicData)
     , mpPdfData(rImpGraphic.mpPdfData)
     , msOriginURL(rImpGraphic.msOriginURL)
@@ -147,7 +147,7 @@ ImpGraphic::ImpGraphic(ImpGraphic&& rImpGraphic)
     , mnSizeBytes(rImpGraphic.mnSizeBytes)
     , mbSwapOut(rImpGraphic.mbSwapOut)
     , mbDummyContext(rImpGraphic.mbDummyContext)
-    , mnPageNumber(-1)
+    , mnPageNumber(rImpGraphic.mnPageNumber)
     , maVectorGraphicData(std::move(rImpGraphic.maVectorGraphicData))
     , mpPdfData(std::move(rImpGraphic.mpPdfData))
     , msOriginURL(rImpGraphic.msOriginURL)
commit 405504b9e902893f254e4f248ee014e1044cf197
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Sun Apr 15 19:44:12 2018 -0400

    sd: pdf: really share the PDF stream
    
    Change-Id: I5b25b3532912c7982a6db9dcc80fb7a72a41af38

diff --git a/sd/source/filter/pdf/sdpdffilter.cxx b/sd/source/filter/pdf/sdpdffilter.cxx
index 35f2bee5a791..9e180c9ea25f 100644
--- a/sd/source/filter/pdf/sdpdffilter.cxx
+++ b/sd/source/filter/pdf/sdpdffilter.cxx
@@ -110,6 +110,7 @@ bool SdPdfFilter::Import()
     std::unique_ptr<sal_uInt8[]> pGraphicContent(new sal_uInt8[nGraphicContentSize]);
     memcpy(pGraphicContent.get(), aPdfData.get(), nGraphicContentSize);
     GfxLink aGfxLink(std::move(pGraphicContent), nGraphicContentSize, GfxLinkType::NativePdf);
+    auto pPdfData = std::make_shared<uno::Sequence<sal_Int8>>(aPdfData);
 
     mrDocument.CreateFirstPages();
     for (size_t i = 0; i < aBitmaps.size() - 1; ++i)
@@ -122,7 +123,7 @@ bool SdPdfFilter::Import()
     {
         // Create the Graphic and link the original PDF stream.
         Graphic aGraphic(aBitmap);
-        aGraphic.setPdfData(std::make_shared<uno::Sequence<sal_Int8>>(aPdfData));
+        aGraphic.setPdfData(pPdfData);
         aGraphic.setPageNumber(nPageNumber);
         aGraphic.SetLink(aGfxLink);
 
commit df1ce94b433f2ff9e3123f5debdc6ba622f23e73
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Sun Apr 15 11:11:33 2018 -0400

    svx: path line width is given as full thickness in PDF
    
    Change-Id: I728d962ea65ad1671e3b4c76034d396bee84228e

diff --git a/svx/source/svdraw/svdpdf.cxx b/svx/source/svdraw/svdpdf.cxx
index 8dcc2f116069..48ab0641ffcb 100644
--- a/svx/source/svdraw/svdpdf.cxx
+++ b/svx/source/svdraw/svdpdf.cxx
@@ -1391,6 +1391,7 @@ void ImpSdrPdfImport::ImportPath(FPDF_PAGEOBJECT pPageObject, int nPageObjectInd
     const double dWidth = fabs(sqrt2(a, c) * fWidth);
     SAL_WARN("sd.filter", "Path Stroke Width scaled: " << dWidth);
     mnLineWidth = lcl_ToLogic(lcl_PointToPixel(dWidth));
+    mnLineWidth /= 2;
 
     unsigned int nR;
     unsigned int nG;
commit 6f32334f9a486ef9c043474a27da8e52321bacc8
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Sun Apr 15 10:51:39 2018 -0400

    svx: support color text for imported PDFs
    
    Change-Id: I01cba9456b37bd7a63c823bbe332d686f7ede389

diff --git a/external/pdfium/edit.patch.1 b/external/pdfium/edit.patch.1
index 96e0fa4f9725..02e0b44c3e87 100644
--- a/external/pdfium/edit.patch.1
+++ b/external/pdfium/edit.patch.1
@@ -1,12 +1,73 @@
+diff --git a/core/fpdfapi/page/cpdf_colorstate.cpp b/core/fpdfapi/page/cpdf_colorstate.cpp
+index 693fcf1..d3e1202 100644
+--- a/core/fpdfapi/page/cpdf_colorstate.cpp
++++ b/core/fpdfapi/page/cpdf_colorstate.cpp
+@@ -74,6 +74,8 @@ void CPDF_ColorState::SetFillColor(CPDF_ColorSpace* pCS,
+                                    uint32_t nValues) {
+   ColorData* pData = m_Ref.GetPrivateCopy();
+   SetColor(pData->m_FillColor, pData->m_FillRGB, pCS, pValue, nValues);
++  if (pData->m_FillRGB != 0 && pData->m_FillRGB != 0xFFFFFFFF)
++    fprintf(stderr, "COLOR FILL!!!!> %x\n", pData->m_FillRGB);
+ }
+ 
+ void CPDF_ColorState::SetStrokeColor(CPDF_ColorSpace* pCS,
+@@ -81,6 +83,8 @@ void CPDF_ColorState::SetStrokeColor(CPDF_ColorSpace* pCS,
+                                      uint32_t nValues) {
+   ColorData* pData = m_Ref.GetPrivateCopy();
+   SetColor(pData->m_StrokeColor, pData->m_StrokeRGB, pCS, pValue, nValues);
++  if (pData->m_StrokeRGB != 0 && pData->m_StrokeRGB != 0xFFFFFFFF)
++    fprintf(stderr, "COLOR STROkE!!!!> %x\n", pData->m_StrokeRGB);
+ }
+ 
+ void CPDF_ColorState::SetFillPattern(CPDF_Pattern* pPattern,
+@@ -99,6 +103,8 @@ void CPDF_ColorState::SetFillPattern(CPDF_Pattern* pPattern,
+     }
+   }
+   pData->m_FillRGB = ret ? FXSYS_RGB(R, G, B) : 0xFFFFFFFF;
++  if (pData->m_FillRGB != 0 && pData->m_FillRGB != 0xFFFFFFFF)
++    fprintf(stderr, "COLOR FILL!!!!> %x\n", pData->m_FillRGB);
+ }
+ 
+ void CPDF_ColorState::SetStrokePattern(CPDF_Pattern* pPattern,
+@@ -118,13 +124,15 @@ void CPDF_ColorState::SetStrokePattern(CPDF_Pattern* pPattern,
+   }
+   pData->m_StrokeRGB =
+       pData->m_StrokeColor.GetRGB(&R, &G, &B) ? FXSYS_RGB(R, G, B) : 0xFFFFFFFF;
++  if (pData->m_StrokeRGB != 0 && pData->m_StrokeRGB != 0xFFFFFFFF)
++    fprintf(stderr, "COLOR STROkE!!!!> %x\n", pData->m_StrokeRGB);
+ }
+ 
+ void CPDF_ColorState::SetColor(CPDF_Color& color,
+                                uint32_t& rgb,
+                                CPDF_ColorSpace* pCS,
+                                float* pValue,
+-                               uint32_t nValues) {
++                               uint32_t nValues) const {
+   if (pCS)
+     color.SetColorSpace(pCS);
+   else if (color.IsNull())
+diff --git a/core/fpdfapi/page/cpdf_colorstate.h b/core/fpdfapi/page/cpdf_colorstate.h
+index 9619051..dbe9c47 100644
+--- a/core/fpdfapi/page/cpdf_colorstate.h
++++ b/core/fpdfapi/page/cpdf_colorstate.h
+@@ -64,7 +64,7 @@ class CPDF_ColorState {
+                 uint32_t& rgb,
+                 CPDF_ColorSpace* pCS,
+                 float* pValue,
+-                uint32_t nValues);
++                uint32_t nValues) const;
+ 
+   SharedCopyOnWrite<ColorData> m_Ref;
+ };
 diff --git a/core/fpdfapi/page/cpdf_imageobject.cpp b/core/fpdfapi/page/cpdf_imageobject.cpp
-index 3b5a740..58ef90a 100644
+index 3b5a740..416d82d 100644
 --- a/core/fpdfapi/page/cpdf_imageobject.cpp
 +++ b/core/fpdfapi/page/cpdf_imageobject.cpp
 @@ -43,6 +43,7 @@ const CPDF_ImageObject* CPDF_ImageObject::AsImage() const {
  void CPDF_ImageObject::CalcBoundingBox() {
    std::tie(m_Left, m_Right, m_Top, m_Bottom) =
        m_Matrix.TransformRect(0.f, 1.f, 1.f, 0.f);
-+    fprintf(stderr, "Image BB: %f, %f, %f, %f\n", m_Left, m_Right, m_Top, m_Bottom);
++    // fprintf(stderr, "Image BB: %f, %f, %f, %f\n", m_Left, m_Right, m_Top, m_Bottom);
  }
  
  void CPDF_ImageObject::SetImage(const RetainPtr<CPDF_Image>& pImage) {
@@ -62,14 +123,14 @@ index 0a01ae0..6947e3a 100644
      DrawTextPathWithPattern(textobj, pObj2Device, pFont, font_size,
                              &text_matrix, bFill, bStroke);
 diff --git a/core/fxge/cfx_pathdata.cpp b/core/fxge/cfx_pathdata.cpp
-index 4ac5cf6..28ea81f 100644
+index 4ac5cf6..4286de4 100644
 --- a/core/fxge/cfx_pathdata.cpp
 +++ b/core/fxge/cfx_pathdata.cpp
 @@ -199,6 +199,7 @@ void CFX_PathData::Append(const CFX_PathData* pSrc, const CFX_Matrix* pMatrix) {
  void CFX_PathData::AppendPoint(const CFX_PointF& point,
                                 FXPT_TYPE type,
                                 bool closeFigure) {
-+  fprintf(stderr, "Append: %f, %f (%s)\n", point.x, point.y, closeFigure ? "CLOSE" : "OPEN");
++//   fprintf(stderr, "Append: %f, %f (%s)\n", point.x, point.y, closeFigure ? "CLOSE" : "OPEN");
    m_Points.push_back(FX_PATHPOINT(point, type, closeFigure));
  }
  
@@ -77,7 +138,7 @@ index 4ac5cf6..28ea81f 100644
  void CFX_PathData::Transform(const CFX_Matrix* pMatrix) {
    if (!pMatrix)
      return;
-+  fprintf(stderr, "XForm: %f, %f %f, %f, %f, %f\n", pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d, pMatrix->e, pMatrix->f);
++//   fprintf(stderr, "XForm: %f, %f %f, %f, %f, %f\n", pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d, pMatrix->e, pMatrix->f);
    for (auto& point : m_Points)
      point.m_Point = pMatrix->Transform(point.m_Point);
  }
@@ -113,7 +174,7 @@ index 0d7ba56..37bdf99 100644
  FPDFImageObj_GetImageDataDecoded(FPDF_PAGEOBJECT image_object,
                                   void* buffer,
 diff --git a/fpdfsdk/fpdfeditpage.cpp b/fpdfsdk/fpdfeditpage.cpp
-index ca2cf3f..e7d633f 100644
+index ca2cf3f..f86201d 100644
 --- a/fpdfsdk/fpdfeditpage.cpp
 +++ b/fpdfsdk/fpdfeditpage.cpp
 @@ -11,12 +11,14 @@
@@ -131,7 +192,7 @@ index ca2cf3f..e7d633f 100644
  #include "core/fpdfapi/page/cpdf_shadingobject.h"
  #include "core/fpdfapi/parser/cpdf_array.h"
  #include "core/fpdfapi/parser/cpdf_document.h"
-@@ -363,3 +365,128 @@ FPDFPageObj_GetBounds(FPDF_PAGEOBJECT pageObject,
+@@ -363,3 +365,157 @@ FPDFPageObj_GetBounds(FPDF_PAGEOBJECT pageObject,
    *top = bbox.top;
    return true;
  }
@@ -242,22 +303,51 @@ index ca2cf3f..e7d633f 100644
 +}
 +
 +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
-+FPDFTextObj_GetStrokeColor(FPDF_PAGEOBJECT text_object,
-+                           unsigned int* R,
-+                           unsigned int* G,
-+                           unsigned int* B,
-+                           unsigned int* A)
++FPDFTextObj_GetColor(FPDF_PAGEOBJECT text_object,
++                     unsigned int* R,
++                     unsigned int* G,
++                     unsigned int* B,
++                     unsigned int* A)
 +{
 +  CPDF_TextObject* pTxtObj = CPDFTextObjectFromFPDFPageObject(text_object);
 +  if (!pTxtObj || !R || !G || !B || !A)
 +    return false;
 +
-+  const uint32_t strokeRGB = pTxtObj->m_ColorState.GetStrokeRGB();
-+  *R = FXSYS_GetRValue(strokeRGB);
-+  *G = FXSYS_GetGValue(strokeRGB);
-+  *B = FXSYS_GetBValue(strokeRGB);
++  bool bFill = false;
++  bool bStroke = false;
++  CPDF_Font* pFont = pTxtObj->m_TextState.GetFont();
++  const TextRenderingMode text_render_mode = pTxtObj->m_TextState.GetTextMode();
++  switch (text_render_mode)
++  {
++    case TextRenderingMode::MODE_FILL:
++    case TextRenderingMode::MODE_FILL_CLIP:
++      bFill = true;
++      break;
++    case TextRenderingMode::MODE_STROKE:
++    case TextRenderingMode::MODE_STROKE_CLIP:
++      if (pFont->GetFace())
++        bStroke = true;
++      else
++        bFill = true;
++      break;
++    case TextRenderingMode::MODE_FILL_STROKE:
++    case TextRenderingMode::MODE_FILL_STROKE_CLIP:
++      bFill = true;
++      if (pFont->GetFace())
++        bStroke = true;
++      break;
++    case TextRenderingMode::MODE_INVISIBLE:
++    case TextRenderingMode::MODE_CLIP:
++      return false;
++  }
++
++  const uint32_t RGB = bStroke ? pTxtObj->m_ColorState.GetStrokeRGB() : pTxtObj->m_ColorState.GetFillRGB();
++  *R = FXSYS_GetRValue(RGB);
++  *G = FXSYS_GetGValue(RGB);
++  *B = FXSYS_GetBValue(RGB);
 +  *A = static_cast<unsigned int>(
 +      (pTxtObj->m_GeneralState.GetStrokeAlpha() * 255.f) + 0.5f);
++
 +  return true;
 +}
 diff --git a/fpdfsdk/fpdfeditpath.cpp b/fpdfsdk/fpdfeditpath.cpp
@@ -409,7 +499,7 @@ index 77c2315..db3e734 100644
  
  CPDF_PageObject* CPDFPageObjectFromFPDFPageObject(FPDF_PAGEOBJECT page_object);
 diff --git a/public/fpdf_edit.h b/public/fpdf_edit.h
-index 54735a3..c86b638 100644
+index 54735a3..c0231c2 100644
 --- a/public/fpdf_edit.h
 +++ b/public/fpdf_edit.h
 @@ -520,6 +520,15 @@ FPDFPath_GetStrokeColor(FPDF_PAGEOBJECT path,
@@ -534,11 +624,11 @@ index 54735a3..c86b638 100644
 +//
 +// Returns TRUE on success.
 +FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
-+FPDFTextObj_GetStrokeColor(FPDF_PAGEOBJECT text_object,
-+                           unsigned int* R,
-+                           unsigned int* G,
-+                           unsigned int* B,
-+                           unsigned int* A);
++FPDFTextObj_GetColor(FPDF_PAGEOBJECT text_object,
++                     unsigned int* R,
++                     unsigned int* G,
++                     unsigned int* B,
++                     unsigned int* A);
 +
  #ifdef __cplusplus
  }  // extern "C"
diff --git a/svx/source/svdraw/svdpdf.cxx b/svx/source/svdraw/svdpdf.cxx
index 0330586c3afa..8dcc2f116069 100644
--- a/svx/source/svdraw/svdpdf.cxx
+++ b/svx/source/svdraw/svdpdf.cxx
@@ -1070,13 +1070,25 @@ void ImpSdrPdfImport::ImportText(FPDF_PAGEOBJECT pPageObject, int nPageObjectInd
     dFontSizeV = lcl_ToLogic(dFontSizeV);
     SAL_WARN("sd.filter", "Got Logic Font Size H: " << dFontSizeH << ", V: " << dFontSizeV);
 
+    const Size aFontSize(dFontSizeH, dFontSizeV);
+    vcl::Font aFnt = mpVD->GetFont();
+    if (aFontSize != aFnt.GetFontSize())
+    {
+        aFnt.SetFontSize(aFontSize);
+        mpVD->SetFont(aFnt);
+        mbFntDirty = true;
+    }
+
+    Color aTextColor(COL_TRANSPARENT);
     unsigned int nR, nG, nB, nA;
-    if (FPDFTextObj_GetStrokeColor(pPageObject, &nR, &nG, &nB, &nA))
-        mpVD->SetTextColor(Color(nR, nG, nB));
+    if (FPDFTextObj_GetColor(pPageObject, &nR, &nG, &nB, &nA))
+        aTextColor = Color(nR, nG, nB);
 
-    vcl::Font aFnt = mpVD->GetFont();
-    aFnt.SetFontSize(Size(dFontSizeH, dFontSizeV));
-    mpVD->SetFont(aFnt);
+    if (aTextColor != mpVD->GetTextColor())
+    {
+        mpVD->SetTextColor(aTextColor);
+        mbFntDirty = true;
+    }
 
     ImportText(aRect.TopLeft(), aRect.GetSize(), sText);
 }
@@ -1408,14 +1420,14 @@ void ImpSdrPdfImport::ImportPath(FPDF_PAGEOBJECT pPageObject, int nPageObjectInd
 Point ImpSdrPdfImport::PointsToLogic(double x, double y) const
 {
     y = correctVertOrigin(y);
-    SAL_WARN("sd.filter", "Corrected point x: " << x << ", y: " << y);
+    // SAL_WARN("sd.filter", "Corrected point x: " << x << ", y: " << y);
     x = lcl_PointToPixel(x);
     y = lcl_PointToPixel(y);
 
-    SAL_WARN("sd.filter", "Pixel point x: " << x << ", y: " << y);
+    // SAL_WARN("sd.filter", "Pixel point x: " << x << ", y: " << y);
 
     Point aPos(lcl_ToLogic(x), lcl_ToLogic(y));
-    SAL_WARN("sd.filter", "Logical Pos: " << aPos);
+    // SAL_WARN("sd.filter", "Logical Pos: " << aPos);
 
     return aPos;
 }
@@ -1425,24 +1437,20 @@ tools::Rectangle ImpSdrPdfImport::PointsToLogic(double left, double right, doubl
 {
     top = correctVertOrigin(top);
     bottom = correctVertOrigin(bottom);
-    SAL_WARN("sd.filter", "Corrected bounds left: " << left << ", right: " << right
-                                                    << ", top: " << top << ", bottom: " << bottom);
+    // SAL_WARN("sd.filter", "Corrected bounds left: " << left << ", right: " << right
+    //                                                 << ", top: " << top << ", bottom: " << bottom);
     left = lcl_PointToPixel(left);
     right = lcl_PointToPixel(right);
     top = lcl_PointToPixel(top);
     bottom = lcl_PointToPixel(bottom);
-    // if (top > bottom)
-    //     std::swap(top, bottom);
-    // if (left > right)
-    //     std::swap(left, right);
 
-    SAL_WARN("sd.filter", "Pixel bounds left: " << left << ", right: " << right << ", top: " << top
-                                                << ", bottom: " << bottom);
+    // SAL_WARN("sd.filter", "Pixel bounds left: " << left << ", right: " << right << ", top: " << top
+    //                                             << ", bottom: " << bottom);
 
     Point aPos(lcl_ToLogic(left), lcl_ToLogic(top));
     Size aSize(lcl_ToLogic(right - left), lcl_ToLogic(bottom - top));
     tools::Rectangle aRect(aPos, aSize);
-    SAL_WARN("sd.filter", "Logical BBox: " << aRect);
+    // SAL_WARN("sd.filter", "Logical BBox: " << aRect);
 
     return aRect;
 }
commit 5e636ada3b89b05fecba0b916ec791383e1555ae
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Sat Apr 14 16:20:11 2018 -0400

    svx: more accurate PDF imported text size
    
    Change-Id: I22880afdd9d36d9096003d86bba15098b465e0b3

diff --git a/svx/source/svdraw/svdpdf.cxx b/svx/source/svdraw/svdpdf.cxx
index 1136fb30c849..0330586c3afa 100644
--- a/svx/source/svdraw/svdpdf.cxx
+++ b/svx/source/svdraw/svdpdf.cxx
@@ -1034,6 +1034,8 @@ void ImpSdrPdfImport::ImportText(FPDF_PAGEOBJECT pPageObject, int nPageObjectInd
         return;
     }
 
+    const tools::Rectangle aRect = PointsToLogic(left, right, top, bottom);
+
     const int nChars = FPDFTextObj_CountChars(pPageObject);
     std::unique_ptr<sal_Unicode[]> pText(new sal_Unicode[nChars + 1]); // + terminating null
 
@@ -1054,6 +1056,7 @@ void ImpSdrPdfImport::ImportText(FPDF_PAGEOBJECT pPageObject, int nPageObjectInd
                                                     << ", " << e << ", " << f << ')');
     Point aPos = PointsToLogic(e, f);
     SAL_WARN("sd.filter", "Got TEXT origin: " << aPos);
+    SAL_WARN("sd.filter", "Got TEXT Bounds: " << aRect);
 
     const double dFontSize = FPDFTextObj_GetFontSize(pPageObject);
     double dFontSizeH = fabs(sqrt2(a, c) * dFontSize);
@@ -1075,10 +1078,10 @@ void ImpSdrPdfImport::ImportText(FPDF_PAGEOBJECT pPageObject, int nPageObjectInd
     aFnt.SetFontSize(Size(dFontSizeH, dFontSizeV));
     mpVD->SetFont(aFnt);
 
-    ImportText(aPos, sText);
+    ImportText(aRect.TopLeft(), aRect.GetSize(), sText);
 }
 
-void ImpSdrPdfImport::ImportText(const Point& rPos, const OUString& rStr)
+void ImpSdrPdfImport::ImportText(const Point& rPos, const Size& rSize, const OUString& rStr)
 {
     // calc text box size, add 5% to make it fit safely
 
@@ -1093,6 +1096,7 @@ void ImpSdrPdfImport::ImportText(const Point& rPos, const OUString& rStr)
                                     << ", Scaled: " << nTextWidth << 'x' << nTextHeight);
 
     Point aPos(FRound(rPos.X() * mfScaleX + maOfs.X()), FRound(rPos.Y() * mfScaleY + maOfs.Y()));
+    Size bSize(FRound(rSize.Width() * mfScaleX), FRound(rSize.Height() * mfScaleY));
     Size aSize(nTextWidth, nTextHeight);
 
     if (eAlg == ALIGN_BASELINE)
@@ -1100,8 +1104,11 @@ void ImpSdrPdfImport::ImportText(const Point& rPos, const OUString& rStr)
     else if (eAlg == ALIGN_BOTTOM)
         aPos.AdjustY(-nTextHeight);
 
-    tools::Rectangle aTextRect(aPos, aSize);
-    SAL_WARN("sd.filter", "Text Rect: " << aTextRect);
+    SAL_WARN("sd.filter", "Final POS: " << aPos);
+    SAL_WARN("sd.filter", "Final Text Size: " << aSize);
+    SAL_WARN("sd.filter", "Final Bound Size: " << bSize);
+    tools::Rectangle aTextRect(aPos, bSize);
+    // SAL_WARN("sd.filter", "Text Rect: " << aTextRect);
     SdrRectObj* pText = new SdrRectObj(*mpModel, OBJ_TEXT, aTextRect);
 
     pText->SetMergedItem(makeSdrTextUpperDistItem(0));
diff --git a/svx/source/svdraw/svdpdf.hxx b/svx/source/svdraw/svdpdf.hxx
index 17b926b43619..dc62b234a688 100644
--- a/svx/source/svdraw/svdpdf.hxx
+++ b/svx/source/svdraw/svdpdf.hxx
@@ -106,7 +106,7 @@ class ImpSdrPdfImport final
     void ImportPath(FPDF_PAGEOBJECT pPageObject, int nPageObjectIndex);
 
     void ImportText(FPDF_PAGEOBJECT pPageObject, int nPageObjectIndex);
-    void ImportText(const Point& rPos, const OUString& rStr);
+    void ImportText(const Point& rPos, const Size& rSize, const OUString& rStr);
     void SetAttributes(SdrObject* pObj, bool bForceTextAttr = false);
     void InsertObj(SdrObject* pObj, bool bScale = true);
     void MapScaling();
commit 7330abe573a182e0e2edbcc225a48815edf974f4
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Sat Apr 14 11:40:18 2018 -0400

    svx: correct the positioning of PDF Paths and the stroke width
    
    Change-Id: I5b150721cc1b61b028f282062c1466ef6a67fcae

diff --git a/external/pdfium/edit.patch.1 b/external/pdfium/edit.patch.1
index 982560a3fab7..96e0fa4f9725 100644
--- a/external/pdfium/edit.patch.1
+++ b/external/pdfium/edit.patch.1
@@ -10,6 +10,33 @@ index 3b5a740..58ef90a 100644
  }
  
  void CPDF_ImageObject::SetImage(const RetainPtr<CPDF_Image>& pImage) {
+diff --git a/core/fpdfapi/page/cpdf_page.cpp b/core/fpdfapi/page/cpdf_page.cpp
+index ba93f4a..70d398b 100644
+--- a/core/fpdfapi/page/cpdf_page.cpp
++++ b/core/fpdfapi/page/cpdf_page.cpp
+@@ -35,12 +35,14 @@ CPDF_Page::CPDF_Page(CPDF_Document* pDocument,
+   CFX_FloatRect mediabox = GetBox("MediaBox");
+   if (mediabox.IsEmpty())
+     mediabox = CFX_FloatRect(0, 0, 612, 792);
++  fprintf(stderr, "Page mediabox: %f, %f, %f, %f\n", mediabox.left, mediabox.right, mediabox.top, mediabox.bottom);
+ 
+   m_BBox = GetBox("CropBox");
+   if (m_BBox.IsEmpty())
+     m_BBox = mediabox;
+   else
+     m_BBox.Intersect(mediabox);
++  fprintf(stderr, "Page cropbox: %f, %f, %f, %f\n", m_BBox.left, m_BBox.right, m_BBox.top, m_BBox.bottom);
+ 
+   m_PageSize.width = m_BBox.Width();
+   m_PageSize.height = m_BBox.Height();
+@@ -48,6 +50,7 @@ CPDF_Page::CPDF_Page(CPDF_Document* pDocument,
+   int rotate = GetPageRotation();
+   if (rotate % 2)
+     std::swap(m_PageSize.width, m_PageSize.height);
++  fprintf(stderr, "Page rotate: %d, Page Width: %f, Page Height: %f\n", rotate, m_PageSize.width, m_PageSize.height);
+ 
+   switch (rotate) {
+     case 0:
 diff --git a/core/fpdfapi/page/cpdf_pageobject.cpp b/core/fpdfapi/page/cpdf_pageobject.cpp
 index 8bb5bf5..9b5e2ce 100644
 --- a/core/fpdfapi/page/cpdf_pageobject.cpp
@@ -23,17 +50,37 @@ index 8bb5bf5..9b5e2ce 100644
    return rect.GetOuterRect();
  }
 diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
-index 0a01ae0..fad2920 100644
+index 0a01ae0..6947e3a 100644
 --- a/core/fpdfapi/render/cpdf_renderstatus.cpp
 +++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
 @@ -1793,6 +1793,7 @@ bool CPDF_RenderStatus::ProcessText(CPDF_TextObject* textobj,
      return true;
  
    float font_size = textobj->m_TextState.GetFontSize();
-+  fprintf(stderr, "Font size: %f, matrix a: %f, b: %f, c: %f, d: %f, e: %f, f: %f\n", font_size, text_matrix.a, text_matrix.b, text_matrix.c, text_matrix.d, text_matrix.e, text_matrix.f);
++//   fprintf(stderr, "Font size: %f, matrix a: %f, b: %f, c: %f, d: %f, e: %f, f: %f\n", font_size, text_matrix.a, text_matrix.b, text_matrix.c, text_matrix.d, text_matrix.e, text_matrix.f);
    if (bPattern) {
      DrawTextPathWithPattern(textobj, pObj2Device, pFont, font_size,
                              &text_matrix, bFill, bStroke);
+diff --git a/core/fxge/cfx_pathdata.cpp b/core/fxge/cfx_pathdata.cpp
+index 4ac5cf6..28ea81f 100644
+--- a/core/fxge/cfx_pathdata.cpp
++++ b/core/fxge/cfx_pathdata.cpp
+@@ -199,6 +199,7 @@ void CFX_PathData::Append(const CFX_PathData* pSrc, const CFX_Matrix* pMatrix) {
+ void CFX_PathData::AppendPoint(const CFX_PointF& point,
+                                FXPT_TYPE type,
+                                bool closeFigure) {
++  fprintf(stderr, "Append: %f, %f (%s)\n", point.x, point.y, closeFigure ? "CLOSE" : "OPEN");
+   m_Points.push_back(FX_PATHPOINT(point, type, closeFigure));
+ }
+ 
+@@ -290,6 +291,7 @@ CFX_FloatRect CFX_PathData::GetBoundingBox(float line_width,
+ void CFX_PathData::Transform(const CFX_Matrix* pMatrix) {
+   if (!pMatrix)
+     return;
++  fprintf(stderr, "XForm: %f, %f %f, %f, %f, %f\n", pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d, pMatrix->e, pMatrix->f);
+   for (auto& point : m_Points)
+     point.m_Point = pMatrix->Transform(point.m_Point);
+ }
 diff --git a/fpdfsdk/fpdfeditimg.cpp b/fpdfsdk/fpdfeditimg.cpp
 index 0d7ba56..37bdf99 100644
 --- a/fpdfsdk/fpdfeditimg.cpp
@@ -214,7 +261,7 @@ index ca2cf3f..e7d633f 100644
 +  return true;
 +}
 diff --git a/fpdfsdk/fpdfeditpath.cpp b/fpdfsdk/fpdfeditpath.cpp
-index a291987..1ac8257 100644
+index a291987..0202284 100644
 --- a/fpdfsdk/fpdfeditpath.cpp
 +++ b/fpdfsdk/fpdfeditpath.cpp
 @@ -101,6 +101,16 @@ FPDFPath_SetStrokeWidth(FPDF_PAGEOBJECT path, float width) {
@@ -275,14 +322,14 @@ index a291987..1ac8257 100644
 +  if (!path_object || !a || !b || !c || !d || !e || !f)
 +    return false;
 +
-+  auto* pPathObj = CPDFPageObjectFromFPDFPageObject(path_object);
-+  CFX_Matrix* pMatrix = pPathObj->m_GeneralState.GetMutableMatrix();
-+  *a = pMatrix->a;
-+  *b = pMatrix->b;
-+  *c = pMatrix->c;
-+  *d = pMatrix->d;
-+  *e = pMatrix->e;
-+  *f = pMatrix->f;
++  CPDF_PathObject* pPathObj = CPDFPathObjectFromFPDFPageObject(path_object);
++  const CFX_Matrix& pMatrix = pPathObj->m_Matrix;
++  *a = pMatrix.a;
++  *b = pMatrix.b;
++  *c = pMatrix.c;
++  *d = pMatrix.d;
++  *e = pMatrix.e;
++  *f = pMatrix.f;
 +
 +  return true;
 +}
diff --git a/svx/source/svdraw/svdpdf.cxx b/svx/source/svdraw/svdpdf.cxx
index 696b340c6767..1136fb30c849 100644
--- a/svx/source/svdraw/svdpdf.cxx
+++ b/svx/source/svdraw/svdpdf.cxx
@@ -1309,12 +1309,16 @@ void ImpSdrPdfImport::ImportPath(FPDF_PAGEOBJECT pPageObject, int nPageObjectInd
                 continue;
             }
 
-            SAL_WARN("sd.filter", "Got point (" << x << ", " << y << ")");
+            SAL_WARN("sd.filter", "Got point (" << x << ", " << y << ") matrix (" << a << ", " << b
+                                                << ", " << c << ", " << d << ", " << e << ", " << f
+                                                << ')');
 
             x = a * x + c * y + e;
             y = b * x + d * y + f;
 
             const bool bClose = FPDFPathSegment_GetClose(pPathSegment);
+            if (bClose)
+                aPoly.setClosed(bClose); // TODO: Review
             SAL_WARN("sd.filter",
                      "Point corrected (" << x << ", " << y << "): " << (bClose ? "CLOSE" : "OPEN"));
             Point aPoint = PointsToLogic(x, y);
@@ -1364,7 +1368,10 @@ void ImpSdrPdfImport::ImportPath(FPDF_PAGEOBJECT pPageObject, int nPageObjectInd
 
     float fWidth = 1;
     FPDFPath_GetStrokeWidth(pPageObject, &fWidth);
-    mnLineWidth = lcl_ToLogic(lcl_PointToPixel(fWidth));
+    SAL_WARN("sd.filter", "Path Stroke Width: " << fWidth);
+    const double dWidth = fabs(sqrt2(a, c) * fWidth);
+    SAL_WARN("sd.filter", "Path Stroke Width scaled: " << dWidth);
+    mnLineWidth = lcl_ToLogic(lcl_PointToPixel(dWidth));
 
     unsigned int nR;
     unsigned int nG;
@@ -1386,7 +1393,6 @@ void ImpSdrPdfImport::ImportPath(FPDF_PAGEOBJECT pPageObject, int nPageObjectInd
 
     // if(!mbLastObjWasPolyWithoutLine || !CheckLastPolyLineAndFillMerge(basegfx::B2DPolyPolygon(aSource)))
 
-    aPoly.setClosed(true); // TODO: Review
     SdrPathObj* pPath = new SdrPathObj(*mpModel, OBJ_POLY, basegfx::B2DPolyPolygon(aPoly));
     SetAttributes(pPath);
     InsertObj(pPath, false);
commit 3379cb362236fa058278a38434fd3ad57e51144d
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Fri Apr 13 20:26:11 2018 -0400

    svx: improved text importing from PDF
    
    Change-Id: I9a2fc2c8511655c1aa362c1a03a5e82ae3ba697e

diff --git a/external/pdfium/edit.patch.1 b/external/pdfium/edit.patch.1
index 86cda347f262..982560a3fab7 100644
--- a/external/pdfium/edit.patch.1
+++ b/external/pdfium/edit.patch.1
@@ -66,7 +66,7 @@ index 0d7ba56..37bdf99 100644
  FPDFImageObj_GetImageDataDecoded(FPDF_PAGEOBJECT image_object,
                                   void* buffer,
 diff --git a/fpdfsdk/fpdfeditpage.cpp b/fpdfsdk/fpdfeditpage.cpp
-index ca2cf3f..8073a18 100644
+index ca2cf3f..e7d633f 100644
 --- a/fpdfsdk/fpdfeditpage.cpp
 +++ b/fpdfsdk/fpdfeditpage.cpp
 @@ -11,12 +11,14 @@
@@ -84,7 +84,7 @@ index ca2cf3f..8073a18 100644
  #include "core/fpdfapi/page/cpdf_shadingobject.h"
  #include "core/fpdfapi/parser/cpdf_array.h"
  #include "core/fpdfapi/parser/cpdf_document.h"
-@@ -363,3 +365,123 @@ FPDFPageObj_GetBounds(FPDF_PAGEOBJECT pageObject,
+@@ -363,3 +365,128 @@ FPDFPageObj_GetBounds(FPDF_PAGEOBJECT pageObject,
    *top = bbox.top;
    return true;
  }
@@ -114,8 +114,11 @@ index ca2cf3f..8073a18 100644
 +                      double* a,
 +                      double* b,
 +                      double* c,
-+                      double* d) {
-+  if (!text_object)
++                      double* d,
++                      double* e,
++                      double* f)
++{
++  if (!text_object || !a || !b || !c || !d || !e || !f)
 +    return;
 +
 +  CPDF_TextObject* pTxtObj = CPDFTextObjectFromFPDFPageObject(text_object);
@@ -124,6 +127,8 @@ index ca2cf3f..8073a18 100644
 +  *b = matrix.b;
 +  *c = matrix.c;
 +  *d = matrix.d;
++  *e = matrix.e;
++  *f = matrix.f;
 +}
 +
 +FPDF_EXPORT int FPDF_CALLCONV
@@ -357,7 +362,7 @@ index 77c2315..db3e734 100644
  
  CPDF_PageObject* CPDFPageObjectFromFPDFPageObject(FPDF_PAGEOBJECT page_object);
 diff --git a/public/fpdf_edit.h b/public/fpdf_edit.h
-index 54735a3..a415c98 100644
+index 54735a3..c86b638 100644
 --- a/public/fpdf_edit.h
 +++ b/public/fpdf_edit.h
 @@ -520,6 +520,15 @@ FPDFPath_GetStrokeColor(FPDF_PAGEOBJECT path,
@@ -413,7 +418,7 @@ index 54735a3..a415c98 100644
  // Create a new text object using one of the standard PDF fonts.
  //
  // document   - handle to the document.
-@@ -761,6 +800,73 @@ FPDFPageObj_CreateTextObj(FPDF_DOCUMENT document,
+@@ -761,6 +800,77 @@ FPDFPageObj_CreateTextObj(FPDF_DOCUMENT document,
                            FPDF_FONT font,
                            float font_size);
  
@@ -445,12 +450,16 @@ index 54735a3..a415c98 100644
 +//   b            - Pointer to a double value receiving coefficient "b" of the matrix.
 +//   c            - Pointer to a double value receiving coefficient "c" of the matrix.
 +//   d            - Pointer to a double value receiving coefficient "d" of the matrix.
++//   e            - Pointer to a double value receiving coefficient "e" of the matrix.
++//   f            - Pointer to a double value receiving coefficient "f" of the matrix.
 +FPDF_EXPORT void FPDF_CALLCONV
 +FPDFTextObj_GetMatrix(FPDF_PAGEOBJECT text_object,
 +                      double* a,
 +                      double* b,
 +                      double* c,
-+                      double* d);
++                      double* d,
++                      double* e,
++                      double* f);
 +
 +// Get the unicode of a special character in a text object.
 +//
diff --git a/svx/source/svdraw/svdpdf.cxx b/svx/source/svdraw/svdpdf.cxx
index 49139d7eacd0..696b340c6767 100644
--- a/svx/source/svdraw/svdpdf.cxx
+++ b/svx/source/svdraw/svdpdf.cxx
@@ -103,6 +103,8 @@ static inline long lcl_ToLogic(double value)
     const long out = OutputDevice::LogicToLogic(in, MapUnit::MapPixel, MapUnit::Map100thMM);
     return out / 100;
 }
+
+static inline double sqrt2(double a, double b) { return sqrt(a * a + b * b); }
 }
 
 struct FPDFBitmapDeleter
@@ -1024,53 +1026,56 @@ void ImpSdrPdfImport::ImportText(FPDF_PAGEOBJECT pPageObject, int nPageObjectInd
         SAL_WARN("sd.filter", "FAILED to get TEXT bounds");
     }
 
-    SAL_WARN("sd.filter", "Got TEXT bounds left: " << left << ", right: " << right
-                                                   << ", top: " << top << ", bottom: " << bottom);
-    tools::Rectangle aRect = PointsToLogic(left, right, top, bottom);
+    if (left == right || top == bottom)
+    {
+        SAL_WARN("sd.filter", "Skipping empty TEXT #" << nPageObjectIndex << " left: " << left
+                                                      << ", right: " << right << ", top: " << top
+                                                      << ", bottom: " << bottom);
+        return;
+    }
 
-    double dFontScale = 1.0;
-    geometry::Matrix2D aMatrix;
-    FPDFTextObj_GetMatrix(pPageObject, &aMatrix.m00, &aMatrix.m01, &aMatrix.m10, &aMatrix.m11);
-    if (aMatrix.m00 != aMatrix.m11 || aMatrix.m00 <= 0)
+    const int nChars = FPDFTextObj_CountChars(pPageObject);
+    std::unique_ptr<sal_Unicode[]> pText(new sal_Unicode[nChars + 1]); // + terminating null
+
+    unsigned short* pShortText = reinterpret_cast<unsigned short*>(pText.get());
+    const int nActualChars = FPDFTextObj_GetText(pPageObject, 0, nChars, pShortText);
+    if (nActualChars <= 0)
     {
-        SAL_WARN("sd.filter", "Bogus font scale matrix (" << aMatrix.m00 << ',' << aMatrix.m11
-                                                          << "), will use heuristic height of "
-                                                          << aRect.GetHeight() << ".");
-        dFontScale = aRect.GetHeight();
+        SAL_WARN("sd.filter", "Got not TEXT");
+        return;
     }
-    else
-        dFontScale = aMatrix.m00;
 
-    double dFontSize = FPDFTextObj_GetFontSize(pPageObject);
-    SAL_WARN("sd.filter", "Got Font Size: " << dFontSize);
-    dFontSize *= dFontScale;
-    SAL_WARN("sd.filter", "Got Font Size Scaled: " << dFontSize);
-    dFontSize = lcl_PointToPixel(dFontSize);
-    SAL_WARN("sd.filter", "Got Font Pixel Size: " << dFontSize);
-    dFontSize = lcl_ToLogic(dFontSize);
-    SAL_WARN("sd.filter", "Got Font Logic Size: " << dFontSize);
+    OUString sText(pText.get(), nActualChars);
+    SAL_WARN("sd.filter", "Got Text (" << nChars << "): [" << sText << "].");
+
+    double a, b, c, d, e, f;
+    FPDFTextObj_GetMatrix(pPageObject, &a, &b, &c, &d, &e, &f);
+    SAL_WARN("sd.filter", "Got font scale matrix (" << a << ", " << b << ", " << c << ", " << d
+                                                    << ", " << e << ", " << f << ')');
+    Point aPos = PointsToLogic(e, f);
+    SAL_WARN("sd.filter", "Got TEXT origin: " << aPos);
+
+    const double dFontSize = FPDFTextObj_GetFontSize(pPageObject);
+    double dFontSizeH = fabs(sqrt2(a, c) * dFontSize);
+    double dFontSizeV = fabs(sqrt2(b, d) * dFontSize);
+    SAL_WARN("sd.filter", "Got Font Size: " << dFontSize << ", Scaled Font Size H: " << dFontSizeH
+                                            << ", V: " << dFontSizeV);
+    dFontSizeH = lcl_PointToPixel(dFontSizeH);
+    dFontSizeV = lcl_PointToPixel(dFontSizeV);
+    SAL_WARN("sd.filter", "Got Pixel Font Size H: " << dFontSizeH << ", V: " << dFontSizeV);
+    dFontSizeH = lcl_ToLogic(dFontSizeH);
+    dFontSizeV = lcl_ToLogic(dFontSizeV);
+    SAL_WARN("sd.filter", "Got Logic Font Size H: " << dFontSizeH << ", V: " << dFontSizeV);
 
     unsigned int nR, nG, nB, nA;
     if (FPDFTextObj_GetStrokeColor(pPageObject, &nR, &nG, &nB, &nA))
         mpVD->SetTextColor(Color(nR, nG, nB));
 
     vcl::Font aFnt = mpVD->GetFont();
-    aFnt.SetFontSize(Size(dFontSize, dFontSize));
+    aFnt.SetFontSize(Size(dFontSizeH, dFontSizeV));
     mpVD->SetFont(aFnt);
 
-    const int nChars = FPDFTextObj_CountChars(pPageObject);
-    std::unique_ptr<sal_Unicode[]> pText(new sal_Unicode[nChars + 1]); // + terminating null
-
-    unsigned short* pShortText = reinterpret_cast<unsigned short*>(pText.get());
-    const int nActualChars = FPDFTextObj_GetText(pPageObject, 0, nChars, pShortText);
-    OUString sText(pText.get(), nActualChars);
-
-    // for (int nChar = 0; nChar < nChars; ++nChar)
-    //     pText[nChar] = static_cast<sal_Unicode>(FPDFTextObj_GetUnicode(pPageObject, nChar));
-    // OUString sText(pText.get(), nChars);
-    SAL_WARN("sd.filter", "Got Text (" << nChars << "): [" << sText << "].");
-
-    ImportText(aRect.TopLeft(), sText);
+    ImportText(aPos, sText);
 }
 
 void ImpSdrPdfImport::ImportText(const Point& rPos, const OUString& rStr)
@@ -1083,11 +1088,12 @@ void ImpSdrPdfImport::ImportText(const Point& rPos, const OUString& rStr)
 
     sal_Int32 nTextWidth = static_cast<sal_Int32>(mpVD->GetTextWidth(rStr) * mfScaleX);
     sal_Int32 nTextHeight = static_cast<sal_Int32>(mpVD->GetTextHeight() * mfScaleY);
-    SAL_WARN("sd.filter", "TextWidth: " << nTextWidth << ", TextHeight: " << nTextHeight);
+    SAL_WARN("sd.filter",
+             "Unscaled text size: " << mpVD->GetTextWidth(rStr) << 'x' << mpVD->GetTextHeight()
+                                    << ", Scaled: " << nTextWidth << 'x' << nTextHeight);
 
     Point aPos(FRound(rPos.X() * mfScaleX + maOfs.X()), FRound(rPos.Y() * mfScaleY + maOfs.Y()));
     Size aSize(nTextWidth, nTextHeight);
-    SAL_WARN("sd.filter", "Text Pos: " << aPos << ", Size: " << aSize);
 
     if (eAlg == ALIGN_BASELINE)
         aPos.AdjustY(-(FRound(aFontMetric.GetAscent() * mfScaleY)));
commit 336f8f40b728ec5df78df72645039cc9b5e17757
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Fri Apr 13 18:59:56 2018 -0400

    svx: improve path importing from PDF
    
    Change-Id: I8e63b2a35d841e065ef32fea95c0a5f22ca6f049

diff --git a/external/pdfium/edit.patch.1 b/external/pdfium/edit.patch.1
index 03b4ab221730..86cda347f262 100644
--- a/external/pdfium/edit.patch.1
+++ b/external/pdfium/edit.patch.1
@@ -209,7 +209,7 @@ index ca2cf3f..8073a18 100644
 +  return true;
 +}
 diff --git a/fpdfsdk/fpdfeditpath.cpp b/fpdfsdk/fpdfeditpath.cpp
-index a291987..d3b0bc1 100644
+index a291987..1ac8257 100644
 --- a/fpdfsdk/fpdfeditpath.cpp
 +++ b/fpdfsdk/fpdfeditpath.cpp
 @@ -101,6 +101,16 @@ FPDFPath_SetStrokeWidth(FPDF_PAGEOBJECT path, float width) {
@@ -229,6 +229,63 @@ index a291987..d3b0bc1 100644
  FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPath_SetFillColor(FPDF_PAGEOBJECT path,
                                                            unsigned int R,
                                                            unsigned int G,
+@@ -217,6 +227,25 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPath_SetDrawMode(FPDF_PAGEOBJECT path,
+   return true;
+ }
+ 
++FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPath_GetDrawMode(FPDF_PAGEOBJECT path,
++                                                         int* fillmode,
++                                                         FPDF_BOOL* stroke)
++{
++  auto* pPathObj = CPDFPathObjectFromFPDFPageObject(path);
++  if (!pPathObj || !fillmode || !stroke)
++    return false;
++
++  if (pPathObj->m_FillType == FXFILL_ALTERNATE)
++    *fillmode = FPDF_FILLMODE_ALTERNATE;
++  else if (pPathObj->m_FillType == FXFILL_WINDING)
++    *fillmode = FPDF_FILLMODE_WINDING;
++  else
++    *fillmode = 0; // no fill
++
++  *stroke = pPathObj->m_bStroke;
++  return true;
++}
++
+ FPDF_EXPORT void FPDF_CALLCONV FPDFPath_SetLineJoin(FPDF_PAGEOBJECT path,
+                                                     int line_join) {
+   if (!path)
+@@ -250,6 +279,30 @@ FPDF_EXPORT void FPDF_CALLCONV FPDFPath_SetLineCap(FPDF_PAGEOBJECT path,
+ }
+ 
+ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
++FPDFPath_GetMatrix(FPDF_PAGEOBJECT path_object,
++                   double* a,
++                   double* b,
++                   double* c,
++                   double* d,
++                   double* e,
++                   double* f)
++{
++  if (!path_object || !a || !b || !c || !d || !e || !f)
++    return false;
++
++  auto* pPathObj = CPDFPageObjectFromFPDFPageObject(path_object);
++  CFX_Matrix* pMatrix = pPathObj->m_GeneralState.GetMutableMatrix();
++  *a = pMatrix->a;
++  *b = pMatrix->b;
++  *c = pMatrix->c;
++  *d = pMatrix->d;
++  *e = pMatrix->e;
++  *f = pMatrix->f;
++
++  return true;
++}
++
++FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
+ FPDFPathSegment_GetPoint(FPDF_PATHSEGMENT segment, float* x, float* y) {
+   auto* pPathPoint = FXPathPointFromFPDFPathSegment(segment);
+   if (!pPathPoint || !x || !y)
 diff --git a/fpdfsdk/fpdftext.cpp b/fpdfsdk/fpdftext.cpp
 index 68bf4f8..e073b20 100644
 --- a/fpdfsdk/fpdftext.cpp
@@ -300,7 +357,7 @@ index 77c2315..db3e734 100644
  
  CPDF_PageObject* CPDFPageObjectFromFPDFPageObject(FPDF_PAGEOBJECT page_object);
 diff --git a/public/fpdf_edit.h b/public/fpdf_edit.h
-index 54735a3..282bcdb 100644
+index 54735a3..a415c98 100644
 --- a/public/fpdf_edit.h
 +++ b/public/fpdf_edit.h
 @@ -520,6 +520,15 @@ FPDFPath_GetStrokeColor(FPDF_PAGEOBJECT path,
@@ -319,7 +376,44 @@ index 54735a3..282bcdb 100644
  // Set the line join of |page_object|.
  //
  // page_object  - handle to a page object.
-@@ -761,6 +770,73 @@ FPDFPageObj_CreateTextObj(FPDF_DOCUMENT document,
+@@ -688,6 +697,36 @@ FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPath_SetDrawMode(FPDF_PAGEOBJECT path,
+                                                          int fillmode,
+                                                          FPDF_BOOL stroke);
+ 
++// Get the drawing mode of a path.
++//
++// path     - the handle to the path object.
++// fillmode - the filling mode to be set: 0 for no fill, 1 for alternate, 2 for
++// winding.
++// stroke   - a boolean specifying if the path should be stroked or not.
++//
++// Returns TRUE on success
++FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPath_GetDrawMode(FPDF_PAGEOBJECT path,
++                                                         int* fillmode,
++                                                         FPDF_BOOL* stroke);
++
++// Get the matrix of a particular text object.
++//
++// path_object - Handle of path object returned by FPDFPath_NewPathObj
++//   a            - Pointer to a double value receiving coefficient "a" of the matrix.
++//   b            - Pointer to a double value receiving coefficient "b" of the matrix.
++//   c            - Pointer to a double value receiving coefficient "c" of the matrix.
++//   d            - Pointer to a double value receiving coefficient "d" of the matrix.
++//   e            - Pointer to a double value receiving coefficient "e" of the matrix.
++//   f            - Pointer to a double value receiving coefficient "f" of the matrix.
++FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
++FPDFPath_GetMatrix(FPDF_PAGEOBJECT path_object,
++                      double* a,
++                      double* b,
++                      double* c,
++                      double* d,
++                      double* e,
++                      double* f);
++
+ // Create a new text object using one of the standard PDF fonts.
+ //
+ // document   - handle to the document.
+@@ -761,6 +800,73 @@ FPDFPageObj_CreateTextObj(FPDF_DOCUMENT document,
                            FPDF_FONT font,
                            float font_size);
  
diff --git a/svx/source/svdraw/svdpdf.cxx b/svx/source/svdraw/svdpdf.cxx
index 3f585b58fb6b..49139d7eacd0 100644
--- a/svx/source/svdraw/svdpdf.cxx
+++ b/svx/source/svdraw/svdpdf.cxx
@@ -568,7 +568,7 @@ void ImpSdrPdfImport::SetAttributes(SdrObject* pObj, bool bForceTextAttr)
 
         if (mpVD->IsLineColor())
         {
-            mpLineAttr->Put(XLineStyleItem(drawing::LineStyle_SOLID));
+            mpLineAttr->Put(XLineStyleItem(drawing::LineStyle_SOLID)); //TODO support dashed lines.
             mpLineAttr->Put(XLineColorItem(OUString(), mpVD->GetLineColor()));
         }
         else
@@ -1283,6 +1283,10 @@ 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);
+
     basegfx::B2DPolygon aPoly;
     std::vector<basegfx::B2DPoint> aBezier;
 
@@ -1299,9 +1303,14 @@ void ImpSdrPdfImport::ImportPath(FPDF_PAGEOBJECT pPageObject, int nPageObjectInd
                 continue;
             }
 
+            SAL_WARN("sd.filter", "Got point (" << x << ", " << y << ")");
+
+            x = a * x + c * y + e;
+            y = b * x + d * y + f;
+
             const bool bClose = FPDFPathSegment_GetClose(pPathSegment);
             SAL_WARN("sd.filter",
-                     "Got (" << x << ", " << y << "): " << (bClose ? "CLOSE" : "OPEN"));
+                     "Point corrected (" << x << ", " << y << "): " << (bClose ? "CLOSE" : "OPEN"));
             Point aPoint = PointsToLogic(x, y);
             x = aPoint.X();
             y = aPoint.Y();
@@ -1351,15 +1360,23 @@ void ImpSdrPdfImport::ImportPath(FPDF_PAGEOBJECT pPageObject, int nPageObjectInd
     FPDFPath_GetStrokeWidth(pPageObject, &fWidth);
     mnLineWidth = lcl_ToLogic(lcl_PointToPixel(fWidth));
 
-    unsigned int r;
-    unsigned int g;
-    unsigned int b;
-    unsigned int a;
-    FPDFPath_GetFillColor(pPageObject, &r, &g, &b, &a);
-    mpVD->SetFillColor(Color(r, g, b));
-
-    FPDFPath_GetStrokeColor(pPageObject, &r, &g, &b, &a);
-    mpVD->SetLineColor(Color(r, g, b));
+    unsigned int nR;
+    unsigned int nG;
+    unsigned int nB;
+    unsigned int nA;
+    FPDFPath_GetFillColor(pPageObject, &nR, &nG, &nB, &nA);
+    SAL_WARN("sd.filter", "Got PATH fill color: " << nR << ", " << nG << ", " << nB << ", " << nA);
+    mpVD->SetFillColor(Color(nR, nG, nB));
+
+    FPDFPath_GetStrokeColor(pPageObject, &nR, &nG, &nB, &nA);
+    SAL_WARN("sd.filter",
+             "Got PATH stroke color: " << nR << ", " << nG << ", " << nB << ", " << nA);
+    mpVD->SetLineColor(Color(nR, nG, nB));
+
+    // int nFillMode = 0; // No fill.
+    // bool bStroke = false;
+    // FPDFPath_GetDrawMode(pPageObject, &nFillMode, &bStroke);
+    // mpVD->Setstroke(Color(r, g, b));
 
     // if(!mbLastObjWasPolyWithoutLine || !CheckLastPolyLineAndFillMerge(basegfx::B2DPolyPolygon(aSource)))
 


More information about the Libreoffice-commits mailing list