| Index: gm/gradients.cpp
|
| diff --git a/gm/gradients.cpp b/gm/gradients.cpp
|
| index 4a687025596d0ccdbb10c21d044c754511f8a239..d5638147045d5c197f6b743e037c3f295c3e4eb3 100644
|
| --- a/gm/gradients.cpp
|
| +++ b/gm/gradients.cpp
|
| @@ -12,14 +12,22 @@
|
| namespace skiagm {
|
|
|
| struct GradData {
|
| - int fCount;
|
| - const SkColor* fColors;
|
| - const SkScalar* fPos;
|
| + int fCount;
|
| + const SkColor* fColors;
|
| + const SkColor4f* fColors4f;
|
| + const SkScalar* fPos;
|
| };
|
|
|
| constexpr SkColor gColors[] = {
|
| SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK
|
| };
|
| +constexpr SkColor4f gColors4f[] ={
|
| + { 1.0f, 0.0f, 0.0f, 1.0f }, // Red
|
| + { 0.0f, 1.0f, 0.0f, 1.0f }, // Green
|
| + { 0.0f, 0.0f, 1.0f, 1.0f }, // Blue
|
| + { 1.0f, 1.0f, 1.0f, 1.0f }, // White
|
| + { 0.0f, 0.0f, 0.0f, 1.0f } // Black
|
| +};
|
| constexpr SkScalar gPos0[] = { 0, SK_Scalar1 };
|
| constexpr SkScalar gPos1[] = { SK_Scalar1/4, SK_Scalar1*3/4 };
|
| constexpr SkScalar gPos2[] = {
|
| @@ -30,14 +38,19 @@ constexpr SkScalar gPosClamp[] = {0.0f, 0.0f, 1.0f, 1.0f};
|
| constexpr SkColor gColorClamp[] = {
|
| SK_ColorRED, SK_ColorGREEN, SK_ColorGREEN, SK_ColorBLUE
|
| };
|
| -
|
| +constexpr SkColor4f gColor4fClamp[] ={
|
| + { 1.0f, 0.0f, 0.0f, 1.0f }, // Red
|
| + { 0.0f, 1.0f, 0.0f, 1.0f }, // Green
|
| + { 0.0f, 1.0f, 0.0f, 1.0f }, // Green
|
| + { 0.0f, 0.0f, 1.0f, 1.0f } // Blue
|
| +};
|
| constexpr GradData gGradData[] = {
|
| - { 2, gColors, nullptr },
|
| - { 2, gColors, gPos0 },
|
| - { 2, gColors, gPos1 },
|
| - { 5, gColors, nullptr },
|
| - { 5, gColors, gPos2 },
|
| - { 4, gColorClamp, gPosClamp }
|
| + { 2, gColors, gColors4f, nullptr },
|
| + { 2, gColors, gColors4f, gPos0 },
|
| + { 2, gColors, gColors4f, gPos1 },
|
| + { 5, gColors, gColors4f, nullptr },
|
| + { 5, gColors, gColors4f, gPos2 },
|
| + { 4, gColorClamp, gColor4fClamp, gPosClamp }
|
| };
|
|
|
| static sk_sp<SkShader> MakeLinear(const SkPoint pts[2], const GradData& data,
|
| @@ -46,6 +59,13 @@ static sk_sp<SkShader> MakeLinear(const SkPoint pts[2], const GradData& data,
|
| &localMatrix);
|
| }
|
|
|
| +static sk_sp<SkShader> MakeLinear4f(const SkPoint pts[2], const GradData& data,
|
| + SkShader::TileMode tm, const SkMatrix& localMatrix) {
|
| + auto srgb = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named)->makeLinearGamma();
|
| + return SkGradientShader::MakeLinear(pts, data.fColors4f, srgb, data.fPos, data.fCount, tm, 0,
|
| + &localMatrix);
|
| +}
|
| +
|
| static sk_sp<SkShader> MakeRadial(const SkPoint pts[2], const GradData& data,
|
| SkShader::TileMode tm, const SkMatrix& localMatrix) {
|
| SkPoint center;
|
| @@ -55,6 +75,16 @@ static sk_sp<SkShader> MakeRadial(const SkPoint pts[2], const GradData& data,
|
| tm, 0, &localMatrix);
|
| }
|
|
|
| +static sk_sp<SkShader> MakeRadial4f(const SkPoint pts[2], const GradData& data,
|
| + SkShader::TileMode tm, const SkMatrix& localMatrix) {
|
| + SkPoint center;
|
| + center.set(SkScalarAve(pts[0].fX, pts[1].fX),
|
| + SkScalarAve(pts[0].fY, pts[1].fY));
|
| + auto srgb = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named)->makeLinearGamma();
|
| + return SkGradientShader::MakeRadial(center, center.fX, data.fColors4f, srgb, data.fPos,
|
| + data.fCount, tm, 0, &localMatrix);
|
| +}
|
| +
|
| static sk_sp<SkShader> MakeSweep(const SkPoint pts[2], const GradData& data,
|
| SkShader::TileMode, const SkMatrix& localMatrix) {
|
| SkPoint center;
|
| @@ -64,6 +94,16 @@ static sk_sp<SkShader> MakeSweep(const SkPoint pts[2], const GradData& data,
|
| 0, &localMatrix);
|
| }
|
|
|
| +static sk_sp<SkShader> MakeSweep4f(const SkPoint pts[2], const GradData& data,
|
| + SkShader::TileMode, const SkMatrix& localMatrix) {
|
| + SkPoint center;
|
| + center.set(SkScalarAve(pts[0].fX, pts[1].fX),
|
| + SkScalarAve(pts[0].fY, pts[1].fY));
|
| + auto srgb = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named)->makeLinearGamma();
|
| + return SkGradientShader::MakeSweep(center.fX, center.fY, data.fColors4f, srgb, data.fPos,
|
| + data.fCount, 0, &localMatrix);
|
| +}
|
| +
|
| static sk_sp<SkShader> Make2Radial(const SkPoint pts[2], const GradData& data,
|
| SkShader::TileMode tm, const SkMatrix& localMatrix) {
|
| SkPoint center0, center1;
|
| @@ -77,8 +117,22 @@ static sk_sp<SkShader> Make2Radial(const SkPoint pts[2], const GradData& data,
|
| 0, &localMatrix);
|
| }
|
|
|
| +static sk_sp<SkShader> Make2Radial4f(const SkPoint pts[2], const GradData& data,
|
| + SkShader::TileMode tm, const SkMatrix& localMatrix) {
|
| + SkPoint center0, center1;
|
| + center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
|
| + SkScalarAve(pts[0].fY, pts[1].fY));
|
| + center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3) / 5),
|
| + SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1) / 4));
|
| + auto srgb = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named)->makeLinearGamma();
|
| + return SkGradientShader::MakeTwoPointConical(center1, (pts[1].fX - pts[0].fX) / 7,
|
| + center0, (pts[1].fX - pts[0].fX) / 2,
|
| + data.fColors4f, srgb, data.fPos, data.fCount, tm,
|
| + 0, &localMatrix);
|
| +}
|
| +
|
| static sk_sp<SkShader> Make2Conical(const SkPoint pts[2], const GradData& data,
|
| - SkShader::TileMode tm, const SkMatrix& localMatrix) {
|
| + SkShader::TileMode tm, const SkMatrix& localMatrix) {
|
| SkPoint center0, center1;
|
| SkScalar radius0 = (pts[1].fX - pts[0].fX) / 10;
|
| SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
|
| @@ -89,11 +143,27 @@ static sk_sp<SkShader> Make2Conical(const SkPoint pts[2], const GradData& data,
|
| data.fCount, tm, 0, &localMatrix);
|
| }
|
|
|
| +static sk_sp<SkShader> Make2Conical4f(const SkPoint pts[2], const GradData& data,
|
| + SkShader::TileMode tm, const SkMatrix& localMatrix) {
|
| + SkPoint center0, center1;
|
| + SkScalar radius0 = (pts[1].fX - pts[0].fX) / 10;
|
| + SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
|
| + center0.set(pts[0].fX + radius0, pts[0].fY + radius0);
|
| + center1.set(pts[1].fX - radius1, pts[1].fY - radius1);
|
| + auto srgb = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named)->makeLinearGamma();
|
| + return SkGradientShader::MakeTwoPointConical(center1, radius1, center0, radius0,
|
| + data.fColors4f, srgb, data.fPos,
|
| + data.fCount, tm, 0, &localMatrix);
|
| +}
|
| +
|
| typedef sk_sp<SkShader> (*GradMaker)(const SkPoint pts[2], const GradData& data,
|
| SkShader::TileMode tm, const SkMatrix& localMatrix);
|
| constexpr GradMaker gGradMakers[] = {
|
| MakeLinear, MakeRadial, MakeSweep, Make2Radial, Make2Conical
|
| };
|
| +constexpr GradMaker gGradMakers4f[] ={
|
| + MakeLinear4f, MakeRadial4f, MakeSweep4f, Make2Radial4f, Make2Conical4f
|
| +};
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| @@ -152,6 +222,62 @@ private:
|
| DEF_GM( return new GradientsGM(true); )
|
| DEF_GM( return new GradientsGM(false); )
|
|
|
| +// Like the original gradients GM, but using the SkColor4f shader factories. Should be identical.
|
| +class Gradients4fGM : public GM {
|
| +public:
|
| + Gradients4fGM(bool dither) : fDither(dither) {
|
| + this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
|
| + }
|
| +
|
| +protected:
|
| +
|
| + SkString onShortName() {
|
| + return SkString(fDither ? "gradients4f" : "gradients4f_nodither");
|
| + }
|
| +
|
| + virtual SkISize onISize() { return SkISize::Make(840, 815); }
|
| +
|
| + virtual void onDraw(SkCanvas* canvas) {
|
| +
|
| + SkPoint pts[2] ={
|
| + { 0, 0 },
|
| + { SkIntToScalar(100), SkIntToScalar(100) }
|
| + };
|
| + SkShader::TileMode tm = SkShader::kClamp_TileMode;
|
| + SkRect r ={ 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
|
| + SkPaint paint;
|
| + paint.setAntiAlias(true);
|
| + paint.setDither(fDither);
|
| +
|
| + canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
|
| + for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
|
| + canvas->save();
|
| + for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers4f); j++) {
|
| + SkMatrix scale = SkMatrix::I();
|
| +
|
| + if (i == 5) { // if the clamp case
|
| + scale.setScale(0.5f, 0.5f);
|
| + scale.postTranslate(25.f, 25.f);
|
| + }
|
| +
|
| + paint.setShader(gGradMakers4f[j](pts, gGradData[i], tm, scale));
|
| + canvas->drawRect(r, paint);
|
| + canvas->translate(0, SkIntToScalar(120));
|
| + }
|
| + canvas->restore();
|
| + canvas->translate(SkIntToScalar(120), 0);
|
| + }
|
| + }
|
| +
|
| +protected:
|
| + bool fDither;
|
| +
|
| +private:
|
| + typedef GM INHERITED;
|
| +};
|
| +DEF_GM(return new Gradients4fGM(true); )
|
| +DEF_GM(return new Gradients4fGM(false); )
|
| +
|
| // Based on the original gradient slide, but with perspective applied to the
|
| // gradient shaders' local matrices
|
| class GradientsLocalPerspectiveGM : public GM {
|
|
|