diff options
author | 2021-07-10 13:31:34 -0400 | |
---|---|---|
committer | 2021-07-12 09:29:59 -0400 | |
commit | a6cb58a924c24ba5f0ca928e850129a945792089 (patch) | |
tree | 3ae1724fee85f9568bd9c77be620fb751f4b9534 | |
parent | ba0a0ac99d43a392039135c72c9985d5c86af88a (diff) |
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
-rw-r--r-- | libs/hwui/RecordingCanvas.cpp | 9 | ||||
-rw-r--r-- | libs/hwui/SkiaCanvas.cpp | 39 | ||||
-rw-r--r-- | libs/hwui/SkiaCanvas.h | 22 | ||||
-rw-r--r-- | libs/hwui/VectorDrawable.cpp | 8 | ||||
-rw-r--r-- | libs/hwui/VectorDrawable.h | 2 | ||||
-rw-r--r-- | libs/hwui/hwui/AnimatedImageDrawable.cpp | 1 | ||||
-rw-r--r-- | libs/hwui/hwui/BlurDrawLooper.cpp | 2 | ||||
-rw-r--r-- | libs/hwui/hwui/BlurDrawLooper.h | 10 | ||||
-rw-r--r-- | libs/hwui/hwui/Canvas.h | 4 | ||||
-rw-r--r-- | libs/hwui/hwui/Paint.h | 17 | ||||
-rw-r--r-- | libs/hwui/hwui/PaintFilter.h | 5 | ||||
-rw-r--r-- | libs/hwui/hwui/PaintImpl.cpp | 32 | ||||
-rw-r--r-- | libs/hwui/jni/Paint.cpp | 3 | ||||
-rw-r--r-- | libs/hwui/jni/PaintFilter.cpp | 4 | ||||
-rw-r--r-- | libs/hwui/jni/android_graphics_Canvas.cpp | 10 | ||||
-rw-r--r-- | libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp | 22 | ||||
-rw-r--r-- | libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp | 2 | ||||
-rw-r--r-- | 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 442ae0fb2707..c945f274bbf4 100644 --- a/libs/hwui/RecordingCanvas.cpp +++ b/libs/hwui/RecordingCanvas.cpp @@ -15,6 +15,7 @@ */ #include "RecordingCanvas.h" +#include <hwui/Paint.h> #include <GrRecordingContext.h> @@ -495,7 +496,7 @@ struct DrawVectorDrawable final : Op { sp<VectorDrawableRoot> 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<const T*>(opRaw); - transformPaint(transform, const_cast<SkPaint*>(&(op->paint)), op->palette); + const SkPaint* paint = &op->paint; + transformPaint(transform, const_cast<SkPaint*>(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<const T*>(opRaw); - transformPaint(transform, const_cast<SkPaint*>(&(op->paint))); + const SkPaint* paint = &op->paint; + transformPaint(transform, const_cast<SkPaint*>(paint)); }; } else { diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp index d032e2b00649..d6b6e162757c 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 438a40cb4c81..fd6bbdc55cf1 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 <SkCanvas.h> #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 <typename Proc> 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 55f434f49bbd..f116641b560f 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 ac7d41e0d600..30bb04ae8361 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 876f5c895c60..d08bc5c583c2 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 27a038d4598e..270d24af99fd 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 7e6786f7dfbc..09a4e0f849b0 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 <SkPaint.h> +#include <hwui/Paint.h> #include <SkRefCnt.h> class SkColorSpace; @@ -30,10 +30,10 @@ public: ~BlurDrawLooper() override; - // proc(SkPoint offset, const SkPaint& modifiedPaint) + // proc(SkPoint offset, const Paint& modifiedPaint) template <typename DrawProc> - 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 9023613478fc..70a558b3d69d 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 d9c9eeed03e9..4a8f3e10fc26 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 <cutils/compiler.h> #include <SkFont.h> #include <SkPaint.h> +#include <SkSamplingOptions.h> #include <string> #include <minikin/FontFamily.h> @@ -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<BlurDrawLooper> looper) { mLooper = std::move(looper); } + void setLooper(sk_sp<BlurDrawLooper> 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 0e7b61977000..4996aa445316 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 <SkRefCnt.h> 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 fa2674fc2f5e..aac928f85924 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<BlurDrawLooper> 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 bcec0fa8a1cc..22a1e1fd94b9 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<Paint*>(paintHandle)->setFilterQuality( - filterBitmap ? kLow_SkFilterQuality : kNone_SkFilterQuality); + reinterpret_cast<Paint*>(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 ec115b4e141c..c30e29bf247f 100644 --- a/libs/hwui/jni/PaintFilter.cpp +++ b/libs/hwui/jni/PaintFilter.cpp @@ -29,10 +29,6 @@ public: fClearFlags = static_cast<uint16_t>(clearFlags); fSetFlags = static_cast<uint16_t>(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 a611f7ce2d14..dada5ae960e2 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<SkColorSpace> cs = GraphicsJNI::getNativeColorSpace(colorSpaceHandle); - SkPaint p; + Paint p; p.setColor4f(color, cs.get()); SkBlendMode mode = static_cast<SkBlendMode>(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 76c4a03d3a91..34c23e7feff3 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<SkImage> 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 10ba07905c45..31a8ae1d38cd 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 a8f2d9a28d67..dc0e1f35163c 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 |