diff options
| -rw-r--r-- | core/jni/android_graphics_Canvas.cpp | 5 | ||||
| -rw-r--r-- | graphics/java/android/graphics/Canvas.java | 4 | ||||
| -rw-r--r-- | libs/hwui/DisplayListOps.in | 1 | ||||
| -rw-r--r-- | libs/hwui/RecordingCanvas.cpp | 20 | ||||
| -rw-r--r-- | libs/hwui/RecordingCanvas.h | 2 | ||||
| -rw-r--r-- | libs/hwui/SkiaCanvas.cpp | 6 | ||||
| -rw-r--r-- | libs/hwui/SkiaCanvas.h | 1 | ||||
| -rw-r--r-- | libs/hwui/hwui/Canvas.h | 1 |
8 files changed, 39 insertions, 1 deletions
diff --git a/core/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp index 84f53468e941..fc9ea76f6ed3 100644 --- a/core/jni/android_graphics_Canvas.cpp +++ b/core/jni/android_graphics_Canvas.cpp @@ -102,6 +102,10 @@ static jint saveLayerAlpha(jlong canvasHandle, jfloat l, jfloat t, return static_cast<jint>(get_canvas(canvasHandle)->saveLayerAlpha(l, t, r, b, alpha, flags)); } +static jint saveUnclippedLayer(jlong canvasHandle, jint l, jint t, jint r, jint b) { + return reinterpret_cast<jint>(get_canvas(canvasHandle)->saveUnclippedLayer(l, t, r, b)); +} + static bool restore(jlong canvasHandle) { Canvas* canvas = get_canvas(canvasHandle); if (canvas->getSaveCount() <= 1) { @@ -651,6 +655,7 @@ static const JNINativeMethod gMethods[] = { {"nSave","(JI)I", (void*) CanvasJNI::save}, {"nSaveLayer","(JFFFFJI)I", (void*) CanvasJNI::saveLayer}, {"nSaveLayerAlpha","(JFFFFII)I", (void*) CanvasJNI::saveLayerAlpha}, + {"nSaveUnclippedLayer","(JIIII)I", (void*) CanvasJNI::saveUnclippedLayer}, {"nGetSaveCount","(J)I", (void*) CanvasJNI::getSaveCount}, {"nRestore","(J)Z", (void*) CanvasJNI::restore}, {"nRestoreToCount","(JI)V", (void*) CanvasJNI::restoreToCount}, diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java index 6798ab216734..63a806e53556 100644 --- a/graphics/java/android/graphics/Canvas.java +++ b/graphics/java/android/graphics/Canvas.java @@ -556,7 +556,7 @@ public class Canvas extends BaseCanvas { * @hide */ public int saveUnclippedLayer(int left, int top, int right, int bottom) { - return nSaveLayer(mNativeCanvasWrapper, left, top, right, bottom, 0, 0); + return nSaveUnclippedLayer(mNativeCanvasWrapper, left, top, right, bottom); } /** @@ -1395,6 +1395,8 @@ public class Canvas extends BaseCanvas { private static native int nSaveLayerAlpha(long nativeCanvas, float l, float t, float r, float b, int alpha, int layerFlags); @CriticalNative + private static native int nSaveUnclippedLayer(long nativeCanvas, int l, int t, int r, int b); + @CriticalNative private static native boolean nRestore(long canvasHandle); @CriticalNative private static native void nRestoreToCount(long canvasHandle, int saveCount); diff --git a/libs/hwui/DisplayListOps.in b/libs/hwui/DisplayListOps.in index 04cf611c8322..bd1e6c5bf2e8 100644 --- a/libs/hwui/DisplayListOps.in +++ b/libs/hwui/DisplayListOps.in @@ -18,6 +18,7 @@ X(Flush) X(Save) X(Restore) X(SaveLayer) +X(SaveBehind) X(Concat) X(SetMatrix) X(Translate) diff --git a/libs/hwui/RecordingCanvas.cpp b/libs/hwui/RecordingCanvas.cpp index 0b847af157d1..fc813d20b1ac 100644 --- a/libs/hwui/RecordingCanvas.cpp +++ b/libs/hwui/RecordingCanvas.cpp @@ -18,6 +18,7 @@ #include "VectorDrawable.h" +#include "SkAndroidFrameworkUtils.h" #include "SkCanvas.h" #include "SkData.h" #include "SkDrawShadowInfo.h" @@ -116,6 +117,16 @@ struct SaveLayer final : Op { clipMatrix.isIdentity() ? nullptr : &clipMatrix, flags}); } }; +struct SaveBehind final : Op { + static const auto kType = Type::SaveBehind; + SaveBehind(const SkRect* subset) { + if (subset) { this->subset = *subset; } + } + SkRect subset = kUnset; + void draw(SkCanvas* c, const SkMatrix&) const { + SkAndroidFrameworkUtils::SaveBehind(c, &subset); + } +}; struct Concat final : Op { static const auto kType = Type::Concat; @@ -579,6 +590,10 @@ void DisplayListData::saveLayer(const SkRect* bounds, const SkPaint* paint, this->push<SaveLayer>(0, bounds, paint, backdrop, clipMask, clipMatrix, flags); } +void DisplayListData::saveBehind(const SkRect* subset) { + this->push<SaveBehind>(0, subset); +} + void DisplayListData::concat(const SkMatrix& matrix) { this->push<Concat>(0, matrix); } @@ -848,6 +863,11 @@ void RecordingCanvas::willRestore() { fDL->restore(); } +bool RecordingCanvas::onDoSaveBehind(const SkRect* subset) { + fDL->saveBehind(subset); + return false; +} + void RecordingCanvas::didConcat(const SkMatrix& matrix) { fDL->concat(matrix); } diff --git a/libs/hwui/RecordingCanvas.h b/libs/hwui/RecordingCanvas.h index de8777b4e79a..22b3a63884ee 100644 --- a/libs/hwui/RecordingCanvas.h +++ b/libs/hwui/RecordingCanvas.h @@ -75,6 +75,7 @@ private: void save(); void saveLayer(const SkRect*, const SkPaint*, const SkImageFilter*, const SkImage*, const SkMatrix*, SkCanvas::SaveLayerFlags); + void saveBehind(const SkRect*); void restore(); void concat(const SkMatrix&); @@ -146,6 +147,7 @@ public: void willSave() override; SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec&) override; void willRestore() override; + bool onDoSaveBehind(const SkRect*) override; void onFlush() override; diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp index 6be7ef72cf5d..83b9e7f6a3b8 100644 --- a/libs/hwui/SkiaCanvas.cpp +++ b/libs/hwui/SkiaCanvas.cpp @@ -24,6 +24,7 @@ #include "hwui/PaintFilter.h" #include "pipeline/skia/AnimatedDrawables.h" +#include <SkAndroidFrameworkUtils.h> #include <SkAnimatedImage.h> #include <SkCanvasStateUtils.h> #include <SkColorFilter.h> @@ -185,6 +186,11 @@ int SkiaCanvas::saveLayerAlpha(float left, float top, float right, float bottom, return this->saveLayer(left, top, right, bottom, nullptr, flags); } +int SkiaCanvas::saveUnclippedLayer(int left, int top, int right, int bottom) { + SkRect bounds = SkRect::MakeLTRB(left, top, right, bottom); + return SkAndroidFrameworkUtils::SaveBehind(mCanvas, &bounds); +} + class SkiaCanvas::Clip { public: Clip(const SkRect& rect, SkClipOp op, const SkMatrix& m) diff --git a/libs/hwui/SkiaCanvas.h b/libs/hwui/SkiaCanvas.h index 24d9c08ec1c6..4ab0a59447ee 100644 --- a/libs/hwui/SkiaCanvas.h +++ b/libs/hwui/SkiaCanvas.h @@ -74,6 +74,7 @@ public: SaveFlags::Flags flags) override; virtual int saveLayerAlpha(float left, float top, float right, float bottom, int alpha, SaveFlags::Flags flags) override; + virtual int saveUnclippedLayer(int left, int top, int right, int bottom) override; virtual void getMatrix(SkMatrix* outMatrix) const override; virtual void setMatrix(const SkMatrix& matrix) override; diff --git a/libs/hwui/hwui/Canvas.h b/libs/hwui/hwui/Canvas.h index 71814c365c31..4c5365d3c170 100644 --- a/libs/hwui/hwui/Canvas.h +++ b/libs/hwui/hwui/Canvas.h @@ -196,6 +196,7 @@ public: SaveFlags::Flags flags) = 0; virtual int saveLayerAlpha(float left, float top, float right, float bottom, int alpha, SaveFlags::Flags flags) = 0; + virtual int saveUnclippedLayer(int, int, int, int) = 0; // Matrix virtual void getMatrix(SkMatrix* outMatrix) const = 0; |