Dedup SkPaths by gen-ID when going to .skp
We're all set up to serialize and deserialze paths by an integer ID, but we're just not deduping any paths (every path gets a new ID). This turns on deduping. This should mean the number of paths in a deserialized SkPicture are the same as when it was recorded. No diffs: https://gold.skia.org/search2?issue=1409373011&unt=true&query=source_type%3Dgm&master=false BUG=skia:4527 Review URL: https://codereview.chromium.org/1409373011
This commit is contained in:
parent
13391dd972
commit
c2e2977014
@ -46,7 +46,13 @@ SkPictureData::SkPictureData(const SkPictureRecord& record,
|
||||
|
||||
fBitmaps = record.fBitmaps;
|
||||
fPaints = record.fPaints;
|
||||
fPaths = record.fPaths;
|
||||
|
||||
fPaths.reset(record.fPaths.count());
|
||||
record.fPaths.foreach([this](const SkPath& path, int n) {
|
||||
// These indices are logically 1-based, but we need to serialize them
|
||||
// 0-based to keep the deserializing SkPictureData::getPath() working.
|
||||
fPaths[n-1] = path;
|
||||
});
|
||||
|
||||
this->initForPlayback();
|
||||
|
||||
|
@ -587,7 +587,7 @@ void SkPictureRecord::onDrawImageRect(const SkImage* image, const SkRect* src, c
|
||||
size += sizeof(*src); // + rect
|
||||
}
|
||||
size += sizeof(dst); // + rect
|
||||
|
||||
|
||||
size_t initialOffset = this->addDraw(DRAW_IMAGE_RECT, &size);
|
||||
SkASSERT(initialOffset+get_paint_offset(DRAW_IMAGE_RECT, size)
|
||||
== fWriter.bytesWritten());
|
||||
@ -603,7 +603,7 @@ void SkPictureRecord::onDrawImageNine(const SkImage* img, const SkIRect& center,
|
||||
const SkPaint* paint) {
|
||||
// id + paint_index + image_index + center + dst
|
||||
size_t size = 3 * kUInt32Size + sizeof(SkIRect) + sizeof(SkRect);
|
||||
|
||||
|
||||
size_t initialOffset = this->addDraw(DRAW_IMAGE_NINE, &size);
|
||||
SkASSERT(initialOffset+get_paint_offset(DRAW_IMAGE_NINE, size) == fWriter.bytesWritten());
|
||||
this->addPaintPtr(paint);
|
||||
@ -863,7 +863,7 @@ void SkPictureRecord::onDrawAtlas(const SkImage* atlas, const SkRSXform xform[],
|
||||
flags |= DRAW_ATLAS_HAS_CULL;
|
||||
size += sizeof(SkRect);
|
||||
}
|
||||
|
||||
|
||||
size_t initialOffset = this->addDraw(DRAW_ATLAS, &size);
|
||||
SkASSERT(initialOffset+get_paint_offset(DRAW_ATLAS, size) == fWriter.bytesWritten());
|
||||
this->addPaintPtr(paint);
|
||||
@ -987,8 +987,12 @@ void SkPictureRecord::addPaintPtr(const SkPaint* paint) {
|
||||
}
|
||||
|
||||
int SkPictureRecord::addPathToHeap(const SkPath& path) {
|
||||
fPaths.push_back(path);
|
||||
return fPaths.count();
|
||||
if (int* n = fPaths.find(path)) {
|
||||
return *n;
|
||||
}
|
||||
int n = fPaths.count() + 1; // 0 is reserved for null / error.
|
||||
fPaths.set(path, n);
|
||||
return n;
|
||||
}
|
||||
|
||||
void SkPictureRecord::addPath(const SkPath& path) {
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include "SkPictureData.h"
|
||||
#include "SkTArray.h"
|
||||
#include "SkTDArray.h"
|
||||
#include "SkTHash.h"
|
||||
#include "SkWriter32.h"
|
||||
|
||||
// These macros help with packing and unpacking a single byte value and
|
||||
@ -226,7 +227,11 @@ private:
|
||||
|
||||
SkTArray<SkBitmap> fBitmaps;
|
||||
SkTArray<SkPaint> fPaints;
|
||||
SkTArray<SkPath> fPaths;
|
||||
|
||||
struct PathHash {
|
||||
uint32_t operator()(const SkPath& p) { return p.getGenerationID(); }
|
||||
};
|
||||
SkTHashMap<SkPath, int, PathHash> fPaths;
|
||||
|
||||
SkWriter32 fWriter;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user