diff options
author | 2021-07-12 19:16:36 +0000 | |
---|---|---|
committer | 2021-07-12 19:16:36 +0000 | |
commit | 00df499744542e93c466697e8e3574333ef5343c (patch) | |
tree | b588b13cc398671a656d2d724ca48da8f55873f4 | |
parent | fcc347db5798ac10784795903a431c5e967a80c8 (diff) | |
parent | a6cb58a924c24ba5f0ca928e850129a945792089 (diff) |
Merge "Store filterbitmap on Paint"
-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 7b962cc22d3f..9c51e628e04a 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 f0fb06893836..94bcb1110e05 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 |