Index: src/pdf/SkPDFFormXObject.cpp |
diff --git a/src/pdf/SkPDFFormXObject.cpp b/src/pdf/SkPDFFormXObject.cpp |
index ba49df8ea8cd0f8c8bc249d0f9c3ae1475f9e884..1ab391c3460a78f27bba186af11a2f3529e07382 100644 |
--- a/src/pdf/SkPDFFormXObject.cpp |
+++ b/src/pdf/SkPDFFormXObject.cpp |
@@ -8,69 +8,26 @@ |
#include "SkPDFFormXObject.h" |
-#include "SkMatrix.h" |
-#include "SkPDFDevice.h" |
-#include "SkPDFUtils.h" |
-#include "SkStream.h" |
-#include "SkTypes.h" |
- |
-SkPDFFormXObject::SkPDFFormXObject(SkPDFDevice* device) { |
- // We don't want to keep around device because we'd have two copies |
- // of content, so reference or copy everything we need (content and |
- // resources). |
- auto resourceDict = device->makeResourceDict(); |
- |
- this->setData(device->content()); |
- |
- sk_sp<SkPDFArray> bboxArray(device->copyMediaBox()); |
- this->init(nullptr, resourceDict.get(), bboxArray.get()); |
- |
- // We invert the initial transform and apply that to the xobject so that |
- // it doesn't get applied twice. We can't just undo it because it's |
- // embedded in things like shaders and images. |
- if (!device->initialTransform().isIdentity()) { |
- SkMatrix inverse; |
- if (!device->initialTransform().invert(&inverse)) { |
- // The initial transform should be invertible. |
- SkASSERT(false); |
- inverse.reset(); |
- } |
- this->insertObject("Matrix", SkPDFUtils::MatrixToArray(inverse)); |
- } |
-} |
- |
-/** |
- * Creates a FormXObject from a content stream and associated resources. |
- */ |
-SkPDFFormXObject::SkPDFFormXObject(std::unique_ptr<SkStreamAsset> content, |
- SkRect bbox, |
- SkPDFDict* resourceDict) { |
- this->setData(std::move(content)); |
- sk_sp<SkPDFArray> bboxArray(SkPDFUtils::RectToArray(bbox)); |
- this->init("DeviceRGB", resourceDict, bboxArray.get()); |
-} |
- |
-/** |
- * Common initialization code. |
- * Note that bbox is unreferenced here, so calling code does not need worry. |
- */ |
-void SkPDFFormXObject::init(const char* colorSpace, |
- SkPDFDict* resourceDict, SkPDFArray* bbox) { |
- this->insertName("Type", "XObject"); |
- this->insertName("Subtype", "Form"); |
- this->insertObject("Resources", sk_ref_sp(resourceDict)); |
- this->insertObject("BBox", sk_ref_sp(bbox)); |
- |
- // Right now SkPDFFormXObject is only used for saveLayer, which implies |
+sk_sp<SkPDFObject> SkPDFMakeFormXObject(std::unique_ptr<SkStreamAsset> content, |
+ sk_sp<SkPDFArray> mediaBox, |
+ sk_sp<SkPDFDict> resourceDict, |
+ const char* colorSpace) { |
+ auto form = sk_make_sp<SkPDFStream>(std::move(content)); |
+ form->insertName("Type", "XObject"); |
+ form->insertName("Subtype", "Form"); |
+ form->insertObject("Resources", std::move(resourceDict)); |
+ form->insertObject("BBox", std::move(mediaBox)); |
+ |
+ // Right now FormXObject is only used for saveLayer, which implies |
// isolated blending. Do this conditionally if that changes. |
+ // TODO(halcanary): Is this comment obsolete, since we use it for |
+ // alpha masks? |
auto group = sk_make_sp<SkPDFDict>("Group"); |
group->insertName("S", "Transparency"); |
- |
if (colorSpace != nullptr) { |
group->insertName("CS", colorSpace); |
} |
group->insertBool("I", true); // Isolated. |
- this->insertObject("Group", std::move(group)); |
+ form->insertObject("Group", std::move(group)); |
+ return form; |
} |
- |
-SkPDFFormXObject::~SkPDFFormXObject() {} |