reject non-Valid() rects Signed-off-by: Caolán McNamara <caolan.mcnamara@collabora.com> Change-Id: I05f5ba73f0555d6b7dbf40c5e6dc20d876a7784a Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/3569 Tested-by: Jenkins CPCI <releng@collaboraoffice.com> Reviewed-by: Noel Grandin <noel.grandin@collabora.com> (cherry picked from commit 68b069d5c5d4a9276bf6d0b79c360002422365d3) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/205870 Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org> Tested-by: Jenkins
184 lines
7.2 KiB
Diff
184 lines
7.2 KiB
Diff
--- core/fpdfapi/page/cpdf_pattern.h 2025-10-17 15:44:08.393532043 +0100
|
|
+++ core/fpdfapi/page/cpdf_pattern.h 2025-10-17 15:44:12.020459390 +0100
|
|
@@ -26,6 +26,7 @@
|
|
virtual CPDF_ShadingPattern* AsShadingPattern();
|
|
|
|
const CFX_Matrix& pattern_to_form() const { return pattern_to_form_; }
|
|
+ RetainPtr<CPDF_Object> pattern_obj() const { return pattern_obj_; }
|
|
|
|
protected:
|
|
CPDF_Pattern(CPDF_Document* doc,
|
|
@@ -35,7 +36,6 @@
|
|
|
|
// All the getters that return pointers return non-NULL pointers.
|
|
CPDF_Document* document() const { return document_; }
|
|
- RetainPtr<CPDF_Object> pattern_obj() const { return pattern_obj_; }
|
|
const CFX_Matrix& parent_matrix() const { return parent_matrix_; }
|
|
|
|
void SetPatternToFormMatrix();
|
|
--- fpdfsdk/fpdf_edittext.cpp 2025-10-17 15:44:08.410532151 +0100
|
|
+++ fpdfsdk/fpdf_edittext.cpp 2025-10-17 15:55:18.804847559 +0100
|
|
@@ -13,6 +13,9 @@
|
|
#include "core/fpdfapi/font/cpdf_cidfont.h"
|
|
#include "core/fpdfapi/font/cpdf_font.h"
|
|
#include "core/fpdfapi/page/cpdf_docpagedata.h"
|
|
+#include "core/fpdfapi/page/cpdf_form.h"
|
|
+#include "core/fpdfapi/page/cpdf_pathobject.h"
|
|
+#include "core/fpdfapi/page/cpdf_tilingpattern.h"
|
|
#include "core/fpdfapi/page/cpdf_textobject.h"
|
|
#include "core/fpdfapi/page/cpdf_textstate.h"
|
|
#include "core/fpdfapi/parser/cpdf_array.h"
|
|
@@ -834,6 +835,108 @@
|
|
return FPDFBitmapFromCFXDIBitmap(result_bitmap.Leak());
|
|
}
|
|
|
|
+FPDF_BITMAP
|
|
+FPDFPageObj_GetRenderedPattern(CPDF_Pattern& pattern,
|
|
+ CPDF_Document& doc,
|
|
+ CPDF_PageObject& pageObj,
|
|
+ CPDF_Page* optional_page) {
|
|
+ CPDF_TilingPattern* pTilingPattern = pattern.AsTilingPattern();
|
|
+ if (!pTilingPattern)
|
|
+ return nullptr;
|
|
+ const std::unique_ptr<CPDF_Form> pPatternForm = pTilingPattern->Load(&pageObj);
|
|
+ if (!pPatternForm)
|
|
+ return nullptr;
|
|
+ RetainPtr<const CPDF_Dictionary> pDict = pattern.pattern_obj()->GetDict();
|
|
+ CFX_FloatRect pattern_bbox = pDict->GetRectFor("BBox");
|
|
+
|
|
+ // `rect` has to use integer values. Round up as needed.
|
|
+ const FX_RECT rect = pattern_bbox.GetOuterRect();
|
|
+ if (rect.IsEmpty() || !rect.Valid())
|
|
+ return nullptr;
|
|
+
|
|
+ auto result_bitmap = pdfium::MakeRetain<CFX_DIBitmap>();
|
|
+ if (!result_bitmap->Create(rect.Width(), rect.Height(),
|
|
+ FXDIB_Format::kBgra)) {
|
|
+ return nullptr;
|
|
+ }
|
|
+ CFX_FloatRect cell_bbox = pattern.pattern_to_form().TransformRect(pattern_bbox);
|
|
+ CFX_FloatRect bitmap_rect(0.0f, 0.0f, rect.Width(), rect.Height());
|
|
+ CFX_Matrix mtPattern2Bitmap;
|
|
+ mtPattern2Bitmap.MatchRect(bitmap_rect, cell_bbox);
|
|
+
|
|
+ CFX_DefaultRenderDevice bitmap_device;
|
|
+ bitmap_device.AttachWithBackdropAndGroupKnockout(
|
|
+ result_bitmap, /*pBackdropBitmap=*/nullptr, /*bGroupKnockout=*/true);
|
|
+
|
|
+ CPDF_RenderOptions options;
|
|
+ if (!pTilingPattern->colored())
|
|
+ options.SetColorMode(CPDF_RenderOptions::kAlpha);
|
|
+ options.GetOptions().bForceHalftone = true;
|
|
+
|
|
+ CPDF_RenderContext context(&doc, nullptr, nullptr);
|
|
+ context.AppendLayer(pPatternForm.get(), mtPattern2Bitmap);
|
|
+ context.Render(&bitmap_device, nullptr, &options, nullptr);
|
|
+
|
|
+ CHECK(!result_bitmap->IsPremultiplied());
|
|
+
|
|
+ // Caller takes ownership.
|
|
+ return FPDFBitmapFromCFXDIBitmap(result_bitmap.Leak());
|
|
+}
|
|
+
|
|
+FPDF_EXPORT FPDF_BITMAP FPDF_CALLCONV
|
|
+FPDFPageObj_GetRenderedStrokePattern(FPDF_DOCUMENT document,
|
|
+ FPDF_PAGE page,
|
|
+ FPDF_PAGEOBJECT page_object) {
|
|
+ CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document);
|
|
+ if (!doc)
|
|
+ return nullptr;
|
|
+
|
|
+ CPDF_Page* optional_page = CPDFPageFromFPDFPage(page);
|
|
+ if (optional_page && optional_page->GetDocument() != doc)
|
|
+ return nullptr;
|
|
+
|
|
+ CPDF_PageObject* object = CPDFPageObjectFromFPDFPageObject(page_object);
|
|
+ if (!object)
|
|
+ return nullptr;
|
|
+
|
|
+ const CPDF_Color* stroke = object->color_state().GetStrokeColor();
|
|
+ if (!stroke || !stroke->IsPattern())
|
|
+ return nullptr;
|
|
+
|
|
+ RetainPtr<CPDF_Pattern> pattern = stroke->GetPattern();
|
|
+ if (!pattern)
|
|
+ return nullptr;
|
|
+
|
|
+ return FPDFPageObj_GetRenderedPattern(*pattern, *doc, *object, optional_page);
|
|
+}
|
|
+
|
|
+FPDF_EXPORT FPDF_BITMAP FPDF_CALLCONV
|
|
+FPDFPageObj_GetRenderedFillPattern(FPDF_DOCUMENT document,
|
|
+ FPDF_PAGE page,
|
|
+ FPDF_PAGEOBJECT page_object) {
|
|
+ CPDF_Document* doc = CPDFDocumentFromFPDFDocument(document);
|
|
+ if (!doc)
|
|
+ return nullptr;
|
|
+
|
|
+ CPDF_Page* optional_page = CPDFPageFromFPDFPage(page);
|
|
+ if (optional_page && optional_page->GetDocument() != doc)
|
|
+ return nullptr;
|
|
+
|
|
+ CPDF_PageObject* object = CPDFPageObjectFromFPDFPageObject(page_object);
|
|
+ if (!object)
|
|
+ return nullptr;
|
|
+
|
|
+ const CPDF_Color* fill = object->color_state().GetFillColor();
|
|
+ if (!fill || !fill->IsPattern())
|
|
+ return nullptr;
|
|
+
|
|
+ RetainPtr<CPDF_Pattern> pattern = fill->GetPattern();
|
|
+ if (!pattern)
|
|
+ return nullptr;
|
|
+
|
|
+ return FPDFPageObj_GetRenderedPattern(*pattern, *doc, *object, optional_page);
|
|
+}
|
|
+
|
|
FPDF_EXPORT void FPDF_CALLCONV FPDFFont_Close(FPDF_FONT font) {
|
|
// Take back ownership from caller and release.
|
|
RetainPtr<CPDF_Font>().Unleak(CPDFFontFromFPDFFont(font));
|
|
--- public/fpdf_edit.h 2025-10-17 15:44:08.415888612 +0100
|
|
+++ public/fpdf_edit.h 2025-10-17 15:44:12.022555158 +0100
|
|
@@ -1417,6 +1417,41 @@
|
|
float scale);
|
|
|
|
// Experimental API.
|
|
+// Get a bitmap rasterization of the stroke pattern of |page object|.
|
|
+// To render correctly, the caller must provide the |document| associated with
|
|
+// |page_object|. If there is a |page| associated with |page_object|, the
|
|
+// caller should provide that as well. The returned bitmap will be owned by
|
|
+// the caller, and FPDFBitmap_Destroy() must be called on the returned bitmap
|
|
+// when it is no longer needed.
|
|
+//
|
|
+// document - handle to a document associated with |page_object|.
|
|
+// page - handle to an optional page associated with |page_object|.
|
|
+// page_object - handle to a page object.
|
|
+//
|
|
+// Returns the bitmap or NULL if the stroke is not a pattern or on failure.
|
|
+FPDF_EXPORT FPDF_BITMAP FPDF_CALLCONV
|
|
+FPDFPageObj_GetRenderedStrokePattern(FPDF_DOCUMENT document,
|
|
+ FPDF_PAGE page,
|
|
+ FPDF_PAGEOBJECT page_object);
|
|
+
|
|
+// Get a bitmap rasterization of the fill pattern of |page object|.
|
|
+// To render correctly, the caller must provide the |document| associated with
|
|
+// |page_object|. If there is a |page| associated with |page_object|, the
|
|
+// caller should provide that as well. The returned bitmap will be owned by
|
|
+// the caller, and FPDFBitmap_Destroy() must be called on the returned bitmap
|
|
+// when it is no longer needed.
|
|
+//
|
|
+// document - handle to a document associated with |page_object|.
|
|
+// page - handle to an optional page associated with |page_object|.
|
|
+// page_object - handle to a page object.
|
|
+//
|
|
+// Returns the bitmap or NULL if the fill is not a pattern or on failure.
|
|
+FPDF_EXPORT FPDF_BITMAP FPDF_CALLCONV
|
|
+FPDFPageObj_GetRenderedFillPattern(FPDF_DOCUMENT document,
|
|
+ FPDF_PAGE page,
|
|
+ FPDF_PAGEOBJECT page_object);
|
|
+
|
|
+// Experimental API.
|
|
// Get the font of a text object.
|
|
//
|
|
// text - the handle to the text object.
|