Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fc42a99e authored by Nader Jawad's avatar Nader Jawad
Browse files

Create wrapper around Shader native implementation

Created Shader classes to wrap existing shader classes
in the framework in order to handle creation of either an
SkShader or SkImageFilter.
Updated native Paint implementation to optionally configure
the currently configured SkShader or SkImageFilter

Bug: 143468037
Test: re-ran CtsGraphicsTestCases and CtsUiRenderingTestCases
Change-Id: I7663b92766c912ab3866cf4e39b268f6dcf5d8e2
parent 7fc13e85
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -3111,7 +3111,7 @@ public class Paint {
    @CriticalNative
    private static native boolean nGetFillPath(long paintPtr, long src, long dst);
    @CriticalNative
    private static native long nSetShader(long paintPtr, long shader);
    private static native void nSetShader(long paintPtr, long shader);
    @CriticalNative
    private static native long nSetColorFilter(long paintPtr, long filter);
    @CriticalNative
+7 −0
Original line number Diff line number Diff line
@@ -462,6 +462,13 @@ cc_defaults {
        "RenderNode.cpp",
        "RenderProperties.cpp",
        "RootRenderNode.cpp",
        "shader/Shader.cpp",
        "shader/BitmapShader.cpp",
        "shader/ComposeShader.cpp",
        "shader/LinearGradientShader.cpp",
        "shader/RadialGradientShader.cpp",
        "shader/RuntimeShader.cpp",
        "shader/SweepGradientShader.cpp",
        "SkiaCanvas.cpp",
        "VectorDrawable.cpp",
    ],
+6 −1
Original line number Diff line number Diff line
@@ -42,6 +42,8 @@
#include <SkTextBlob.h>
#include <SkVertices.h>

#include <shader/BitmapShader.h>

#include <memory>
#include <optional>
#include <utility>
@@ -49,6 +51,7 @@
namespace android {

using uirenderer::PaintUtils;
using uirenderer::BitmapShader;

Canvas* Canvas::create_canvas(const SkBitmap& bitmap) {
    return new SkiaCanvas(bitmap);
@@ -681,7 +684,9 @@ void SkiaCanvas::drawBitmapMesh(Bitmap& bitmap, int meshWidth, int meshHeight,
    if (paint) {
        pnt = *paint;
    }
    pnt.setShader(bitmap.makeImage()->makeShader());

    pnt.setShader(sk_ref_sp(new BitmapShader(
            bitmap.makeImage(), SkTileMode::kClamp, SkTileMode::kClamp, nullptr)));
    auto v = builder.detach();
    apply_looper(&pnt, [&](const SkPaint& p) {
        mCanvas->drawVertices(v, SkBlendMode::kModulate, p);
+3 −4
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@
#include "PathParser.h"
#include "SkColorFilter.h"
#include "SkImageInfo.h"
#include "SkShader.h"
#include "hwui/Paint.h"

#ifdef __ANDROID__
@@ -159,10 +158,10 @@ void FullPath::draw(SkCanvas* outCanvas, bool useStagingData) {

    // Draw path's fill, if fill color or gradient is valid
    bool needsFill = false;
    SkPaint paint;
    Paint paint;
    if (properties.getFillGradient() != nullptr) {
        paint.setColor(applyAlpha(SK_ColorBLACK, properties.getFillAlpha()));
        paint.setShader(sk_sp<SkShader>(SkSafeRef(properties.getFillGradient())));
        paint.setShader(sk_sp<Shader>(SkSafeRef(properties.getFillGradient())));
        needsFill = true;
    } else if (properties.getFillColor() != SK_ColorTRANSPARENT) {
        paint.setColor(applyAlpha(properties.getFillColor(), properties.getFillAlpha()));
@@ -179,7 +178,7 @@ void FullPath::draw(SkCanvas* outCanvas, bool useStagingData) {
    bool needsStroke = false;
    if (properties.getStrokeGradient() != nullptr) {
        paint.setColor(applyAlpha(SK_ColorBLACK, properties.getStrokeAlpha()));
        paint.setShader(sk_sp<SkShader>(SkSafeRef(properties.getStrokeGradient())));
        paint.setShader(sk_sp<Shader>(SkSafeRef(properties.getStrokeGradient())));
        needsStroke = true;
    } else if (properties.getStrokeColor() != SK_ColorTRANSPARENT) {
        paint.setColor(applyAlpha(properties.getStrokeColor(), properties.getStrokeAlpha()));
+7 −7
Original line number Diff line number Diff line
@@ -31,8 +31,8 @@
#include <SkPath.h>
#include <SkPathMeasure.h>
#include <SkRect.h>
#include <SkShader.h>
#include <SkSurface.h>
#include <shader/Shader.h>

#include <cutils/compiler.h>
#include <stddef.h>
@@ -227,20 +227,20 @@ public:
            strokeGradient = prop.strokeGradient;
            onPropertyChanged();
        }
        void setFillGradient(SkShader* gradient) {
        void setFillGradient(Shader* gradient) {
            if (fillGradient.get() != gradient) {
                fillGradient = sk_ref_sp(gradient);
                onPropertyChanged();
            }
        }
        void setStrokeGradient(SkShader* gradient) {
        void setStrokeGradient(Shader* gradient) {
            if (strokeGradient.get() != gradient) {
                strokeGradient = sk_ref_sp(gradient);
                onPropertyChanged();
            }
        }
        SkShader* getFillGradient() const { return fillGradient.get(); }
        SkShader* getStrokeGradient() const { return strokeGradient.get(); }
        Shader* getFillGradient() const { return fillGradient.get(); }
        Shader* getStrokeGradient() const { return strokeGradient.get(); }
        float getStrokeWidth() const { return mPrimitiveFields.strokeWidth; }
        void setStrokeWidth(float strokeWidth) {
            VD_SET_PRIMITIVE_FIELD_AND_NOTIFY(strokeWidth, strokeWidth);
@@ -320,8 +320,8 @@ public:
            count,
        };
        PrimitiveFields mPrimitiveFields;
        sk_sp<SkShader> fillGradient;
        sk_sp<SkShader> strokeGradient;
        sk_sp<Shader> fillGradient;
        sk_sp<Shader> strokeGradient;
    };

    // Called from UI thread
Loading