From 42309d415e56f6fbeeea8239479d3f4ccf81a5ac Mon Sep 17 00:00:00 2001 From: "reed@android.com" Date: Mon, 22 Jun 2009 02:06:35 +0000 Subject: [PATCH] add gm for gradients git-svn-id: http://skia.googlecode.com/svn/trunk@230 2bbb7eff-a529-9590-31e7-b0007b416f81 --- Makefile | 2 +- gm/gradients.cpp | 113 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 gm/gradients.cpp diff --git a/Makefile b/Makefile index 4c5bc61a9..9b42de02a 100644 --- a/Makefile +++ b/Makefile @@ -132,7 +132,7 @@ skimage: $(SKIMAGE_OBJS) out/libskia.a ############################################################################## -GM_SRCS := gmmain.cpp xfermodes.cpp +GM_SRCS := gmmain.cpp xfermodes.cpp gradients.cpp GM_SRCS := $(addprefix gm/, $(GM_SRCS)) GM_OBJS := $(GM_SRCS:.cpp=.o) diff --git a/gm/gradients.cpp b/gm/gradients.cpp new file mode 100644 index 000000000..aed4e0b14 --- /dev/null +++ b/gm/gradients.cpp @@ -0,0 +1,113 @@ +#include "gm.h" +#include "SkGradientShader.h" + +namespace skiagm { + +struct GradData { + int fCount; + const SkColor* fColors; + const SkScalar* fPos; +}; + +static const SkColor gColors[] = { + SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK +}; +static const SkScalar gPos0[] = { 0, SK_Scalar1 }; +static const SkScalar gPos1[] = { SK_Scalar1/4, SK_Scalar1*3/4 }; +static const SkScalar gPos2[] = { + 0, SK_Scalar1/8, SK_Scalar1/2, SK_Scalar1*7/8, SK_Scalar1 +}; + +static const GradData gGradData[] = { + { 2, gColors, NULL }, + { 2, gColors, gPos0 }, + { 2, gColors, gPos1 }, + { 5, gColors, NULL }, + { 5, gColors, gPos2 } +}; + +static SkShader* MakeLinear(const SkPoint pts[2], const GradData& data, + SkShader::TileMode tm, SkUnitMapper* mapper) { + return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos, + data.fCount, tm, mapper); +} + +static SkShader* MakeRadial(const SkPoint pts[2], const GradData& data, + SkShader::TileMode tm, SkUnitMapper* mapper) { + SkPoint center; + center.set(SkScalarAve(pts[0].fX, pts[1].fX), + SkScalarAve(pts[0].fY, pts[1].fY)); + return SkGradientShader::CreateRadial(center, center.fX, data.fColors, + data.fPos, data.fCount, tm, mapper); +} + +static SkShader* MakeSweep(const SkPoint pts[2], const GradData& data, + SkShader::TileMode tm, SkUnitMapper* mapper) { + SkPoint center; + center.set(SkScalarAve(pts[0].fX, pts[1].fX), + SkScalarAve(pts[0].fY, pts[1].fY)); + return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors, + data.fPos, data.fCount, mapper); +} + +typedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data, + SkShader::TileMode tm, SkUnitMapper* mapper); +static const GradMaker gGradMakers[] = { + MakeLinear, MakeRadial, MakeSweep +}; + +/////////////////////////////////////////////////////////////////////////////// + +class GradientsGM : public GM { +public: + GradientsGM() {} + +protected: + SkString onShortName() { + return SkString("gradients"); + } + + SkISize onISize() { return make_isize(640, 380); } + + void drawBG(SkCanvas* canvas) { + canvas->drawColor(0xFFDDDDDD); + } + + virtual void onDraw(SkCanvas* canvas) { + this->drawBG(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); + + 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(gGradMakers); j++) { + SkShader* shader = gGradMakers[j](pts, gGradData[i], tm, NULL); + paint.setShader(shader); + canvas->drawRect(r, paint); + shader->unref(); + canvas->translate(0, SkIntToScalar(120)); + } + canvas->restore(); + canvas->translate(SkIntToScalar(120), 0); + } + } + +private: + typedef GM INHERITED; +}; + +/////////////////////////////////////////////////////////////////////////////// + +static GM* MyFactory(void*) { return new GradientsGM; } +static GMRegistry reg(MyFactory); + +} +