Merge "Don't crash Launcher on config change." into honeycomb

This commit is contained in:
Romain Guy
2011-01-14 18:49:55 -08:00
committed by Android (Google) Code Review
5 changed files with 50 additions and 20 deletions

View File

@@ -129,7 +129,7 @@ DisplayList::~DisplayList() {
mBitmapResources.clear(); mBitmapResources.clear();
for (size_t i = 0; i < mShaders.size(); i++) { for (size_t i = 0; i < mShaders.size(); i++) {
delete mShaders.itemAt(i); caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
} }
mShaders.clear(); mShaders.clear();
@@ -181,7 +181,9 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde
const Vector<SkiaShader*> &shaders = recorder.getShaders(); const Vector<SkiaShader*> &shaders = recorder.getShaders();
for (size_t i = 0; i < shaders.size(); i++) { for (size_t i = 0; i < shaders.size(); i++) {
mShaders.add(shaders.itemAt(i)); SkiaShader* shader = shaders.itemAt(i);
mShaders.add(shader);
caches.resourceCache.incrementRefcount(shader);
} }
const Vector<SkPaint*> &paints = recorder.getPaints(); const Vector<SkPaint*> &paints = recorder.getPaints();
@@ -405,10 +407,14 @@ void DisplayListRenderer::reset() {
} }
mBitmapResources.clear(); mBitmapResources.clear();
mPaints.clear(); for (size_t i = 0; i < mShaders.size(); i++) {
mPaintMap.clear(); caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
}
mShaders.clear(); mShaders.clear();
mShaderMap.clear(); mShaderMap.clear();
mPaints.clear();
mPaintMap.clear();
mMatrices.clear(); mMatrices.clear();
} }

View File

@@ -417,6 +417,7 @@ private:
shaderCopy = shader->copy(); shaderCopy = shader->copy();
mShaderMap.add(shader, shaderCopy); mShaderMap.add(shader, shaderCopy);
mShaders.add(shaderCopy); mShaders.add(shaderCopy);
Caches::getInstance().resourceCache.incrementRefcount(shaderCopy);
} }
addInt((int) shaderCopy); addInt((int) shaderCopy);

View File

@@ -67,12 +67,12 @@ void ResourceCache::incrementRefcount(SkBitmap* bitmapResource) {
void ResourceCache::incrementRefcount(SkiaShader* shaderResource) { void ResourceCache::incrementRefcount(SkiaShader* shaderResource) {
shaderResource->getSkShader()->safeRef(); shaderResource->getSkShader()->safeRef();
incrementRefcount((void*)shaderResource, kShader); incrementRefcount((void*) shaderResource, kShader);
} }
void ResourceCache::incrementRefcount(SkiaColorFilter* filterResource) { void ResourceCache::incrementRefcount(SkiaColorFilter* filterResource) {
filterResource->getSkColorFilter()->safeRef(); filterResource->getSkColorFilter()->safeRef();
incrementRefcount((void*)filterResource, kColorFilter); incrementRefcount((void*) filterResource, kColorFilter);
} }
void ResourceCache::decrementRefcount(void* resource) { void ResourceCache::decrementRefcount(void* resource) {
@@ -91,17 +91,17 @@ void ResourceCache::decrementRefcount(void* resource) {
void ResourceCache::decrementRefcount(SkBitmap* bitmapResource) { void ResourceCache::decrementRefcount(SkBitmap* bitmapResource) {
bitmapResource->pixelRef()->safeUnref(); bitmapResource->pixelRef()->safeUnref();
bitmapResource->getColorTable()->safeUnref(); bitmapResource->getColorTable()->safeUnref();
decrementRefcount((void*)bitmapResource); decrementRefcount((void*) bitmapResource);
} }
void ResourceCache::decrementRefcount(SkiaShader* shaderResource) { void ResourceCache::decrementRefcount(SkiaShader* shaderResource) {
shaderResource->getSkShader()->safeUnref(); shaderResource->getSkShader()->safeUnref();
decrementRefcount((void*)shaderResource); decrementRefcount((void*) shaderResource);
} }
void ResourceCache::decrementRefcount(SkiaColorFilter* filterResource) { void ResourceCache::decrementRefcount(SkiaColorFilter* filterResource) {
filterResource->getSkColorFilter()->safeUnref(); filterResource->getSkColorFilter()->safeUnref();
decrementRefcount((void*)filterResource); decrementRefcount((void*) filterResource);
} }
void ResourceCache::recycle(SkBitmap* resource) { void ResourceCache::recycle(SkBitmap* resource) {

View File

@@ -205,9 +205,12 @@ SkiaLinearGradientShader::~SkiaLinearGradientShader() {
SkiaShader* SkiaLinearGradientShader::copy() { SkiaShader* SkiaLinearGradientShader::copy() {
SkiaLinearGradientShader* copy = new SkiaLinearGradientShader(); SkiaLinearGradientShader* copy = new SkiaLinearGradientShader();
copy->copyFrom(*this); copy->copyFrom(*this);
copy->mBounds = mBounds; copy->mBounds = new float[4];
copy->mColors = mColors; memcpy(copy->mBounds, mBounds, sizeof(float) * 4);
copy->mPositions = mPositions; copy->mColors = new uint32_t[mCount];
memcpy(copy->mColors, mColors, sizeof(uint32_t) * mCount);
copy->mPositions = new float[mCount];
memcpy(copy->mPositions, mPositions, sizeof(float) * mCount);
copy->mCount = mCount; copy->mCount = mCount;
return copy; return copy;
} }
@@ -270,8 +273,10 @@ SkiaCircularGradientShader::SkiaCircularGradientShader(float x, float y, float r
SkiaShader* SkiaCircularGradientShader::copy() { SkiaShader* SkiaCircularGradientShader::copy() {
SkiaCircularGradientShader* copy = new SkiaCircularGradientShader(); SkiaCircularGradientShader* copy = new SkiaCircularGradientShader();
copy->copyFrom(*this); copy->copyFrom(*this);
copy->mColors = mColors; copy->mColors = new uint32_t[mCount];
copy->mPositions = mPositions; memcpy(copy->mColors, mColors, sizeof(uint32_t) * mCount);
copy->mPositions = new float[mCount];
memcpy(copy->mPositions, mPositions, sizeof(float) * mCount);
copy->mCount = mCount; copy->mCount = mCount;
return copy; return copy;
} }
@@ -317,8 +322,10 @@ SkiaSweepGradientShader::~SkiaSweepGradientShader() {
SkiaShader* SkiaSweepGradientShader::copy() { SkiaShader* SkiaSweepGradientShader::copy() {
SkiaSweepGradientShader* copy = new SkiaSweepGradientShader(); SkiaSweepGradientShader* copy = new SkiaSweepGradientShader();
copy->copyFrom(*this); copy->copyFrom(*this);
copy->mColors = mColors; copy->mColors = new uint32_t[mCount];
copy->mPositions = mPositions; memcpy(copy->mColors, mColors, sizeof(uint32_t) * mCount);
copy->mPositions = new float[mCount];
memcpy(copy->mPositions, mPositions, sizeof(float) * mCount);
copy->mCount = mCount; copy->mCount = mCount;
return copy; return copy;
} }
@@ -362,15 +369,24 @@ void SkiaSweepGradientShader::updateTransforms(Program* program, const mat4& mod
SkiaComposeShader::SkiaComposeShader(SkiaShader* first, SkiaShader* second, SkiaComposeShader::SkiaComposeShader(SkiaShader* first, SkiaShader* second,
SkXfermode::Mode mode, SkShader* key): SkXfermode::Mode mode, SkShader* key):
SkiaShader(kCompose, key, SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, SkiaShader(kCompose, key, SkShader::kClamp_TileMode, SkShader::kClamp_TileMode,
NULL, first->blend() || second->blend()), mFirst(first), mSecond(second), mMode(mode) { NULL, first->blend() || second->blend()),
mFirst(first), mSecond(second), mMode(mode), mCleanup(false) {
}
SkiaComposeShader::~SkiaComposeShader() {
if (mCleanup) {
delete mFirst;
delete mSecond;
}
} }
SkiaShader* SkiaComposeShader::copy() { SkiaShader* SkiaComposeShader::copy() {
SkiaComposeShader* copy = new SkiaComposeShader(); SkiaComposeShader* copy = new SkiaComposeShader();
copy->copyFrom(*this); copy->copyFrom(*this);
copy->mFirst = mFirst; copy->mFirst = mFirst->copy();
copy->mSecond = mSecond; copy->mSecond = mSecond->copy();
copy->mMode = mMode; copy->mMode = mMode;
copy->cleanup();
return copy; return copy;
} }

View File

@@ -234,6 +234,7 @@ private:
*/ */
struct SkiaComposeShader: public SkiaShader { struct SkiaComposeShader: public SkiaShader {
SkiaComposeShader(SkiaShader* first, SkiaShader* second, SkXfermode::Mode mode, SkShader* key); SkiaComposeShader(SkiaShader* first, SkiaShader* second, SkXfermode::Mode mode, SkShader* key);
~SkiaComposeShader();
SkiaShader* copy(); SkiaShader* copy();
void set(TextureCache* textureCache, GradientCache* gradientCache); void set(TextureCache* textureCache, GradientCache* gradientCache);
@@ -243,12 +244,18 @@ struct SkiaComposeShader: public SkiaShader {
GLuint* textureUnit); GLuint* textureUnit);
private: private:
SkiaComposeShader() { SkiaComposeShader(): mCleanup(false) {
}
void cleanup() {
mCleanup = true;
} }
SkiaShader* mFirst; SkiaShader* mFirst;
SkiaShader* mSecond; SkiaShader* mSecond;
SkXfermode::Mode mMode; SkXfermode::Mode mMode;
bool mCleanup;
}; // struct SkiaComposeShader }; // struct SkiaComposeShader
}; // namespace uirenderer }; // namespace uirenderer