| Index: gm/gradient_matrix.cpp
|
| diff --git a/gm/gradient_matrix.cpp b/gm/gradient_matrix.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..cc1683e08939a197b9c0f246031faba68c8d700d
|
| --- /dev/null
|
| +++ b/gm/gradient_matrix.cpp
|
| @@ -0,0 +1,111 @@
|
| +/*
|
| + * Copyright 2013 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#include "SkCanvas.h"
|
| +#include "SkColor.h"
|
| +#include "SkGradientShader.h"
|
| +#include "SkMatrix.h"
|
| +#include "SkPaint.h"
|
| +#include "SkPoint.h"
|
| +#include "SkRect.h"
|
| +#include "SkRefCnt.h"
|
| +#include "SkScalar.h"
|
| +#include "SkSize.h"
|
| +#include "SkString.h"
|
| +
|
| +#include "gm.h"
|
| +
|
| +static const SkColor gColors[] = {
|
| + SK_ColorRED, SK_ColorYELLOW
|
| +};
|
| +
|
| +// these arrays define the gradient stop points
|
| +// as x1, y1, x2, y2 per gradient to draw
|
| +static const SkPoint linearPts[][2] = {
|
| + {{0, 0}, {1, 0}},
|
| + {{0, 0}, {0, 1}},
|
| + {{1, 0}, {0, 0}},
|
| + {{0, 1}, {0, 0}},
|
| +
|
| + {{0, 0}, {1, 1}},
|
| + {{1, 1}, {0, 0}},
|
| + {{1, 0}, {0, 1}},
|
| + {{0, 1}, {1, 0}}
|
| +};
|
| +
|
| +static const SkScalar TESTGRID_X = 200; // pixels allocated to each image in x dimension
|
| +static const SkScalar TESTGRID_Y = 200; // pixels allocated to each image in y dimension
|
| +
|
| +static const int IMAGES_X = 4; // number of images per row
|
| +
|
| +static SkShader* make_linear_gradient(const SkPoint pts[2]) {
|
| + return SkGradientShader::CreateLinear(pts, gColors, NULL, SK_ARRAY_COUNT(gColors),
|
| + SkShader::kClamp_TileMode, NULL);
|
| +}
|
| +
|
| +static void draw_gradients(SkCanvas* canvas, SkShader* (*makeShader)(const SkPoint[2]),
|
| + const SkPoint ptsArray[][2], int numImages) {
|
| + // Use some nice prime numbers for the rectangle and matrix with
|
| + // different scaling along the x and y axes (which is the bug this
|
| + // test addresses, where incorrect order of operations mixed up the axes)
|
| + SkRect rectGrad = { 43, 61, 181, 167 };
|
| + SkMatrix shaderMat;
|
| + shaderMat.setScale(rectGrad.width(), rectGrad.height());
|
| + shaderMat.postTranslate(rectGrad.left(), rectGrad.top());
|
| +
|
| + canvas->save();
|
| + for (int i = 0; i < numImages; i++) {
|
| + // Advance line downwards if necessary.
|
| + if (i % IMAGES_X == 0 && i != 0) {
|
| + canvas->restore();
|
| + canvas->translate(0, TESTGRID_Y);
|
| + canvas->save();
|
| + }
|
| +
|
| + // Setup shader and draw.
|
| + SkAutoTUnref<SkShader> shader(makeShader(*ptsArray));
|
| + shader->setLocalMatrix(shaderMat);
|
| +
|
| + SkPaint paint;
|
| + paint.setShader(shader);
|
| + canvas->drawRect(rectGrad, paint);
|
| +
|
| + // Advance to next position.
|
| + canvas->translate(TESTGRID_X, 0);
|
| + ptsArray++;
|
| + }
|
| + canvas->restore();
|
| +}
|
| +
|
| +namespace skiagm {
|
| +
|
| +class GradientMatrixGM : public GM {
|
| +public:
|
| + GradientMatrixGM() {
|
| + this->setBGColor(0xFFDDDDDD);
|
| + }
|
| +
|
| +protected:
|
| + SkString onShortName() SK_OVERRIDE {
|
| + return SkString("gradient_matrix");
|
| + }
|
| +
|
| + virtual SkISize onISize() SK_OVERRIDE {
|
| + return SkISize::Make(800, 800);
|
| + }
|
| +
|
| + virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
|
| + draw_gradients(canvas, &make_linear_gradient,
|
| + linearPts, SK_ARRAY_COUNT(linearPts));
|
| + }
|
| +
|
| +private:
|
| + typedef GM INHERITED;
|
| +};
|
| +
|
| +DEF_GM( return new GradientMatrixGM; )
|
| +}
|
|
|