diff options
author | Mike Reed <reed@google.com> | 2016-10-07 15:59:20 -0400 |
---|---|---|
committer | Mike Reed <reed@google.com> | 2016-10-13 17:14:52 -0400 |
commit | 260ab726486317496bc12a57d599ea96dcde3284 (patch) | |
tree | be150530fd0597507dddf3a670f2480563dd1e00 | |
parent | ccbc5c183067ae988f57725cfafda855bafa47ec (diff) |
use SkBlendMode instead of SkXfermode
use sk_sp versions of paint setters/getters
Change-Id: I86591a0a8ec92e6039776cbf00424ea24f585b28
59 files changed, 277 insertions, 290 deletions
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index 5c24585cb182..ad39a5758afd 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -497,7 +497,7 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding // kSrc_Mode instructs us to overwrite the uninitialized pixels in // outputBitmap. Otherwise we would blend by default, which is not // what we want. - paint.setXfermodeMode(SkXfermode::kSrc_Mode); + paint.setBlendMode(SkBlendMode::kSrc); paint.setFilterQuality(kLow_SkFilterQuality); // bilinear filtering SkCanvas canvas(outputBitmap); diff --git a/core/jni/android/graphics/ColorFilter.cpp b/core/jni/android/graphics/ColorFilter.cpp index 1a86e5fc6a15..79439e2350ff 100644 --- a/core/jni/android/graphics/ColorFilter.cpp +++ b/core/jni/android/graphics/ColorFilter.cpp @@ -21,7 +21,6 @@ #include "SkColorFilter.h" #include "SkColorMatrixFilter.h" -#include "SkXfermode.h" #include <Caches.h> @@ -33,16 +32,16 @@ class SkColorFilterGlue { public: static void finalizer(JNIEnv* env, jobject clazz, jlong skFilterHandle) { SkColorFilter* filter = reinterpret_cast<SkColorFilter *>(skFilterHandle); - if (filter) SkSafeUnref(filter); + SkSafeUnref(filter); } static jlong CreatePorterDuffFilter(JNIEnv* env, jobject, jint srcColor, jint modeHandle) { - SkXfermode::Mode mode = static_cast<SkXfermode::Mode>(modeHandle); - return reinterpret_cast<jlong>(SkColorFilter::CreateModeFilter(srcColor, mode)); + SkBlendMode mode = static_cast<SkBlendMode>(modeHandle); + return reinterpret_cast<jlong>(SkColorFilter::MakeModeFilter(srcColor, mode).release()); } static jlong CreateLightingFilter(JNIEnv* env, jobject, jint mul, jint add) { - return reinterpret_cast<jlong>(SkColorMatrixFilter::CreateLightingFilter(mul, add)); + return reinterpret_cast<jlong>(SkColorMatrixFilter::MakeLightingFilter(mul, add).release()); } static jlong CreateColorMatrixFilter(JNIEnv* env, jobject, jfloatArray jarray) { @@ -50,7 +49,7 @@ public: const float* src = autoArray.ptr(); #ifdef SK_SCALAR_IS_FLOAT - return reinterpret_cast<jlong>(SkColorMatrixFilter::Create(src)); + return reinterpret_cast<jlong>(SkColorFilter::MakeMatrixFilterRowMajor255(src).release()); #else SkASSERT(false); #endif diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h index e5af52512abc..cf617bd2fe42 100644 --- a/core/jni/android/graphics/GraphicsJNI.h +++ b/core/jni/android/graphics/GraphicsJNI.h @@ -53,7 +53,7 @@ public: // Given the 'native' long held by the Rasterizer.java object, return a // ref to its SkRasterizer* (or NULL). - static SkRasterizer* refNativeRasterizer(jlong rasterizerHandle); + static sk_sp<SkRasterizer> refNativeRasterizer(jlong rasterizerHandle); /* * LegacyBitmapConfig is the old enum in Skia that matched the enum int values diff --git a/core/jni/android/graphics/MaskFilter.cpp b/core/jni/android/graphics/MaskFilter.cpp index 2b4a1abbd673..3e3de5aade7f 100644 --- a/core/jni/android/graphics/MaskFilter.cpp +++ b/core/jni/android/graphics/MaskFilter.cpp @@ -23,7 +23,7 @@ public: static jlong createBlur(JNIEnv* env, jobject, jfloat radius, jint blurStyle) { SkScalar sigma = SkBlurMask::ConvertRadiusToSigma(radius); - SkMaskFilter* filter = SkBlurMaskFilter::Create((SkBlurStyle)blurStyle, sigma); + SkMaskFilter* filter = SkBlurMaskFilter::Make((SkBlurStyle)blurStyle, sigma).release(); ThrowIAE_IfNull(env, filter); return reinterpret_cast<jlong>(filter); } @@ -38,8 +38,8 @@ public: } SkScalar sigma = SkBlurMask::ConvertRadiusToSigma(radius); - SkMaskFilter* filter = SkBlurMaskFilter::CreateEmboss(sigma, - direction, ambient, specular); + SkMaskFilter* filter = SkBlurMaskFilter::MakeEmboss(sigma, + direction, ambient, specular).release(); ThrowIAE_IfNull(env, filter); return reinterpret_cast<jlong>(filter); } diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp index 4b1530a17e8f..38452bbf5159 100644 --- a/core/jni/android/graphics/Paint.cpp +++ b/core/jni/android/graphics/Paint.cpp @@ -29,6 +29,7 @@ #include "SkColorFilter.h" #include "SkMaskFilter.h" #include "SkPath.h" +#include "SkPathEffect.h" #include "SkRasterizer.h" #include "SkShader.h" #include "SkXfermode.h" @@ -791,51 +792,55 @@ namespace PaintGlue { static jlong setShader(jlong objHandle, jlong shaderHandle) { Paint* obj = reinterpret_cast<Paint*>(objHandle); SkShader* shader = reinterpret_cast<SkShader*>(shaderHandle); - return reinterpret_cast<jlong>(obj->setShader(shader)); + obj->setShader(sk_ref_sp(shader)); + return reinterpret_cast<jlong>(obj->getShader()); } static jlong setColorFilter(jlong objHandle, jlong filterHandle) { Paint* obj = reinterpret_cast<Paint *>(objHandle); SkColorFilter* filter = reinterpret_cast<SkColorFilter *>(filterHandle); - return reinterpret_cast<jlong>(obj->setColorFilter(filter)); + obj->setColorFilter(sk_ref_sp(filter)); + return reinterpret_cast<jlong>(obj->getColorFilter()); } static void setXfermode(jlong paintHandle, jint xfermodeHandle) { // validate that the Java enum values match our expectations - static_assert(0 == SkXfermode::kClear_Mode, "xfermode_mismatch"); - static_assert(1 == SkXfermode::kSrc_Mode, "xfermode_mismatch"); - static_assert(2 == SkXfermode::kDst_Mode, "xfermode_mismatch"); - static_assert(3 == SkXfermode::kSrcOver_Mode, "xfermode_mismatch"); - static_assert(4 == SkXfermode::kDstOver_Mode, "xfermode_mismatch"); - static_assert(5 == SkXfermode::kSrcIn_Mode, "xfermode_mismatch"); - static_assert(6 == SkXfermode::kDstIn_Mode, "xfermode_mismatch"); - static_assert(7 == SkXfermode::kSrcOut_Mode, "xfermode_mismatch"); - static_assert(8 == SkXfermode::kDstOut_Mode, "xfermode_mismatch"); - static_assert(9 == SkXfermode::kSrcATop_Mode, "xfermode_mismatch"); - static_assert(10 == SkXfermode::kDstATop_Mode, "xfermode_mismatch"); - static_assert(11 == SkXfermode::kXor_Mode, "xfermode_mismatch"); - static_assert(16 == SkXfermode::kDarken_Mode, "xfermode_mismatch"); - static_assert(17 == SkXfermode::kLighten_Mode, "xfermode_mismatch"); - static_assert(13 == SkXfermode::kModulate_Mode, "xfermode_mismatch"); - static_assert(14 == SkXfermode::kScreen_Mode, "xfermode_mismatch"); - static_assert(12 == SkXfermode::kPlus_Mode, "xfermode_mismatch"); - static_assert(15 == SkXfermode::kOverlay_Mode, "xfermode_mismatch"); - - SkXfermode::Mode mode = static_cast<SkXfermode::Mode>(xfermodeHandle); + static_assert(0 == static_cast<int>(SkBlendMode::kClear), "xfermode_mismatch"); + static_assert(1 == static_cast<int>(SkBlendMode::kSrc), "xfermode_mismatch"); + static_assert(2 == static_cast<int>(SkBlendMode::kDst), "xfermode_mismatch"); + static_assert(3 == static_cast<int>(SkBlendMode::kSrcOver), "xfermode_mismatch"); + static_assert(4 == static_cast<int>(SkBlendMode::kDstOver), "xfermode_mismatch"); + static_assert(5 == static_cast<int>(SkBlendMode::kSrcIn), "xfermode_mismatch"); + static_assert(6 == static_cast<int>(SkBlendMode::kDstIn), "xfermode_mismatch"); + static_assert(7 == static_cast<int>(SkBlendMode::kSrcOut), "xfermode_mismatch"); + static_assert(8 == static_cast<int>(SkBlendMode::kDstOut), "xfermode_mismatch"); + static_assert(9 == static_cast<int>(SkBlendMode::kSrcATop), "xfermode_mismatch"); + static_assert(10 == static_cast<int>(SkBlendMode::kDstATop), "xfermode_mismatch"); + static_assert(11 == static_cast<int>(SkBlendMode::kXor), "xfermode_mismatch"); + static_assert(16 == static_cast<int>(SkBlendMode::kDarken), "xfermode_mismatch"); + static_assert(17 == static_cast<int>(SkBlendMode::kLighten), "xfermode_mismatch"); + static_assert(13 == static_cast<int>(SkBlendMode::kModulate), "xfermode_mismatch"); + static_assert(14 == static_cast<int>(SkBlendMode::kScreen), "xfermode_mismatch"); + static_assert(12 == static_cast<int>(SkBlendMode::kPlus), "xfermode_mismatch"); + static_assert(15 == static_cast<int>(SkBlendMode::kOverlay), "xfermode_mismatch"); + + SkBlendMode mode = static_cast<SkBlendMode>(xfermodeHandle); Paint* paint = reinterpret_cast<Paint*>(paintHandle); - paint->setXfermodeMode(mode); + paint->setBlendMode(mode); } static jlong setPathEffect(jlong objHandle, jlong effectHandle) { Paint* obj = reinterpret_cast<Paint*>(objHandle); SkPathEffect* effect = reinterpret_cast<SkPathEffect*>(effectHandle); - return reinterpret_cast<jlong>(obj->setPathEffect(effect)); + obj->setPathEffect(sk_ref_sp(effect)); + return reinterpret_cast<jlong>(obj->getPathEffect()); } static jlong setMaskFilter(jlong objHandle, jlong maskfilterHandle) { Paint* obj = reinterpret_cast<Paint*>(objHandle); SkMaskFilter* maskfilter = reinterpret_cast<SkMaskFilter*>(maskfilterHandle); - return reinterpret_cast<jlong>(obj->setMaskFilter(maskfilter)); + obj->setMaskFilter(sk_ref_sp(maskfilter)); + return reinterpret_cast<jlong>(obj->getMaskFilter()); } static jlong setTypeface(jlong objHandle, jlong typefaceHandle) { @@ -845,8 +850,8 @@ namespace PaintGlue { static jlong setRasterizer(jlong objHandle, jlong rasterizerHandle) { Paint* obj = reinterpret_cast<Paint*>(objHandle); - SkAutoTUnref<SkRasterizer> rasterizer(GraphicsJNI::refNativeRasterizer(rasterizerHandle)); - return reinterpret_cast<jlong>(obj->setRasterizer(rasterizer)); + obj->setRasterizer(GraphicsJNI::refNativeRasterizer(rasterizerHandle)); + return reinterpret_cast<jlong>(obj->getRasterizer()); } static jint getTextAlign(jlong objHandle) { @@ -940,7 +945,7 @@ namespace PaintGlue { } else { SkScalar sigma = android::uirenderer::Blur::convertRadiusToSigma(radius); - paint->setLooper(SkBlurDrawLooper::Create((SkColor)color, sigma, dx, dy))->unref(); + paint->setLooper(SkBlurDrawLooper::Make((SkColor)color, sigma, dx, dy)); } } diff --git a/core/jni/android/graphics/PathEffect.cpp b/core/jni/android/graphics/PathEffect.cpp index b289b21a3d8b..e801da360018 100644 --- a/core/jni/android/graphics/PathEffect.cpp +++ b/core/jni/android/graphics/PathEffect.cpp @@ -20,7 +20,8 @@ public: jlong outerHandle, jlong innerHandle) { SkPathEffect* outer = reinterpret_cast<SkPathEffect*>(outerHandle); SkPathEffect* inner = reinterpret_cast<SkPathEffect*>(innerHandle); - SkPathEffect* effect = SkComposePathEffect::Create(outer, inner); + SkPathEffect* effect = SkComposePathEffect::Make(sk_ref_sp(outer), + sk_ref_sp(inner)).release(); return reinterpret_cast<jlong>(effect); } @@ -28,7 +29,8 @@ public: jlong firstHandle, jlong secondHandle) { SkPathEffect* first = reinterpret_cast<SkPathEffect*>(firstHandle); SkPathEffect* second = reinterpret_cast<SkPathEffect*>(secondHandle); - SkPathEffect* effect = SkSumPathEffect::Create(first, second); + SkPathEffect* effect = SkSumPathEffect::Make(sk_ref_sp(first), + sk_ref_sp(second)).release(); return reinterpret_cast<jlong>(effect); } @@ -41,7 +43,7 @@ public: #else #error Need to convert float array to SkScalar array before calling the following function. #endif - SkPathEffect* effect = SkDashPathEffect::Create(intervals, count, phase); + SkPathEffect* effect = SkDashPathEffect::Make(intervals, count, phase).release(); return reinterpret_cast<jlong>(effect); } @@ -49,19 +51,19 @@ public: jlong shapeHandle, jfloat advance, jfloat phase, jint style) { const SkPath* shape = reinterpret_cast<SkPath*>(shapeHandle); SkASSERT(shape != NULL); - SkPathEffect* effect = SkPath1DPathEffect::Create(*shape, advance, phase, - (SkPath1DPathEffect::Style)style); + SkPathEffect* effect = SkPath1DPathEffect::Make(*shape, advance, phase, + (SkPath1DPathEffect::Style)style).release(); return reinterpret_cast<jlong>(effect); } static jlong Corner_constructor(JNIEnv* env, jobject, jfloat radius){ - SkPathEffect* effect = SkCornerPathEffect::Create(radius); + SkPathEffect* effect = SkCornerPathEffect::Make(radius).release(); return reinterpret_cast<jlong>(effect); } static jlong Discrete_constructor(JNIEnv* env, jobject, jfloat length, jfloat deviation) { - SkPathEffect* effect = SkDiscretePathEffect::Create(length, deviation); + SkPathEffect* effect = SkDiscretePathEffect::Make(length, deviation).release(); return reinterpret_cast<jlong>(effect); } diff --git a/core/jni/android/graphics/Picture.cpp b/core/jni/android/graphics/Picture.cpp index 07e14a211e64..d1ddfab6d6c2 100644 --- a/core/jni/android/graphics/Picture.cpp +++ b/core/jni/android/graphics/Picture.cpp @@ -27,9 +27,9 @@ Picture::Picture(const Picture* src) { mWidth = src->width(); mHeight = src->height(); if (NULL != src->mPicture.get()) { - mPicture.reset(SkRef(src->mPicture.get())); + mPicture = src->mPicture; } else if (NULL != src->mRecorder.get()) { - mPicture.reset(src->makePartialCopy()); + mPicture = src->makePartialCopy(); } validate(); } else { @@ -49,7 +49,7 @@ Canvas* Picture::beginRecording(int width, int height) { void Picture::endRecording() { if (NULL != mRecorder.get()) { - mPicture.reset(mRecorder->endRecording()); + mPicture = mRecorder->finishRecordingAsPicture(); validate(); mRecorder.reset(NULL); } @@ -68,9 +68,9 @@ int Picture::height() const { Picture* Picture::CreateFromStream(SkStream* stream) { Picture* newPict = new Picture; - SkPicture* skPicture = SkPicture::CreateFromStream(stream); + sk_sp<SkPicture> skPicture = SkPicture::MakeFromStream(stream); if (NULL != skPicture) { - newPict->mPicture.reset(skPicture); + newPict->mPicture = skPicture; const SkIRect cullRect = skPicture->cullRect().roundOut(); newPict->mWidth = cullRect.width(); @@ -82,16 +82,15 @@ Picture* Picture::CreateFromStream(SkStream* stream) { void Picture::serialize(SkWStream* stream) const { if (NULL != mRecorder.get()) { - std::unique_ptr<SkPicture> tempPict(this->makePartialCopy()); - tempPict->serialize(stream); + this->makePartialCopy()->serialize(stream); } else if (NULL != mPicture.get()) { validate(); mPicture->serialize(stream); } else { + // serialize "empty" picture SkPictureRecorder recorder; recorder.beginRecording(0, 0); - std::unique_ptr<SkPicture> empty(recorder.endRecording()); - empty->serialize(stream); + recorder.finishRecordingAsPicture()->serialize(stream); } } @@ -102,18 +101,18 @@ void Picture::draw(Canvas* canvas) { } validate(); if (NULL != mPicture.get()) { - mPicture.get()->playback(canvas->asSkCanvas()); + mPicture->playback(canvas->asSkCanvas()); } } -SkPicture* Picture::makePartialCopy() const { +sk_sp<SkPicture> Picture::makePartialCopy() const { SkASSERT(NULL != mRecorder.get()); SkPictureRecorder reRecorder; SkCanvas* canvas = reRecorder.beginRecording(mWidth, mHeight, NULL, 0); mRecorder->partialReplay(canvas); - return reRecorder.endRecording(); + return reRecorder.finishRecordingAsPicture(); } void Picture::validate() const { diff --git a/core/jni/android/graphics/Picture.h b/core/jni/android/graphics/Picture.h index 26a4f6a3e6a6..b73b375ef899 100644 --- a/core/jni/android/graphics/Picture.h +++ b/core/jni/android/graphics/Picture.h @@ -55,12 +55,12 @@ public: private: int mWidth; int mHeight; - SkAutoTUnref<const SkPicture> mPicture; + sk_sp<SkPicture> mPicture; std::unique_ptr<SkPictureRecorder> mRecorder; // Make a copy of a picture that is in the midst of being recorded. The // resulting picture will have balanced saves and restores. - SkPicture* makePartialCopy() const; + sk_sp<SkPicture> makePartialCopy() const; void validate() const; }; diff --git a/core/jni/android/graphics/Rasterizer.cpp b/core/jni/android/graphics/Rasterizer.cpp index 3784f0d8a220..f4094985177c 100644 --- a/core/jni/android/graphics/Rasterizer.cpp +++ b/core/jni/android/graphics/Rasterizer.cpp @@ -34,19 +34,19 @@ public: virtual ~NativeRasterizer() {} // Can return NULL, or a ref to the skia rasterizer. - virtual SkRasterizer* refRasterizer() { return NULL; } + virtual sk_sp<SkRasterizer> refRasterizer() { return NULL; } }; class NativeLayerRasterizer : public NativeRasterizer { public: SkLayerRasterizer::Builder fBuilder; - virtual SkRasterizer* refRasterizer() { - return fBuilder.snapshotRasterizer(); + virtual sk_sp<SkRasterizer> refRasterizer() { + return fBuilder.snapshot(); } }; -SkRasterizer* GraphicsJNI::refNativeRasterizer(jlong rasterizerHandle) { +sk_sp<SkRasterizer> GraphicsJNI::refNativeRasterizer(jlong rasterizerHandle) { NativeRasterizer* nr = reinterpret_cast<NativeRasterizer*>(rasterizerHandle); return nr ? nr->refRasterizer() : NULL; } diff --git a/core/jni/android/graphics/Shader.cpp b/core/jni/android/graphics/Shader.cpp index 03462a6d402e..a2416df8ee0b 100644 --- a/core/jni/android/graphics/Shader.cpp +++ b/core/jni/android/graphics/Shader.cpp @@ -79,9 +79,9 @@ static jlong Shader_setLocalMatrix(JNIEnv* env, jobject o, jlong shaderHandle, j if (proxyMatrix == *matrix) { return reinterpret_cast<jlong>(currentShader.detach()); } - return reinterpret_cast<jlong>(baseShader->newWithLocalMatrix(*matrix)); + return reinterpret_cast<jlong>(baseShader->makeWithLocalMatrix(*matrix).release()); } - return reinterpret_cast<jlong>(currentShader->newWithLocalMatrix(*matrix)); + return reinterpret_cast<jlong>(currentShader->makeWithLocalMatrix(*matrix).release()); } /////////////////////////////////////////////////////////////////////////////////////////////// @@ -126,9 +126,9 @@ static jlong LinearGradient_create1(JNIEnv* env, jobject o, #error Need to convert float array to SkScalar array before calling the following function. #endif - SkShader* shader = SkGradientShader::CreateLinear(pts, + SkShader* shader = SkGradientShader::MakeLinear(pts, reinterpret_cast<const SkColor*>(colorValues), pos, count, - static_cast<SkShader::TileMode>(tileMode)); + static_cast<SkShader::TileMode>(tileMode)).release(); env->ReleaseIntArrayElements(colorArray, const_cast<jint*>(colorValues), JNI_ABORT); ThrowIAE_IfNull(env, shader); @@ -147,7 +147,7 @@ static jlong LinearGradient_create2(JNIEnv* env, jobject o, colors[0] = color0; colors[1] = color1; - SkShader* s = SkGradientShader::CreateLinear(pts, colors, NULL, 2, (SkShader::TileMode)tileMode); + SkShader* s = SkGradientShader::MakeLinear(pts, colors, NULL, 2, (SkShader::TileMode)tileMode).release(); ThrowIAE_IfNull(env, s); return reinterpret_cast<jlong>(s); @@ -170,9 +170,9 @@ static jlong RadialGradient_create1(JNIEnv* env, jobject, jfloat x, jfloat y, jf #error Need to convert float array to SkScalar array before calling the following function. #endif - SkShader* shader = SkGradientShader::CreateRadial(center, radius, + SkShader* shader = SkGradientShader::MakeRadial(center, radius, reinterpret_cast<const SkColor*>(colorValues), pos, count, - static_cast<SkShader::TileMode>(tileMode)); + static_cast<SkShader::TileMode>(tileMode)).release(); env->ReleaseIntArrayElements(colorArray, const_cast<jint*>(colorValues), JNI_ABORT); @@ -189,8 +189,8 @@ static jlong RadialGradient_create2(JNIEnv* env, jobject, jfloat x, jfloat y, jf colors[0] = color0; colors[1] = color1; - SkShader* s = SkGradientShader::CreateRadial(center, radius, colors, NULL, 2, - (SkShader::TileMode)tileMode); + SkShader* s = SkGradientShader::MakeRadial(center, radius, colors, NULL, 2, + (SkShader::TileMode)tileMode).release(); ThrowIAE_IfNull(env, s); return reinterpret_cast<jlong>(s); } @@ -209,8 +209,8 @@ static jlong SweepGradient_create1(JNIEnv* env, jobject, jfloat x, jfloat y, #error Need to convert float array to SkScalar array before calling the following function. #endif - SkShader* shader = SkGradientShader::CreateSweep(x, y, - reinterpret_cast<const SkColor*>(colors), pos, count); + SkShader* shader = SkGradientShader::MakeSweep(x, y, + reinterpret_cast<const SkColor*>(colors), pos, count).release(); env->ReleaseIntArrayElements(jcolors, const_cast<jint*>(colors), JNI_ABORT); ThrowIAE_IfNull(env, shader); @@ -222,7 +222,7 @@ static jlong SweepGradient_create2(JNIEnv* env, jobject, jfloat x, jfloat y, SkColor colors[2]; colors[0] = color0; colors[1] = color1; - SkShader* s = SkGradientShader::CreateSweep(x, y, colors, NULL, 2); + SkShader* s = SkGradientShader::MakeSweep(x, y, colors, NULL, 2).release(); ThrowIAE_IfNull(env, s); return reinterpret_cast<jlong>(s); } @@ -234,8 +234,10 @@ static jlong ComposeShader_create(JNIEnv* env, jobject o, { SkShader* shaderA = reinterpret_cast<SkShader *>(shaderAHandle); SkShader* shaderB = reinterpret_cast<SkShader *>(shaderBHandle); - SkXfermode::Mode mode = static_cast<SkXfermode::Mode>(xfermodeHandle); - SkShader* shader = SkShader::CreateComposeShader(shaderA, shaderB, mode); + SkBlendMode mode = static_cast<SkBlendMode>(xfermodeHandle); + SkShader* shader = SkShader::MakeComposeShader(sk_ref_sp(shaderA), + sk_ref_sp(shaderB), + (SkXfermode::Mode)mode).release(); return reinterpret_cast<jlong>(shader); } diff --git a/core/jni/android/graphics/pdf/PdfDocument.cpp b/core/jni/android/graphics/pdf/PdfDocument.cpp index acf9996de55f..d233f7b6805e 100644 --- a/core/jni/android/graphics/pdf/PdfDocument.cpp +++ b/core/jni/android/graphics/pdf/PdfDocument.cpp @@ -81,7 +81,7 @@ public: assert(mCurrentPage != NULL); assert(mCurrentPage->mPictureRecorder != NULL); assert(mCurrentPage->mPicture == NULL); - mCurrentPage->mPicture = mCurrentPage->mPictureRecorder->endRecording(); + mCurrentPage->mPicture = mCurrentPage->mPictureRecorder->finishRecordingAsPicture().release(); delete mCurrentPage->mPictureRecorder; mCurrentPage->mPictureRecorder = NULL; mCurrentPage = NULL; diff --git a/core/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp index 43f7ca5c1237..f6bf67f5a97d 100644 --- a/core/jni/android_graphics_Canvas.cpp +++ b/core/jni/android_graphics_Canvas.cpp @@ -207,7 +207,7 @@ static jboolean clipRegion(JNIEnv* env, jobject, jlong canvasHandle, jlong devic } static void drawColor(JNIEnv* env, jobject, jlong canvasHandle, jint color, jint modeHandle) { - SkXfermode::Mode mode = static_cast<SkXfermode::Mode>(modeHandle); + SkBlendMode mode = static_cast<SkBlendMode>(modeHandle); get_canvas(canvasHandle)->drawColor(color, mode); } diff --git a/libs/hwui/BakedOpDispatcher.cpp b/libs/hwui/BakedOpDispatcher.cpp index 699503991e02..840c79dcc108 100644 --- a/libs/hwui/BakedOpDispatcher.cpp +++ b/libs/hwui/BakedOpDispatcher.cpp @@ -292,7 +292,7 @@ static void renderText(BakedOpRenderer& renderer, const TextOp& op, const BakedO Rect layerBounds(FLT_MAX / 2.0f, FLT_MAX / 2.0f, FLT_MIN / 2.0f, FLT_MIN / 2.0f); int alpha = PaintUtils::getAlphaDirect(op.paint) * state.alpha; - SkXfermode::Mode mode = PaintUtils::getXfermodeDirect(op.paint); + SkBlendMode mode = PaintUtils::getBlendModeDirect(op.paint); TextDrawFunctor functor(&renderer, &state, renderClip, x, y, pureTranslate, alpha, mode, op.paint); @@ -528,7 +528,7 @@ void BakedOpDispatcher::onBitmapRectOp(BakedOpRenderer& renderer, const BitmapRe void BakedOpDispatcher::onColorOp(BakedOpRenderer& renderer, const ColorOp& op, const BakedOpState& state) { SkPaint paint; paint.setColor(op.color); - paint.setXfermodeMode(op.mode); + paint.setBlendMode(op.mode); Glop glop; GlopBuilder(renderer.renderState(), renderer.caches(), &glop) @@ -744,7 +744,7 @@ void BakedOpDispatcher::onTextOnPathOp(BakedOpRenderer& renderer, const TextOnPa Rect layerBounds(FLT_MAX / 2.0f, FLT_MAX / 2.0f, FLT_MIN / 2.0f, FLT_MIN / 2.0f); int alpha = PaintUtils::getAlphaDirect(op.paint) * state.alpha; - SkXfermode::Mode mode = PaintUtils::getXfermodeDirect(op.paint); + SkBlendMode mode = PaintUtils::getBlendModeDirect(op.paint); TextDrawFunctor functor(&renderer, &state, renderTargetClip, 0.0f, 0.0f, false, alpha, mode, op.paint); @@ -776,11 +776,11 @@ void BakedOpDispatcher::onTextureLayerOp(BakedOpRenderer& renderer, const Textur } void renderRectForLayer(BakedOpRenderer& renderer, const LayerOp& op, const BakedOpState& state, - int color, SkXfermode::Mode mode, SkColorFilter* colorFilter) { + int color, SkBlendMode mode, SkColorFilter* colorFilter) { SkPaint paint; paint.setColor(color); - paint.setXfermodeMode(mode); - paint.setColorFilter(colorFilter); + paint.setBlendMode(mode); + paint.setColorFilter(sk_ref_sp(colorFilter)); RectOp rectOp(op.unmappedBounds, op.localMatrix, op.localClip, &paint); BakedOpDispatcher::onRectOp(renderer, rectOp, state); } @@ -808,11 +808,11 @@ void BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op, if (CC_UNLIKELY(Properties::debugLayersUpdates)) { // render debug layer highlight renderRectForLayer(renderer, op, state, - 0x7f00ff00, SkXfermode::Mode::kSrcOver_Mode, nullptr); + 0x7f00ff00, SkBlendMode::kSrcOver, nullptr); } else if (CC_UNLIKELY(Properties::debugOverdraw)) { // render transparent to increment overdraw for repaint area renderRectForLayer(renderer, op, state, - SK_ColorTRANSPARENT, SkXfermode::Mode::kSrcOver_Mode, nullptr); + SK_ColorTRANSPARENT, SkBlendMode::kSrcOver, nullptr); } } } @@ -829,14 +829,14 @@ void BakedOpDispatcher::onCopyFromLayerOp(BakedOpRenderer& renderer, const CopyF if (op.paint && op.paint->getAlpha() < 255) { SkPaint layerPaint; layerPaint.setAlpha(op.paint->getAlpha()); - layerPaint.setXfermodeMode(SkXfermode::kDstIn_Mode); - layerPaint.setColorFilter(op.paint->getColorFilter()); + layerPaint.setBlendMode(SkBlendMode::kDstIn); + layerPaint.setColorFilter(sk_ref_sp(op.paint->getColorFilter())); RectOp rectOp(state.computedState.clippedBounds, Matrix4::identity(), nullptr, &layerPaint); BakedOpDispatcher::onRectOp(renderer, rectOp, state); } OffscreenBuffer& layer = **(op.layerHandle); - auto mode = PaintUtils::getXfermodeDirect(op.paint); + auto mode = PaintUtils::getBlendModeDirect(op.paint); Glop glop; GlopBuilder(renderer.renderState(), renderer.caches(), &glop) .setRoundRectClipState(state.roundRectClipState) diff --git a/libs/hwui/DeferredLayerUpdater.cpp b/libs/hwui/DeferredLayerUpdater.cpp index c42ff1a93353..a7d5f6026d00 100644 --- a/libs/hwui/DeferredLayerUpdater.cpp +++ b/libs/hwui/DeferredLayerUpdater.cpp @@ -45,7 +45,7 @@ DeferredLayerUpdater::~DeferredLayerUpdater() { void DeferredLayerUpdater::setPaint(const SkPaint* paint) { mAlpha = PaintUtils::getAlphaDirect(paint); - mMode = PaintUtils::getXfermodeDirect(paint); + mMode = PaintUtils::getBlendModeDirect(paint); SkColorFilter* colorFilter = (paint) ? paint->getColorFilter() : nullptr; SkRefCnt_SafeAssign(mColorFilter, colorFilter); } diff --git a/libs/hwui/DeferredLayerUpdater.h b/libs/hwui/DeferredLayerUpdater.h index 742011253b94..733500885e67 100644 --- a/libs/hwui/DeferredLayerUpdater.h +++ b/libs/hwui/DeferredLayerUpdater.h @@ -101,7 +101,7 @@ private: bool mBlend; SkColorFilter* mColorFilter; int mAlpha; - SkXfermode::Mode mMode; + SkBlendMode mMode; sp<GLConsumer> mSurfaceTexture; SkMatrix* mTransform; bool mNeedsGLContextAttach; diff --git a/libs/hwui/FontRenderer.h b/libs/hwui/FontRenderer.h index e836c20bbf9c..dd9c40f89ad0 100644 --- a/libs/hwui/FontRenderer.h +++ b/libs/hwui/FontRenderer.h @@ -58,7 +58,7 @@ public: const BakedOpState* bakedState, const ClipBase* clip, float x, float y, bool pureTranslate, - int alpha, SkXfermode::Mode mode, const SkPaint* paint) + int alpha, SkBlendMode mode, const SkPaint* paint) : renderer(renderer) , bakedState(bakedState) , clip(clip) @@ -79,7 +79,7 @@ public: float y; bool pureTranslate; int alpha; - SkXfermode::Mode mode; + SkBlendMode mode; const SkPaint* paint; }; diff --git a/libs/hwui/FrameBuilder.cpp b/libs/hwui/FrameBuilder.cpp index 17ad0e36fa90..bc36f817f614 100644 --- a/libs/hwui/FrameBuilder.cpp +++ b/libs/hwui/FrameBuilder.cpp @@ -608,7 +608,7 @@ void FrameBuilder::deferBitmapOp(const BitmapOp& op) { // MergingDrawBatch::canMergeWith() if (bakedState->computedState.transform.isSimple() && bakedState->computedState.transform.positiveScale() - && PaintUtils::getXfermodeDirect(op.paint) == SkXfermode::kSrcOver_Mode + && PaintUtils::getBlendModeDirect(op.paint) == SkBlendMode::kSrcOver && op.bitmap->colorType() != kAlpha_8_SkColorType && hasMergeableClip(*bakedState)) { mergeid_t mergeId = reinterpret_cast<mergeid_t>(op.bitmap->getGenerationID()); @@ -683,7 +683,7 @@ void FrameBuilder::deferPatchOp(const PatchOp& op) { if (!bakedState) return; // quick rejected if (bakedState->computedState.transform.isPureTranslate() - && PaintUtils::getXfermodeDirect(op.paint) == SkXfermode::kSrcOver_Mode + && PaintUtils::getBlendModeDirect(op.paint) == SkBlendMode::kSrcOver && hasMergeableClip(*bakedState)) { mergeid_t mergeId = reinterpret_cast<mergeid_t>(op.bitmap->getGenerationID()); @@ -750,7 +750,7 @@ void FrameBuilder::deferTextOp(const TextOp& op) { batchid_t batchId = textBatchId(*(op.paint)); if (bakedState->computedState.transform.isPureTranslate() - && PaintUtils::getXfermodeDirect(op.paint) == SkXfermode::kSrcOver_Mode + && PaintUtils::getBlendModeDirect(op.paint) == SkBlendMode::kSrcOver && hasMergeableClip(*bakedState)) { mergeid_t mergeId = reinterpret_cast<mergeid_t>(op.paint->getColor()); currentLayer().deferMergeableOp(mAllocator, bakedState, batchId, mergeId); diff --git a/libs/hwui/GlopBuilder.cpp b/libs/hwui/GlopBuilder.cpp index 65922f68bd09..f14b50a84312 100644 --- a/libs/hwui/GlopBuilder.cpp +++ b/libs/hwui/GlopBuilder.cpp @@ -220,9 +220,9 @@ GlopBuilder& GlopBuilder::setMeshPatchQuads(const Patch& patch) { //////////////////////////////////////////////////////////////////////////////// void GlopBuilder::setFill(int color, float alphaScale, - SkXfermode::Mode mode, Blend::ModeOrderSwap modeUsage, + SkBlendMode mode, Blend::ModeOrderSwap modeUsage, const SkShader* shader, const SkColorFilter* colorFilter) { - if (mode != SkXfermode::kClear_Mode) { + if (mode != SkBlendMode::kClear) { if (!shader) { FloatColor c; c.set(color); @@ -246,8 +246,8 @@ void GlopBuilder::setFill(int color, float alphaScale, || mOutGlop->roundRectClipState || PaintUtils::isBlendedShader(shader) || PaintUtils::isBlendedColorFilter(colorFilter) - || mode != SkXfermode::kSrcOver_Mode) { - if (CC_LIKELY(mode <= SkXfermode::kScreen_Mode)) { + || mode != SkBlendMode::kSrcOver) { + if (CC_LIKELY(mode <= SkBlendMode::kScreen)) { Blend::getFactors(mode, modeUsage, &mOutGlop->blend.src, &mOutGlop->blend.dst); } else { @@ -257,12 +257,12 @@ void GlopBuilder::setFill(int color, float alphaScale, // If the blend mode cannot be implemented using shaders, fall // back to the default SrcOver blend mode instead if (CC_UNLIKELY(mCaches.extensions().hasFramebufferFetch())) { - mDescription.framebufferMode = mode; + mDescription.framebufferMode = (SkXfermode::Mode)mode; mDescription.swapSrcDst = (modeUsage == Blend::ModeOrderSwap::Swap); // blending in shader, don't enable } else { // unsupported - Blend::getFactors(SkXfermode::kSrcOver_Mode, modeUsage, + Blend::getFactors(SkBlendMode::kSrcOver, modeUsage, &mOutGlop->blend.src, &mOutGlop->blend.dst); } } @@ -271,11 +271,11 @@ void GlopBuilder::setFill(int color, float alphaScale, if (colorFilter) { SkColor color; - SkXfermode::Mode mode; + SkXfermode::Mode xmode; SkScalar srcColorMatrix[20]; - if (colorFilter->asColorMode(&color, &mode)) { + if (colorFilter->asColorMode(&color, &xmode)) { mOutGlop->fill.filterMode = mDescription.colorOp = ProgramDescription::ColorFilterMode::Blend; - mDescription.colorMode = mode; + mDescription.colorMode = xmode; mOutGlop->fill.filter.color.set(color); } else if (colorFilter->asColorMatrix(srcColorMatrix)) { mOutGlop->fill.filterMode = mDescription.colorOp = ProgramDescription::ColorFilterMode::Matrix; @@ -321,7 +321,7 @@ GlopBuilder& GlopBuilder::setFillTexturePaint(Texture& texture, shader = nullptr; } setFill(color, alphaScale, - PaintUtils::getXfermode(paint->getXfermode()), Blend::ModeOrderSwap::NoSwap, + paint->getBlendMode(), Blend::ModeOrderSwap::NoSwap, shader, paint->getColorFilter()); } else { mOutGlop->fill.color = { alphaScale, alphaScale, alphaScale, alphaScale }; @@ -330,7 +330,7 @@ GlopBuilder& GlopBuilder::setFillTexturePaint(Texture& texture, || (mOutGlop->mesh.vertices.attribFlags & VertexAttribFlags::Alpha) || texture.blend || mOutGlop->roundRectClipState) { - Blend::getFactors(SkXfermode::kSrcOver_Mode, Blend::ModeOrderSwap::NoSwap, + Blend::getFactors(SkBlendMode::kSrcOver, Blend::ModeOrderSwap::NoSwap, &mOutGlop->blend.src, &mOutGlop->blend.dst); } else { mOutGlop->blend = { GL_ZERO, GL_ZERO }; @@ -360,7 +360,7 @@ GlopBuilder& GlopBuilder::setFillPaint(const SkPaint& paint, float alphaScale, b } setFill(paint.getColor(), alphaScale, - PaintUtils::getXfermode(paint.getXfermode()), Blend::ModeOrderSwap::NoSwap, + paint.getBlendMode(), Blend::ModeOrderSwap::NoSwap, paint.getShader(), paint.getColorFilter()); mDescription.useShadowAlphaInterp = shadowInterp; mDescription.modulate = mOutGlop->fill.color.a < 1.0f; @@ -376,7 +376,7 @@ GlopBuilder& GlopBuilder::setFillPathTexturePaint(PathTexture& texture, mOutGlop->fill.texture = { &texture, GL_TEXTURE_2D, GL_INVALID_ENUM, GL_INVALID_ENUM, nullptr }; setFill(paint.getColor(), alphaScale, - PaintUtils::getXfermode(paint.getXfermode()), Blend::ModeOrderSwap::NoSwap, + paint.getBlendMode(), Blend::ModeOrderSwap::NoSwap, paint.getShader(), paint.getColorFilter()); mDescription.hasAlpha8Texture = true; @@ -400,7 +400,7 @@ GlopBuilder& GlopBuilder::setFillShadowTexturePaint(ShadowTexture& texture, int } setFill(shadowColor, alphaScale, - PaintUtils::getXfermode(paint.getXfermode()), Blend::ModeOrderSwap::NoSwap, + paint.getBlendMode(), Blend::ModeOrderSwap::NoSwap, paint.getShader(), paint.getColorFilter()); mDescription.hasAlpha8Texture = true; @@ -413,7 +413,7 @@ GlopBuilder& GlopBuilder::setFillBlack() { REQUIRE_STAGES(kMeshStage | kRoundRectClipStage); mOutGlop->fill.texture = { nullptr, GL_INVALID_ENUM, GL_INVALID_ENUM, GL_INVALID_ENUM, nullptr }; - setFill(SK_ColorBLACK, 1.0f, SkXfermode::kSrcOver_Mode, Blend::ModeOrderSwap::NoSwap, + setFill(SK_ColorBLACK, 1.0f, SkBlendMode::kSrcOver, Blend::ModeOrderSwap::NoSwap, nullptr, nullptr); return *this; } @@ -423,13 +423,13 @@ GlopBuilder& GlopBuilder::setFillClear() { REQUIRE_STAGES(kMeshStage | kRoundRectClipStage); mOutGlop->fill.texture = { nullptr, GL_INVALID_ENUM, GL_INVALID_ENUM, GL_INVALID_ENUM, nullptr }; - setFill(SK_ColorBLACK, 1.0f, SkXfermode::kClear_Mode, Blend::ModeOrderSwap::NoSwap, + setFill(SK_ColorBLACK, 1.0f, SkBlendMode::kClear, Blend::ModeOrderSwap::NoSwap, nullptr, nullptr); return *this; } GlopBuilder& GlopBuilder::setFillLayer(Texture& texture, const SkColorFilter* colorFilter, - float alpha, SkXfermode::Mode mode, Blend::ModeOrderSwap modeUsage) { + float alpha, SkBlendMode mode, Blend::ModeOrderSwap modeUsage) { TRIGGER_STAGE(kFillStage); REQUIRE_STAGES(kMeshStage | kRoundRectClipStage); @@ -465,7 +465,7 @@ GlopBuilder& GlopBuilder::setFillExternalTexture(Texture& texture, Matrix4& text GL_TEXTURE_EXTERNAL_OES, GL_LINEAR, GL_CLAMP_TO_EDGE, &textureTransform }; - setFill(SK_ColorWHITE, 1.0f, SkXfermode::kSrc_Mode, Blend::ModeOrderSwap::NoSwap, + setFill(SK_ColorWHITE, 1.0f, SkBlendMode::kSrc, Blend::ModeOrderSwap::NoSwap, nullptr, nullptr); mDescription.modulate = mOutGlop->fill.color.a < 1.0f; diff --git a/libs/hwui/GlopBuilder.h b/libs/hwui/GlopBuilder.h index 1f3b53abdb29..d511ccbcb71a 100644 --- a/libs/hwui/GlopBuilder.h +++ b/libs/hwui/GlopBuilder.h @@ -70,7 +70,7 @@ public: GlopBuilder& setFillBlack(); GlopBuilder& setFillClear(); GlopBuilder& setFillLayer(Texture& texture, const SkColorFilter* colorFilter, - float alpha, SkXfermode::Mode mode, Blend::ModeOrderSwap modeUsage); + float alpha, SkBlendMode mode, Blend::ModeOrderSwap modeUsage); GlopBuilder& setFillTextureLayer(Layer& layer, float alpha); // TODO: Texture should probably know and own its target. // setFillLayer() forces it to GL_TEXTURE which isn't always correct. @@ -112,7 +112,7 @@ public: static void dump(const Glop& glop); private: void setFill(int color, float alphaScale, - SkXfermode::Mode mode, Blend::ModeOrderSwap modeUsage, + SkBlendMode mode, Blend::ModeOrderSwap modeUsage, const SkShader* shader, const SkColorFilter* colorFilter); enum StageFlags { diff --git a/libs/hwui/Layer.h b/libs/hwui/Layer.h index 01650ef5745f..9874ce29cb3c 100644 --- a/libs/hwui/Layer.h +++ b/libs/hwui/Layer.h @@ -28,7 +28,7 @@ #include <ui/Region.h> #include <SkPaint.h> -#include <SkXfermode.h> +#include <SkBlendMode.h> #include "Matrix.h" #include "Rect.h" @@ -98,7 +98,7 @@ public: this->alpha = alpha; } - inline void setAlpha(int alpha, SkXfermode::Mode mode) { + inline void setAlpha(int alpha, SkBlendMode mode) { this->alpha = alpha; this->mode = mode; } @@ -107,7 +107,7 @@ public: return alpha; } - inline SkXfermode::Mode getMode() const { + inline SkBlendMode getMode() const { return mode; } @@ -208,7 +208,7 @@ private: /** * Blending mode of the layer. */ - SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode; + SkBlendMode mode = SkBlendMode::kSrcOver; /** * Optional texture coordinates transform. diff --git a/libs/hwui/LayerBuilder.cpp b/libs/hwui/LayerBuilder.cpp index 66413dcf0d97..c5d5492d4fd1 100644 --- a/libs/hwui/LayerBuilder.cpp +++ b/libs/hwui/LayerBuilder.cpp @@ -274,7 +274,7 @@ void LayerBuilder::flushLayerClears(LinearAllocator& allocator) { // One or more unclipped saveLayers have been enqueued, with deferred clears. // Flush all of these clears with a single draw SkPaint* paint = allocator.create<SkPaint>(); - paint->setXfermodeMode(SkXfermode::kClear_Mode); + paint->setBlendMode(SkBlendMode::kClear); SimpleRectsOp* op = allocator.create_trivial<SimpleRectsOp>(bounds, Matrix4::identity(), nullptr, paint, verts, vertCount); diff --git a/libs/hwui/PathCache.cpp b/libs/hwui/PathCache.cpp index e69ea79ccfb9..d46c46f9381f 100644 --- a/libs/hwui/PathCache.cpp +++ b/libs/hwui/PathCache.cpp @@ -17,6 +17,8 @@ #include <SkBitmap.h> #include <SkCanvas.h> #include <SkColor.h> +#include <SkColorFilter.h> +#include <SkMaskFilter.h> #include <SkPaint.h> #include <SkPath.h> #include <SkPathEffect.h> @@ -149,8 +151,7 @@ static void initPaint(SkPaint& paint) { paint.setColorFilter(nullptr); paint.setMaskFilter(nullptr); paint.setShader(nullptr); - SkXfermode* mode = SkXfermode::Create(SkXfermode::kSrc_Mode); - SkSafeUnref(paint.setXfermode(mode)); + paint.setBlendMode(SkBlendMode::kSrc); } static SkBitmap* drawPath(const SkPath* path, const SkPaint* paint, PathTexture* texture, diff --git a/libs/hwui/RecordedOp.h b/libs/hwui/RecordedOp.h index ebc41b18ed8c..3b1caa58ab04 100644 --- a/libs/hwui/RecordedOp.h +++ b/libs/hwui/RecordedOp.h @@ -26,7 +26,6 @@ #include "Vector.h" #include <androidfw/ResourceTypes.h> -#include <SkXfermode.h> class SkBitmap; class SkPaint; @@ -257,12 +256,12 @@ struct CirclePropsOp : RecordedOp { struct ColorOp : RecordedOp { // Note: unbounded op that will fillclip, so no bounds/matrix needed - ColorOp(const ClipBase* localClip, int color, SkXfermode::Mode mode) + ColorOp(const ClipBase* localClip, int color, SkBlendMode mode) : RecordedOp(RecordedOpId::ColorOp, Rect(), Matrix4::identity(), localClip, nullptr) , color(color) , mode(mode) {} const int color; - const SkXfermode::Mode mode; + const SkBlendMode mode; }; struct FunctorOp : RecordedOp { @@ -504,7 +503,7 @@ struct LayerOp : RecordedOp { : SUPER_PAINTLESS(LayerOp) , layerHandle(layerHandle) , alpha(paint ? paint->getAlpha() / 255.0f : 1.0f) - , mode(PaintUtils::getXfermodeDirect(paint)) + , mode(PaintUtils::getBlendModeDirect(paint)) , colorFilter(paint ? paint->getColorFilter() : nullptr) {} explicit LayerOp(RenderNode& node) @@ -518,7 +517,7 @@ struct LayerOp : RecordedOp { // constructed until after this operation is constructed. OffscreenBuffer** layerHandle; const float alpha; - const SkXfermode::Mode mode; + const SkBlendMode mode; // pointer to object owned by either LayerProperties, or a recorded Paint object in a // BeginLayerOp. Lives longer than LayerOp in either case, so no skia ref counting is used. diff --git a/libs/hwui/RecordingCanvas.cpp b/libs/hwui/RecordingCanvas.cpp index 27e6a12fb59e..09d525269787 100644 --- a/libs/hwui/RecordingCanvas.cpp +++ b/libs/hwui/RecordingCanvas.cpp @@ -247,7 +247,7 @@ bool RecordingCanvas::clipRegion(const SkRegion* region, SkRegion::Op op) { // ---------------------------------------------------------------------------- // android/graphics/Canvas draw operations // ---------------------------------------------------------------------------- -void RecordingCanvas::drawColor(int color, SkXfermode::Mode mode) { +void RecordingCanvas::drawColor(int color, SkBlendMode mode) { addOp(alloc().create_trivial<ColorOp>( getRecordedClip(), color, diff --git a/libs/hwui/RecordingCanvas.h b/libs/hwui/RecordingCanvas.h index efa6b915ac7a..4483e1b626ef 100644 --- a/libs/hwui/RecordingCanvas.h +++ b/libs/hwui/RecordingCanvas.h @@ -144,7 +144,7 @@ public: // ---------------------------------------------------------------------------- // android/graphics/Canvas draw operations // ---------------------------------------------------------------------------- - virtual void drawColor(int color, SkXfermode::Mode mode) override; + virtual void drawColor(int color, SkBlendMode mode) override; virtual void drawPaint(const SkPaint& paint) override; // Geometry diff --git a/libs/hwui/RenderProperties.cpp b/libs/hwui/RenderProperties.cpp index b0114bce4b51..146fbe73a48a 100644 --- a/libs/hwui/RenderProperties.cpp +++ b/libs/hwui/RenderProperties.cpp @@ -52,7 +52,7 @@ bool LayerProperties::setColorFilter(SkColorFilter* filter) { bool LayerProperties::setFromPaint(const SkPaint* paint) { bool changed = false; changed |= setAlpha(static_cast<uint8_t>(PaintUtils::getAlphaDirect(paint))); - changed |= setXferMode(PaintUtils::getXfermodeDirect(paint)); + changed |= setXferMode(PaintUtils::getBlendModeDirect(paint)); changed |= setColorFilter(paint ? paint->getColorFilter() : nullptr); return changed; } diff --git a/libs/hwui/RenderProperties.h b/libs/hwui/RenderProperties.h index 2f5223cedb86..9ee2f9c69343 100644 --- a/libs/hwui/RenderProperties.h +++ b/libs/hwui/RenderProperties.h @@ -24,10 +24,10 @@ #include "utils/MathUtils.h" #include "utils/PaintUtils.h" +#include <SkBlendMode.h> #include <SkCamera.h> #include <SkMatrix.h> #include <SkRegion.h> -#include <SkXfermode.h> #include <algorithm> #include <stddef.h> @@ -93,11 +93,11 @@ public: return mAlpha; } - bool setXferMode(SkXfermode::Mode mode) { + bool setXferMode(SkBlendMode mode) { return RP_SET(mMode, mode); } - SkXfermode::Mode xferMode() const { + SkBlendMode xferMode() const { return mMode; } @@ -133,7 +133,7 @@ private: // Whether or not that Layer's content is opaque, doesn't include alpha bool mOpaque; uint8_t mAlpha; - SkXfermode::Mode mMode; + SkBlendMode mMode; SkColorFilter* mColorFilter = nullptr; }; diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp index 9553ab459b5c..7b2fda1c6234 100644 --- a/libs/hwui/SkiaCanvas.cpp +++ b/libs/hwui/SkiaCanvas.cpp @@ -386,7 +386,7 @@ void SkiaCanvas::setDrawFilter(SkDrawFilter* drawFilter) { // Canvas draw operations // ---------------------------------------------------------------------------- -void SkiaCanvas::drawColor(int color, SkXfermode::Mode mode) { +void SkiaCanvas::drawColor(int color, SkBlendMode mode) { mCanvas->drawColor(color, mode); } diff --git a/libs/hwui/SkiaCanvas.h b/libs/hwui/SkiaCanvas.h index 0e506f4d9412..aac903698ae9 100644 --- a/libs/hwui/SkiaCanvas.h +++ b/libs/hwui/SkiaCanvas.h @@ -100,7 +100,7 @@ public: virtual SkDrawFilter* getDrawFilter() override; virtual void setDrawFilter(SkDrawFilter* drawFilter) override; - virtual void drawColor(int color, SkXfermode::Mode mode) override; + virtual void drawColor(int color, SkBlendMode mode) override; virtual void drawPaint(const SkPaint& paint) override; virtual void drawPoint(float x, float y, const SkPaint& paint) override; diff --git a/libs/hwui/VectorDrawable.cpp b/libs/hwui/VectorDrawable.cpp index a2f3cb6b3d85..715681d5fca6 100644 --- a/libs/hwui/VectorDrawable.cpp +++ b/libs/hwui/VectorDrawable.cpp @@ -201,10 +201,7 @@ void FullPath::drawPath(SkCanvas* outCanvas, SkPath& renderPath, float strokeSca SkPaint paint; if (properties.getFillGradient() != nullptr) { paint.setColor(applyAlpha(SK_ColorBLACK, properties.getFillAlpha())); - SkShader* newShader = properties.getFillGradient()->newWithLocalMatrix(matrix); - // newWithLocalMatrix(...) creates a new SkShader and returns a bare pointer. We need to - // remove the extra ref so that the ref count is correctly managed. - paint.setShader(newShader)->unref(); + paint.setShader(properties.getFillGradient()->makeWithLocalMatrix(matrix)); needsFill = true; } else if (properties.getFillColor() != SK_ColorTRANSPARENT) { paint.setColor(applyAlpha(properties.getFillColor(), properties.getFillAlpha())); @@ -223,10 +220,7 @@ void FullPath::drawPath(SkCanvas* outCanvas, SkPath& renderPath, float strokeSca bool needsStroke = false; if (properties.getStrokeGradient() != nullptr) { paint.setColor(applyAlpha(SK_ColorBLACK, properties.getStrokeAlpha())); - SkShader* newShader = properties.getStrokeGradient()->newWithLocalMatrix(matrix); - // newWithLocalMatrix(...) creates a new SkShader and returns a bare pointer. We need to - // remove the extra ref so that the ref count is correctly managed. - paint.setShader(newShader)->unref(); + paint.setShader(properties.getStrokeGradient()->makeWithLocalMatrix(matrix)); needsStroke = true; } else if (properties.getStrokeColor() != SK_ColorTRANSPARENT) { paint.setColor(applyAlpha(properties.getStrokeColor(), properties.getStrokeAlpha())); @@ -534,7 +528,7 @@ SkPaint* Tree::updatePaint(SkPaint* outPaint, TreeProperties* prop) { if (prop->getRootAlpha() == 1.0f && prop->getColorFilter() == nullptr) { return nullptr; } else { - outPaint->setColorFilter(prop->getColorFilter()); + outPaint->setColorFilter(sk_ref_sp(prop->getColorFilter())); outPaint->setFilterQuality(kLow_SkFilterQuality); outPaint->setAlpha(prop->getRootAlpha() * 255); return outPaint; diff --git a/libs/hwui/hwui/Canvas.h b/libs/hwui/hwui/Canvas.h index d76143bf999c..cb9056f5cc87 100644 --- a/libs/hwui/hwui/Canvas.h +++ b/libs/hwui/hwui/Canvas.h @@ -174,7 +174,7 @@ public: // ---------------------------------------------------------------------------- // Canvas draw operations // ---------------------------------------------------------------------------- - virtual void drawColor(int color, SkXfermode::Mode mode) = 0; + virtual void drawColor(int color, SkBlendMode mode) = 0; virtual void drawPaint(const SkPaint& paint) = 0; // Geometry diff --git a/libs/hwui/renderstate/Blend.cpp b/libs/hwui/renderstate/Blend.cpp index 93f787d31745..8865c6efce8c 100644 --- a/libs/hwui/renderstate/Blend.cpp +++ b/libs/hwui/renderstate/Blend.cpp @@ -25,70 +25,70 @@ namespace uirenderer { * Structure mapping Skia xfermodes to OpenGL blending factors. */ struct Blender { - SkXfermode::Mode mode; + SkBlendMode mode; GLenum src; GLenum dst; }; // assumptions made by lookup tables in either this file or ProgramCache -static_assert(0 == SkXfermode::kClear_Mode, "SkXfermode enums have changed"); -static_assert(1 == SkXfermode::kSrc_Mode, "SkXfermode enums have changed"); -static_assert(2 == SkXfermode::kDst_Mode, "SkXfermode enums have changed"); -static_assert(3 == SkXfermode::kSrcOver_Mode, "SkXfermode enums have changed"); -static_assert(4 == SkXfermode::kDstOver_Mode, "SkXfermode enums have changed"); -static_assert(5 == SkXfermode::kSrcIn_Mode, "SkXfermode enums have changed"); -static_assert(6 == SkXfermode::kDstIn_Mode, "SkXfermode enums have changed"); -static_assert(7 == SkXfermode::kSrcOut_Mode, "SkXfermode enums have changed"); -static_assert(8 == SkXfermode::kDstOut_Mode, "SkXfermode enums have changed"); -static_assert(9 == SkXfermode::kSrcATop_Mode, "SkXfermode enums have changed"); -static_assert(10 == SkXfermode::kDstATop_Mode, "SkXfermode enums have changed"); -static_assert(11 == SkXfermode::kXor_Mode, "SkXfermode enums have changed"); -static_assert(12 == SkXfermode::kPlus_Mode, "SkXfermode enums have changed"); -static_assert(13 == SkXfermode::kModulate_Mode, "SkXfermode enums have changed"); -static_assert(14 == SkXfermode::kScreen_Mode, "SkXfermode enums have changed"); -static_assert(15 == SkXfermode::kOverlay_Mode, "SkXfermode enums have changed"); -static_assert(16 == SkXfermode::kDarken_Mode, "SkXfermode enums have changed"); -static_assert(17 == SkXfermode::kLighten_Mode, "SkXfermode enums have changed"); +static_assert(0 == static_cast<int>(SkBlendMode::kClear), "SkBlendMode enums have changed"); +static_assert(1 == static_cast<int>(SkBlendMode::kSrc), "SkBlendMode enums have changed"); +static_assert(2 == static_cast<int>(SkBlendMode::kDst), "SkBlendMode enums have changed"); +static_assert(3 == static_cast<int>(SkBlendMode::kSrcOver), "SkBlendMode enums have changed"); +static_assert(4 == static_cast<int>(SkBlendMode::kDstOver), "SkBlendMode enums have changed"); +static_assert(5 == static_cast<int>(SkBlendMode::kSrcIn), "SkBlendMode enums have changed"); +static_assert(6 == static_cast<int>(SkBlendMode::kDstIn), "SkBlendMode enums have changed"); +static_assert(7 == static_cast<int>(SkBlendMode::kSrcOut), "SkBlendMode enums have changed"); +static_assert(8 == static_cast<int>(SkBlendMode::kDstOut), "SkBlendMode enums have changed"); +static_assert(9 == static_cast<int>(SkBlendMode::kSrcATop), "SkBlendMode enums have changed"); +static_assert(10 == static_cast<int>(SkBlendMode::kDstATop), "SkBlendMode enums have changed"); +static_assert(11 == static_cast<int>(SkBlendMode::kXor), "SkBlendMode enums have changed"); +static_assert(12 == static_cast<int>(SkBlendMode::kPlus), "SkBlendMode enums have changed"); +static_assert(13 == static_cast<int>(SkBlendMode::kModulate), "SkBlendMode enums have changed"); +static_assert(14 == static_cast<int>(SkBlendMode::kScreen), "SkBlendMode enums have changed"); +static_assert(15 == static_cast<int>(SkBlendMode::kOverlay), "SkBlendMode enums have changed"); +static_assert(16 == static_cast<int>(SkBlendMode::kDarken), "SkBlendMode enums have changed"); +static_assert(17 == static_cast<int>(SkBlendMode::kLighten), "SkBlendMode enums have changed"); // In this array, the index of each Blender equals the value of the first -// entry. For instance, gBlends[1] == gBlends[SkXfermode::kSrc_Mode] +// entry. For instance, gBlends[1] == gBlends[SkBlendMode::kSrc] const Blender kBlends[] = { - { SkXfermode::kClear_Mode, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA }, - { SkXfermode::kSrc_Mode, GL_ONE, GL_ZERO }, - { SkXfermode::kDst_Mode, GL_ZERO, GL_ONE }, - { SkXfermode::kSrcOver_Mode, GL_ONE, GL_ONE_MINUS_SRC_ALPHA }, - { SkXfermode::kDstOver_Mode, GL_ONE_MINUS_DST_ALPHA, GL_ONE }, - { SkXfermode::kSrcIn_Mode, GL_DST_ALPHA, GL_ZERO }, - { SkXfermode::kDstIn_Mode, GL_ZERO, GL_SRC_ALPHA }, - { SkXfermode::kSrcOut_Mode, GL_ONE_MINUS_DST_ALPHA, GL_ZERO }, - { SkXfermode::kDstOut_Mode, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA }, - { SkXfermode::kSrcATop_Mode, GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA }, - { SkXfermode::kDstATop_Mode, GL_ONE_MINUS_DST_ALPHA, GL_SRC_ALPHA }, - { SkXfermode::kXor_Mode, GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA }, - { SkXfermode::kPlus_Mode, GL_ONE, GL_ONE }, - { SkXfermode::kModulate_Mode, GL_ZERO, GL_SRC_COLOR }, - { SkXfermode::kScreen_Mode, GL_ONE, GL_ONE_MINUS_SRC_COLOR } + { SkBlendMode::kClear, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA }, + { SkBlendMode::kSrc, GL_ONE, GL_ZERO }, + { SkBlendMode::kDst, GL_ZERO, GL_ONE }, + { SkBlendMode::kSrcOver, GL_ONE, GL_ONE_MINUS_SRC_ALPHA }, + { SkBlendMode::kDstOver, GL_ONE_MINUS_DST_ALPHA, GL_ONE }, + { SkBlendMode::kSrcIn, GL_DST_ALPHA, GL_ZERO }, + { SkBlendMode::kDstIn, GL_ZERO, GL_SRC_ALPHA }, + { SkBlendMode::kSrcOut, GL_ONE_MINUS_DST_ALPHA, GL_ZERO }, + { SkBlendMode::kDstOut, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA }, + { SkBlendMode::kSrcATop, GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA }, + { SkBlendMode::kDstATop, GL_ONE_MINUS_DST_ALPHA, GL_SRC_ALPHA }, + { SkBlendMode::kXor, GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA }, + { SkBlendMode::kPlus, GL_ONE, GL_ONE }, + { SkBlendMode::kModulate, GL_ZERO, GL_SRC_COLOR }, + { SkBlendMode::kScreen, GL_ONE, GL_ONE_MINUS_SRC_COLOR } }; -// This array contains the swapped version of each SkXfermode. For instance +// This array contains the swapped version of each SkBlendMode. For instance // this array's SrcOver blending mode is actually DstOver. You can refer to // createLayer() for more information on the purpose of this array. const Blender kBlendsSwap[] = { - { SkXfermode::kClear_Mode, GL_ONE_MINUS_DST_ALPHA, GL_ZERO }, - { SkXfermode::kSrc_Mode, GL_ZERO, GL_ONE }, - { SkXfermode::kDst_Mode, GL_ONE, GL_ZERO }, - { SkXfermode::kSrcOver_Mode, GL_ONE_MINUS_DST_ALPHA, GL_ONE }, - { SkXfermode::kDstOver_Mode, GL_ONE, GL_ONE_MINUS_SRC_ALPHA }, - { SkXfermode::kSrcIn_Mode, GL_ZERO, GL_SRC_ALPHA }, - { SkXfermode::kDstIn_Mode, GL_DST_ALPHA, GL_ZERO }, - { SkXfermode::kSrcOut_Mode, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA }, - { SkXfermode::kDstOut_Mode, GL_ONE_MINUS_DST_ALPHA, GL_ZERO }, - { SkXfermode::kSrcATop_Mode, GL_ONE_MINUS_DST_ALPHA, GL_SRC_ALPHA }, - { SkXfermode::kDstATop_Mode, GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA }, - { SkXfermode::kXor_Mode, GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA }, - { SkXfermode::kPlus_Mode, GL_ONE, GL_ONE }, - { SkXfermode::kModulate_Mode, GL_DST_COLOR, GL_ZERO }, - { SkXfermode::kScreen_Mode, GL_ONE_MINUS_DST_COLOR, GL_ONE } + { SkBlendMode::kClear, GL_ONE_MINUS_DST_ALPHA, GL_ZERO }, + { SkBlendMode::kSrc, GL_ZERO, GL_ONE }, + { SkBlendMode::kDst, GL_ONE, GL_ZERO }, + { SkBlendMode::kSrcOver, GL_ONE_MINUS_DST_ALPHA, GL_ONE }, + { SkBlendMode::kDstOver, GL_ONE, GL_ONE_MINUS_SRC_ALPHA }, + { SkBlendMode::kSrcIn, GL_ZERO, GL_SRC_ALPHA }, + { SkBlendMode::kDstIn, GL_DST_ALPHA, GL_ZERO }, + { SkBlendMode::kSrcOut, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA }, + { SkBlendMode::kDstOut, GL_ONE_MINUS_DST_ALPHA, GL_ZERO }, + { SkBlendMode::kSrcATop, GL_ONE_MINUS_DST_ALPHA, GL_SRC_ALPHA }, + { SkBlendMode::kDstATop, GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA }, + { SkBlendMode::kXor, GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA }, + { SkBlendMode::kPlus, GL_ONE, GL_ONE }, + { SkBlendMode::kModulate, GL_DST_COLOR, GL_ZERO }, + { SkBlendMode::kScreen, GL_ONE_MINUS_DST_COLOR, GL_ONE } }; Blend::Blend() @@ -111,9 +111,10 @@ void Blend::syncEnabled() { } } -void Blend::getFactors(SkXfermode::Mode mode, ModeOrderSwap modeUsage, GLenum* outSrc, GLenum* outDst) { - *outSrc = (modeUsage == ModeOrderSwap::Swap) ? kBlendsSwap[mode].src : kBlends[mode].src; - *outDst = (modeUsage == ModeOrderSwap::Swap) ? kBlendsSwap[mode].dst : kBlends[mode].dst; +void Blend::getFactors(SkBlendMode mode, ModeOrderSwap modeUsage, GLenum* outSrc, GLenum* outDst) { + int index = static_cast<int>(mode); + *outSrc = (modeUsage == ModeOrderSwap::Swap) ? kBlendsSwap[index].src : kBlends[index].src; + *outDst = (modeUsage == ModeOrderSwap::Swap) ? kBlendsSwap[index].dst : kBlends[index].dst; } void Blend::setFactors(GLenum srcMode, GLenum dstMode) { diff --git a/libs/hwui/renderstate/Blend.h b/libs/hwui/renderstate/Blend.h index df9e5a8af879..ec0e114c998f 100644 --- a/libs/hwui/renderstate/Blend.h +++ b/libs/hwui/renderstate/Blend.h @@ -20,7 +20,7 @@ #include <GLES2/gl2.h> #include <GLES2/gl2ext.h> -#include <SkXfermode.h> +#include <SkBlendMode.h> #include <memory> namespace android { @@ -36,7 +36,7 @@ public: }; void syncEnabled(); - static void getFactors(SkXfermode::Mode mode, ModeOrderSwap modeUsage, + static void getFactors(SkBlendMode mode, ModeOrderSwap modeUsage, GLenum* outSrc, GLenum* outDst); void setFactors(GLenum src, GLenum dst); diff --git a/libs/hwui/tests/common/TestListViewSceneBase.cpp b/libs/hwui/tests/common/TestListViewSceneBase.cpp index b8484b9d30d7..6d2e85996444 100644 --- a/libs/hwui/tests/common/TestListViewSceneBase.cpp +++ b/libs/hwui/tests/common/TestListViewSceneBase.cpp @@ -47,7 +47,7 @@ void TestListViewSceneBase::createContent(int width, int height, Canvas& canvas) } }); - canvas.drawColor(Color::Grey_500, SkXfermode::kSrcOver_Mode); + canvas.drawColor(Color::Grey_500, SkBlendMode::kSrcOver); canvas.drawRenderNode(mListView.get()); } diff --git a/libs/hwui/tests/common/scenes/ClippingAnimation.cpp b/libs/hwui/tests/common/scenes/ClippingAnimation.cpp index 47f40a11fc83..8f2ba2d2cddc 100644 --- a/libs/hwui/tests/common/scenes/ClippingAnimation.cpp +++ b/libs/hwui/tests/common/scenes/ClippingAnimation.cpp @@ -29,7 +29,7 @@ class ClippingAnimation : public TestScene { public: sp<RenderNode> card; void createContent(int width, int height, Canvas& canvas) override { - canvas.drawColor(Color::White, SkXfermode::kSrcOver_Mode); + canvas.drawColor(Color::White, SkBlendMode::kSrcOver); card = TestUtils::createNode(0, 0, 200, 400, [](RenderProperties& props, Canvas& canvas) { canvas.save(SaveFlags::MatrixClip); @@ -39,7 +39,7 @@ public: canvas.rotate(45); canvas.translate(-100, -100); canvas.clipRect(0, 0, 200, 200, SkRegion::kIntersect_Op); - canvas.drawColor(Color::Blue_500, SkXfermode::kSrcOver_Mode); + canvas.drawColor(Color::Blue_500, SkBlendMode::kSrcOver); } canvas.restore(); @@ -48,7 +48,7 @@ public: SkPath clipCircle; clipCircle.addCircle(100, 300, 100); canvas.clipPath(&clipCircle, SkRegion::kIntersect_Op); - canvas.drawColor(Color::Red_500, SkXfermode::kSrcOver_Mode); + canvas.drawColor(Color::Red_500, SkBlendMode::kSrcOver); } canvas.restore(); diff --git a/libs/hwui/tests/common/scenes/GlyphStressAnimation.cpp b/libs/hwui/tests/common/scenes/GlyphStressAnimation.cpp index 9d6aa5364900..c0d9450ebace 100644 --- a/libs/hwui/tests/common/scenes/GlyphStressAnimation.cpp +++ b/libs/hwui/tests/common/scenes/GlyphStressAnimation.cpp @@ -37,7 +37,7 @@ public: container = TestUtils::createNode(0, 0, width, height, nullptr); doFrame(0); // update container - canvas.drawColor(Color::White, SkXfermode::kSrcOver_Mode); + canvas.drawColor(Color::White, SkBlendMode::kSrcOver); canvas.drawRenderNode(container.get()); } diff --git a/libs/hwui/tests/common/scenes/HwLayerAnimation.cpp b/libs/hwui/tests/common/scenes/HwLayerAnimation.cpp index 00dba7858296..3a230ae6e8b7 100644 --- a/libs/hwui/tests/common/scenes/HwLayerAnimation.cpp +++ b/libs/hwui/tests/common/scenes/HwLayerAnimation.cpp @@ -32,9 +32,9 @@ public: card = TestUtils::createNode(0, 0, 200, 200, [](RenderProperties& props, Canvas& canvas) { props.mutateLayerProperties().setType(LayerType::RenderLayer); - canvas.drawColor(0xFF0000FF, SkXfermode::kSrcOver_Mode); + canvas.drawColor(0xFF0000FF, SkBlendMode::kSrcOver); }); - canvas.drawColor(0xFFFFFFFF, SkXfermode::kSrcOver_Mode); // background + canvas.drawColor(0xFFFFFFFF, SkBlendMode::kSrcOver); // background canvas.drawRenderNode(card.get()); } void doFrame(int frameNr) override { diff --git a/libs/hwui/tests/common/scenes/ListOfFadedTextAnimation.cpp b/libs/hwui/tests/common/scenes/ListOfFadedTextAnimation.cpp index a5e91e4b85ed..b7357e179bfe 100644 --- a/libs/hwui/tests/common/scenes/ListOfFadedTextAnimation.cpp +++ b/libs/hwui/tests/common/scenes/ListOfFadedTextAnimation.cpp @@ -31,7 +31,7 @@ static TestScene::Registrar _ListOfFadedTextAnimation(TestScene::Info{ class ListOfFadedTextAnimation : public TestListViewSceneBase { void createListItem(RenderProperties& props, Canvas& canvas, int id, int itemWidth, int itemHeight) override { - canvas.drawColor(Color::White, SkXfermode::kSrcOver_Mode); + canvas.drawColor(Color::White, SkBlendMode::kSrcOver); int length = dp(100); canvas.saveLayer(0, 0, length, itemHeight, nullptr, SaveFlags::HasAlphaLayer); SkPaint textPaint; @@ -44,16 +44,15 @@ class ListOfFadedTextAnimation : public TestListViewSceneBase { pts[1].set(0, 1); SkColor colors[2] = {Color::Black, Color::Transparent}; - SkAutoTUnref<SkShader> s(SkGradientShader::CreateLinear(pts, colors, NULL, 2, + sk_sp<SkShader> s(SkGradientShader::MakeLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode)); SkMatrix matrix; matrix.setScale(1, length); matrix.postRotate(-90); SkPaint fadingPaint; - fadingPaint.setShader(s->newWithLocalMatrix(matrix))->unref(); - SkXfermode* mode = SkXfermode::Create(SkXfermode::kDstOut_Mode); - fadingPaint.setXfermode(mode); + fadingPaint.setShader(s->makeWithLocalMatrix(matrix)); + fadingPaint.setBlendMode(SkBlendMode::kDstOut); canvas.drawRect(0, 0, length, itemHeight, fadingPaint); canvas.restore(); } diff --git a/libs/hwui/tests/common/scenes/OpPropAnimation.cpp b/libs/hwui/tests/common/scenes/OpPropAnimation.cpp index c8e124cbfc41..68051d63e855 100644 --- a/libs/hwui/tests/common/scenes/OpPropAnimation.cpp +++ b/libs/hwui/tests/common/scenes/OpPropAnimation.cpp @@ -53,7 +53,7 @@ public: mCircleX->value = width * 0.75; mCircleY->value = height * 0.75; - canvas.drawColor(Color::White, SkXfermode::Mode::kSrcOver_Mode); + canvas.drawColor(Color::White, SkBlendMode::kSrcOver); canvas.drawRoundRect(mRoundRectLeft.get(), mRoundRectTop.get(), mRoundRectRight.get(), mRoundRectBottom.get(), mRoundRectRx.get(), mRoundRectRy.get(), mPaint.get()); diff --git a/libs/hwui/tests/common/scenes/OvalAnimation.cpp b/libs/hwui/tests/common/scenes/OvalAnimation.cpp index f37c00c612ff..d6fd60494812 100644 --- a/libs/hwui/tests/common/scenes/OvalAnimation.cpp +++ b/libs/hwui/tests/common/scenes/OvalAnimation.cpp @@ -29,7 +29,7 @@ class OvalAnimation : public TestScene { public: sp<RenderNode> card; void createContent(int width, int height, Canvas& canvas) override { - canvas.drawColor(Color::White, SkXfermode::kSrcOver_Mode); + canvas.drawColor(Color::White, SkBlendMode::kSrcOver); card = TestUtils::createNode(0, 0, 200, 200, [](RenderProperties& props, Canvas& canvas) { SkPaint paint; diff --git a/libs/hwui/tests/common/scenes/PartialDamageAnimation.cpp b/libs/hwui/tests/common/scenes/PartialDamageAnimation.cpp index bc2dc750ec19..bc04d81296df 100644 --- a/libs/hwui/tests/common/scenes/PartialDamageAnimation.cpp +++ b/libs/hwui/tests/common/scenes/PartialDamageAnimation.cpp @@ -37,7 +37,7 @@ public: 0xFF4CAF50, }; - canvas.drawColor(0xFFFFFFFF, SkXfermode::kSrcOver_Mode); + canvas.drawColor(0xFFFFFFFF, SkBlendMode::kSrcOver); for (int x = dp(16); x < (width - dp(116)); x += dp(116)) { for (int y = dp(16); y < (height - dp(116)); y += dp(116)) { @@ -45,7 +45,7 @@ public: sp<RenderNode> card = TestUtils::createNode(x, y, x + dp(100), y + dp(100), [color](RenderProperties& props, Canvas& canvas) { - canvas.drawColor(color, SkXfermode::kSrcOver_Mode); + canvas.drawColor(color, SkBlendMode::kSrcOver); }); canvas.drawRenderNode(card.get()); cards.push_back(card); @@ -61,7 +61,7 @@ public: TestUtils::recordNode(*cards[0], [curFrame](Canvas& canvas) { SkColor color = TestUtils::interpolateColor( curFrame / 150.0f, 0xFFF44336, 0xFFF8BBD0); - canvas.drawColor(color, SkXfermode::kSrcOver_Mode); + canvas.drawColor(color, SkBlendMode::kSrcOver); }); } }; diff --git a/libs/hwui/tests/common/scenes/RecentsAnimation.cpp b/libs/hwui/tests/common/scenes/RecentsAnimation.cpp index 3d4397a4b451..584f6841d4ad 100644 --- a/libs/hwui/tests/common/scenes/RecentsAnimation.cpp +++ b/libs/hwui/tests/common/scenes/RecentsAnimation.cpp @@ -39,7 +39,7 @@ public: thumbnailSize = std::min(std::min(width, height) / 2, 720); int cardsize = std::min(width, height) - dp(64); - renderer.drawColor(Color::White, SkXfermode::kSrcOver_Mode); + renderer.drawColor(Color::White, SkBlendMode::kSrcOver); renderer.insertReorderBarrier(true); int x = dp(32); @@ -76,7 +76,7 @@ private: props.mutableOutline().setRoundRect(0, 0, width, height, dp(10), 1); props.mutableOutline().setShouldClip(true); - canvas.drawColor(Color::Grey_200, SkXfermode::kSrcOver_Mode); + canvas.drawColor(Color::Grey_200, SkBlendMode::kSrcOver); canvas.drawBitmap(thumb, 0, 0, thumb.width(), thumb.height(), 0, 0, width, height, nullptr); }); diff --git a/libs/hwui/tests/common/scenes/RectGridAnimation.cpp b/libs/hwui/tests/common/scenes/RectGridAnimation.cpp index e1d323e60b3e..668eec69c2d0 100644 --- a/libs/hwui/tests/common/scenes/RectGridAnimation.cpp +++ b/libs/hwui/tests/common/scenes/RectGridAnimation.cpp @@ -30,12 +30,12 @@ class RectGridAnimation : public TestScene { public: sp<RenderNode> card; void createContent(int width, int height, Canvas& canvas) override { - canvas.drawColor(0xFFFFFFFF, SkXfermode::kSrcOver_Mode); + canvas.drawColor(0xFFFFFFFF, SkBlendMode::kSrcOver); canvas.insertReorderBarrier(true); card = TestUtils::createNode(50, 50, 250, 250, [](RenderProperties& props, Canvas& canvas) { - canvas.drawColor(0xFFFF00FF, SkXfermode::kSrcOver_Mode); + canvas.drawColor(0xFFFF00FF, SkBlendMode::kSrcOver); SkRegion region; for (int xOffset = 0; xOffset < 200; xOffset+=2) { diff --git a/libs/hwui/tests/common/scenes/RoundRectClippingAnimation.cpp b/libs/hwui/tests/common/scenes/RoundRectClippingAnimation.cpp index 0f8906e97790..4b6632d244f5 100644 --- a/libs/hwui/tests/common/scenes/RoundRectClippingAnimation.cpp +++ b/libs/hwui/tests/common/scenes/RoundRectClippingAnimation.cpp @@ -28,7 +28,7 @@ public: std::vector< sp<RenderNode> > cards; void createContent(int width, int height, Canvas& canvas) override { - canvas.drawColor(0xFFFFFFFF, SkXfermode::kSrcOver_Mode); + canvas.drawColor(0xFFFFFFFF, SkBlendMode::kSrcOver); canvas.insertReorderBarrier(true); int ci = 0; @@ -37,7 +37,7 @@ public: auto color = BrightColors[ci++ % BrightColorsCount]; auto card = TestUtils::createNode(x, y, x + mSize, y + mSize, [&](RenderProperties& props, Canvas& canvas) { - canvas.drawColor(color, SkXfermode::kSrcOver_Mode); + canvas.drawColor(color, SkBlendMode::kSrcOver); props.mutableOutline().setRoundRect(0, 0, props.getWidth(), props.getHeight(), mSize * .25, 1); props.mutableOutline().setShouldClip(true); diff --git a/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp b/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp index cd00ed3b920d..3630935a809f 100644 --- a/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp +++ b/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp @@ -29,16 +29,16 @@ class SaveLayerAnimation : public TestScene { public: sp<RenderNode> card; void createContent(int width, int height, Canvas& canvas) override { - canvas.drawColor(Color::White, SkXfermode::kSrcOver_Mode); // background + canvas.drawColor(Color::White, SkBlendMode::kSrcOver); // background card = TestUtils::createNode(0, 0, 400, 800, [](RenderProperties& props, Canvas& canvas) { // nested clipped saveLayers canvas.saveLayerAlpha(0, 0, 400, 400, 200, SaveFlags::ClipToLayer); - canvas.drawColor(Color::Green_700, SkXfermode::kSrcOver_Mode); + canvas.drawColor(Color::Green_700, SkBlendMode::kSrcOver); canvas.clipRect(50, 50, 350, 350, SkRegion::kIntersect_Op); canvas.saveLayerAlpha(100, 100, 300, 300, 128, SaveFlags::ClipToLayer); - canvas.drawColor(Color::Blue_500, SkXfermode::kSrcOver_Mode); + canvas.drawColor(Color::Blue_500, SkBlendMode::kSrcOver); canvas.restore(); canvas.restore(); diff --git a/libs/hwui/tests/common/scenes/ShadowGrid2Animation.cpp b/libs/hwui/tests/common/scenes/ShadowGrid2Animation.cpp index d7d0c51208dc..0a69b62fe615 100644 --- a/libs/hwui/tests/common/scenes/ShadowGrid2Animation.cpp +++ b/libs/hwui/tests/common/scenes/ShadowGrid2Animation.cpp @@ -29,7 +29,7 @@ class ShadowGrid2Animation : public TestScene { public: std::vector< sp<RenderNode> > cards; void createContent(int width, int height, Canvas& canvas) override { - canvas.drawColor(0xFFFFFFFF, SkXfermode::kSrcOver_Mode); + canvas.drawColor(0xFFFFFFFF, SkBlendMode::kSrcOver); canvas.insertReorderBarrier(true); for (int x = dp(8); x < (width - dp(58)); x += dp(58)) { @@ -57,7 +57,7 @@ private: props.setElevation(dp(16)); props.mutableOutline().setRoundRect(0, 0, width, height, dp(6), 1); props.mutableOutline().setShouldClip(true); - canvas.drawColor(0xFFEEEEEE, SkXfermode::kSrcOver_Mode); + canvas.drawColor(0xFFEEEEEE, SkBlendMode::kSrcOver); }); } }; diff --git a/libs/hwui/tests/common/scenes/ShadowGridAnimation.cpp b/libs/hwui/tests/common/scenes/ShadowGridAnimation.cpp index 75362dd75d7c..4a024295cb25 100644 --- a/libs/hwui/tests/common/scenes/ShadowGridAnimation.cpp +++ b/libs/hwui/tests/common/scenes/ShadowGridAnimation.cpp @@ -29,7 +29,7 @@ class ShadowGridAnimation : public TestScene { public: std::vector< sp<RenderNode> > cards; void createContent(int width, int height, Canvas& canvas) override { - canvas.drawColor(0xFFFFFFFF, SkXfermode::kSrcOver_Mode); + canvas.drawColor(0xFFFFFFFF, SkBlendMode::kSrcOver); canvas.insertReorderBarrier(true); for (int x = dp(16); x < (width - dp(116)); x += dp(116)) { @@ -57,7 +57,7 @@ private: props.setElevation(dp(16)); props.mutableOutline().setRoundRect(0, 0, width, height, dp(6), 1); props.mutableOutline().setShouldClip(true); - canvas.drawColor(0xFFEEEEEE, SkXfermode::kSrcOver_Mode); + canvas.drawColor(0xFFEEEEEE, SkBlendMode::kSrcOver); }); } }; diff --git a/libs/hwui/tests/common/scenes/ShapeAnimation.cpp b/libs/hwui/tests/common/scenes/ShapeAnimation.cpp index e2370f7ccf58..5ef8773488b6 100644 --- a/libs/hwui/tests/common/scenes/ShapeAnimation.cpp +++ b/libs/hwui/tests/common/scenes/ShapeAnimation.cpp @@ -83,7 +83,7 @@ public: for (auto op : ops) { int innerCount = canvas.save(SaveFlags::MatrixClip); canvas.clipRect(0, 0, cellSize, cellSize, SkRegion::kIntersect_Op); - canvas.drawColor(Color::White, SkXfermode::Mode::kSrcOver_Mode); + canvas.drawColor(Color::White, SkBlendMode::kSrcOver); op(canvas, cellSize, paint); canvas.restoreToCount(innerCount); canvas.translate(cellSize + cellSpace, 0); @@ -94,7 +94,7 @@ public: } canvas.restoreToCount(outerCount); }); - canvas.drawColor(Color::Grey_500, SkXfermode::Mode::kSrcOver_Mode); + canvas.drawColor(Color::Grey_500, SkBlendMode::kSrcOver); canvas.drawRenderNode(card.get()); } diff --git a/libs/hwui/tests/common/scenes/TextAnimation.cpp b/libs/hwui/tests/common/scenes/TextAnimation.cpp index 29334025c33a..438f877deb3e 100644 --- a/libs/hwui/tests/common/scenes/TextAnimation.cpp +++ b/libs/hwui/tests/common/scenes/TextAnimation.cpp @@ -29,7 +29,7 @@ class TextAnimation : public TestScene { public: sp<RenderNode> card; void createContent(int width, int height, Canvas& canvas) override { - canvas.drawColor(Color::White, SkXfermode::kSrcOver_Mode); + canvas.drawColor(Color::White, SkBlendMode::kSrcOver); card = TestUtils::createNode(0, 0, width, height, [](RenderProperties& props, Canvas& canvas) { SkPaint paint; diff --git a/libs/hwui/tests/microbench/DisplayListCanvasBench.cpp b/libs/hwui/tests/microbench/DisplayListCanvasBench.cpp index 2787fba8fee2..10cf05aacd15 100644 --- a/libs/hwui/tests/microbench/DisplayListCanvasBench.cpp +++ b/libs/hwui/tests/microbench/DisplayListCanvasBench.cpp @@ -163,7 +163,7 @@ BENCHMARK(BM_CanvasState_translate); void BM_DisplayListCanvas_basicViewGroupDraw(benchmark::State& benchState) { sp<RenderNode> child = TestUtils::createNode(50, 50, 100, 100, [](auto& props, auto& canvas) { - canvas.drawColor(0xFFFFFFFF, SkXfermode::kSrcOver_Mode); + canvas.drawColor(0xFFFFFFFF, SkBlendMode::kSrcOver); }); std::unique_ptr<Canvas> canvas(Canvas::create_recording_canvas(100, 100)); diff --git a/libs/hwui/tests/unit/BakedOpDispatcherTests.cpp b/libs/hwui/tests/unit/BakedOpDispatcherTests.cpp index 9deb441c6e1c..d44be7dfbc3a 100644 --- a/libs/hwui/tests/unit/BakedOpDispatcherTests.cpp +++ b/libs/hwui/tests/unit/BakedOpDispatcherTests.cpp @@ -86,9 +86,7 @@ RENDERTHREAD_TEST(BakedOpDispatcher, pathTexture_positionOvalArc) { strokePaint.setStrokeWidth(4); float intervals[] = {1.0f, 1.0f}; - auto dashEffect = SkDashPathEffect::Create(intervals, 2, 0); - strokePaint.setPathEffect(dashEffect); - dashEffect->unref(); + strokePaint.setPathEffect(SkDashPathEffect::Make(intervals, 2, 0)); auto textureGlopVerifier = [] (const Glop& glop) { // validate glop produced by renderPathTexture (so texture, unit quad) @@ -167,7 +165,7 @@ RENDERTHREAD_TEST(BakedOpDispatcher, renderTextWithShadow) { shadowPaint.setColor(SK_ColorRED); SkScalar sigma = Blur::convertRadiusToSigma(5); - shadowPaint.setLooper(SkBlurDrawLooper::Create(SK_ColorWHITE, sigma, 3, 3))->unref(); + shadowPaint.setLooper(SkBlurDrawLooper::Make(SK_ColorWHITE, sigma, 3, 3)); TestUtils::drawUtf8ToCanvas(&canvas, "A", shadowPaint, 25, 25); TestUtils::drawUtf8ToCanvas(&canvas, "B", shadowPaint, 50, 50); @@ -202,8 +200,8 @@ static void validateLayerDraw(renderthread::RenderThread& renderThread, props.mutateLayerProperties().setType(LayerType::RenderLayer); // provide different blend mode, so decoration draws contrast - props.mutateLayerProperties().setXferMode(SkXfermode::Mode::kSrc_Mode); - canvas.drawColor(Color::Black, SkXfermode::Mode::kSrcOver_Mode); + props.mutateLayerProperties().setXferMode(SkBlendMode::kSrc); + canvas.drawColor(Color::Black, SkBlendMode::kSrcOver); }); OffscreenBuffer** layerHandle = node->getLayerHandle(); @@ -287,4 +285,4 @@ RENDERTHREAD_TEST(BakedOpDispatcher, pathTextureSnapping) { EXPECT_EQ(1, reinterpret_cast<PathTexture*>(texture)->left); EXPECT_EQ(3, reinterpret_cast<PathTexture*>(texture)->top); }); -}
\ No newline at end of file +} diff --git a/libs/hwui/tests/unit/FrameBuilderTests.cpp b/libs/hwui/tests/unit/FrameBuilderTests.cpp index 259686b11c81..0856472604cb 100644 --- a/libs/hwui/tests/unit/FrameBuilderTests.cpp +++ b/libs/hwui/tests/unit/FrameBuilderTests.cpp @@ -721,7 +721,7 @@ RENDERTHREAD_TEST(FrameBuilder, deferColorOp_unbounded) { auto unclippedColorView = TestUtils::createNode<RecordingCanvas>(0, 0, 10, 10, [](RenderProperties& props, RecordingCanvas& canvas) { props.setClipToBounds(false); - canvas.drawColor(SK_ColorWHITE, SkXfermode::Mode::kSrcOver_Mode); + canvas.drawColor(SK_ColorWHITE, SkBlendMode::kSrcOver); }); FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, @@ -974,7 +974,7 @@ RENDERTHREAD_TEST(FrameBuilder, saveLayerUnclipped_simple) { void onSimpleRectsOp(const SimpleRectsOp& op, const BakedOpState& state) override { EXPECT_EQ(1, mIndex++); ASSERT_NE(nullptr, op.paint); - ASSERT_EQ(SkXfermode::kClear_Mode, PaintUtils::getXfermodeDirect(op.paint)); + ASSERT_EQ(SkBlendMode::kClear, PaintUtils::getBlendModeDirect(op.paint)); } void onRectOp(const RectOp& op, const BakedOpState& state) override { EXPECT_EQ(2, mIndex++); @@ -1108,7 +1108,7 @@ RENDERTHREAD_TEST(FrameBuilder, saveLayerUnclipped_clearClip) { void onSimpleRectsOp(const SimpleRectsOp& op, const BakedOpState& state) override { EXPECT_EQ(1, mIndex++); ASSERT_NE(nullptr, op.paint); - EXPECT_EQ(SkXfermode::kClear_Mode, PaintUtils::getXfermodeDirect(op.paint)); + EXPECT_EQ(SkBlendMode::kClear, PaintUtils::getBlendModeDirect(op.paint)); EXPECT_EQ(Rect(50, 50, 150, 150), state.computedState.clippedBounds) << "Expect dirty rect as clip"; ASSERT_NE(nullptr, state.computedState.clipState); @@ -1433,7 +1433,7 @@ RENDERTHREAD_TEST(FrameBuilder, buildLayer) { auto node = TestUtils::createNode<RecordingCanvas>(10, 10, 110, 110, [](RenderProperties& props, RecordingCanvas& canvas) { props.mutateLayerProperties().setType(LayerType::RenderLayer); - canvas.drawColor(SK_ColorWHITE, SkXfermode::Mode::kSrcOver_Mode); + canvas.drawColor(SK_ColorWHITE, SkBlendMode::kSrcOver); }); OffscreenBuffer** layerHandle = node->getLayerHandle(); @@ -2196,7 +2196,7 @@ RENDERTHREAD_TEST(FrameBuilder, clip_replace) { auto node = TestUtils::createNode<RecordingCanvas>(20, 20, 30, 30, [](RenderProperties& props, RecordingCanvas& canvas) { canvas.clipRect(0, -20, 10, 30, SkRegion::kReplace_Op); - canvas.drawColor(SK_ColorWHITE, SkXfermode::Mode::kSrcOver_Mode); + canvas.drawColor(SK_ColorWHITE, SkBlendMode::kSrcOver); }); FrameBuilder frameBuilder(SkRect::MakeLTRB(10, 10, 40, 40), 50, 50, diff --git a/libs/hwui/tests/unit/RecordingCanvasTests.cpp b/libs/hwui/tests/unit/RecordingCanvasTests.cpp index edc7191459b7..46e685cd772a 100644 --- a/libs/hwui/tests/unit/RecordingCanvasTests.cpp +++ b/libs/hwui/tests/unit/RecordingCanvasTests.cpp @@ -249,7 +249,7 @@ TEST(RecordingCanvas, drawGlyphs_forceAlignLeft) { TEST(RecordingCanvas, drawColor) { auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) { - canvas.drawColor(Color::Black, SkXfermode::kSrcOver_Mode); + canvas.drawColor(Color::Black, SkBlendMode::kSrcOver); }); ASSERT_EQ(1u, dl->getOps().size()) << "Must be exactly one op"; @@ -639,7 +639,7 @@ TEST(RecordingCanvas, replaceClipIntersectWithRoot) { auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 100, [](RecordingCanvas& canvas) { canvas.save(SaveFlags::MatrixClip); canvas.clipRect(-10, -10, 110, 110, SkRegion::kReplace_Op); - canvas.drawColor(SK_ColorWHITE, SkXfermode::Mode::kSrcOver_Mode); + canvas.drawColor(SK_ColorWHITE, SkBlendMode::kSrcOver); canvas.restore(); }); ASSERT_EQ(1u, dl->getOps().size()) << "Must have one op"; @@ -773,7 +773,7 @@ TEST(RecordingCanvas, refBitmapInShader_composeShader) { SkShader::TileMode::kRepeat_TileMode); sk_sp<SkShader> composeShader = SkShader::MakeComposeShader(std::move(shader1), std::move(shader2), - SkXfermode::Mode::kMultiply_Mode); + SkXfermode::kMultiply_Mode); paint.setShader(std::move(composeShader)); canvas.drawRoundRect(0, 0, 100, 100, 20.0f, 20.0f, paint); }); diff --git a/libs/hwui/tests/unit/RenderNodeTests.cpp b/libs/hwui/tests/unit/RenderNodeTests.cpp index 0d90afa06ab4..307d16dc18e0 100644 --- a/libs/hwui/tests/unit/RenderNodeTests.cpp +++ b/libs/hwui/tests/unit/RenderNodeTests.cpp @@ -41,7 +41,7 @@ public: TEST(RenderNode, hasParents) { auto child = TestUtils::createNode(0, 0, 200, 400, [](RenderProperties& props, Canvas& canvas) { - canvas.drawColor(Color::Red_500, SkXfermode::kSrcOver_Mode); + canvas.drawColor(Color::Red_500, SkBlendMode::kSrcOver); }); auto parent = TestUtils::createNode(0, 0, 200, 400, [&child](RenderProperties& props, Canvas& canvas) { @@ -54,7 +54,7 @@ TEST(RenderNode, hasParents) { EXPECT_FALSE(parent->hasParents()) << "Root node shouldn't have any parents"; TestUtils::recordNode(*parent, [](Canvas& canvas) { - canvas.drawColor(Color::Amber_500, SkXfermode::kSrcOver_Mode); + canvas.drawColor(Color::Amber_500, SkBlendMode::kSrcOver); }); EXPECT_TRUE(child->hasParents()) << "Child should still have a parent"; @@ -117,7 +117,7 @@ RENDERTHREAD_TEST(RenderNode, prepareTree_nullableDisplayList) { { auto nonNullDLNode = TestUtils::createNode(0, 0, 200, 400, [](RenderProperties& props, Canvas& canvas) { - canvas.drawColor(Color::Red_500, SkXfermode::kSrcOver_Mode); + canvas.drawColor(Color::Red_500, SkBlendMode::kSrcOver); }); TestUtils::syncHierarchyPropertiesAndDisplayList(nonNullDLNode); EXPECT_TRUE(nonNullDLNode->getDisplayList()); diff --git a/libs/hwui/tests/unit/SkiaBehaviorTests.cpp b/libs/hwui/tests/unit/SkiaBehaviorTests.cpp index 5cab04d26c2a..1f4788abbeb0 100644 --- a/libs/hwui/tests/unit/SkiaBehaviorTests.cpp +++ b/libs/hwui/tests/unit/SkiaBehaviorTests.cpp @@ -57,8 +57,8 @@ TEST(SkiaBehavior, genIds) { TEST(SkiaBehavior, lightingColorFilter_simplify) { { - SkAutoTUnref<SkColorFilter> filter( - SkColorMatrixFilter::CreateLightingFilter(0x11223344, 0)); + sk_sp<SkColorFilter> filter( + SkColorMatrixFilter::MakeLightingFilter(0x11223344, 0)); SkColor observedColor; SkXfermode::Mode observedMode; @@ -68,20 +68,20 @@ TEST(SkiaBehavior, lightingColorFilter_simplify) { } { - SkAutoTUnref<SkColorFilter> failFilter( - SkColorMatrixFilter::CreateLightingFilter(0x11223344, 0x1)); + sk_sp<SkColorFilter> failFilter( + SkColorMatrixFilter::MakeLightingFilter(0x11223344, 0x1)); EXPECT_FALSE(failFilter->asColorMode(nullptr, nullptr)); } } TEST(SkiaBehavior, porterDuffCreateIsCached) { SkPaint paint; - paint.setXfermodeMode(SkXfermode::kOverlay_Mode); - auto expected = paint.getXfermode(); - paint.setXfermodeMode(SkXfermode::kClear_Mode); - ASSERT_NE(expected, paint.getXfermode()); - paint.setXfermodeMode(SkXfermode::kOverlay_Mode); - ASSERT_EQ(expected, paint.getXfermode()); + paint.setBlendMode(SkBlendMode::kOverlay); + auto expected = paint.getBlendMode(); + paint.setBlendMode(SkBlendMode::kClear); + ASSERT_NE(expected, paint.getBlendMode()); + paint.setBlendMode(SkBlendMode::kOverlay); + ASSERT_EQ(expected, paint.getBlendMode()); } TEST(SkiaBehavior, srgbColorSpaceIsSingleton) { diff --git a/libs/hwui/tests/unit/SkiaCanvasTests.cpp b/libs/hwui/tests/unit/SkiaCanvasTests.cpp index 5a011938e2bb..451596d31761 100644 --- a/libs/hwui/tests/unit/SkiaCanvasTests.cpp +++ b/libs/hwui/tests/unit/SkiaCanvasTests.cpp @@ -45,7 +45,7 @@ TEST(SkiaCanvasProxy, drawGlyphsViaPicture) { SkCanvas* skCanvas = recorder.beginRecording(200, 200, NULL, 0); std::unique_ptr<Canvas> pictCanvas(Canvas::create_canvas(skCanvas)); TestUtils::drawUtf8ToCanvas(pictCanvas.get(), text, paint, 25, 25); - SkAutoTUnref<const SkPicture> picture(recorder.endRecording()); + sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture()); canvas.asSkCanvas()->drawPicture(picture); }); diff --git a/libs/hwui/utils/NinePatchImpl.cpp b/libs/hwui/utils/NinePatchImpl.cpp index d37126c91e9a..cef214be6a85 100644 --- a/libs/hwui/utils/NinePatchImpl.cpp +++ b/libs/hwui/utils/NinePatchImpl.cpp @@ -134,7 +134,7 @@ void NinePatch::Draw(SkCanvas* canvas, const SkRect& bounds, if (bounds.isEmpty() || bitmap.width() == 0 || bitmap.height() == 0 || - (paint && paint->getXfermode() == NULL && paint->getAlpha() == 0)) + (paint && paint->isSrcOver() && paint->getAlpha() == 0)) { if (kUseTrace) { ALOGV("======== abort ninepatch draw\n"); @@ -149,7 +149,7 @@ void NinePatch::Draw(SkCanvas* canvas, const SkRect& bounds, if (bitmap.getPixels() == NULL) return; - const bool hasXfer = paint->getXfermode() != NULL; + const bool hasXfer = !paint->isSrcOver(); SkRect dst; SkIRect src; diff --git a/libs/hwui/utils/PaintUtils.h b/libs/hwui/utils/PaintUtils.h index 4faab9a5f648..710e06382772 100644 --- a/libs/hwui/utils/PaintUtils.h +++ b/libs/hwui/utils/PaintUtils.h @@ -33,18 +33,6 @@ namespace uirenderer { class PaintUtils { public: - /** - * Safely retrieves the mode from the specified xfermode. If the specified - * xfermode is null, the mode is assumed to be SkXfermode::kSrcOver_Mode. - */ - static inline SkXfermode::Mode getXfermode(SkXfermode* mode) { - SkXfermode::Mode resultMode; - if (!SkXfermode::AsMode(mode, &resultMode)) { - resultMode = SkXfermode::kSrcOver_Mode; - } - return resultMode; - } - static inline GLenum getFilter(const SkPaint* paint) { if (!paint || paint->getFilterQuality() != kNone_SkFilterQuality) { return GL_LINEAR; @@ -56,7 +44,7 @@ public: static inline bool paintWillNotDraw(const SkPaint& paint) { return paint.getAlpha() == 0 && !paint.getColorFilter() - && getXfermode(paint.getXfermode()) == SkXfermode::kSrcOver_Mode; + && paint.getBlendMode() == SkBlendMode::kSrcOver; } // TODO: move to a method on android:Paint? replace with SkPaint::nothingToDraw()? @@ -64,7 +52,7 @@ public: return paint.getAlpha() == 0 && paint.getLooper() == nullptr && !paint.getColorFilter() - && getXfermode(paint.getXfermode()) == SkXfermode::kSrcOver_Mode; + && paint.getBlendMode() == SkBlendMode::kSrcOver; } static bool isOpaquePaint(const SkPaint* paint) { @@ -77,9 +65,9 @@ public: } // Only let simple srcOver / src blending modes declare opaque, since behavior is clear. - SkXfermode::Mode mode = getXfermode(paint->getXfermode()); - return mode == SkXfermode::Mode::kSrcOver_Mode - || mode == SkXfermode::Mode::kSrc_Mode; + SkBlendMode mode = paint->getBlendMode(); + return mode == SkBlendMode::kSrcOver + || mode == SkBlendMode::kSrc; } static bool isBlendedShader(const SkShader* shader) { @@ -121,8 +109,8 @@ public: return getTextShadow(paint, nullptr); } - static inline SkXfermode::Mode getXfermodeDirect(const SkPaint* paint) { - return paint ? getXfermode(paint->getXfermode()) : SkXfermode::kSrcOver_Mode; + static inline SkBlendMode getBlendModeDirect(const SkPaint* paint) { + return paint ? paint->getBlendMode() : SkBlendMode::kSrcOver; } static inline int getAlphaDirect(const SkPaint* paint) { diff --git a/libs/input/SpriteController.cpp b/libs/input/SpriteController.cpp index 0bc832a8fb37..6941dba28d6f 100644 --- a/libs/input/SpriteController.cpp +++ b/libs/input/SpriteController.cpp @@ -216,7 +216,7 @@ void SpriteController::doUpdateSprites() { SkCanvas surfaceCanvas(surfaceBitmap); SkPaint paint; - paint.setXfermodeMode(SkXfermode::kSrc_Mode); + paint.setBlendMode(SkBlendMode::kSrc); surfaceCanvas.drawBitmap(update.state.icon.bitmap, 0, 0, &paint); if (outBuffer.width > update.state.icon.bitmap.width()) { |