Fix paths rendering issues.

See ApiDemos, PathEffect and PathFillTypes.

Change-Id: I9f9593c1da33d0d013b5b89c86bc5bd71128a192
This commit is contained in:
Romain Guy
2011-03-18 16:24:19 -07:00
parent 40667676e5
commit b29cfbf768
4 changed files with 10 additions and 37 deletions

View File

@@ -95,10 +95,6 @@ void DisplayList::clearResources() {
delete mPaths.itemAt(i);
}
mPaths.clear();
for (size_t i = 0; i < mOriginalPaths.size(); i++) {
caches.resourceCache.decrementRefcount(mOriginalPaths.itemAt(i));
}
mOriginalPaths.clear();
for (size_t i = 0; i < mMatrices.size(); i++) {
delete mMatrices.itemAt(i);
@@ -150,13 +146,6 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde
mPaths.add(paths.itemAt(i));
}
const Vector<SkPath*> &originalPaths = recorder.getOriginalPaths();
for (size_t i = 0; i < originalPaths.size(); i++) {
SkPath* path = originalPaths.itemAt(i);
mOriginalPaths.add(path);
caches.resourceCache.incrementRefcount(path);
}
const Vector<SkMatrix*> &matrices = recorder.getMatrices();
for (size_t i = 0; i < matrices.size(); i++) {
mMatrices.add(matrices.itemAt(i));
@@ -533,12 +522,6 @@ void DisplayListRenderer::reset() {
}
mBitmapResources.clear();
for (size_t i = 0; i < mOriginalPaths.size(); i++) {
SkPath* resource = mOriginalPaths.itemAt(i);
caches.resourceCache.decrementRefcount(resource);
}
mOriginalPaths.clear();
for (size_t i = 0; i < mShaders.size(); i++) {
caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
}

View File

@@ -193,7 +193,6 @@ private:
Vector<SkPaint*> mPaints;
Vector<SkPath*> mPaths;
Vector<SkPath*> mOriginalPaths;
Vector<SkMatrix*> mMatrices;
Vector<SkiaShader*> mShaders;
@@ -298,10 +297,6 @@ public:
return mPaths;
}
const Vector<SkPath*>& getOriginalPaths() const {
return mOriginalPaths;
}
const Vector<SkMatrix*>& getMatrices() const {
return mMatrices;
}
@@ -383,16 +378,9 @@ private:
SkPath* pathCopy = mPathMap.valueFor(path);
if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) {
if (pathCopy == NULL) {
pathCopy = path;
mOriginalPaths.add(path);
Caches& caches = Caches::getInstance();
caches.resourceCache.incrementRefcount(path);
} else {
pathCopy = new SkPath(*path);
mPaths.add(pathCopy);
}
pathCopy = new SkPath(*path);
mPathMap.add(path, pathCopy);
mPaths.add(pathCopy);
}
addInt((int) pathCopy);
@@ -469,7 +457,6 @@ private:
Vector<SkPaint*> mPaints;
DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap;
Vector<SkPath*> mOriginalPaths;
Vector<SkPath*> mPaths;
DefaultKeyedVector<SkPath*, SkPath*> mPathMap;

View File

@@ -41,8 +41,7 @@ struct PathCacheEntry: public ShapeCacheEntry {
path = NULL;
}
PathCacheEntry(const PathCacheEntry& entry):
ShapeCacheEntry(entry) {
PathCacheEntry(const PathCacheEntry& entry): ShapeCacheEntry(entry) {
path = entry.path;
}
@@ -55,6 +54,7 @@ struct PathCacheEntry: public ShapeCacheEntry {
}
SkPath* path;
}; // PathCacheEntry
/**

View File

@@ -96,7 +96,7 @@ struct ShapeCacheEntry {
ShapeCacheEntry(const ShapeCacheEntry& entry):
shapeType(entry.shapeType), join(entry.join), cap(entry.cap),
style(entry.style), miter(entry.miter),
strokeWidth(entry.strokeWidth) {
strokeWidth(entry.strokeWidth), pathEffect(entry.pathEffect) {
}
ShapeCacheEntry(ShapeType type, SkPaint* paint) {
@@ -108,18 +108,19 @@ struct ShapeCacheEntry {
v = paint->getStrokeWidth();
strokeWidth = *(uint32_t*) &v;
style = paint->getStyle();
pathEffect = paint->getPathEffect();
}
virtual ~ShapeCacheEntry() {
}
// shapeType must be checked in subclasses operator<
ShapeType shapeType;
SkPaint::Join join;
SkPaint::Cap cap;
SkPaint::Style style;
uint32_t miter;
uint32_t strokeWidth;
SkPathEffect* pathEffect;
bool operator<(const ShapeCacheEntry& rhs) const {
LTE_INT(shapeType) {
@@ -128,7 +129,9 @@ struct ShapeCacheEntry {
LTE_INT(style) {
LTE_INT(miter) {
LTE_INT(strokeWidth) {
return lessThan(rhs);
LTE_INT(pathEffect) {
return lessThan(rhs);
}
}
}
}