summaryrefslogtreecommitdiffstats
path: root/libs/hwui
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2015-06-09 13:12:40 -0700
committerJohn Reck <jreck@google.com>2015-06-09 15:27:52 -0700
commit37b0824a46157b7e169ad7ec33a46e89c851884c (patch)
tree0fae87101df3a38ff8ef5c125cc6bdb3498bdad9 /libs/hwui
parent4538ef2abcdf672e12f00bd944a816af35f16ed1 (diff)
downloadframeworks_base-37b0824a46157b7e169ad7ec33a46e89c851884c.zip
frameworks_base-37b0824a46157b7e169ad7ec33a46e89c851884c.tar.gz
frameworks_base-37b0824a46157b7e169ad7ec33a46e89c851884c.tar.bz2
Upload bitmaps in SkShader* safely
Bug: 19412589 Change-Id: Id50c08ff523d5540f60c39b435c0ab1b4c685655
Diffstat (limited to 'libs/hwui')
-rw-r--r--libs/hwui/DisplayListCanvas.cpp21
-rw-r--r--libs/hwui/DisplayListCanvas.h2
-rwxr-xr-xlibs/hwui/OpenGLRenderer.h16
3 files changed, 23 insertions, 16 deletions
diff --git a/libs/hwui/DisplayListCanvas.cpp b/libs/hwui/DisplayListCanvas.cpp
index cbb6fd5..900a621 100644
--- a/libs/hwui/DisplayListCanvas.cpp
+++ b/libs/hwui/DisplayListCanvas.cpp
@@ -352,6 +352,7 @@ void DisplayListCanvas::drawRoundRect(
mDisplayListData->ref(rx);
mDisplayListData->ref(ry);
mDisplayListData->ref(paint);
+ refBitmapsInShader(paint->value.getShader());
addDrawOp(new (alloc()) DrawRoundRectPropsOp(&left->value, &top->value,
&right->value, &bottom->value, &rx->value, &ry->value, &paint->value));
}
@@ -366,6 +367,7 @@ void DisplayListCanvas::drawCircle(CanvasPropertyPrimitive* x, CanvasPropertyPri
mDisplayListData->ref(y);
mDisplayListData->ref(radius);
mDisplayListData->ref(paint);
+ refBitmapsInShader(paint->value.getShader());
addDrawOp(new (alloc()) DrawCirclePropsOp(&x->value, &y->value,
&radius->value, &paint->value));
}
@@ -565,5 +567,24 @@ size_t DisplayListCanvas::addRenderNodeOp(DrawRenderNodeOp* op) {
return opIndex;
}
+void DisplayListCanvas::refBitmapsInShader(const SkShader* shader) {
+ if (!shader) return;
+
+ // If this paint has an SkShader that has an SkBitmap add
+ // it to the bitmap pile
+ SkBitmap bitmap;
+ SkShader::TileMode xy[2];
+ if (shader->asABitmap(&bitmap, nullptr, xy) == SkShader::kDefault_BitmapType) {
+ refBitmap(bitmap);
+ return;
+ }
+ SkShader::ComposeRec rec;
+ if (shader->asACompose(&rec)) {
+ refBitmapsInShader(rec.fShaderA);
+ refBitmapsInShader(rec.fShaderB);
+ return;
+ }
+}
+
}; // namespace uirenderer
}; // namespace android
diff --git a/libs/hwui/DisplayListCanvas.h b/libs/hwui/DisplayListCanvas.h
index d997ef4..edfda62 100644
--- a/libs/hwui/DisplayListCanvas.h
+++ b/libs/hwui/DisplayListCanvas.h
@@ -263,6 +263,7 @@ private:
size_t addDrawOp(DrawOp* op);
size_t addRenderNodeOp(DrawRenderNodeOp* op);
+ void refBitmapsInShader(const SkShader* shader);
template<class T>
inline const T* refBuffer(const T* srcBuffer, int32_t count) {
@@ -311,6 +312,7 @@ private:
// replaceValueFor() performs an add if the entry doesn't exist
mPaintMap.replaceValueFor(key, cachedPaint);
+ refBitmapsInShader(cachedPaint->getShader());
}
return cachedPaint;
diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h
index 29fbf0c..5850dc6 100755
--- a/libs/hwui/OpenGLRenderer.h
+++ b/libs/hwui/OpenGLRenderer.h
@@ -524,22 +524,6 @@ protected:
inline float getLayerAlpha(const Layer* layer) const;
/**
- * Safely retrieves the ColorFilter from the given Paint. If the paint is
- * null then null is returned.
- */
- static inline SkColorFilter* getColorFilter(const SkPaint* paint) {
- return paint ? paint->getColorFilter() : nullptr;
- }
-
- /**
- * Safely retrieves the Shader from the given Paint. If the paint is
- * null then null is returned.
- */
- static inline const SkShader* getShader(const SkPaint* paint) {
- return paint ? paint->getShader() : nullptr;
- }
-
- /**
* Set to true to suppress error checks at the end of a frame.
*/
virtual bool suppressErrorChecks() const {