diff options
author | 2015-12-21 10:43:01 -0500 | |
---|---|---|
committer | 2016-01-25 15:48:00 -0500 | |
commit | eecff56fed5dd5206acfbc5007b4912081b36d3b (patch) | |
tree | 5e9b0e3dcf6add0bde182a791d9ba9040c16dafa | |
parent | 36c297f426b2d1337658d781bc6cbd60b04ce4e8 (diff) |
Add internal Canvas save flags
Skia's SkCanvas::SaveFlags are being deprecated. This CL introduces
the equivalent android::SaveFlags, converts all internal clients to
the new enum, and switches the saveLayer glue to the
SaveLayerRec-based API.
Change-Id: Icb1785f4e7c0f652b1f04b34a1e3ccb063c408f3
26 files changed, 205 insertions, 161 deletions
diff --git a/core/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp index 34877e054e55..35b5016e1b07 100644 --- a/core/jni/android_graphics_Canvas.cpp +++ b/core/jni/android_graphics_Canvas.cpp @@ -86,20 +86,20 @@ static jint getSaveCount(JNIEnv*, jobject, jlong canvasHandle) { } static jint save(JNIEnv*, jobject, jlong canvasHandle, jint flagsHandle) { - SkCanvas::SaveFlags flags = static_cast<SkCanvas::SaveFlags>(flagsHandle); + SaveFlags::Flags flags = static_cast<SaveFlags::Flags>(flagsHandle); return static_cast<jint>(get_canvas(canvasHandle)->save(flags)); } static jint saveLayer(JNIEnv* env, jobject, jlong canvasHandle, jfloat l, jfloat t, jfloat r, jfloat b, jlong paintHandle, jint flagsHandle) { Paint* paint = reinterpret_cast<Paint*>(paintHandle); - SkCanvas::SaveFlags flags = static_cast<SkCanvas::SaveFlags>(flagsHandle); + SaveFlags::Flags flags = static_cast<SaveFlags::Flags>(flagsHandle); return static_cast<jint>(get_canvas(canvasHandle)->saveLayer(l, t, r, b, paint, flags)); } static jint saveLayerAlpha(JNIEnv* env, jobject, jlong canvasHandle, jfloat l, jfloat t, jfloat r, jfloat b, jint alpha, jint flagsHandle) { - SkCanvas::SaveFlags flags = static_cast<SkCanvas::SaveFlags>(flagsHandle); + SaveFlags::Flags flags = static_cast<SaveFlags::Flags>(flagsHandle); return static_cast<jint>(get_canvas(canvasHandle)->saveLayerAlpha(l, t, r, b, alpha, flags)); } @@ -351,7 +351,7 @@ static void drawNinePatch(JNIEnv* env, jobject, jlong canvasHandle, jlong bitmap if (CC_LIKELY(dstDensity == srcDensity || dstDensity == 0 || srcDensity == 0)) { canvas->drawNinePatch(skiaBitmap, *chunk, left, top, right, bottom, paint); } else { - canvas->save(SkCanvas::kMatrixClip_SaveFlag); + canvas->save(SaveFlags::MatrixClip); SkScalar scale = dstDensity / (float)srcDensity; canvas->translate(left, top); @@ -390,7 +390,7 @@ static void drawBitmap(JNIEnv* env, jobject jcanvas, jlong canvasHandle, jobject canvas->drawBitmap(bitmap, left, top, paint); } } else { - canvas->save(SkCanvas::kMatrixClip_SaveFlag); + canvas->save(SaveFlags::MatrixClip); SkScalar scale = canvasDensity / (float)bitmapDensity; canvas->translate(left, top); canvas->scale(scale, scale); diff --git a/libs/hwui/Canvas.h b/libs/hwui/Canvas.h index 0643a54c88c5..9dfe454c7bc1 100644 --- a/libs/hwui/Canvas.h +++ b/libs/hwui/Canvas.h @@ -27,6 +27,22 @@ namespace android { +namespace SaveFlags { + +// These must match the corresponding Canvas API constants. +enum { + Matrix = 0x01, + Clip = 0x02, + HasAlphaLayer = 0x04, + ClipToLayer = 0x10, + + // Helper constant + MatrixClip = Matrix | Clip, +}; +typedef uint32_t Flags; + +} // namespace SaveFlags + class ANDROID_API Canvas { public: virtual ~Canvas() {}; @@ -70,16 +86,17 @@ public: // ---------------------------------------------------------------------------- // Canvas state operations // ---------------------------------------------------------------------------- + // Save (layer) virtual int getSaveCount() const = 0; - virtual int save(SkCanvas::SaveFlags flags) = 0; + virtual int save(SaveFlags::Flags flags) = 0; virtual void restore() = 0; virtual void restoreToCount(int saveCount) = 0; virtual int saveLayer(float left, float top, float right, float bottom, - const SkPaint* paint, SkCanvas::SaveFlags flags) = 0; + const SkPaint* paint, SaveFlags::Flags flags) = 0; virtual int saveLayerAlpha(float left, float top, float right, float bottom, - int alpha, SkCanvas::SaveFlags flags) = 0; + int alpha, SaveFlags::Flags flags) = 0; // Matrix virtual void getMatrix(SkMatrix* outMatrix) const = 0; diff --git a/libs/hwui/CanvasState.cpp b/libs/hwui/CanvasState.cpp index cf2726b5f530..43ff33f2b997 100644 --- a/libs/hwui/CanvasState.cpp +++ b/libs/hwui/CanvasState.cpp @@ -14,8 +14,7 @@ * limitations under the License. */ -#include <SkCanvas.h> - +#include "Canvas.h" #include "CanvasState.h" #include "utils/MathUtils.h" @@ -54,8 +53,7 @@ void CanvasState::initializeRecordingSaveStack(int viewportWidth, int viewportHe } freeAllSnapshots(); - mSnapshot = allocSnapshot(&mFirstSnapshot, - SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + mSnapshot = allocSnapshot(&mFirstSnapshot, SaveFlags::MatrixClip); mSnapshot->setRelativeLightCenter(Vector3()); mSaveCount = 1; } @@ -72,8 +70,7 @@ void CanvasState::initializeSaveStack( } freeAllSnapshots(); - mSnapshot = allocSnapshot(&mFirstSnapshot, - SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + mSnapshot = allocSnapshot(&mFirstSnapshot, SaveFlags::MatrixClip); mSnapshot->setClip(clipLeft, clipTop, clipRight, clipBottom); mSnapshot->fbo = mCanvas.getTargetFbo(); mSnapshot->setRelativeLightCenter(lightCenter); diff --git a/libs/hwui/DeferredDisplayList.cpp b/libs/hwui/DeferredDisplayList.cpp index a1825c5bc4c1..1b0f42466bff 100644 --- a/libs/hwui/DeferredDisplayList.cpp +++ b/libs/hwui/DeferredDisplayList.cpp @@ -14,8 +14,6 @@ * limitations under the License. */ -#include <SkCanvas.h> - #include <utils/Trace.h> #include <ui/Rect.h> #include <ui/Region.h> @@ -419,7 +417,7 @@ void DeferredDisplayList::addClip(OpenGLRenderer& renderer, ClipOp* op) { * beginning of the frame. This would avoid targetting and removing an FBO in the middle of a frame. * * saveLayer operations should be pulled to the beginning of the frame if the canvas doesn't have a - * complex clip, and if the flags (kClip_SaveFlag & kClipToLayer_SaveFlag) are set. + * complex clip, and if the flags (SaveFlags::Clip & SaveFlags::ClipToLayer) are set. */ void DeferredDisplayList::addSaveLayer(OpenGLRenderer& renderer, SaveLayerOp* op, int newSaveCount) { @@ -438,7 +436,7 @@ void DeferredDisplayList::addSave(OpenGLRenderer& renderer, SaveOp* op, int newS int saveFlags = op->getFlags(); DEFER_LOGD("%p adding saveOp %p, flags %x, new count %d", this, op, saveFlags, newSaveCount); - if (recordingComplexClip() && (saveFlags & SkCanvas::kClip_SaveFlag)) { + if (recordingComplexClip() && (saveFlags & SaveFlags::Clip)) { // store and replay the save operation, as it may be needed to correctly playback the clip DEFER_LOGD(" adding save barrier with new save count %d", newSaveCount); storeStateOpBarrier(renderer, op); @@ -621,7 +619,7 @@ void DeferredDisplayList::storeRestoreToCountBarrier(OpenGLRenderer& renderer, S this, newSaveCount, mBatches.size()); // store displayState for the restore operation, as it may be associated with a saveLayer that - // doesn't have kClip_SaveFlag set + // doesn't have SaveFlags::Clip set DeferredDisplayState* state = createState(); renderer.storeDisplayState(*state, getStateOpDeferFlags()); mBatches.push_back(new RestoreToCountBatch(op, state, newSaveCount)); @@ -654,7 +652,7 @@ void DeferredDisplayList::flush(OpenGLRenderer& renderer, Rect& dirty) { renderer.eventMark("Flush"); // save and restore so that reordering doesn't affect final state - renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + renderer.save(SaveFlags::MatrixClip); if (CC_LIKELY(avoidOverdraw())) { for (unsigned int i = 1; i < mBatches.size(); i++) { diff --git a/libs/hwui/DisplayListCanvas.cpp b/libs/hwui/DisplayListCanvas.cpp index 759c12a3f214..384e64d7700f 100644 --- a/libs/hwui/DisplayListCanvas.cpp +++ b/libs/hwui/DisplayListCanvas.cpp @@ -102,7 +102,7 @@ SkCanvas* DisplayListCanvas::asSkCanvas() { return mSkiaCanvasProxy.get(); } -int DisplayListCanvas::save(SkCanvas::SaveFlags flags) { +int DisplayListCanvas::save(SaveFlags::Flags flags) { addStateOp(new (alloc()) SaveOp((int) flags)); return mState.save((int) flags); } @@ -125,9 +125,9 @@ void DisplayListCanvas::restoreToCount(int saveCount) { } int DisplayListCanvas::saveLayer(float left, float top, float right, float bottom, - const SkPaint* paint, SkCanvas::SaveFlags flags) { + const SkPaint* paint, SaveFlags::Flags flags) { // force matrix/clip isolation for layer - flags |= SkCanvas::kClip_SaveFlag | SkCanvas::kMatrix_SaveFlag; + flags |= SaveFlags::MatrixClip; paint = refPaint(paint); addStateOp(new (alloc()) SaveLayerOp(left, top, right, bottom, paint, (int) flags)); @@ -232,7 +232,7 @@ void DisplayListCanvas::drawBitmap(const SkBitmap* bitmap, const SkPaint* paint) void DisplayListCanvas::drawBitmap(const SkBitmap& bitmap, float left, float top, const SkPaint* paint) { - save(SkCanvas::kMatrix_SaveFlag); + save(SaveFlags::Matrix); translate(left, top); drawBitmap(&bitmap, paint); restore(); @@ -253,7 +253,7 @@ void DisplayListCanvas::drawBitmap(const SkBitmap& bitmap, const SkMatrix& matri drawBitmap(bitmap, src.fLeft, src.fTop, src.fRight, src.fBottom, dst.fLeft, dst.fTop, dst.fRight, dst.fBottom, paint); } else { - save(SkCanvas::kMatrix_SaveFlag); + save(SaveFlags::Matrix); concat(matrix); drawBitmap(&bitmap, paint); restore(); @@ -269,7 +269,7 @@ void DisplayListCanvas::drawBitmap(const SkBitmap& bitmap, float srcLeft, float && (srcBottom - srcTop == dstBottom - dstTop) && (srcRight - srcLeft == dstRight - dstLeft)) { // transform simple rect to rect drawing case into position bitmap ops, since they merge - save(SkCanvas::kMatrix_SaveFlag); + save(SaveFlags::Matrix); translate(dstLeft, dstTop); drawBitmap(&bitmap, paint); restore(); @@ -283,7 +283,7 @@ void DisplayListCanvas::drawBitmap(const SkBitmap& bitmap, float srcLeft, float // Apply the scale transform on the canvas, so that the shader // effectively calculates positions relative to src rect space - save(SkCanvas::kMatrix_SaveFlag); + save(SaveFlags::Matrix); translate(dstLeft, dstTop); scale(scaleX, scaleY); diff --git a/libs/hwui/DisplayListCanvas.h b/libs/hwui/DisplayListCanvas.h index 72fc100ebd1d..f1cfa08b3ac2 100644 --- a/libs/hwui/DisplayListCanvas.h +++ b/libs/hwui/DisplayListCanvas.h @@ -128,14 +128,14 @@ public: // ---------------------------------------------------------------------------- // Save (layer) virtual int getSaveCount() const override { return mState.getSaveCount(); } - virtual int save(SkCanvas::SaveFlags flags) override; + virtual int save(SaveFlags::Flags flags) override; virtual void restore() override; virtual void restoreToCount(int saveCount) override; virtual int saveLayer(float left, float top, float right, float bottom, const SkPaint* paint, - SkCanvas::SaveFlags flags) override; + SaveFlags::Flags flags) override; virtual int saveLayerAlpha(float left, float top, float right, float bottom, - int alpha, SkCanvas::SaveFlags flags) override { + int alpha, SaveFlags::Flags flags) override { SkPaint paint; paint.setAlpha(alpha); return saveLayer(left, top, right, bottom, &paint, flags); diff --git a/libs/hwui/FrameBuilder.cpp b/libs/hwui/FrameBuilder.cpp index c4c655b75d22..a3d6401bc86c 100644 --- a/libs/hwui/FrameBuilder.cpp +++ b/libs/hwui/FrameBuilder.cpp @@ -16,6 +16,7 @@ #include "FrameBuilder.h" +#include "Canvas.h" #include "LayerUpdateQueue.h" #include "RenderNode.h" #include "renderstate/OffscreenBufferPool.h" @@ -23,7 +24,6 @@ #include "utils/PaintUtils.h" #include "utils/TraceUtils.h" -#include <SkCanvas.h> #include <SkPathOps.h> #include <utils/TypeHelpers.h> @@ -77,7 +77,7 @@ FrameBuilder::FrameBuilder(const LayerUpdateQueue& layers, const SkRect& clip, if (node->nothingToDraw()) continue; node->computeOrdering(); - int count = mCanvasState.save(SkCanvas::kClip_SaveFlag | SkCanvas::kMatrix_SaveFlag); + int count = mCanvasState.save(SaveFlags::MatrixClip); deferNodePropsAndOps(*node); mCanvasState.restoreToCount(count); } @@ -327,7 +327,7 @@ void FrameBuilder::deferShadow(const RenderNodeOp& casterNodeOp) { void FrameBuilder::deferProjectedChildren(const RenderNode& renderNode) { const SkPath* projectionReceiverOutline = renderNode.properties().getOutline().getPath(); - int count = mCanvasState.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + int count = mCanvasState.save(SaveFlags::MatrixClip); // can't be null, since DL=null node rejection happens before deferNodePropsAndOps const DisplayList& displayList = *(renderNode.getDisplayList()); @@ -348,7 +348,7 @@ void FrameBuilder::deferProjectedChildren(const RenderNode& renderNode) { for (size_t i = 0; i < renderNode.mProjectedNodes.size(); i++) { RenderNodeOp* childOp = renderNode.mProjectedNodes[i]; - int restoreTo = mCanvasState.save(SkCanvas::kMatrix_SaveFlag); + int restoreTo = mCanvasState.save(SaveFlags::Matrix); mCanvasState.concatMatrix(childOp->transformFromCompositingAncestor); deferRenderNodeOpImpl(*childOp); mCanvasState.restoreToCount(restoreTo); @@ -392,7 +392,7 @@ void FrameBuilder::deferNodeOps(const RenderNode& renderNode) { void FrameBuilder::deferRenderNodeOpImpl(const RenderNodeOp& op) { if (op.renderNode->nothingToDraw()) return; - int count = mCanvasState.save(SkCanvas::kClip_SaveFlag | SkCanvas::kMatrix_SaveFlag); + int count = mCanvasState.save(SaveFlags::MatrixClip); // apply state from RecordedOp (clip first, since op's clip is transformed by current matrix) mCanvasState.writableSnapshot()->mutateClipArea().applyClip(op.localClip, @@ -597,7 +597,7 @@ void FrameBuilder::saveForLayer(uint32_t layerWidth, uint32_t layerHeight, const Rect& repaintRect, const Vector3& lightCenter, const BeginLayerOp* beginLayerOp, RenderNode* renderNode) { - mCanvasState.save(SkCanvas::kClip_SaveFlag | SkCanvas::kMatrix_SaveFlag); + mCanvasState.save(SaveFlags::MatrixClip); mCanvasState.writableSnapshot()->initializeViewport(layerWidth, layerHeight); mCanvasState.writableSnapshot()->roundRectClipState = nullptr; mCanvasState.writableSnapshot()->setRelativeLightCenter(lightCenter); diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index db017feff577..f6f45149ed6b 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -17,6 +17,7 @@ #include <GpuMemoryTracker.h> #include "OpenGLRenderer.h" +#include "Canvas.h" #include "DeferredDisplayList.h" #include "GammaFontRenderer.h" #include "Glop.h" @@ -39,7 +40,6 @@ #include <stdint.h> #include <sys/types.h> -#include <SkCanvas.h> #include <SkColor.h> #include <SkPaintDefaults.h> #include <SkPathOps.h> @@ -472,7 +472,7 @@ void OpenGLRenderer::onSnapshotRestored(const Snapshot& removed, const Snapshot& int OpenGLRenderer::saveLayer(float left, float top, float right, float bottom, const SkPaint* paint, int flags, const SkPath* convexMask) { // force matrix/clip isolation for layer - flags |= SkCanvas::kClip_SaveFlag | SkCanvas::kMatrix_SaveFlag; + flags |= SaveFlags::MatrixClip; const int count = mState.saveSnapshot(flags); @@ -531,7 +531,7 @@ int OpenGLRenderer::saveLayerDeferred(float left, float top, float right, float const SkPaint* paint, int flags) { const int count = mState.saveSnapshot(flags); - if (!mState.currentlyIgnored() && (flags & SkCanvas::kClipToLayer_SaveFlag)) { + if (!mState.currentlyIgnored() && (flags & SaveFlags::ClipToLayer)) { // initialize the snapshot as though it almost represents an FBO layer so deferred draw // operations will be able to store and restore the current clip and transform info, and // quick rejection will be correct (for display lists) @@ -558,7 +558,7 @@ int OpenGLRenderer::saveLayerDeferred(float left, float top, float right, float * and the frame buffer still receive every drawing command. For instance, if a * layer is created and a shape intersecting the bounds of the layers and the * framebuffer is draw, the shape will be drawn on both (unless the layer was - * created with the SkCanvas::kClipToLayer_SaveFlag flag.) + * created with the SaveFlags::ClipToLayer flag.) * * A way to implement layers is to create an FBO for each layer, backed by an RGBA * texture. Unfortunately, this is inefficient as it requires every primitive to @@ -608,7 +608,7 @@ bool OpenGLRenderer::createLayer(float left, float top, float right, float botto LAYER_LOGD("Requesting layer %.2fx%.2f", right - left, bottom - top); LAYER_LOGD("Layer cache size = %d", mCaches.layerCache.getSize()); - const bool fboLayer = flags & SkCanvas::kClipToLayer_SaveFlag; + const bool fboLayer = flags & SaveFlags::ClipToLayer; // Window coordinates of the layer Rect clip; @@ -890,7 +890,7 @@ void OpenGLRenderer::composeLayerRegion(Layer* layer, const Rect& rect) { if (CC_UNLIKELY(layer->region.isEmpty())) return; // nothing to draw if (layer->getConvexMask()) { - save(SkCanvas::kClip_SaveFlag | SkCanvas::kMatrix_SaveFlag); + save(SaveFlags::MatrixClip); // clip to the area of the layer the mask can be larger clipRect(rect.left, rect.top, rect.right, rect.bottom, SkRegion::kIntersect_Op); @@ -2233,7 +2233,7 @@ void OpenGLRenderer::drawLayer(Layer* layer) { if (layer->isTextureLayer()) { transform = &layer->getTransform(); if (!transform->isIdentity()) { - save(SkCanvas::kMatrix_SaveFlag); + save(SaveFlags::Matrix); concatMatrix(*transform); } } diff --git a/libs/hwui/RecordingCanvas.cpp b/libs/hwui/RecordingCanvas.cpp index 78855e5d6a0a..328e291a60af 100644 --- a/libs/hwui/RecordingCanvas.cpp +++ b/libs/hwui/RecordingCanvas.cpp @@ -92,7 +92,7 @@ void RecordingCanvas::onSnapshotRestored(const Snapshot& removed, const Snapshot // android/graphics/Canvas state operations // ---------------------------------------------------------------------------- // Save (layer) -int RecordingCanvas::save(SkCanvas::SaveFlags flags) { +int RecordingCanvas::save(SaveFlags::Flags flags) { return mState.save((int) flags); } @@ -105,10 +105,10 @@ void RecordingCanvas::restoreToCount(int saveCount) { } int RecordingCanvas::saveLayer(float left, float top, float right, float bottom, - const SkPaint* paint, SkCanvas::SaveFlags flags) { + const SkPaint* paint, SaveFlags::Flags flags) { // force matrix/clip isolation for layer - flags |= SkCanvas::kClip_SaveFlag | SkCanvas::kMatrix_SaveFlag; - bool clippedLayer = flags & SkCanvas::kClipToLayer_SaveFlag; + flags |= SaveFlags::MatrixClip; + bool clippedLayer = flags & SaveFlags::ClipToLayer; const Snapshot& previous = *mState.currentSnapshot(); @@ -128,7 +128,7 @@ int RecordingCanvas::saveLayer(float left, float top, float right, float bottom, // unlikely case where an unclipped savelayer is recorded with a clip it can use, // as none of its unaffected/unclipped area is visible clippedLayer = true; - flags |= SkCanvas::kClipToLayer_SaveFlag; + flags |= SaveFlags::ClipToLayer; } visibleBounds.doIntersect(previous.getRenderTargetClip()); @@ -424,7 +424,7 @@ void RecordingCanvas::drawPath(const SkPath& path, const SkPaint& paint) { // Bitmap-based void RecordingCanvas::drawBitmap(const SkBitmap& bitmap, float left, float top, const SkPaint* paint) { - save(SkCanvas::kMatrix_SaveFlag); + save(SaveFlags::Matrix); translate(left, top); drawBitmap(&bitmap, paint); restore(); @@ -445,7 +445,7 @@ void RecordingCanvas::drawBitmap(const SkBitmap& bitmap, const SkMatrix& matrix, drawBitmap(bitmap, src.fLeft, src.fTop, src.fRight, src.fBottom, dst.fLeft, dst.fTop, dst.fRight, dst.fBottom, paint); } else { - save(SkCanvas::kMatrix_SaveFlag); + save(SaveFlags::Matrix); concat(matrix); drawBitmap(&bitmap, paint); restore(); @@ -461,7 +461,7 @@ void RecordingCanvas::drawBitmap(const SkBitmap& bitmap, float srcLeft, float sr && (srcBottom - srcTop == dstBottom - dstTop) && (srcRight - srcLeft == dstRight - dstLeft)) { // transform simple rect to rect drawing case into position bitmap ops, since they merge - save(SkCanvas::kMatrix_SaveFlag); + save(SaveFlags::Matrix); translate(dstLeft, dstTop); drawBitmap(&bitmap, paint); restore(); diff --git a/libs/hwui/RecordingCanvas.h b/libs/hwui/RecordingCanvas.h index 8aa750602972..786f96e852ec 100644 --- a/libs/hwui/RecordingCanvas.h +++ b/libs/hwui/RecordingCanvas.h @@ -108,14 +108,14 @@ public: // ---------------------------------------------------------------------------- // Save (layer) virtual int getSaveCount() const override { return mState.getSaveCount(); } - virtual int save(SkCanvas::SaveFlags flags) override; + virtual int save(SaveFlags::Flags flags) override; virtual void restore() override; virtual void restoreToCount(int saveCount) override; virtual int saveLayer(float left, float top, float right, float bottom, const SkPaint* paint, - SkCanvas::SaveFlags flags) override; + SaveFlags::Flags flags) override; virtual int saveLayerAlpha(float left, float top, float right, float bottom, - int alpha, SkCanvas::SaveFlags flags) override { + int alpha, SaveFlags::Flags flags) override { SkPaint paint; paint.setAlpha(alpha); return saveLayer(left, top, right, bottom, &paint, flags); diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp index ae690fdef4c7..d4588edea207 100644 --- a/libs/hwui/RenderNode.cpp +++ b/libs/hwui/RenderNode.cpp @@ -33,8 +33,6 @@ #include "protos/hwui.pb.h" #include "protos/ProtoHelpers.h" -#include <SkCanvas.h> - #include <algorithm> #include <sstream> #include <string> @@ -105,8 +103,7 @@ void RenderNode::output(uint32_t level) { (isRenderable() ? "" : ", empty"), (properties().getProjectBackwards() ? ", projected" : ""), (mLayer != nullptr ? ", on HW Layer" : "")); - ALOGD("%*s%s %d", level * 2, "", "Save", - SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + ALOGD("%*s%s %d", level * 2, "", "Save", SaveFlags::MatrixClip); properties().debugOutputProperties(level); @@ -574,7 +571,7 @@ void RenderNode::setViewProperties(OpenGLRenderer& renderer, T& handler) { layerBounds.left, layerBounds.top, layerBounds.right, layerBounds.bottom, (int) (properties().getAlpha() * 255), - SkCanvas::kHasAlphaLayer_SaveFlag | SkCanvas::kClipToLayer_SaveFlag); + SaveFlags::HasAlphaLayer | SaveFlags::ClipToLayer); handler(op, PROPERTY_SAVECOUNT, properties().getClipToBounds()); } @@ -875,7 +872,7 @@ void RenderNode::issueOperationsOf3dChildren(ChildrenSelectMode mode, // Apply the base transform of the parent of the 3d children. This isolates // 3d children of the current chunk from transformations made in previous chunks. - int rootRestoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag); + int rootRestoreTo = renderer.save(SaveFlags::Matrix); renderer.setGlobalMatrix(initialTransform); /** @@ -919,7 +916,7 @@ void RenderNode::issueOperationsOf3dChildren(ChildrenSelectMode mode, // only the actual child DL draw needs to be in save/restore, // since it modifies the renderer's matrix - int restoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag); + int restoreTo = renderer.save(SaveFlags::Matrix); DrawRenderNodeOp* childOp = zTranslatedNodes[drawIndex].value; @@ -941,7 +938,7 @@ void RenderNode::issueOperationsOfProjectedChildren(OpenGLRenderer& renderer, T& int restoreTo = renderer.getSaveCount(); LinearAllocator& alloc = handler.allocator(); - handler(new (alloc) SaveOp(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag), + handler(new (alloc) SaveOp(SaveFlags::MatrixClip), PROPERTY_SAVECOUNT, properties().getClipToBounds()); // Transform renderer to match background we're projecting onto @@ -966,7 +963,7 @@ void RenderNode::issueOperationsOfProjectedChildren(OpenGLRenderer& renderer, T& renderNodeOp_t* childOp = mProjectedNodes[i]; // matrix save, concat, and restore can be done safely without allocating operations - int restoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag); + int restoreTo = renderer.save(SaveFlags::Matrix); renderer.concatMatrix(childOp->transformFromCompositingAncestor); childOp->skipInOrderDraw = false; // this is horrible, I'm so sorry everyone handler(childOp, renderer.getSaveCount() - 1, properties().getClipToBounds()); @@ -1027,11 +1024,11 @@ void RenderNode::issueOperations(OpenGLRenderer& renderer, T& handler) { LinearAllocator& alloc = handler.allocator(); int restoreTo = renderer.getSaveCount(); - handler(new (alloc) SaveOp(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag), + handler(new (alloc) SaveOp(SaveFlags::MatrixClip), PROPERTY_SAVECOUNT, properties().getClipToBounds()); DISPLAY_LIST_LOGD("%*sSave %d %d", (handler.level() + 1) * 2, "", - SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag, restoreTo); + SaveFlags::MatrixClip, restoreTo); if (useViewProperties) { setViewProperties<T>(renderer, handler); diff --git a/libs/hwui/RenderProperties.cpp b/libs/hwui/RenderProperties.cpp index ce1bd6ab8b03..b848af4e7b1e 100644 --- a/libs/hwui/RenderProperties.cpp +++ b/libs/hwui/RenderProperties.cpp @@ -18,12 +18,12 @@ #include <utils/Trace.h> -#include <SkCanvas.h> #include <SkColorFilter.h> #include <SkMatrix.h> #include <SkPath.h> #include <SkPathOps.h> +#include "Canvas.h" #include "Matrix.h" #include "OpenGLRenderer.h" #include "utils/MathUtils.h" @@ -144,7 +144,7 @@ void RenderProperties::debugOutputProperties(const int level) const { (int)layerBounds.left, (int)layerBounds.top, (int)layerBounds.right, (int)layerBounds.bottom, (int)(mPrimitiveFields.mAlpha * 255), - SkCanvas::kHasAlphaLayer_SaveFlag | SkCanvas::kClipToLayer_SaveFlag); + SaveFlags::HasAlphaLayer | SaveFlags::ClipToLayer); } diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp index 96c1a7c18db9..20e7c711a9ce 100644 --- a/libs/hwui/SkiaCanvas.cpp +++ b/libs/hwui/SkiaCanvas.cpp @@ -24,6 +24,7 @@ #include <SkGraphics.h> #include <SkShader.h> #include <SkTArray.h> +#include <SkTLazy.h> #include <SkTemplates.h> #include <memory> @@ -63,14 +64,14 @@ public: virtual bool isHighContrastText() override { return mHighContrastText; } virtual int getSaveCount() const override; - virtual int save(SkCanvas::SaveFlags flags) override; + virtual int save(SaveFlags::Flags flags) override; virtual void restore() override; virtual void restoreToCount(int saveCount) override; virtual int saveLayer(float left, float top, float right, float bottom, - const SkPaint* paint, SkCanvas::SaveFlags flags) override; + const SkPaint* paint, SaveFlags::Flags flags) override; virtual int saveLayerAlpha(float left, float top, float right, float bottom, - int alpha, SkCanvas::SaveFlags flags) override; + int alpha, SaveFlags::Flags flags) override; virtual void getMatrix(SkMatrix* outMatrix) const override; virtual void setMatrix(const SkMatrix& matrix) override; @@ -138,13 +139,13 @@ public: private: struct SaveRec { - int saveCount; - SkCanvas::SaveFlags saveFlags; + int saveCount; + SaveFlags::Flags saveFlags; }; bool mHighContrastText = false; - void recordPartialSave(SkCanvas::SaveFlags flags); + void recordPartialSave(SaveFlags::Flags flags); void saveClipsForFrame(SkTArray<SkClipStack::Element>& clips, int frameSaveCount); void applyClips(const SkTArray<SkClipStack::Element>& clips); @@ -231,7 +232,7 @@ int SkiaCanvas::getSaveCount() const { return mCanvas->getSaveCount(); } -int SkiaCanvas::save(SkCanvas::SaveFlags flags) { +int SkiaCanvas::save(SaveFlags::Flags flags) { int count = mCanvas->save(); recordPartialSave(flags); return count; @@ -254,8 +255,8 @@ void SkiaCanvas::restore() { return; } - bool preserveMatrix = !(rec->saveFlags & SkCanvas::kMatrix_SaveFlag); - bool preserveClip = !(rec->saveFlags & SkCanvas::kClip_SaveFlag); + bool preserveMatrix = !(rec->saveFlags & SaveFlags::Matrix); + bool preserveClip = !(rec->saveFlags & SaveFlags::Clip); SkMatrix savedMatrix; if (preserveMatrix) { @@ -291,34 +292,53 @@ void SkiaCanvas::restoreToCount(int restoreCount) { } } +static inline SkCanvas::SaveLayerFlags layerFlags(SaveFlags::Flags flags) { + SkCanvas::SaveLayerFlags layerFlags = 0; + + if (!(flags & SaveFlags::HasAlphaLayer)) { + layerFlags |= SkCanvas::kIsOpaque_SaveLayerFlag; + } + + if (!(flags & SaveFlags::ClipToLayer)) { + layerFlags |= SkCanvas::kDontClipToLayer_Legacy_SaveLayerFlag; + } + + return layerFlags; +} + int SkiaCanvas::saveLayer(float left, float top, float right, float bottom, - const SkPaint* paint, SkCanvas::SaveFlags flags) { - SkRect bounds = SkRect::MakeLTRB(left, top, right, bottom); - int count = mCanvas->saveLayer(&bounds, paint, flags | SkCanvas::kMatrixClip_SaveFlag); + const SkPaint* paint, SaveFlags::Flags flags) { + const SkRect bounds = SkRect::MakeLTRB(left, top, right, bottom); + const SkCanvas::SaveLayerRec rec(&bounds, paint, layerFlags(flags)); + + int count = mCanvas->saveLayer(rec); recordPartialSave(flags); return count; } int SkiaCanvas::saveLayerAlpha(float left, float top, float right, float bottom, - int alpha, SkCanvas::SaveFlags flags) { - SkRect bounds = SkRect::MakeLTRB(left, top, right, bottom); - int count = mCanvas->saveLayerAlpha(&bounds, alpha, flags | SkCanvas::kMatrixClip_SaveFlag); - recordPartialSave(flags); - return count; + int alpha, SaveFlags::Flags flags) { + SkTLazy<SkPaint> alphaPaint; + if (static_cast<unsigned>(alpha) < 0xFF) { + alphaPaint.init()->setAlpha(alpha); + } + + return this->saveLayer(left, top, right, bottom, alphaPaint.getMaybeNull(), + flags); } // ---------------------------------------------------------------------------- // functions to emulate legacy SaveFlags (i.e. independent matrix/clip flags) // ---------------------------------------------------------------------------- -void SkiaCanvas::recordPartialSave(SkCanvas::SaveFlags flags) { +void SkiaCanvas::recordPartialSave(SaveFlags::Flags flags) { // A partial save is a save operation which doesn't capture the full canvas state. - // (either kMatrix_SaveFlags or kClip_SaveFlag is missing). + // (either SaveFlags::Matrix or SaveFlags::Clip is missing). // Mask-out non canvas state bits. - flags = static_cast<SkCanvas::SaveFlags>(flags & SkCanvas::kMatrixClip_SaveFlag); + flags &= SaveFlags::MatrixClip; - if (SkCanvas::kMatrixClip_SaveFlag == flags) { + if (flags == SaveFlags::MatrixClip) { // not a partial save. return; } diff --git a/libs/hwui/SkiaCanvasProxy.cpp b/libs/hwui/SkiaCanvasProxy.cpp index 976f77518337..6530d4ed8d50 100644 --- a/libs/hwui/SkiaCanvasProxy.cpp +++ b/libs/hwui/SkiaCanvasProxy.cpp @@ -159,7 +159,21 @@ SkSurface* SkiaCanvasProxy::onNewSurface(const SkImageInfo&, const SkSurfaceProp } void SkiaCanvasProxy::willSave() { - mCanvas->save(SkCanvas::kMatrixClip_SaveFlag); + mCanvas->save(android::SaveFlags::MatrixClip); +} + +static inline SaveFlags::Flags saveFlags(SkCanvas::SaveLayerFlags layerFlags) { + SaveFlags::Flags saveFlags = 0; + + if (!(layerFlags & SkCanvas::kDontClipToLayer_Legacy_SaveLayerFlag)) { + saveFlags |= SaveFlags::ClipToLayer; + } + + if (!(layerFlags & SkCanvas::kIsOpaque_SaveLayerFlag)) { + saveFlags |= SaveFlags::HasAlphaLayer; + } + + return saveFlags; } SkCanvas::SaveLayerStrategy SkiaCanvasProxy::getSaveLayerStrategy(const SaveLayerRec& saveLayerRec) { @@ -170,7 +184,7 @@ SkCanvas::SaveLayerStrategy SkiaCanvasProxy::getSaveLayerStrategy(const SaveLaye rect = SkRect::MakeEmpty(); } mCanvas->saveLayer(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, saveLayerRec.fPaint, - (SkCanvas::SaveFlags) SaveLayerFlagsToSaveFlags(saveLayerRec.fSaveLayerFlags)); + saveFlags(saveLayerRec.fSaveLayerFlags)); return SkCanvas::kNoLayer_SaveLayerStrategy; } diff --git a/libs/hwui/Snapshot.cpp b/libs/hwui/Snapshot.cpp index c6d89775390b..27fea1ff59f5 100644 --- a/libs/hwui/Snapshot.cpp +++ b/libs/hwui/Snapshot.cpp @@ -16,7 +16,7 @@ #include "Snapshot.h" -#include <SkCanvas.h> +#include "Canvas.h" namespace android { namespace uirenderer { @@ -57,14 +57,14 @@ Snapshot::Snapshot(Snapshot* s, int saveFlags) , mClipArea(nullptr) , mViewportData(s->mViewportData) , mRelativeLightCenter(s->mRelativeLightCenter) { - if (saveFlags & SkCanvas::kMatrix_SaveFlag) { + if (saveFlags & SaveFlags::Matrix) { mTransformRoot = *s->transform; transform = &mTransformRoot; } else { transform = s->transform; } - if (saveFlags & SkCanvas::kClip_SaveFlag) { + if (saveFlags & SaveFlags::Clip) { mClipAreaRoot = s->getClipArea(); mClipArea = &mClipAreaRoot; } else { diff --git a/libs/hwui/VectorDrawable.cpp b/libs/hwui/VectorDrawable.cpp index 3e20608dc4cc..1d31c9e08a9e 100644 --- a/libs/hwui/VectorDrawable.cpp +++ b/libs/hwui/VectorDrawable.cpp @@ -420,7 +420,7 @@ void Tree::draw(Canvas* outCanvas, SkColorFilter* colorFilter, return; } - int saveCount = outCanvas->save(SkCanvas::SaveFlags::kMatrixClip_SaveFlag); + int saveCount = outCanvas->save(SaveFlags::MatrixClip); outCanvas->translate(mBounds.fLeft, mBounds.fTop); // Handle RTL mirroring. diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 6f8d62757437..18c713af9b20 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -19,6 +19,7 @@ #include "AnimationContext.h" #include "Caches.h" +#include "Canvas.h" #include "DeferredLayerUpdater.h" #include "EglManager.h" #include "LayerUpdateQueue.h" @@ -394,7 +395,7 @@ void CanvasContext::draw() { backdropBounds.doIntersect(targetBounds); // Check if we have to draw something on the left side ... if (targetBounds.left < contentBounds.left) { - mCanvas->save(SkCanvas::kClip_SaveFlag); + mCanvas->save(SaveFlags::Clip); if (mCanvas->clipRect(targetBounds.left, targetBounds.top, contentBounds.left, targetBounds.bottom, SkRegion::kIntersect_Op)) { @@ -407,7 +408,7 @@ void CanvasContext::draw() { // ... or on the right side ... if (targetBounds.right > contentBounds.right && !targetBounds.isEmpty()) { - mCanvas->save(SkCanvas::kClip_SaveFlag); + mCanvas->save(SaveFlags::Clip); if (mCanvas->clipRect(contentBounds.right, targetBounds.top, targetBounds.right, targetBounds.bottom, SkRegion::kIntersect_Op)) { @@ -420,7 +421,7 @@ void CanvasContext::draw() { // ... or at the top ... if (targetBounds.top < contentBounds.top && !targetBounds.isEmpty()) { - mCanvas->save(SkCanvas::kClip_SaveFlag); + mCanvas->save(SaveFlags::Clip); if (mCanvas->clipRect(targetBounds.left, targetBounds.top, targetBounds.right, contentBounds.top, SkRegion::kIntersect_Op)) { @@ -433,7 +434,7 @@ void CanvasContext::draw() { // ... or at the bottom. if (targetBounds.bottom > contentBounds.bottom && !targetBounds.isEmpty()) { - mCanvas->save(SkCanvas::kClip_SaveFlag); + mCanvas->save(SaveFlags::Clip); if (mCanvas->clipRect(targetBounds.left, contentBounds.bottom, targetBounds.right, targetBounds.bottom, SkRegion::kIntersect_Op)) { mCanvas->drawRenderNode(node.get(), outBounds); @@ -442,7 +443,7 @@ void CanvasContext::draw() { } } else if (layer == 1) { // Content // It gets cropped against the bounds of the backdrop to stay inside. - mCanvas->save(SkCanvas::kClip_SaveFlag | SkCanvas::kMatrix_SaveFlag); + mCanvas->save(SaveFlags::MatrixClip); // We shift and clip the content to match its final location in the window. const float left = mContentDrawBounds.left; diff --git a/libs/hwui/tests/common/scenes/ClippingAnimation.cpp b/libs/hwui/tests/common/scenes/ClippingAnimation.cpp index db6402ce136f..a5fd71266314 100644 --- a/libs/hwui/tests/common/scenes/ClippingAnimation.cpp +++ b/libs/hwui/tests/common/scenes/ClippingAnimation.cpp @@ -32,7 +32,7 @@ public: canvas.drawColor(Color::White, SkXfermode::kSrcOver_Mode); card = TestUtils::createNode(0, 0, 200, 400, [](RenderProperties& props, TestCanvas& canvas) { - canvas.save(SkCanvas::kMatrixClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); { canvas.clipRect(0, 0, 200, 200, SkRegion::kIntersect_Op); canvas.translate(100, 100); @@ -43,7 +43,7 @@ public: } canvas.restore(); - canvas.save(SkCanvas::kMatrixClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); { SkPath clipCircle; clipCircle.addCircle(100, 300, 100); diff --git a/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp b/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp index c89985009fbd..6904bec304e3 100644 --- a/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp +++ b/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp @@ -34,18 +34,18 @@ public: card = TestUtils::createNode(0, 0, 400, 800, [](RenderProperties& props, TestCanvas& canvas) { // nested clipped saveLayers - canvas.saveLayerAlpha(0, 0, 400, 400, 200, SkCanvas::kClipToLayer_SaveFlag); + canvas.saveLayerAlpha(0, 0, 400, 400, 200, SaveFlags::ClipToLayer); canvas.drawColor(Color::Green_700, SkXfermode::kSrcOver_Mode); canvas.clipRect(50, 50, 350, 350, SkRegion::kIntersect_Op); - canvas.saveLayerAlpha(100, 100, 300, 300, 128, SkCanvas::kClipToLayer_SaveFlag); + canvas.saveLayerAlpha(100, 100, 300, 300, 128, SaveFlags::ClipToLayer); canvas.drawColor(Color::Blue_500, SkXfermode::kSrcOver_Mode); canvas.restore(); canvas.restore(); // single unclipped saveLayer - canvas.save(SkCanvas::kMatrixClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); canvas.translate(0, 400); - canvas.saveLayerAlpha(100, 100, 300, 300, 128, SkCanvas::SaveFlags(0)); // unclipped + canvas.saveLayerAlpha(100, 100, 300, 300, 128, SaveFlags::Flags(0)); // unclipped SkPaint paint; paint.setAntiAlias(true); paint.setColor(Color::Green_700); diff --git a/libs/hwui/tests/common/scenes/ShapeAnimation.cpp b/libs/hwui/tests/common/scenes/ShapeAnimation.cpp index 0cba34479a3c..6d27c9d61a29 100644 --- a/libs/hwui/tests/common/scenes/ShapeAnimation.cpp +++ b/libs/hwui/tests/common/scenes/ShapeAnimation.cpp @@ -69,7 +69,7 @@ public: float cellSize = floorf(width / 7 - cellSpace); // each combination of strokeWidth + style gets a column - int outerCount = canvas.save(SkCanvas::kMatrixClip_SaveFlag); + int outerCount = canvas.save(SaveFlags::MatrixClip); SkPaint paint; paint.setAntiAlias(true); SkPaint::Style styles[] = { @@ -79,9 +79,9 @@ public: for (auto strokeWidth : { 0.0f, 0.5f, 8.0f }) { paint.setStrokeWidth(strokeWidth); // fill column with each op - int middleCount = canvas.save(SkCanvas::kMatrixClip_SaveFlag); + int middleCount = canvas.save(SaveFlags::MatrixClip); for (auto op : ops) { - int innerCount = canvas.save(SkCanvas::kMatrixClip_SaveFlag); + int innerCount = canvas.save(SaveFlags::MatrixClip); canvas.clipRect(0, 0, cellSize, cellSize, SkRegion::kIntersect_Op); canvas.drawColor(Color::White, SkXfermode::Mode::kSrcOver_Mode); op(canvas, cellSize, paint); diff --git a/libs/hwui/tests/microbench/DisplayListCanvasBench.cpp b/libs/hwui/tests/microbench/DisplayListCanvasBench.cpp index 2e59eb450c9f..83af148d095e 100644 --- a/libs/hwui/tests/microbench/DisplayListCanvasBench.cpp +++ b/libs/hwui/tests/microbench/DisplayListCanvasBench.cpp @@ -78,8 +78,8 @@ void BM_DisplayListCanvas_record_saverestore::Run(int iters) { StartBenchmarkTiming(); for (int i = 0; i < iters; ++i) { canvas.reset(100, 100); - canvas.save(SkCanvas::kMatrixClip_SaveFlag); - canvas.save(SkCanvas::kMatrixClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); + canvas.save(SaveFlags::MatrixClip); MicroBench::DoNotOptimize(&canvas); canvas.restore(); canvas.restore(); @@ -121,12 +121,12 @@ void BM_DisplayListCanvas_record_simpleBitmapView::Run(int iters) { for (int i = 0; i < iters; ++i) { canvas.reset(100, 100); { - canvas.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); canvas.drawRect(0, 0, 100, 100, rectPaint); canvas.restore(); } { - canvas.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); canvas.translate(10, 10); canvas.drawBitmap(iconBitmap, 0, 0, nullptr); canvas.restore(); @@ -151,8 +151,8 @@ void BM_CanvasState_saverestore::Run(int iters) { StartBenchmarkTiming(); for (int i = 0; i < iters; ++i) { - state.save(SkCanvas::kMatrixClip_SaveFlag); - state.save(SkCanvas::kMatrixClip_SaveFlag); + state.save(SaveFlags::MatrixClip); + state.save(SaveFlags::MatrixClip); MicroBench::DoNotOptimize(&state); state.restore(); state.restore(); diff --git a/libs/hwui/tests/microbench/FrameBuilderBench.cpp b/libs/hwui/tests/microbench/FrameBuilderBench.cpp index 67c95e2e921f..f9c2b671fdf3 100644 --- a/libs/hwui/tests/microbench/FrameBuilderBench.cpp +++ b/libs/hwui/tests/microbench/FrameBuilderBench.cpp @@ -47,7 +47,7 @@ static std::vector<sp<RenderNode>> createTestNodeList() { // Alternate between drawing rects and bitmaps, with bitmaps overlapping rects. // Rects don't overlap bitmaps, so bitmaps should be brought to front as a group. - canvas.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); for (int i = 0; i < 30; i++) { canvas.translate(0, 10); canvas.drawRect(0, 0, 10, 10, paint); diff --git a/libs/hwui/tests/unit/CanvasStateTests.cpp b/libs/hwui/tests/unit/CanvasStateTests.cpp index 4df2687394fa..68d74ee1e91d 100644 --- a/libs/hwui/tests/unit/CanvasStateTests.cpp +++ b/libs/hwui/tests/unit/CanvasStateTests.cpp @@ -16,6 +16,7 @@ #include "CanvasState.h" +#include "Canvas.h" #include "Matrix.h" #include "Rect.h" #include "utils/LinearAllocator.h" @@ -23,7 +24,6 @@ #include <gtest/gtest.h> #include <SkPath.h> #include <SkRegion.h> -#include <SkCanvas.h> namespace android { namespace uirenderer { @@ -83,7 +83,7 @@ TEST(CanvasState, complexClipping) { state.initializeSaveStack(200, 200, 0, 0, 200, 200, Vector3()); - state.save(SkCanvas::kClip_SaveFlag | SkCanvas::kMatrix_SaveFlag); + state.save(SaveFlags::MatrixClip); { // rotated clip causes complex clip state.rotate(10); @@ -93,7 +93,7 @@ TEST(CanvasState, complexClipping) { } state.restore(); - state.save(SkCanvas::kClip_SaveFlag | SkCanvas::kMatrix_SaveFlag); + state.save(SaveFlags::MatrixClip); { // subtracted clip causes complex clip EXPECT_TRUE(state.clipIsSimple()); @@ -102,7 +102,7 @@ TEST(CanvasState, complexClipping) { } state.restore(); - state.save(SkCanvas::kClip_SaveFlag | SkCanvas::kMatrix_SaveFlag); + state.save(SaveFlags::MatrixClip); { // complex path causes complex clip SkPath path; @@ -119,7 +119,7 @@ TEST(CanvasState, saveAndRestore) { state.initializeSaveStack(200, 200, 0, 0, 200, 200, Vector3()); - state.save(SkCanvas::kClip_SaveFlag); + state.save(SaveFlags::Clip); { state.clipRect(0, 0, 10, 10, SkRegion::kIntersect_Op); ASSERT_EQ(state.getRenderTargetClipBounds(), Rect(10, 10)); @@ -129,7 +129,7 @@ TEST(CanvasState, saveAndRestore) { Matrix4 simpleTranslate; simpleTranslate.loadTranslate(10, 10, 0); - state.save(SkCanvas::kMatrix_SaveFlag); + state.save(SaveFlags::Matrix); { state.translate(10, 10, 0); EXPECT_TRUE(approxEqual(*state.currentTransform(), simpleTranslate)); @@ -143,7 +143,7 @@ TEST(CanvasState, saveAndRestoreButNotTooMuch) { state.initializeSaveStack(200, 200, 0, 0, 200, 200, Vector3()); - state.save(SkCanvas::kMatrix_SaveFlag); // NOTE: clip not saved + state.save(SaveFlags::Matrix); // NOTE: clip not saved { state.clipRect(0, 0, 10, 10, SkRegion::kIntersect_Op); ASSERT_EQ(state.getRenderTargetClipBounds(), Rect(10, 10)); @@ -153,7 +153,7 @@ TEST(CanvasState, saveAndRestoreButNotTooMuch) { Matrix4 simpleTranslate; simpleTranslate.loadTranslate(10, 10, 0); - state.save(SkCanvas::kClip_SaveFlag); // NOTE: matrix not saved + state.save(SaveFlags::Clip); // NOTE: matrix not saved { state.translate(10, 10, 0); EXPECT_TRUE(approxEqual(*state.currentTransform(), simpleTranslate)); diff --git a/libs/hwui/tests/unit/FrameBuilderTests.cpp b/libs/hwui/tests/unit/FrameBuilderTests.cpp index b51bd2ff99cf..b75724ca2b10 100644 --- a/libs/hwui/tests/unit/FrameBuilderTests.cpp +++ b/libs/hwui/tests/unit/FrameBuilderTests.cpp @@ -167,7 +167,7 @@ TEST(FrameBuilder, simpleStroke) { TEST(FrameBuilder, simpleRejection) { auto node = TestUtils::createNode(0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) { - canvas.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); canvas.clipRect(200, 200, 400, 400, SkRegion::kIntersect_Op); // intersection should be empty canvas.drawRect(0, 0, 400, 400, SkPaint()); canvas.restore(); @@ -198,7 +198,7 @@ TEST(FrameBuilder, simpleBatching) { // Alternate between drawing rects and bitmaps, with bitmaps overlapping rects. // Rects don't overlap bitmaps, so bitmaps should be brought to front as a group. - canvas.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); for (int i = 0; i < LOOPS; i++) { canvas.translate(0, 10); canvas.drawRect(0, 0, 10, 10, SkPaint()); @@ -336,7 +336,7 @@ RENDERTHREAD_TEST(FrameBuilder, textureLayer) { auto node = TestUtils::createNode(0, 0, 200, 200, [&layerUpdater](RenderProperties& props, RecordingCanvas& canvas) { - canvas.save(SkCanvas::kMatrixClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); canvas.clipRect(50, 50, 150, 150, SkRegion::kIntersect_Op); canvas.drawLayer(layerUpdater.get()); canvas.restore(); @@ -380,7 +380,7 @@ TEST(FrameBuilder, renderNode) { paint.setColor(SK_ColorDKGRAY); canvas.drawRect(0, 0, 200, 200, paint); - canvas.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); canvas.translate(40, 40); canvas.drawRenderNode(child.get()); canvas.restore(); @@ -448,7 +448,7 @@ TEST(FrameBuilder, saveLayer_simple) { auto node = TestUtils::createNode(0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) { - canvas.saveLayerAlpha(10, 10, 190, 190, 128, SkCanvas::kClipToLayer_SaveFlag); + canvas.saveLayerAlpha(10, 10, 190, 190, 128, SaveFlags::ClipToLayer); canvas.drawRect(10, 10, 190, 190, SkPaint()); canvas.restore(); }); @@ -512,10 +512,10 @@ TEST(FrameBuilder, saveLayer_nested) { auto node = TestUtils::createNode(0, 0, 800, 800, [](RenderProperties& props, RecordingCanvas& canvas) { - canvas.saveLayerAlpha(0, 0, 800, 800, 128, SkCanvas::kClipToLayer_SaveFlag); + canvas.saveLayerAlpha(0, 0, 800, 800, 128, SaveFlags::ClipToLayer); { canvas.drawRect(0, 0, 800, 800, SkPaint()); - canvas.saveLayerAlpha(0, 0, 400, 400, 128, SkCanvas::kClipToLayer_SaveFlag); + canvas.saveLayerAlpha(0, 0, 400, 400, 128, SaveFlags::ClipToLayer); { canvas.drawRect(0, 0, 400, 400, SkPaint()); } @@ -534,9 +534,9 @@ TEST(FrameBuilder, saveLayer_nested) { TEST(FrameBuilder, saveLayer_contentRejection) { auto node = TestUtils::createNode(0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) { - canvas.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); canvas.clipRect(200, 200, 400, 400, SkRegion::kIntersect_Op); - canvas.saveLayerAlpha(200, 200, 400, 400, 128, SkCanvas::kClipToLayer_SaveFlag); + canvas.saveLayerAlpha(200, 200, 400, 400, 128, SaveFlags::ClipToLayer); // draw within save layer may still be recorded, but shouldn't be drawn canvas.drawRect(200, 200, 400, 400, SkPaint()); @@ -583,7 +583,7 @@ TEST(FrameBuilder, saveLayerUnclipped_simple) { auto node = TestUtils::createNode(0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) { - canvas.saveLayerAlpha(10, 10, 190, 190, 128, (SkCanvas::SaveFlags)(0)); + canvas.saveLayerAlpha(10, 10, 190, 190, 128, (SaveFlags::Flags)(0)); canvas.drawRect(0, 0, 200, 200, SkPaint()); canvas.restore(); }); @@ -632,12 +632,12 @@ TEST(FrameBuilder, saveLayerUnclipped_mergedClears) { auto node = TestUtils::createNode(0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) { - int restoreTo = canvas.save(SkCanvas::kMatrixClip_SaveFlag); + int restoreTo = canvas.save(SaveFlags::MatrixClip); canvas.scale(2, 2); - canvas.saveLayerAlpha(0, 0, 5, 5, 128, SkCanvas::kMatrixClip_SaveFlag); - canvas.saveLayerAlpha(95, 0, 100, 5, 128, SkCanvas::kMatrixClip_SaveFlag); - canvas.saveLayerAlpha(0, 95, 5, 100, 128, SkCanvas::kMatrixClip_SaveFlag); - canvas.saveLayerAlpha(95, 95, 100, 100, 128, SkCanvas::kMatrixClip_SaveFlag); + canvas.saveLayerAlpha(0, 0, 5, 5, 128, SaveFlags::MatrixClip); + canvas.saveLayerAlpha(95, 0, 100, 5, 128, SaveFlags::MatrixClip); + canvas.saveLayerAlpha(0, 95, 5, 100, 128, SaveFlags::MatrixClip); + canvas.saveLayerAlpha(95, 95, 100, 100, 128, SaveFlags::MatrixClip); canvas.drawRect(0, 0, 100, 100, SkPaint()); canvas.restoreToCount(restoreTo); }); @@ -695,9 +695,9 @@ TEST(FrameBuilder, saveLayerUnclipped_complex) { auto node = TestUtils::createNode(0, 0, 600, 600, // 500x500 triggers clipping [](RenderProperties& props, RecordingCanvas& canvas) { - canvas.saveLayerAlpha(0, 0, 500, 500, 128, (SkCanvas::SaveFlags)0); // unclipped - canvas.saveLayerAlpha(100, 100, 400, 400, 128, SkCanvas::kClipToLayer_SaveFlag); // clipped - canvas.saveLayerAlpha(200, 200, 300, 300, 128, (SkCanvas::SaveFlags)0); // unclipped + canvas.saveLayerAlpha(0, 0, 500, 500, 128, (SaveFlags::Flags)0); // unclipped + canvas.saveLayerAlpha(100, 100, 400, 400, 128, SaveFlags::ClipToLayer); // clipped + canvas.saveLayerAlpha(200, 200, 300, 300, 128, (SaveFlags::Flags)0); // unclipped canvas.drawRect(200, 200, 300, 300, SkPaint()); canvas.restore(); canvas.restore(); @@ -849,7 +849,7 @@ RENDERTHREAD_TEST(FrameBuilder, hwLayer_complex) { paint.setColor(SK_ColorDKGRAY); canvas.drawRect(0, 0, 200, 200, paint); - canvas.saveLayerAlpha(50, 50, 150, 150, 128, SkCanvas::kClipToLayer_SaveFlag); + canvas.saveLayerAlpha(50, 50, 150, 150, 128, SaveFlags::ClipToLayer); canvas.drawRenderNode(childPtr); canvas.restore(); }); @@ -987,7 +987,7 @@ TEST(FrameBuilder, projectionReorder) { }); auto parent = TestUtils::createNode(0, 0, 100, 100, [&receiverBackground, &child](RenderProperties& properties, RecordingCanvas& canvas) { - canvas.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); canvas.translate(-scrollX, -scrollY); // Apply scroll (note: bg undoes this internally) canvas.drawRenderNode(receiverBackground.get()); canvas.drawRenderNode(child.get()); @@ -1071,7 +1071,7 @@ TEST(FrameBuilder, shadowSaveLayer) { [](RenderProperties& props, RecordingCanvas& canvas) { // save/restore outside of reorderBarrier, so they don't get moved out of place canvas.translate(20, 10); - int count = canvas.saveLayerAlpha(30, 50, 130, 150, 128, SkCanvas::kClipToLayer_SaveFlag); + int count = canvas.saveLayerAlpha(30, 50, 130, 150, 128, SaveFlags::ClipToLayer); canvas.insertReorderBarrier(true); canvas.drawRenderNode(createWhiteRectShadowCaster(5.0f).get()); canvas.insertReorderBarrier(false); @@ -1111,7 +1111,7 @@ RENDERTHREAD_TEST(FrameBuilder, shadowHwLayer) { [](RenderProperties& props, RecordingCanvas& canvas) { props.mutateLayerProperties().setType(LayerType::RenderLayer); canvas.insertReorderBarrier(true); - canvas.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); canvas.translate(20, 10); canvas.drawRenderNode(createWhiteRectShadowCaster(5.0f).get()); canvas.restore(); diff --git a/libs/hwui/tests/unit/LeakCheckTests.cpp b/libs/hwui/tests/unit/LeakCheckTests.cpp index 41e44fc88a6b..4a635fb1b8c8 100644 --- a/libs/hwui/tests/unit/LeakCheckTests.cpp +++ b/libs/hwui/tests/unit/LeakCheckTests.cpp @@ -32,7 +32,7 @@ const Vector3 sLightCenter = {100, 100, 100}; RENDERTHREAD_TEST(LeakCheck, saveLayerUnclipped_simple) { auto node = TestUtils::createNode(0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) { - canvas.saveLayerAlpha(10, 10, 190, 190, 128, (SkCanvas::SaveFlags)(0)); + canvas.saveLayerAlpha(10, 10, 190, 190, 128, (SaveFlags::Flags)(0)); canvas.drawRect(0, 0, 200, 200, SkPaint()); canvas.restore(); }); diff --git a/libs/hwui/tests/unit/RecordingCanvasTests.cpp b/libs/hwui/tests/unit/RecordingCanvasTests.cpp index ff098c8bb3d5..01bfc5adbbbd 100644 --- a/libs/hwui/tests/unit/RecordingCanvasTests.cpp +++ b/libs/hwui/tests/unit/RecordingCanvasTests.cpp @@ -35,7 +35,7 @@ static void playbackOps(const DisplayList& displayList, TEST(RecordingCanvas, emptyPlayback) { auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 200, [](RecordingCanvas& canvas) { - canvas.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); canvas.restore(); }); playbackOps(*dl, [](const RecordedOp& op) { ADD_FAILURE(); }); @@ -43,7 +43,7 @@ TEST(RecordingCanvas, emptyPlayback) { TEST(RecordingCanvas, clipRect) { auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 100, [](RecordingCanvas& canvas) { - canvas.save(SkCanvas::kMatrixClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); canvas.clipRect(0, 0, 100, 100, SkRegion::kIntersect_Op); canvas.drawRect(0, 0, 50, 50, SkPaint()); canvas.drawRect(50, 50, 100, 100, SkPaint()); @@ -176,16 +176,16 @@ TEST(RecordingCanvas, backgroundAndImage) { SkPaint paint; paint.setColor(SK_ColorBLUE); - canvas.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); { // a background! - canvas.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); canvas.drawRect(0, 0, 100, 200, paint); canvas.restore(); } { // an image! - canvas.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); canvas.translate(25, 25); canvas.scale(2, 2); canvas.drawBitmap(bitmap, 0, 0, nullptr); @@ -224,7 +224,7 @@ TEST(RecordingCanvas, backgroundAndImage) { TEST(RecordingCanvas, saveLayer_simple) { auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) { - canvas.saveLayerAlpha(10, 20, 190, 180, 128, SkCanvas::kClipToLayer_SaveFlag); + canvas.saveLayerAlpha(10, 20, 190, 180, 128, SaveFlags::ClipToLayer); canvas.drawRect(10, 20, 190, 180, SkPaint()); canvas.restore(); }); @@ -258,7 +258,7 @@ TEST(RecordingCanvas, saveLayer_simple) { TEST(RecordingCanvas, saveLayer_missingRestore) { auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) { - canvas.saveLayerAlpha(0, 0, 200, 200, 128, SkCanvas::kClipToLayer_SaveFlag); + canvas.saveLayerAlpha(0, 0, 200, 200, 128, SaveFlags::ClipToLayer); canvas.drawRect(0, 0, 200, 200, SkPaint()); // Note: restore omitted, shouldn't result in unmatched save }); @@ -273,7 +273,7 @@ TEST(RecordingCanvas, saveLayer_missingRestore) { TEST(RecordingCanvas, saveLayer_simpleUnclipped) { auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) { - canvas.saveLayerAlpha(10, 20, 190, 180, 128, (SkCanvas::SaveFlags)0); // unclipped + canvas.saveLayerAlpha(10, 20, 190, 180, 128, (SaveFlags::Flags)0); // unclipped canvas.drawRect(10, 20, 190, 180, SkPaint()); canvas.restore(); }); @@ -305,9 +305,9 @@ TEST(RecordingCanvas, saveLayer_simpleUnclipped) { TEST(RecordingCanvas, saveLayer_addClipFlag) { auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) { - canvas.save(SkCanvas::kMatrixClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); canvas.clipRect(10, 20, 190, 180, SkRegion::kIntersect_Op); - canvas.saveLayerAlpha(10, 20, 190, 180, 128, (SkCanvas::SaveFlags)0); // unclipped + canvas.saveLayerAlpha(10, 20, 190, 180, 128, (SaveFlags::Flags)0); // unclipped canvas.drawRect(10, 20, 190, 180, SkPaint()); canvas.restore(); canvas.restore(); @@ -327,7 +327,7 @@ TEST(RecordingCanvas, saveLayer_viewportCrop) { // shouldn't matter, since saveLayer will clip to its bounds canvas.clipRect(-1000, -1000, 1000, 1000, SkRegion::kReplace_Op); - canvas.saveLayerAlpha(100, 100, 300, 300, 128, SkCanvas::kClipToLayer_SaveFlag); + canvas.saveLayerAlpha(100, 100, 300, 300, 128, SaveFlags::ClipToLayer); canvas.drawRect(0, 0, 400, 400, SkPaint()); canvas.restore(); }); @@ -348,12 +348,12 @@ TEST(RecordingCanvas, saveLayer_viewportCrop) { TEST(RecordingCanvas, saveLayer_rotateUnclipped) { auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) { - canvas.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); canvas.translate(100, 100); canvas.rotate(45); canvas.translate(-50, -50); - canvas.saveLayerAlpha(0, 0, 100, 100, 128, SkCanvas::kClipToLayer_SaveFlag); + canvas.saveLayerAlpha(0, 0, 100, 100, 128, SaveFlags::ClipToLayer); canvas.drawRect(0, 0, 100, 100, SkPaint()); canvas.restore(); @@ -374,13 +374,13 @@ TEST(RecordingCanvas, saveLayer_rotateUnclipped) { TEST(RecordingCanvas, saveLayer_rotateClipped) { auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) { - canvas.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); + canvas.save(SaveFlags::MatrixClip); canvas.translate(100, 100); canvas.rotate(45); canvas.translate(-200, -200); // area of saveLayer will be clipped to parent viewport, so we ask for 400x400... - canvas.saveLayerAlpha(0, 0, 400, 400, 128, SkCanvas::kClipToLayer_SaveFlag); + canvas.saveLayerAlpha(0, 0, 400, 400, 128, SaveFlags::ClipToLayer); canvas.drawRect(0, 0, 400, 400, SkPaint()); canvas.restore(); |