external/pdfium/edit.patch.1 | 173 ++++++++++++++++++++++++++++++- svx/source/svdraw/svdpdf.cxx | 235 +++++++++++++++++++++++++++++-------------- svx/source/svdraw/svdpdf.hxx | 5 3 files changed, 330 insertions(+), 83 deletions(-)
New commits: commit 4dd309183cb94853be8fa4f7ff8180718260f50f Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Tue Apr 10 18:06:47 2018 -0400 svx: support Paths in PDFs while importing Change-Id: Idba294cf5a3a8dd00988f94786715b110039e000 diff --git a/external/pdfium/edit.patch.1 b/external/pdfium/edit.patch.1 index 9099a4024b3e..03b4ab221730 100644 --- a/external/pdfium/edit.patch.1 +++ b/external/pdfium/edit.patch.1 @@ -208,6 +208,27 @@ index ca2cf3f..8073a18 100644 + (pTxtObj->m_GeneralState.GetStrokeAlpha() * 255.f) + 0.5f); + return true; +} +diff --git a/fpdfsdk/fpdfeditpath.cpp b/fpdfsdk/fpdfeditpath.cpp +index a291987..d3b0bc1 100644 +--- a/fpdfsdk/fpdfeditpath.cpp ++++ b/fpdfsdk/fpdfeditpath.cpp +@@ -101,6 +101,16 @@ FPDFPath_SetStrokeWidth(FPDF_PAGEOBJECT path, float width) { + return true; + } + ++FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV ++FPDFPath_GetStrokeWidth(FPDF_PAGEOBJECT path, float* width) { ++ auto* pPathObj = CPDFPathObjectFromFPDFPageObject(path); ++ if (!pPathObj || !width) ++ return false; ++ ++ *width = pPathObj->m_GraphState.GetLineWidth(); ++ return true; ++} ++ + FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFPath_SetFillColor(FPDF_PAGEOBJECT path, + unsigned int R, + unsigned int G, diff --git a/fpdfsdk/fpdftext.cpp b/fpdfsdk/fpdftext.cpp index 68bf4f8..e073b20 100644 --- a/fpdfsdk/fpdftext.cpp @@ -279,10 +300,26 @@ 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..15292f5 100644 +index 54735a3..282bcdb 100644 --- a/public/fpdf_edit.h +++ b/public/fpdf_edit.h -@@ -761,6 +761,73 @@ FPDFPageObj_CreateTextObj(FPDF_DOCUMENT document, +@@ -520,6 +520,15 @@ FPDFPath_GetStrokeColor(FPDF_PAGEOBJECT path, + FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV + FPDFPath_SetStrokeWidth(FPDF_PAGEOBJECT path, float width); + ++// Get the stroke width of a path. ++// ++// path - the handle to the path object. ++// width - the width of the stroke. ++// ++// Returns TRUE on success ++FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV ++FPDFPath_GetStrokeWidth(FPDF_PAGEOBJECT path, float* width); ++ + // Set the line join of |page_object|. + // + // page_object - handle to a page object. +@@ -761,6 +770,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 bccb124eb476..3f585b58fb6b 100644 --- a/svx/source/svdraw/svdpdf.cxx +++ b/svx/source/svdraw/svdpdf.cxx @@ -236,7 +236,7 @@ void ImpSdrPdfImport::DoLoopActions(SvdProgressInfo* pProgrInfo, sal_uInt32* pAc ImportText(pPageObject, nPageObjectIndex); break; case FPDF_PAGEOBJ_PATH: - SAL_WARN("sd.filter", "Got page object PATH: " << nPageObjectIndex); + ImportPath(pPageObject, nPageObjectIndex); break; case FPDF_PAGEOBJ_IMAGE: ImportImage(pPageObject, nPageObjectIndex); @@ -1280,6 +1280,95 @@ void ImpSdrPdfImport::ImportImage(FPDF_PAGEOBJECT pPageObject, int nPageObjectIn InsertObj(pGraf); } +void ImpSdrPdfImport::ImportPath(FPDF_PAGEOBJECT pPageObject, int nPageObjectIndex) +{ + SAL_WARN("sd.filter", "Got page object PATH: " << nPageObjectIndex); + basegfx::B2DPolygon aPoly; + std::vector<basegfx::B2DPoint> aBezier; + + const int nSegments = FPDFPath_CountSegments(pPageObject); + for (int nSegmentIndex = 0; nSegmentIndex < nSegments; ++nSegmentIndex) + { + FPDF_PATHSEGMENT pPathSegment = FPDFPath_GetPathSegment(pPageObject, nSegmentIndex); + if (pPathSegment != nullptr) + { + float x, y; + if (!FPDFPathSegment_GetPoint(pPathSegment, &x, &y)) + { + SAL_WARN("sd.filter", "Failed to get PDF path segement point"); + continue; + } + + const bool bClose = FPDFPathSegment_GetClose(pPathSegment); + SAL_WARN("sd.filter", + "Got (" << x << ", " << y << "): " << (bClose ? "CLOSE" : "OPEN")); + Point aPoint = PointsToLogic(x, y); + x = aPoint.X(); + y = aPoint.Y(); + + const int nSegmentType = FPDFPathSegment_GetType(pPathSegment); + switch (nSegmentType) + { + case FPDF_SEGMENT_LINETO: + SAL_WARN("sd.filter", "Got LineTo Segment."); + aPoly.append(basegfx::B2DPoint(x, y)); + break; + + case FPDF_SEGMENT_BEZIERTO: + SAL_WARN("sd.filter", "Got BezierTo Segment."); + aBezier.emplace_back(x, y); + if (aBezier.size() == 3) + { + aPoly.appendBezierSegment(aBezier[0], aBezier[1], aBezier[2]); + aBezier.clear(); + } + break; + + case FPDF_SEGMENT_MOVETO: + SAL_WARN("sd.filter", "Got MoveTo Segment."); + aPoly.append(basegfx::B2DPoint(x, y)); + break; + + case FPDF_SEGMENT_UNKNOWN: + default: + SAL_WARN("sd.filter", "Unknown path segment type in PDF: " << nSegmentType); + break; + } + } + } + + if (aBezier.size() == 3) + { + aPoly.appendBezierSegment(aBezier[0], aBezier[1], aBezier[2]); + aBezier.clear(); + } + + const basegfx::B2DHomMatrix aTransform( + basegfx::utils::createScaleTranslateB2DHomMatrix(mfScaleX, mfScaleY, maOfs.X(), maOfs.Y())); + aPoly.transform(aTransform); + + float fWidth = 1; + 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)); + + // 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); +} + Point ImpSdrPdfImport::PointsToLogic(double x, double y) const { y = correctVertOrigin(y); diff --git a/svx/source/svdraw/svdpdf.hxx b/svx/source/svdraw/svdpdf.hxx index dd4306c738bd..17b926b43619 100644 --- a/svx/source/svdraw/svdpdf.hxx +++ b/svx/source/svdraw/svdpdf.hxx @@ -103,6 +103,8 @@ class ImpSdrPdfImport final 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 OUString& rStr); void SetAttributes(SdrObject* pObj, bool bForceTextAttr = false); commit a5965f06eba940e2057de8c8e55e7a3c396f73e3 Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Tue Apr 10 07:45:06 2018 -0400 svx: support PDF text color Change-Id: I7fa675c6560504e4fc7917e19cac3cceb2700d8e diff --git a/external/pdfium/edit.patch.1 b/external/pdfium/edit.patch.1 index da72f96f46fc..9099a4024b3e 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..ac36788 100644 +index ca2cf3f..8073a18 100644 --- a/fpdfsdk/fpdfeditpage.cpp +++ b/fpdfsdk/fpdfeditpage.cpp @@ -11,12 +11,14 @@ @@ -84,7 +84,7 @@ index ca2cf3f..ac36788 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,103 @@ FPDFPageObj_GetBounds(FPDF_PAGEOBJECT pageObject, +@@ -363,3 +365,123 @@ FPDFPageObj_GetBounds(FPDF_PAGEOBJECT pageObject, *top = bbox.top; return true; } @@ -95,7 +95,7 @@ index ca2cf3f..ac36788 100644 + if (!text_object) + return 0; + -+ CPDF_TextObject* pTxtObj = static_cast<CPDF_TextObject*>(text_object); ++ CPDF_TextObject* pTxtObj = CPDFTextObjectFromFPDFPageObject(text_object); + return pTxtObj->CountChars(); +} + @@ -105,7 +105,7 @@ index ca2cf3f..ac36788 100644 + if (!text_object) + return 0; + -+ CPDF_TextObject* pTxtObj = static_cast<CPDF_TextObject*>(text_object); ++ CPDF_TextObject* pTxtObj = CPDFTextObjectFromFPDFPageObject(text_object); + return pTxtObj->GetFontSize(); +} + @@ -118,7 +118,7 @@ index ca2cf3f..ac36788 100644 + if (!text_object) + return; + -+ CPDF_TextObject* pTxtObj = static_cast<CPDF_TextObject*>(text_object); ++ CPDF_TextObject* pTxtObj = CPDFTextObjectFromFPDFPageObject(text_object); + const CFX_Matrix& matrix = pTxtObj->GetTextMatrix(); + *a = matrix.a; + *b = matrix.b; @@ -132,7 +132,7 @@ index ca2cf3f..ac36788 100644 + if (!text_object || index < 0) + return 0; + -+ CPDF_TextObject* pTxtObj = static_cast<CPDF_TextObject*>(text_object); ++ CPDF_TextObject* pTxtObj = CPDFTextObjectFromFPDFPageObject(text_object); + if (index > pTxtObj->CountChars()) + return 0; + @@ -148,7 +148,7 @@ index ca2cf3f..ac36788 100644 + if (!text_object || char_start < 0 || char_count < 0 || !result) + return 0; + -+ CPDF_TextObject* pTxtObj = static_cast<CPDF_TextObject*>(text_object); ++ CPDF_TextObject* pTxtObj = CPDFTextObjectFromFPDFPageObject(text_object); + int char_available = pTxtObj->CountChars() - char_start; + if (char_available <= 0) + return 0; @@ -188,6 +188,26 @@ index ca2cf3f..ac36788 100644 + memcpy(result, byte_str.GetBuffer(byte_str_len), byte_str_len); + return ret_count; +} ++ ++FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV ++FPDFTextObj_GetStrokeColor(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); ++ *A = static_cast<unsigned int>( ++ (pTxtObj->m_GeneralState.GetStrokeAlpha() * 255.f) + 0.5f); ++ return true; ++} diff --git a/fpdfsdk/fpdftext.cpp b/fpdfsdk/fpdftext.cpp index 68bf4f8..e073b20 100644 --- a/fpdfsdk/fpdftext.cpp @@ -221,11 +241,48 @@ index 68bf4f8..e073b20 100644 FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV FPDFText_GetCharBox(FPDF_TEXTPAGE text_page, int index, double* left, +diff --git a/fpdfsdk/fpdfview.cpp b/fpdfsdk/fpdfview.cpp +index e890aa0..709bea3 100644 +--- a/fpdfsdk/fpdfview.cpp ++++ b/fpdfsdk/fpdfview.cpp +@@ -336,6 +336,11 @@ CPDF_Page* CPDFPageFromFPDFPage(FPDF_PAGE page) { + #endif // PDF_ENABLE_XFA + } + ++CPDF_TextObject* CPDFTextObjectFromFPDFPageObject(FPDF_PAGEOBJECT page_object) { ++ auto* obj = CPDFPageObjectFromFPDFPageObject(page_object); ++ return obj ? obj->AsText() : 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 +--- a/fpdfsdk/fsdk_define.h ++++ b/fpdfsdk/fsdk_define.h +@@ -25,6 +25,7 @@ class CPDF_Annot; + class CPDF_Page; + class CPDF_PageObject; + class CPDF_PageRenderContext; ++class CPDF_TextObject; + class CPDF_PathObject; + class CPDF_Stream; + class IFSDK_PAUSE_Adapter; +@@ -65,6 +66,8 @@ FPDF_DOCUMENT FPDFDocumentFromCPDFDocument(CPDF_Document* doc); + + CPDF_Page* CPDFPageFromFPDFPage(FPDF_PAGE page); + ++CPDF_TextObject* CPDFTextObjectFromFPDFPageObject(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..a9c1a25 100644 +index 54735a3..15292f5 100644 --- a/public/fpdf_edit.h +++ b/public/fpdf_edit.h -@@ -761,6 +761,57 @@ FPDFPageObj_CreateTextObj(FPDF_DOCUMENT document, +@@ -761,6 +761,73 @@ FPDFPageObj_CreateTextObj(FPDF_DOCUMENT document, FPDF_FONT font, float font_size); @@ -280,6 +337,22 @@ index 54735a3..a9c1a25 100644 + int char_count, + unsigned short* result); + ++// Get the stroke RGBA of a text. Range of values: 0 - 255. ++// ++// path - the handle to the path object. ++// R - the red component of the path stroke color. ++// G - the green component of the path stroke color. ++// B - the blue component of the path stroke color. ++// A - the stroke alpha of the path. ++// ++// 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); ++ #ifdef __cplusplus } // extern "C" #endif // __cplusplus diff --git a/svx/source/svdraw/svdpdf.cxx b/svx/source/svdraw/svdpdf.cxx index 6dd75b0a293e..bccb124eb476 100644 --- a/svx/source/svdraw/svdpdf.cxx +++ b/svx/source/svdraw/svdpdf.cxx @@ -229,8 +229,6 @@ void ImpSdrPdfImport::DoLoopActions(SvdProgressInfo* pProgrInfo, sal_uInt32* pAc if (pPageObject == nullptr) continue; - SAL_WARN("sd.filter", "Got page object number: "); - const int nPageObjectType = FPDFPageObj_GetType(pPageObject); switch (nPageObjectType) { @@ -1051,6 +1049,11 @@ void ImpSdrPdfImport::ImportText(FPDF_PAGEOBJECT pPageObject, int nPageObjectInd SAL_WARN("sd.filter", "Got Font Pixel Size: " << dFontSize); dFontSize = lcl_ToLogic(dFontSize); SAL_WARN("sd.filter", "Got Font Logic Size: " << dFontSize); + + 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)); mpVD->SetFont(aFnt); commit 6fc0b8838a37463886c09fdf7aad1d05f7e58b28 Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Mon Apr 9 22:17:49 2018 -0400 svx: more informative logging Change-Id: Ia9f2fa1fbb24ad3466bd082b778244f451c90745 diff --git a/svx/source/svdraw/svdpdf.cxx b/svx/source/svdraw/svdpdf.cxx index aaa8347f03fd..6dd75b0a293e 100644 --- a/svx/source/svdraw/svdpdf.cxx +++ b/svx/source/svdraw/svdpdf.cxx @@ -229,29 +229,29 @@ void ImpSdrPdfImport::DoLoopActions(SvdProgressInfo* pProgrInfo, sal_uInt32* pAc if (pPageObject == nullptr) continue; - SAL_WARN("sd.filter", "Got page object number: " << nPageObjectIndex); + SAL_WARN("sd.filter", "Got page object number: "); - // Process everything but text, which is done separately below. const int nPageObjectType = FPDFPageObj_GetType(pPageObject); switch (nPageObjectType) { case FPDF_PAGEOBJ_TEXT: - ImportText(pPageObject); + ImportText(pPageObject, nPageObjectIndex); break; case FPDF_PAGEOBJ_PATH: - SAL_WARN("sd.filter", "Got page object PATH"); + SAL_WARN("sd.filter", "Got page object PATH: " << nPageObjectIndex); break; case FPDF_PAGEOBJ_IMAGE: - ImportImage(pPageObject); + ImportImage(pPageObject, nPageObjectIndex); break; case FPDF_PAGEOBJ_SHADING: - SAL_WARN("sd.filter", "Got page object SHADING"); + SAL_WARN("sd.filter", "Got page object SHADING: " << nPageObjectIndex); break; case FPDF_PAGEOBJ_FORM: - SAL_WARN("sd.filter", "Got page object FORM"); + SAL_WARN("sd.filter", "Got page object FORM: " << nPageObjectIndex); break; default: - SAL_WARN("sd.filter", "Unknown PDF page object type: " << nPageObjectType); + SAL_WARN("sd.filter", "Unknown PDF page object type: " + << nPageObjectType << ": " << nPageObjectIndex); break; } } @@ -1014,10 +1014,9 @@ void ImpSdrPdfImport::checkClip() } bool ImpSdrPdfImport::isClip() const { return !maClip.getB2DRange().isEmpty(); } - -void ImpSdrPdfImport::ImportText(FPDF_PAGEOBJECT pPageObject) +void ImpSdrPdfImport::ImportText(FPDF_PAGEOBJECT pPageObject, int nPageObjectIndex) { - SAL_WARN("sd.filter", "Got page object TEXT"); + SAL_WARN("sd.filter", "Got page object TEXT: " << nPageObjectIndex); float left; float bottom; float right; @@ -1157,9 +1156,9 @@ void ImpSdrPdfImport::MapScaling() mnMapScalingOfs = nCount; } -void ImpSdrPdfImport::ImportImage(FPDF_PAGEOBJECT pPageObject) +void ImpSdrPdfImport::ImportImage(FPDF_PAGEOBJECT pPageObject, int nPageObjectIndex) { - SAL_WARN("sd.filter", "Got page object IMAGE"); + SAL_WARN("sd.filter", "Got page object IMAGE: " << nPageObjectIndex); std::unique_ptr<void, FPDFBitmapDeleter> bitmap(FPDFImageObj_GetBitmapBgra(pPageObject)); if (!bitmap) { diff --git a/svx/source/svdraw/svdpdf.hxx b/svx/source/svdraw/svdpdf.hxx index 7d458b978c01..dd4306c738bd 100644 --- a/svx/source/svdraw/svdpdf.hxx +++ b/svx/source/svdraw/svdpdf.hxx @@ -100,10 +100,10 @@ class ImpSdrPdfImport final void checkClip(); bool isClip() const; - void ImportImage(FPDF_PAGEOBJECT pPageObject); + void ImportImage(FPDF_PAGEOBJECT pPageObject, int nPageObjectIndex); void SetupPageScale(const double dPageWidth, const double dPageHeight); - void ImportText(FPDF_PAGEOBJECT pPageObject); + void ImportText(FPDF_PAGEOBJECT pPageObject, int nPageObjectIndex); void ImportText(const Point& rPos, const OUString& rStr); void SetAttributes(SdrObject* pObj, bool bForceTextAttr = false); void InsertObj(SdrObject* pObj, bool bScale = true); commit 0cda67a10f461b22f44fa3ef873b92cf13f2ba48 Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Mon Apr 9 22:16:05 2018 -0400 svx: import PDF images as BGRA This makes it trivial to support all sort of odd bit-format and 8-bit paletted images. Change-Id: I4555794eccd0ee2906f9a39bd93957ad3775432c diff --git a/external/pdfium/edit.patch.1 b/external/pdfium/edit.patch.1 index b7cd86e5ff2d..da72f96f46fc 100644 --- a/external/pdfium/edit.patch.1 +++ b/external/pdfium/edit.patch.1 @@ -34,6 +34,37 @@ index 0a01ae0..fad2920 100644 if (bPattern) { DrawTextPathWithPattern(textobj, pObj2Device, pFont, font_size, &text_matrix, bFill, bStroke); +diff --git a/fpdfsdk/fpdfeditimg.cpp b/fpdfsdk/fpdfeditimg.cpp +index 0d7ba56..37bdf99 100644 +--- a/fpdfsdk/fpdfeditimg.cpp ++++ b/fpdfsdk/fpdfeditimg.cpp +@@ -167,6 +167,26 @@ FPDFImageObj_GetBitmap(FPDF_PAGEOBJECT image_object) { + return pBitmap.Leak(); + } + ++FPDF_EXPORT FPDF_BITMAP FPDF_CALLCONV ++FPDFImageObj_GetBitmapBgra(FPDF_PAGEOBJECT image_object) { ++ CPDF_PageObject* pObj = CPDFPageObjectFromFPDFPageObject(image_object); ++ if (!pObj || !pObj->IsImage()) ++ return nullptr; ++ ++ RetainPtr<CPDF_Image> pImg = pObj->AsImage()->GetImage(); ++ if (!pImg) ++ return nullptr; ++ ++ RetainPtr<CFX_DIBSource> pSource = pImg->LoadDIBSource(); ++ if (!pSource) ++ return nullptr; ++ ++ RetainPtr<CFX_DIBitmap> pBitmap; ++ pBitmap = pSource->CloneConvert(FXDIB_Argb); ++ ++ return pBitmap.Leak(); ++} ++ + FPDF_EXPORT unsigned long FPDF_CALLCONV + FPDFImageObj_GetImageDataDecoded(FPDF_PAGEOBJECT image_object, + void* buffer, diff --git a/fpdfsdk/fpdfeditpage.cpp b/fpdfsdk/fpdfeditpage.cpp index ca2cf3f..ac36788 100644 --- a/fpdfsdk/fpdfeditpage.cpp @@ -283,3 +314,17 @@ index 043dc16..fe3b971 100644 // Function: FPDFLink_LoadWebLinks // Prepare information about weblinks in a page. // Parameters: +diff --git a/public/fpdfview.h b/public/fpdfview.h +index 35e87ae..80ab0ad 100644 +--- a/public/fpdfview.h ++++ b/public/fpdfview.h +@@ -908,6 +908,9 @@ FPDF_EXPORT FPDF_BITMAP FPDF_CALLCONV FPDFBitmap_CreateEx(int width, + // function; see the list of such formats above. + FPDF_EXPORT int FPDF_CALLCONV FPDFBitmap_GetFormat(FPDF_BITMAP bitmap); + ++FPDF_EXPORT FPDF_BITMAP FPDF_CALLCONV ++FPDFImageObj_GetBitmapBgra(FPDF_PAGEOBJECT image_object); ++ + // Function: FPDFBitmap_FillRect + // Fill a rectangle in a bitmap. + // Parameters: diff --git a/svx/source/svdraw/svdpdf.cxx b/svx/source/svdraw/svdpdf.cxx index b4b8ca47a54d..aaa8347f03fd 100644 --- a/svx/source/svdraw/svdpdf.cxx +++ b/svx/source/svdraw/svdpdf.cxx @@ -1160,7 +1160,7 @@ void ImpSdrPdfImport::MapScaling() void ImpSdrPdfImport::ImportImage(FPDF_PAGEOBJECT pPageObject) { SAL_WARN("sd.filter", "Got page object IMAGE"); - std::unique_ptr<void, FPDFBitmapDeleter> bitmap(FPDFImageObj_GetBitmap(pPageObject)); + std::unique_ptr<void, FPDFBitmapDeleter> bitmap(FPDFImageObj_GetBitmapBgra(pPageObject)); if (!bitmap) { SAL_WARN("sd.filter", "Failed to get IMAGE"); @@ -1222,7 +1222,7 @@ void ImpSdrPdfImport::ImportImage(FPDF_PAGEOBJECT pPageObject) for (int nRow = 0; nRow < nHeight; ++nRow) { pWriteAccess->CopyScanline(nRow, pBuf + (nStride * nRow), - ScanlineFormat::N32BitTcBgra, nStride); + ScanlineFormat::N32BitTcRgba, nStride); } break; case FPDFBitmap_BGRA: commit 1b6300f00de97c64d1df1e0ed35af98973a18ee6 Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Mon Apr 9 09:08:02 2018 -0400 svx: refactor PDF text importing Change-Id: Ibe8d794c1d457936c9272bb664a5478d78654dd4 diff --git a/svx/source/svdraw/svdpdf.cxx b/svx/source/svdraw/svdpdf.cxx index d5673a4cf364..b4b8ca47a54d 100644 --- a/svx/source/svdraw/svdpdf.cxx +++ b/svx/source/svdraw/svdpdf.cxx @@ -236,67 +236,8 @@ void ImpSdrPdfImport::DoLoopActions(SvdProgressInfo* pProgrInfo, sal_uInt32* pAc switch (nPageObjectType) { case FPDF_PAGEOBJ_TEXT: - { - SAL_WARN("sd.filter", "Got page object TEXT"); - float left; - float bottom; - float right; - float top; - if (!FPDFPageObj_GetBounds(pPageObject, &left, &bottom, &right, &top)) - { - 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); - - 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) - { - SAL_WARN("sd.filter", "Bogus font scale matrix (" - << aMatrix.m00 << ',' << aMatrix.m11 - << "), will use heuristic height of " - << aRect.GetHeight() << "."); - dFontScale = aRect.GetHeight(); - } - 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); - vcl::Font aFnt = mpVD->GetFont(); - aFnt.SetFontSize(Size(dFontSize, dFontSize)); - 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 #" << nPageObjectIndex + 1 << " (" << nChars - << "): [" << sText << "]."); - - ImportText(aRect.TopLeft(), sText); - } - break; + ImportText(pPageObject); + break; case FPDF_PAGEOBJ_PATH: SAL_WARN("sd.filter", "Got page object PATH"); break; @@ -1073,6 +1014,63 @@ void ImpSdrPdfImport::checkClip() } bool ImpSdrPdfImport::isClip() const { return !maClip.getB2DRange().isEmpty(); } + +void ImpSdrPdfImport::ImportText(FPDF_PAGEOBJECT pPageObject) +{ + SAL_WARN("sd.filter", "Got page object TEXT"); + float left; + float bottom; + float right; + float top; + if (!FPDFPageObj_GetBounds(pPageObject, &left, &bottom, &right, &top)) + { + 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); + + 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) + { + SAL_WARN("sd.filter", "Bogus font scale matrix (" << aMatrix.m00 << ',' << aMatrix.m11 + << "), will use heuristic height of " + << aRect.GetHeight() << "."); + dFontScale = aRect.GetHeight(); + } + 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); + vcl::Font aFnt = mpVD->GetFont(); + aFnt.SetFontSize(Size(dFontSize, dFontSize)); + 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); +} + void ImpSdrPdfImport::ImportText(const Point& rPos, const OUString& rStr) { // calc text box size, add 5% to make it fit safely diff --git a/svx/source/svdraw/svdpdf.hxx b/svx/source/svdraw/svdpdf.hxx index 0c462c6fc135..7d458b978c01 100644 --- a/svx/source/svdraw/svdpdf.hxx +++ b/svx/source/svdraw/svdpdf.hxx @@ -103,6 +103,7 @@ class ImpSdrPdfImport final void ImportImage(FPDF_PAGEOBJECT pPageObject); void SetupPageScale(const double dPageWidth, const double dPageHeight); + void ImportText(FPDF_PAGEOBJECT pPageObject); void ImportText(const Point& rPos, const OUString& rStr); void SetAttributes(SdrObject* pObj, bool bForceTextAttr = false); void InsertObj(SdrObject* pObj, bool bScale = true); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits