From a6cb58a924c24ba5f0ca928e850129a945792089 Mon Sep 17 00:00:00 2001 From: Mike Reed Date: Sat, 10 Jul 2021 13:31:34 -0400 Subject: [PATCH] Store filterbitmap on Paint Update Paint and SkiaCanvas now that SkFilterQuality is no longer part of Skia's API. 1. Store mFilterBitmap:bool directly in Paint (matching java side) 2. Change Looper construct to operate on Paint rather than SkPaint ... so it can access mFilterBitmap. 3. Update PaintFilter to take Paint instead of SkPaint As before, when we do have to call SkCanvas, we convert Paint's mFilterBitmap into SkSamplingOptions as needed. Test: make Bug: 178700363 Change-Id: I7fccf17657d4e255f2453b4bfc513215503597b2 --- libs/hwui/RecordingCanvas.cpp | 9 +++-- libs/hwui/SkiaCanvas.cpp | 39 +++++++------------ libs/hwui/SkiaCanvas.h | 22 +++++------ libs/hwui/VectorDrawable.cpp | 8 ++-- libs/hwui/VectorDrawable.h | 2 +- libs/hwui/hwui/AnimatedImageDrawable.cpp | 1 - libs/hwui/hwui/BlurDrawLooper.cpp | 2 +- libs/hwui/hwui/BlurDrawLooper.h | 10 ++--- libs/hwui/hwui/Canvas.h | 4 +- libs/hwui/hwui/Paint.h | 17 ++++++-- libs/hwui/hwui/PaintFilter.h | 5 ++- libs/hwui/hwui/PaintImpl.cpp | 32 ++++++++------- libs/hwui/jni/Paint.cpp | 3 +- libs/hwui/jni/PaintFilter.cpp | 4 -- libs/hwui/jni/android_graphics_Canvas.cpp | 10 ++--- .../pipeline/skia/SkiaRecordingCanvas.cpp | 22 +++-------- .../common/scenes/SaveLayerAnimation.cpp | 2 +- libs/hwui/utils/PaintUtils.h | 7 ---- 18 files changed, 92 insertions(+), 107 deletions(-) diff --git a/libs/hwui/RecordingCanvas.cpp b/libs/hwui/RecordingCanvas.cpp index 442ae0fb27076..c945f274bbf4e 100644 --- a/libs/hwui/RecordingCanvas.cpp +++ b/libs/hwui/RecordingCanvas.cpp @@ -15,6 +15,7 @@ */ #include "RecordingCanvas.h" +#include #include @@ -495,7 +496,7 @@ struct DrawVectorDrawable final : Op { sp mRoot; SkRect mBounds; - SkPaint paint; + Paint paint; BitmapPalette palette; }; @@ -833,7 +834,8 @@ constexpr color_transform_fn colorTransformForOp() { // TODO: We should be const. Or not. Or just use a different map // Unclear, but this is the quick fix const T* op = reinterpret_cast(opRaw); - transformPaint(transform, const_cast(&(op->paint)), op->palette); + const SkPaint* paint = &op->paint; + transformPaint(transform, const_cast(paint), op->palette); }; } else if @@ -842,7 +844,8 @@ constexpr color_transform_fn colorTransformForOp() { // TODO: We should be const. Or not. Or just use a different map // Unclear, but this is the quick fix const T* op = reinterpret_cast(opRaw); - transformPaint(transform, const_cast(&(op->paint))); + const SkPaint* paint = &op->paint; + transformPaint(transform, const_cast(paint)); }; } else { diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp index d032e2b006492..d6b6e162757c0 100644 --- a/libs/hwui/SkiaCanvas.cpp +++ b/libs/hwui/SkiaCanvas.cpp @@ -182,7 +182,7 @@ int SkiaCanvas::saveUnclippedLayer(int left, int top, int right, int bottom) { return SkAndroidFrameworkUtils::SaveBehind(mCanvas, &bounds); } -void SkiaCanvas::restoreUnclippedLayer(int restoreCount, const SkPaint& paint) { +void SkiaCanvas::restoreUnclippedLayer(int restoreCount, const Paint& paint) { while (mCanvas->getSaveCount() > restoreCount + 1) { this->restore(); @@ -439,13 +439,13 @@ void SkiaCanvas::drawColor(int color, SkBlendMode mode) { mCanvas->drawColor(color, mode); } -void SkiaCanvas::onFilterPaint(SkPaint& paint) { +void SkiaCanvas::onFilterPaint(Paint& paint) { if (mPaintFilter) { - mPaintFilter->filter(&paint); + mPaintFilter->filterFullPaint(&paint); } } -void SkiaCanvas::drawPaint(const SkPaint& paint) { +void SkiaCanvas::drawPaint(const Paint& paint) { mCanvas->drawPaint(filterPaint(paint)); } @@ -552,9 +552,8 @@ void SkiaCanvas::drawVertices(const SkVertices* vertices, SkBlendMode mode, cons void SkiaCanvas::drawBitmap(Bitmap& bitmap, float left, float top, const Paint* paint) { auto image = bitmap.makeImage(); - applyLooper(paint, [&](const SkPaint& p) { - auto sampling = SkSamplingOptions(p.getFilterQuality()); - mCanvas->drawImage(image, left, top, sampling, &p); + applyLooper(paint, [&](const Paint& p) { + mCanvas->drawImage(image, left, top, p.sampling(), &p); }); } @@ -562,9 +561,8 @@ void SkiaCanvas::drawBitmap(Bitmap& bitmap, const SkMatrix& matrix, const Paint* auto image = bitmap.makeImage(); SkAutoCanvasRestore acr(mCanvas, true); mCanvas->concat(matrix); - applyLooper(paint, [&](const SkPaint& p) { - auto sampling = SkSamplingOptions(p.getFilterQuality()); - mCanvas->drawImage(image, 0, 0, sampling, &p); + applyLooper(paint, [&](const Paint& p) { + mCanvas->drawImage(image, 0, 0, p.sampling(), &p); }); } @@ -575,18 +573,12 @@ void SkiaCanvas::drawBitmap(Bitmap& bitmap, float srcLeft, float srcTop, float s SkRect srcRect = SkRect::MakeLTRB(srcLeft, srcTop, srcRight, srcBottom); SkRect dstRect = SkRect::MakeLTRB(dstLeft, dstTop, dstRight, dstBottom); - applyLooper(paint, [&](const SkPaint& p) { - auto sampling = SkSamplingOptions(p.getFilterQuality()); - mCanvas->drawImageRect(image, srcRect, dstRect, sampling, &p, + applyLooper(paint, [&](const Paint& p) { + mCanvas->drawImageRect(image, srcRect, dstRect, p.sampling(), &p, SkCanvas::kFast_SrcRectConstraint); }); } -static SkFilterMode paintToFilter(const Paint* paint) { - return paint && paint->isFilterBitmap() ? SkFilterMode::kLinear - : SkFilterMode::kNearest; -} - void SkiaCanvas::drawBitmapMesh(Bitmap& bitmap, int meshWidth, int meshHeight, const float* vertices, const int* colors, const Paint* paint) { const int ptCount = (meshWidth + 1) * (meshHeight + 1); @@ -668,13 +660,13 @@ void SkiaCanvas::drawBitmapMesh(Bitmap& bitmap, int meshWidth, int meshHeight, if (paint) { pnt = *paint; } - SkSamplingOptions sampling(paintToFilter(&pnt)); + SkSamplingOptions sampling = pnt.sampling(); pnt.setShader(image->makeShader(sampling)); auto v = builder.detach(); - applyLooper(&pnt, [&](const SkPaint& p) { + applyLooper(&pnt, [&](const Paint& p) { SkPaint copy(p); - auto s = SkSamplingOptions(p.getFilterQuality()); + auto s = p.sampling(); if (s != sampling) { // applyLooper changed the quality? copy.setShader(image->makeShader(s)); @@ -707,9 +699,8 @@ void SkiaCanvas::drawNinePatch(Bitmap& bitmap, const Res_png_9patch& chunk, floa lattice.fBounds = nullptr; SkRect dst = SkRect::MakeLTRB(dstLeft, dstTop, dstRight, dstBottom); auto image = bitmap.makeImage(); - applyLooper(paint, [&](const SkPaint& p) { - auto filter = SkSamplingOptions(p.getFilterQuality()).filter; - mCanvas->drawImageLattice(image.get(), lattice, dst, filter, &p); + applyLooper(paint, [&](const Paint& p) { + mCanvas->drawImageLattice(image.get(), lattice, dst, p.filterMode(), &p); }); } diff --git a/libs/hwui/SkiaCanvas.h b/libs/hwui/SkiaCanvas.h index 438a40cb4c81d..fd6bbdc55cf1e 100644 --- a/libs/hwui/SkiaCanvas.h +++ b/libs/hwui/SkiaCanvas.h @@ -23,6 +23,7 @@ #include "VectorDrawable.h" #include "hwui/Canvas.h" #include "hwui/Paint.h" +#include "hwui/BlurDrawLooper.h" #include #include "pipeline/skia/AnimatedDrawables.h" @@ -73,7 +74,7 @@ public: virtual int save(SaveFlags::Flags flags) override; virtual void restore() override; virtual void restoreToCount(int saveCount) override; - virtual void restoreUnclippedLayer(int saveCount, const SkPaint& paint) override; + virtual void restoreUnclippedLayer(int saveCount, const Paint& paint) override; virtual int saveLayer(float left, float top, float right, float bottom, const SkPaint* paint) override; virtual int saveLayerAlpha(float left, float top, float right, float bottom, int alpha) override; @@ -99,7 +100,7 @@ public: virtual SkCanvasState* captureCanvasState() const override; virtual void drawColor(int color, SkBlendMode mode) override; - virtual void drawPaint(const SkPaint& paint) override; + virtual void drawPaint(const Paint& paint) override; virtual void drawPoint(float x, float y, const Paint& paint) override; virtual void drawPoints(const float* points, int count, const Paint& paint) override; @@ -167,10 +168,10 @@ protected: const Paint& paint, const SkPath& path, size_t start, size_t end) override; - void onFilterPaint(SkPaint& paint); + void onFilterPaint(Paint& paint); - SkPaint filterPaint(const SkPaint& src) { - SkPaint dst(src); + Paint filterPaint(const Paint& src) { + Paint dst(src); this->onFilterPaint(dst); return dst; } @@ -179,21 +180,20 @@ protected: template void applyLooper(const Paint* paint, Proc proc, void (*preFilter)(SkPaint&) = nullptr) { BlurDrawLooper* looper = paint ? paint->getLooper() : nullptr; - const SkPaint* skpPtr = paint; - SkPaint skp = skpPtr ? *skpPtr : SkPaint(); + Paint pnt = paint ? *paint : Paint(); if (preFilter) { - preFilter(skp); + preFilter(pnt); } - this->onFilterPaint(skp); + this->onFilterPaint(pnt); if (looper) { - looper->apply(skp, [&](SkPoint offset, const SkPaint& modifiedPaint) { + looper->apply(pnt, [&](SkPoint offset, const Paint& modifiedPaint) { mCanvas->save(); mCanvas->translate(offset.fX, offset.fY); proc(modifiedPaint); mCanvas->restore(); }); } else { - proc(skp); + proc(pnt); } } diff --git a/libs/hwui/VectorDrawable.cpp b/libs/hwui/VectorDrawable.cpp index 55f434f49bbda..f116641b560f9 100644 --- a/libs/hwui/VectorDrawable.cpp +++ b/libs/hwui/VectorDrawable.cpp @@ -463,10 +463,10 @@ void Tree::drawStaging(Canvas* outCanvas) { mStagingCache.dirty = false; } - SkPaint skp; + Paint skp; getPaintFor(&skp, mStagingProperties); Paint paint; - paint.setFilterQuality(skp.getFilterQuality()); + paint.setFilterBitmap(skp.isFilterBitmap()); paint.setColorFilter(skp.refColorFilter()); paint.setAlpha(skp.getAlpha()); outCanvas->drawBitmap(*mStagingCache.bitmap, 0, 0, mStagingCache.bitmap->width(), @@ -476,9 +476,9 @@ void Tree::drawStaging(Canvas* outCanvas) { mStagingProperties.getBounds().bottom(), &paint); } -void Tree::getPaintFor(SkPaint* outPaint, const TreeProperties& prop) const { +void Tree::getPaintFor(Paint* outPaint, const TreeProperties& prop) const { // HWUI always draws VD with bilinear filtering. - outPaint->setFilterQuality(kLow_SkFilterQuality); + outPaint->setFilterBitmap(true); if (prop.getColorFilter() != nullptr) { outPaint->setColorFilter(sk_ref_sp(prop.getColorFilter())); } diff --git a/libs/hwui/VectorDrawable.h b/libs/hwui/VectorDrawable.h index ac7d41e0d600a..30bb04ae83611 100644 --- a/libs/hwui/VectorDrawable.h +++ b/libs/hwui/VectorDrawable.h @@ -648,7 +648,7 @@ public: */ void draw(SkCanvas* canvas, const SkRect& bounds, const SkPaint& paint); - void getPaintFor(SkPaint* outPaint, const TreeProperties &props) const; + void getPaintFor(Paint* outPaint, const TreeProperties &props) const; BitmapPalette computePalette(); void setAntiAlias(bool aa) { mRootNode->setAntiAlias(aa); } diff --git a/libs/hwui/hwui/AnimatedImageDrawable.cpp b/libs/hwui/hwui/AnimatedImageDrawable.cpp index 876f5c895c600..d08bc5c583c27 100644 --- a/libs/hwui/hwui/AnimatedImageDrawable.cpp +++ b/libs/hwui/hwui/AnimatedImageDrawable.cpp @@ -157,7 +157,6 @@ void AnimatedImageDrawable::onDraw(SkCanvas* canvas) { lazyPaint.emplace(); lazyPaint->setAlpha(mProperties.mAlpha); lazyPaint->setColorFilter(mProperties.mColorFilter); - lazyPaint->setFilterQuality(kLow_SkFilterQuality); } canvas->concat(matrix); diff --git a/libs/hwui/hwui/BlurDrawLooper.cpp b/libs/hwui/hwui/BlurDrawLooper.cpp index 27a038d4598e0..270d24af99fd1 100644 --- a/libs/hwui/hwui/BlurDrawLooper.cpp +++ b/libs/hwui/hwui/BlurDrawLooper.cpp @@ -24,7 +24,7 @@ BlurDrawLooper::BlurDrawLooper(SkColor4f color, float blurSigma, SkPoint offset) BlurDrawLooper::~BlurDrawLooper() = default; -SkPoint BlurDrawLooper::apply(SkPaint* paint) const { +SkPoint BlurDrawLooper::apply(Paint* paint) const { paint->setColor(mColor); if (mBlurSigma > 0) { paint->setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, mBlurSigma, true)); diff --git a/libs/hwui/hwui/BlurDrawLooper.h b/libs/hwui/hwui/BlurDrawLooper.h index 7e6786f7dfbc9..09a4e0f849b0a 100644 --- a/libs/hwui/hwui/BlurDrawLooper.h +++ b/libs/hwui/hwui/BlurDrawLooper.h @@ -17,7 +17,7 @@ #ifndef ANDROID_GRAPHICS_BLURDRAWLOOPER_H_ #define ANDROID_GRAPHICS_BLURDRAWLOOPER_H_ -#include +#include #include class SkColorSpace; @@ -30,10 +30,10 @@ public: ~BlurDrawLooper() override; - // proc(SkPoint offset, const SkPaint& modifiedPaint) + // proc(SkPoint offset, const Paint& modifiedPaint) template - void apply(const SkPaint& paint, DrawProc proc) const { - SkPaint p(paint); + void apply(const Paint& paint, DrawProc proc) const { + Paint p(paint); proc(this->apply(&p), p); // draw the shadow proc({0, 0}, paint); // draw the original (on top) } @@ -43,7 +43,7 @@ private: const float mBlurSigma; const SkPoint mOffset; - SkPoint apply(SkPaint* paint) const; + SkPoint apply(Paint* paint) const; BlurDrawLooper(SkColor4f, float, SkPoint); }; diff --git a/libs/hwui/hwui/Canvas.h b/libs/hwui/hwui/Canvas.h index 9023613478fc1..70a558b3d69d0 100644 --- a/libs/hwui/hwui/Canvas.h +++ b/libs/hwui/hwui/Canvas.h @@ -162,7 +162,7 @@ public: virtual int save(SaveFlags::Flags flags) = 0; virtual void restore() = 0; virtual void restoreToCount(int saveCount) = 0; - virtual void restoreUnclippedLayer(int saveCount, const SkPaint& paint) = 0; + virtual void restoreUnclippedLayer(int saveCount, const Paint& paint) = 0; virtual int saveLayer(float left, float top, float right, float bottom, const SkPaint* paint) = 0; virtual int saveLayerAlpha(float left, float top, float right, float bottom, int alpha) = 0; @@ -197,7 +197,7 @@ public: // Canvas draw operations // ---------------------------------------------------------------------------- virtual void drawColor(int color, SkBlendMode mode) = 0; - virtual void drawPaint(const SkPaint& paint) = 0; + virtual void drawPaint(const Paint& paint) = 0; // Geometry virtual void drawPoint(float x, float y, const Paint& paint) = 0; diff --git a/libs/hwui/hwui/Paint.h b/libs/hwui/hwui/Paint.h index d9c9eeed03e9e..4a8f3e10fc260 100644 --- a/libs/hwui/hwui/Paint.h +++ b/libs/hwui/hwui/Paint.h @@ -17,13 +17,13 @@ #ifndef ANDROID_GRAPHICS_PAINT_H_ #define ANDROID_GRAPHICS_PAINT_H_ -#include "BlurDrawLooper.h" #include "Typeface.h" #include #include #include +#include #include #include @@ -32,6 +32,8 @@ namespace android { +class BlurDrawLooper; + class Paint : public SkPaint { public: // Default values for underlined and strikethrough text, @@ -60,7 +62,7 @@ public: const SkFont& getSkFont() const { return mFont; } BlurDrawLooper* getLooper() const { return mLooper.get(); } - void setLooper(sk_sp looper) { mLooper = std::move(looper); } + void setLooper(sk_sp looper); // These shadow the methods on SkPaint, but we need to so we can keep related // attributes in-sync. @@ -138,7 +140,15 @@ public: void setDevKern(bool d) { mDevKern = d; } // Deprecated -- bitmapshaders will be taking this flag explicitly - bool isFilterBitmap() const { return this->getFilterQuality() != kNone_SkFilterQuality; } + bool isFilterBitmap() const { return mFilterBitmap; } + void setFilterBitmap(bool filter) { mFilterBitmap = filter; } + + SkFilterMode filterMode() const { + return mFilterBitmap ? SkFilterMode::kLinear : SkFilterMode::kNearest; + } + SkSamplingOptions sampling() const { + return SkSamplingOptions(this->filterMode()); + } // The Java flags (Paint.java) no longer fit into the native apis directly. // These methods handle converting to and from them and the native representations @@ -169,6 +179,7 @@ private: // nullptr is valid: it means the default typeface. const Typeface* mTypeface = nullptr; Align mAlign = kLeft_Align; + bool mFilterBitmap = false; bool mStrikeThru = false; bool mUnderline = false; bool mDevKern = false; diff --git a/libs/hwui/hwui/PaintFilter.h b/libs/hwui/hwui/PaintFilter.h index 0e7b619770007..4996aa4453161 100644 --- a/libs/hwui/hwui/PaintFilter.h +++ b/libs/hwui/hwui/PaintFilter.h @@ -1,17 +1,18 @@ #ifndef ANDROID_GRAPHICS_PAINT_FILTER_H_ #define ANDROID_GRAPHICS_PAINT_FILTER_H_ -class SkPaint; +#include namespace android { +class Paint; + class PaintFilter : public SkRefCnt { public: /** * Called with the paint that will be used to draw. * The implementation may modify the paint as they wish. */ - virtual void filter(SkPaint*) = 0; virtual void filterFullPaint(Paint*) = 0; }; diff --git a/libs/hwui/hwui/PaintImpl.cpp b/libs/hwui/hwui/PaintImpl.cpp index fa2674fc2f5e4..aac928f85924a 100644 --- a/libs/hwui/hwui/PaintImpl.cpp +++ b/libs/hwui/hwui/PaintImpl.cpp @@ -15,6 +15,7 @@ */ #include "Paint.h" +#include "BlurDrawLooper.h" namespace android { @@ -43,6 +44,7 @@ Paint::Paint(const Paint& paint) , mHyphenEdit(paint.mHyphenEdit) , mTypeface(paint.mTypeface) , mAlign(paint.mAlign) + , mFilterBitmap(paint.mFilterBitmap) , mStrikeThru(paint.mStrikeThru) , mUnderline(paint.mUnderline) , mDevKern(paint.mDevKern) {} @@ -62,6 +64,7 @@ Paint& Paint::operator=(const Paint& other) { mHyphenEdit = other.mHyphenEdit; mTypeface = other.mTypeface; mAlign = other.mAlign; + mFilterBitmap = other.mFilterBitmap; mStrikeThru = other.mStrikeThru; mUnderline = other.mUnderline; mDevKern = other.mDevKern; @@ -77,6 +80,7 @@ bool operator==(const Paint& a, const Paint& b) { a.mMinikinLocaleListId == b.mMinikinLocaleListId && a.mFamilyVariant == b.mFamilyVariant && a.mHyphenEdit == b.mHyphenEdit && a.mTypeface == b.mTypeface && a.mAlign == b.mAlign && + a.mFilterBitmap == b.mFilterBitmap && a.mStrikeThru == b.mStrikeThru && a.mUnderline == b.mUnderline && a.mDevKern == b.mDevKern; } @@ -88,11 +92,16 @@ void Paint::reset() { mFont.setEdging(SkFont::Edging::kAlias); mLooper.reset(); + mFilterBitmap = false; mStrikeThru = false; mUnderline = false; mDevKern = false; } +void Paint::setLooper(sk_sp looper) { + mLooper = std::move(looper); +} + void Paint::setAntiAlias(bool aa) { // Java does not support/understand subpixel(lcd) antialiasing SkASSERT(mFont.getEdging() != SkFont::Edging::kSubpixelAntiAlias); @@ -131,9 +140,6 @@ static uint32_t paintToLegacyFlags(const SkPaint& paint) { uint32_t flags = 0; flags |= -(int)paint.isAntiAlias() & sAntiAliasFlag; flags |= -(int)paint.isDither() & sDitherFlag; - if (paint.getFilterQuality() != kNone_SkFilterQuality) { - flags |= sFilterBitmapFlag; - } return flags; } @@ -150,12 +156,6 @@ static uint32_t fontToLegacyFlags(const SkFont& font) { static void applyLegacyFlagsToPaint(uint32_t flags, SkPaint* paint) { paint->setAntiAlias((flags & sAntiAliasFlag) != 0); paint->setDither ((flags & sDitherFlag) != 0); - - if (flags & sFilterBitmapFlag) { - paint->setFilterQuality(kLow_SkFilterQuality); - } else { - paint->setFilterQuality(kNone_SkFilterQuality); - } } static void applyLegacyFlagsToFont(uint32_t flags, SkFont* font) { @@ -182,18 +182,20 @@ void Paint::SetSkPaintJavaFlags(SkPaint* paint, uint32_t flags) { uint32_t Paint::getJavaFlags() const { uint32_t flags = paintToLegacyFlags(*this) | fontToLegacyFlags(mFont); - flags |= -(int)mStrikeThru & sStrikeThruFlag; - flags |= -(int)mUnderline & sUnderlineFlag; - flags |= -(int)mDevKern & sDevKernFlag; + flags |= -(int)mStrikeThru & sStrikeThruFlag; + flags |= -(int)mUnderline & sUnderlineFlag; + flags |= -(int)mDevKern & sDevKernFlag; + flags |= -(int)mFilterBitmap & sFilterBitmapFlag; return flags; } void Paint::setJavaFlags(uint32_t flags) { applyLegacyFlagsToPaint(flags, this); applyLegacyFlagsToFont(flags, &mFont); - mStrikeThru = (flags & sStrikeThruFlag) != 0; - mUnderline = (flags & sUnderlineFlag) != 0; - mDevKern = (flags & sDevKernFlag) != 0; + mStrikeThru = (flags & sStrikeThruFlag) != 0; + mUnderline = (flags & sUnderlineFlag) != 0; + mDevKern = (flags & sDevKernFlag) != 0; + mFilterBitmap = (flags & sFilterBitmapFlag) != 0; } } // namespace android diff --git a/libs/hwui/jni/Paint.cpp b/libs/hwui/jni/Paint.cpp index bcec0fa8a1cc0..22a1e1fd94b94 100644 --- a/libs/hwui/jni/Paint.cpp +++ b/libs/hwui/jni/Paint.cpp @@ -663,8 +663,7 @@ namespace PaintGlue { } static void setFilterBitmap(CRITICAL_JNI_PARAMS_COMMA jlong paintHandle, jboolean filterBitmap) { - reinterpret_cast(paintHandle)->setFilterQuality( - filterBitmap ? kLow_SkFilterQuality : kNone_SkFilterQuality); + reinterpret_cast(paintHandle)->setFilterBitmap(filterBitmap); } static void setDither(CRITICAL_JNI_PARAMS_COMMA jlong paintHandle, jboolean dither) { diff --git a/libs/hwui/jni/PaintFilter.cpp b/libs/hwui/jni/PaintFilter.cpp index ec115b4e141c1..c30e29bf247f8 100644 --- a/libs/hwui/jni/PaintFilter.cpp +++ b/libs/hwui/jni/PaintFilter.cpp @@ -29,10 +29,6 @@ public: fClearFlags = static_cast(clearFlags); fSetFlags = static_cast(setFlags); } - void filter(SkPaint* paint) override { - uint32_t flags = Paint::GetSkPaintJavaFlags(*paint); - Paint::SetSkPaintJavaFlags(paint, (flags & ~fClearFlags) | fSetFlags); - } void filterFullPaint(Paint* paint) override { paint->setJavaFlags((paint->getJavaFlags() & ~fClearFlags) | fSetFlags); } diff --git a/libs/hwui/jni/android_graphics_Canvas.cpp b/libs/hwui/jni/android_graphics_Canvas.cpp index a611f7ce2d14c..dada5ae960e23 100644 --- a/libs/hwui/jni/android_graphics_Canvas.cpp +++ b/libs/hwui/jni/android_graphics_Canvas.cpp @@ -233,7 +233,7 @@ static void drawColorLong(JNIEnv* env, jobject, jlong canvasHandle, jlong colorS jlong colorLong, jint modeHandle) { SkColor4f color = GraphicsJNI::convertColorLong(colorLong); sk_sp cs = GraphicsJNI::getNativeColorSpace(colorSpaceHandle); - SkPaint p; + Paint p; p.setColor4f(color, cs.get()); SkBlendMode mode = static_cast(modeHandle); @@ -421,7 +421,7 @@ static void drawNinePatch(JNIEnv* env, jobject, jlong canvasHandle, jlong bitmap if (paint) { filteredPaint = *paint; } - filteredPaint.setFilterQuality(kLow_SkFilterQuality); + filteredPaint.setFilterBitmap(true); canvas->drawNinePatch(bitmap, *chunk, 0, 0, (right-left)/scale, (bottom-top)/scale, &filteredPaint); @@ -443,7 +443,7 @@ static void drawBitmap(JNIEnv* env, jobject, jlong canvasHandle, jlong bitmapHan if (paint) { filteredPaint = *paint; } - filteredPaint.setFilterQuality(kLow_SkFilterQuality); + filteredPaint.setFilterBitmap(true); canvas->drawBitmap(bitmap, left, top, &filteredPaint); } else { canvas->drawBitmap(bitmap, left, top, paint); @@ -458,7 +458,7 @@ static void drawBitmap(JNIEnv* env, jobject, jlong canvasHandle, jlong bitmapHan if (paint) { filteredPaint = *paint; } - filteredPaint.setFilterQuality(kLow_SkFilterQuality); + filteredPaint.setFilterBitmap(true); canvas->drawBitmap(bitmap, 0, 0, &filteredPaint); canvas->restore(); @@ -486,7 +486,7 @@ static void drawBitmapRect(JNIEnv* env, jobject, jlong canvasHandle, jlong bitma if (paint) { filteredPaint = *paint; } - filteredPaint.setFilterQuality(kLow_SkFilterQuality); + filteredPaint.setFilterBitmap(true); canvas->drawBitmap(bitmap, srcLeft, srcTop, srcRight, srcBottom, dstLeft, dstTop, dstRight, dstBottom, &filteredPaint); } else { diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp index 76c4a03d3a914..34c23e7feff3c 100644 --- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp +++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp @@ -192,23 +192,13 @@ void SkiaRecordingCanvas::FilterForImage(SkPaint& paint) { } } -static SkFilterMode Paint_to_filter(const SkPaint& paint) { - return paint.getFilterQuality() != kNone_SkFilterQuality ? SkFilterMode::kLinear - : SkFilterMode::kNearest; -} - -static SkSamplingOptions Paint_to_sampling(const SkPaint& paint) { - // Android only has 1-bit for "filter", so we don't try to cons-up mipmaps or cubics - return SkSamplingOptions(Paint_to_filter(paint), SkMipmapMode::kNone); -} - void SkiaRecordingCanvas::drawBitmap(Bitmap& bitmap, float left, float top, const Paint* paint) { sk_sp image = bitmap.makeImage(); applyLooper( paint, - [&](const SkPaint& p) { - mRecorder.drawImage(image, left, top, Paint_to_sampling(p), &p, bitmap.palette()); + [&](const Paint& p) { + mRecorder.drawImage(image, left, top, p.sampling(), &p, bitmap.palette()); }, FilterForImage); @@ -228,8 +218,8 @@ void SkiaRecordingCanvas::drawBitmap(Bitmap& bitmap, const SkMatrix& matrix, con applyLooper( paint, - [&](const SkPaint& p) { - mRecorder.drawImage(image, 0, 0, Paint_to_sampling(p), &p, bitmap.palette()); + [&](const Paint& p) { + mRecorder.drawImage(image, 0, 0, p.sampling(), &p, bitmap.palette()); }, FilterForImage); @@ -248,8 +238,8 @@ void SkiaRecordingCanvas::drawBitmap(Bitmap& bitmap, float srcLeft, float srcTop applyLooper( paint, - [&](const SkPaint& p) { - mRecorder.drawImageRect(image, srcRect, dstRect, Paint_to_sampling(p), &p, + [&](const Paint& p) { + mRecorder.drawImageRect(image, srcRect, dstRect, p.sampling(), &p, SkCanvas::kFast_SrcRectConstraint, bitmap.palette()); }, FilterForImage); diff --git a/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp b/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp index 10ba07905c45f..31a8ae1d38cd9 100644 --- a/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp +++ b/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp @@ -49,7 +49,7 @@ public: paint.setAntiAlias(true); paint.setColor(Color::Green_700); canvas.drawCircle(200, 200, 200, paint); - SkPaint alphaPaint; + Paint alphaPaint; alphaPaint.setAlpha(128); canvas.restoreUnclippedLayer(unclippedSaveLayer, alphaPaint); canvas.restore(); diff --git a/libs/hwui/utils/PaintUtils.h b/libs/hwui/utils/PaintUtils.h index a8f2d9a28d671..dc0e1f35163c1 100644 --- a/libs/hwui/utils/PaintUtils.h +++ b/libs/hwui/utils/PaintUtils.h @@ -32,13 +32,6 @@ namespace uirenderer { */ class PaintUtils { public: - static inline GLenum getFilter(const SkPaint* paint) { - if (!paint || paint->getFilterQuality() != kNone_SkFilterQuality) { - return GL_LINEAR; - } - return GL_NEAREST; - } - static bool isOpaquePaint(const SkPaint* paint) { if (!paint) return true; // default (paintless) behavior is SrcOver, black