Index: src/pdf/SkPDFDevice.cpp |
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp |
index 9cc2563caf44532123e3d6e3fe2f39ba5a65fdb8..514cd8840897c9a84312ce5c6da0186e9605ee06 100644 |
--- a/src/pdf/SkPDFDevice.cpp |
+++ b/src/pdf/SkPDFDevice.cpp |
@@ -19,6 +19,7 @@ |
#include "SkPathOps.h" |
#include "SkPDFBitmap.h" |
#include "SkPDFCanon.h" |
+#include "SkPDFDocument.h" |
#include "SkPDFFont.h" |
#include "SkPDFFormXObject.h" |
#include "SkPDFGraphicState.h" |
@@ -584,9 +585,11 @@ SkBaseDevice* SkPDFDevice::onCreateDevice(const CreateInfo& cinfo, const SkPaint |
return nullptr; |
} |
SkISize size = SkISize::Make(cinfo.fInfo.width(), cinfo.fInfo.height()); |
- return SkPDFDevice::Create(size, fRasterDpi, fCanon); |
+ return SkPDFDevice::Create(size, fRasterDpi, fDocument); |
} |
+SkPDFCanon* SkPDFDevice::getCanon() const { return fDocument->canon(); } |
+ |
struct ContentEntry { |
GraphicStateEntry fState; |
@@ -700,7 +703,7 @@ private: |
//////////////////////////////////////////////////////////////////////////////// |
-SkPDFDevice::SkPDFDevice(SkISize pageSize, SkScalar rasterDpi, SkPDFCanon* canon, bool flip) |
+SkPDFDevice::SkPDFDevice(SkISize pageSize, SkScalar rasterDpi, SkPDFDocument* doc, bool flip) |
: INHERITED(SkSurfaceProps(0, kUnknown_SkPixelGeometry)) |
, fPageSize(pageSize) |
, fContentSize(pageSize) |
@@ -711,7 +714,7 @@ SkPDFDevice::SkPDFDevice(SkISize pageSize, SkScalar rasterDpi, SkPDFCanon* canon |
, fClipStack(nullptr) |
, fFontGlyphUsage(new SkPDFGlyphSetMap) |
, fRasterDpi(rasterDpi) |
- , fCanon(canon) { |
+ , fDocument(doc) { |
SkASSERT(pageSize.width() > 0); |
SkASSERT(pageSize.height() > 0); |
fLegacyBitmap.setInfo( |
@@ -1057,7 +1060,7 @@ void SkPDFDevice::drawBitmap(const SkDraw& d, |
SkMatrix transform = matrix; |
transform.postConcat(*d.fMatrix); |
- const SkImage* image = fCanon->bitmapToImage(bitmap); |
+ const SkImage* image = fDocument->canon()->bitmapToImage(bitmap); |
if (!image) { |
return; |
} |
@@ -1081,7 +1084,7 @@ void SkPDFDevice::drawSprite(const SkDraw& d, |
SkMatrix matrix; |
matrix.setTranslate(SkIntToScalar(x), SkIntToScalar(y)); |
- const SkImage* image = fCanon->bitmapToImage(bitmap); |
+ const SkImage* image = fDocument->canon()->bitmapToImage(bitmap); |
if (!image) { |
return; |
} |
@@ -1196,7 +1199,7 @@ static void draw_transparent_text(SkPDFDevice* device, |
void SkPDFDevice::drawText(const SkDraw& d, const void* text, size_t len, |
SkScalar x, SkScalar y, const SkPaint& srcPaint) { |
- if (!SkPDFFont::CanEmbedTypeface(srcPaint.getTypeface(), fCanon)) { |
+ if (!SkPDFFont::CanEmbedTypeface(srcPaint.getTypeface(), fDocument->canon())) { |
// https://bug.skia.org/3866 |
SkPath path; |
srcPaint.getTextPath(text, len, x, y, &path); |
@@ -1257,7 +1260,7 @@ void SkPDFDevice::drawText(const SkDraw& d, const void* text, size_t len, |
void SkPDFDevice::drawPosText(const SkDraw& d, const void* text, size_t len, |
const SkScalar pos[], int scalarsPerPos, |
const SkPoint& offset, const SkPaint& srcPaint) { |
- if (!SkPDFFont::CanEmbedTypeface(srcPaint.getTypeface(), fCanon)) { |
+ if (!SkPDFFont::CanEmbedTypeface(srcPaint.getTypeface(), fDocument->canon())) { |
const SkPoint* positions = reinterpret_cast<const SkPoint*>(pos); |
SkAutoTMalloc<SkPoint> positionsBuffer; |
if (2 != scalarsPerPos) { |
@@ -1680,7 +1683,7 @@ void SkPDFDevice::drawFormXObjectWithMask(int xObjectIndex, |
} |
auto sMaskGS = SkPDFGraphicState::GetSMaskGraphicState( |
- mask, invertClip, SkPDFGraphicState::kAlpha_SMaskMode, fCanon); |
+ mask, invertClip, SkPDFGraphicState::kAlpha_SMaskMode, fDocument->canon()); |
SkMatrix identity; |
identity.reset(); |
@@ -1697,7 +1700,7 @@ void SkPDFDevice::drawFormXObjectWithMask(int xObjectIndex, |
// Call makeNoSmaskGraphicState() instead of |
// SkPDFGraphicState::MakeNoSmaskGraphicState so that the canon |
// can deduplicate. |
- sMaskGS = fCanon->makeNoSmaskGraphicState(); |
+ sMaskGS = fDocument->canon()->makeNoSmaskGraphicState(); |
SkPDFUtils::ApplyGraphicState(addGraphicStateResource(sMaskGS.get()), |
&content.entry()->fContent); |
} |
@@ -2004,7 +2007,7 @@ void SkPDFDevice::populateGraphicStateEntryFromPaint( |
SkScalar rasterScale = |
SkIntToScalar(fRasterDpi) / DPI_FOR_RASTER_SCALE_ONE; |
pdfShader.reset(SkPDFShader::GetPDFShader( |
- fCanon, fRasterDpi, *shader, transform, bounds, rasterScale)); |
+ fDocument, fRasterDpi, *shader, transform, bounds, rasterScale)); |
if (pdfShader.get()) { |
// pdfShader has been canonicalized so we can directly compare |
@@ -2035,12 +2038,12 @@ void SkPDFDevice::populateGraphicStateEntryFromPaint( |
sk_sp<SkPDFGraphicState> newGraphicState; |
if (color == paint.getColor()) { |
newGraphicState.reset( |
- SkPDFGraphicState::GetGraphicStateForPaint(fCanon, paint)); |
+ SkPDFGraphicState::GetGraphicStateForPaint(fDocument->canon(), paint)); |
} else { |
SkPaint newPaint = paint; |
newPaint.setColor(color); |
newGraphicState.reset( |
- SkPDFGraphicState::GetGraphicStateForPaint(fCanon, newPaint)); |
+ SkPDFGraphicState::GetGraphicStateForPaint(fDocument->canon(), newPaint)); |
} |
int resourceIndex = addGraphicStateResource(newGraphicState.get()); |
entry->fGraphicStateIndex = resourceIndex; |
@@ -2097,7 +2100,7 @@ void SkPDFDevice::updateFont(const SkPaint& paint, uint16_t glyphID, |
int SkPDFDevice::getFontResourceIndex(SkTypeface* typeface, uint16_t glyphID) { |
sk_sp<SkPDFFont> newFont( |
- SkPDFFont::GetFontResource(fCanon, typeface, glyphID)); |
+ SkPDFFont::GetFontResource(fDocument->canon(), typeface, glyphID)); |
int resourceIndex = fFontResources.find(newFont.get()); |
if (resourceIndex < 0) { |
resourceIndex = fFontResources.count(); |
@@ -2261,14 +2264,20 @@ void SkPDFDevice::internalDrawImage(const SkMatrix& origMatrix, |
// TODO(halcanary): de-dupe this by caching filtered images. |
// (maybe in the resource cache?) |
} |
- sk_sp<SkPDFObject> pdfimage(SkSafeRef(fCanon->findPDFBitmap(image))); |
+ sk_sp<SkPDFObject> pdfimage(SkSafeRef(fDocument->canon()->findPDFBitmap(image))); |
if (!pdfimage) { |
pdfimage.reset(SkPDFCreateBitmapObject( |
- image, fCanon->getPixelSerializer())); |
+ image, fDocument->canon()->getPixelSerializer())); |
if (!pdfimage) { |
return; |
} |
- fCanon->addPDFBitmap(image->uniqueID(), pdfimage.get()); |
+ #if SK_PDF_SERIALIZE_IMAGES_EARLY // TODO(halcanary): enable. |
+ sk_sp<SkData> encodedImage(image->refEncodedData()); |
+ if (!encodedImage) { |
+ fDocument->serialize(pdfimage); |
+ } |
+ #endif |
+ fDocument->canon()->addPDFBitmap(image->uniqueID(), pdfimage.get()); |
} |
SkPDFUtils::DrawFormXObject(this->addXObjectResource(pdfimage.get()), |
&content.entry()->fContent); |