SkPDF: remove margin foolishness
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1837453003 Review URL: https://codereview.chromium.org/1837453003
This commit is contained in:
parent
d2100f20a9
commit
73557f6c3f
@ -707,8 +707,6 @@ SkPDFDevice::SkPDFDevice(SkISize pageSize, SkScalar rasterDpi, SkPDFDocument* do
|
||||
, fContentSize(pageSize)
|
||||
, fExistingClipRegion(SkIRect::MakeSize(pageSize))
|
||||
, fLastContentEntry(nullptr)
|
||||
, fLastMarginContentEntry(nullptr)
|
||||
, fDrawingArea(kContent_DrawingArea)
|
||||
, fClipStack(nullptr)
|
||||
, fFontGlyphUsage(new SkPDFGlyphSetMap)
|
||||
, fRasterDpi(rasterDpi)
|
||||
@ -736,9 +734,6 @@ SkPDFDevice::~SkPDFDevice() {
|
||||
void SkPDFDevice::init() {
|
||||
fContentEntries.reset();
|
||||
fLastContentEntry = nullptr;
|
||||
fMarginContentEntries.reset();
|
||||
fLastMarginContentEntry = nullptr;
|
||||
fDrawingArea = kContent_DrawingArea;
|
||||
if (fFontGlyphUsage.get() == nullptr) {
|
||||
fFontGlyphUsage.reset(new SkPDFGlyphSetMap);
|
||||
}
|
||||
@ -1409,35 +1404,6 @@ sk_sp<SkSurface> SkPDFDevice::makeSurface(const SkImageInfo& info, const SkSurfa
|
||||
return SkSurface::MakeRaster(info, &props);
|
||||
}
|
||||
|
||||
ContentEntry* SkPDFDevice::getLastContentEntry() {
|
||||
if (fDrawingArea == kContent_DrawingArea) {
|
||||
return fLastContentEntry;
|
||||
} else {
|
||||
return fLastMarginContentEntry;
|
||||
}
|
||||
}
|
||||
|
||||
SkAutoTDelete<ContentEntry>* SkPDFDevice::getContentEntries() {
|
||||
if (fDrawingArea == kContent_DrawingArea) {
|
||||
return &fContentEntries;
|
||||
} else {
|
||||
return &fMarginContentEntries;
|
||||
}
|
||||
}
|
||||
|
||||
void SkPDFDevice::setLastContentEntry(ContentEntry* contentEntry) {
|
||||
if (fDrawingArea == kContent_DrawingArea) {
|
||||
fLastContentEntry = contentEntry;
|
||||
} else {
|
||||
fLastMarginContentEntry = contentEntry;
|
||||
}
|
||||
}
|
||||
|
||||
void SkPDFDevice::setDrawingArea(DrawingArea drawingArea) {
|
||||
// A ScopedContentEntry only exists during the course of a draw call, so
|
||||
// this can't be called while a ScopedContentEntry exists.
|
||||
fDrawingArea = drawingArea;
|
||||
}
|
||||
|
||||
sk_sp<SkPDFDict> SkPDFDevice::makeResourceDict() const {
|
||||
SkTDArray<SkPDFObject*> fonts;
|
||||
@ -1500,13 +1466,6 @@ void SkPDFDevice::writeContent(SkWStream* out) const {
|
||||
SkPDFUtils::AppendTransform(fInitialTransform, out);
|
||||
}
|
||||
|
||||
// TODO(aayushkumar): Apply clip along the margins. Currently, webkit
|
||||
// colors the contentArea white before it starts drawing into it and
|
||||
// that currently acts as our clip.
|
||||
// Also, think about adding a transform here (or assume that the values
|
||||
// sent across account for that)
|
||||
SkPDFDevice::copyContentEntriesToData(fMarginContentEntries.get(), out);
|
||||
|
||||
// If the content area is the entire page, then we don't need to clip
|
||||
// the content area (PDF area clips to the page size). Otherwise,
|
||||
// we have to clip to the content area; we've already applied the
|
||||
@ -1764,9 +1723,8 @@ ContentEntry* SkPDFDevice::setUpContentEntry(const SkClipStack* clipStack,
|
||||
ContentEntry* entry;
|
||||
SkAutoTDelete<ContentEntry> newEntry;
|
||||
|
||||
ContentEntry* lastContentEntry = getLastContentEntry();
|
||||
if (lastContentEntry && lastContentEntry->fContent.getOffset() == 0) {
|
||||
entry = lastContentEntry;
|
||||
if (fLastContentEntry && fLastContentEntry->fContent.getOffset() == 0) {
|
||||
entry = fLastContentEntry;
|
||||
} else {
|
||||
newEntry.reset(new ContentEntry);
|
||||
entry = newEntry.get();
|
||||
@ -1774,21 +1732,20 @@ ContentEntry* SkPDFDevice::setUpContentEntry(const SkClipStack* clipStack,
|
||||
|
||||
populateGraphicStateEntryFromPaint(matrix, *clipStack, clipRegion, paint,
|
||||
hasText, &entry->fState);
|
||||
if (lastContentEntry && xfermode != SkXfermode::kDstOver_Mode &&
|
||||
entry->fState.compareInitialState(lastContentEntry->fState)) {
|
||||
return lastContentEntry;
|
||||
if (fLastContentEntry && xfermode != SkXfermode::kDstOver_Mode &&
|
||||
entry->fState.compareInitialState(fLastContentEntry->fState)) {
|
||||
return fLastContentEntry;
|
||||
}
|
||||
|
||||
SkAutoTDelete<ContentEntry>* contentEntries = getContentEntries();
|
||||
if (!lastContentEntry) {
|
||||
contentEntries->reset(entry);
|
||||
setLastContentEntry(entry);
|
||||
if (!fLastContentEntry) {
|
||||
fContentEntries.reset(entry);
|
||||
fLastContentEntry = entry;
|
||||
} else if (xfermode == SkXfermode::kDstOver_Mode) {
|
||||
entry->fNext.reset(contentEntries->release());
|
||||
contentEntries->reset(entry);
|
||||
entry->fNext.reset(fContentEntries.release());
|
||||
fContentEntries.reset(entry);
|
||||
} else {
|
||||
lastContentEntry->fNext.reset(entry);
|
||||
setLastContentEntry(entry);
|
||||
fLastContentEntry->fNext.reset(entry);
|
||||
fLastContentEntry = entry;
|
||||
}
|
||||
newEntry.release();
|
||||
return entry;
|
||||
@ -1812,13 +1769,11 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode,
|
||||
}
|
||||
if (xfermode == SkXfermode::kDstOver_Mode) {
|
||||
SkASSERT(!dst);
|
||||
ContentEntry* firstContentEntry = getContentEntries()->get();
|
||||
if (firstContentEntry->fContent.getOffset() == 0) {
|
||||
if (fContentEntries->fContent.getOffset() == 0) {
|
||||
// For DstOver, an empty content entry was inserted before the rest
|
||||
// of the content entries. If nothing was drawn, it needs to be
|
||||
// removed.
|
||||
SkAutoTDelete<ContentEntry>* contentEntries = getContentEntries();
|
||||
contentEntries->reset(firstContentEntry->fNext.release());
|
||||
fContentEntries.reset(fContentEntries->fNext.release());
|
||||
}
|
||||
return;
|
||||
}
|
||||
@ -1828,15 +1783,14 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode,
|
||||
return;
|
||||
}
|
||||
|
||||
ContentEntry* contentEntries = getContentEntries()->get();
|
||||
SkASSERT(dst);
|
||||
SkASSERT(!contentEntries->fNext.get());
|
||||
SkASSERT(!fContentEntries->fNext.get());
|
||||
// Changing the current content into a form-xobject will destroy the clip
|
||||
// objects which is fine since the xobject will already be clipped. However
|
||||
// if source has shape, we need to clip it too, so a copy of the clip is
|
||||
// saved.
|
||||
SkClipStack clipStack = contentEntries->fState.fClipStack;
|
||||
SkRegion clipRegion = contentEntries->fState.fClipRegion;
|
||||
SkClipStack clipStack = fContentEntries->fState.fClipStack;
|
||||
SkRegion clipRegion = fContentEntries->fState.fClipRegion;
|
||||
|
||||
SkMatrix identity;
|
||||
identity.reset();
|
||||
@ -1951,9 +1905,8 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode,
|
||||
}
|
||||
|
||||
bool SkPDFDevice::isContentEmpty() {
|
||||
ContentEntry* contentEntries = getContentEntries()->get();
|
||||
if (!contentEntries || contentEntries->fContent.getOffset() == 0) {
|
||||
SkASSERT(!contentEntries || !contentEntries->fNext.get());
|
||||
if (!fContentEntries || fContentEntries->fContent.getOffset() == 0) {
|
||||
SkASSERT(!fContentEntries || !fContentEntries->fNext.get());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -131,22 +131,6 @@ public:
|
||||
void onDetachFromCanvas() override;
|
||||
SkImageInfo imageInfo() const override;
|
||||
|
||||
enum DrawingArea {
|
||||
kContent_DrawingArea, // Drawing area for the page content.
|
||||
kMargin_DrawingArea, // Drawing area for the margin content.
|
||||
};
|
||||
|
||||
/** Sets the drawing area for the device. Subsequent draw calls are directed
|
||||
* to the specific drawing area (margin or content). The default drawing
|
||||
* area is the content drawing area.
|
||||
*
|
||||
* Currently if margin content is drawn and then a complex (for PDF) xfer
|
||||
* mode is used, like SrcIn, Clear, etc, the margin content will get
|
||||
* clipped. A simple way to avoid the bug is to always draw the margin
|
||||
* content last.
|
||||
*/
|
||||
void setDrawingArea(DrawingArea drawingArea);
|
||||
|
||||
// PDF specific methods.
|
||||
|
||||
/** Create the resource dictionary for this device. */
|
||||
@ -250,15 +234,9 @@ private:
|
||||
|
||||
SkAutoTDelete<ContentEntry> fContentEntries;
|
||||
ContentEntry* fLastContentEntry;
|
||||
SkAutoTDelete<ContentEntry> fMarginContentEntries;
|
||||
ContentEntry* fLastMarginContentEntry;
|
||||
DrawingArea fDrawingArea;
|
||||
|
||||
const SkClipStack* fClipStack;
|
||||
|
||||
// Accessor and setter functions based on the current DrawingArea.
|
||||
SkAutoTDelete<ContentEntry>* getContentEntries();
|
||||
|
||||
// Glyph ids used for each font on this device.
|
||||
SkAutoTDelete<SkPDFGlyphSetMap> fFontGlyphUsage;
|
||||
|
||||
@ -274,9 +252,6 @@ private:
|
||||
SkPDFDocument* doc,
|
||||
bool flip);
|
||||
|
||||
ContentEntry* getLastContentEntry();
|
||||
void setLastContentEntry(ContentEntry* contentEntry);
|
||||
|
||||
SkBaseDevice* onCreateDevice(const CreateInfo&, const SkPaint*) override;
|
||||
|
||||
void init();
|
||||
|
Loading…
Reference in New Issue
Block a user