10b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
20b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com/*
30b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com * Copyright 2012 Intel Inc.
40b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com *
50b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
60b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com * found in the LICENSE file.
70b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com */
80b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com#include "gm.h"
9b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurDrawLooper.h"
10b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMask.h"
110b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com#include "SkBlurMaskFilter.h"
120b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com#include "SkGradientShader.h"
13b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkMatrix.h"
14b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkRandom.h"
15b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkTArray.h"
160b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
170b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.comnamespace skiagm {
180b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
190b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.comclass CircleGM : public GM {
200b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.compublic:
210b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com    CircleGM() {
220b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        this->setBGColor(0xFF000000);
230b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        this->makePaints();
240b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        this->makeMatrices();
250b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com    }
260b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
270b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.comprotected:
28a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
29a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
30a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
31a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
320b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com    virtual SkString onShortName() SK_OVERRIDE {
330b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        return SkString("circles");
340b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com    }
350b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
360b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com    virtual SkISize onISize() SK_OVERRIDE {
37f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(1200, 900);
380b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com    }
390b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
400b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com    void makePaints() {
410b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        {
420b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        // no AA
430b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        SkPaint p;
440b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        fPaints.push_back(p);
450b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        }
460b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
470b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        {
480b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        // AA
490b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        SkPaint p;
500b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        p.setAntiAlias(true);
510b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        fPaints.push_back(p);
520b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        }
530b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
540b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        {
550b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        // AA with mask filter
560b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        SkPaint p;
570b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        p.setAntiAlias(true);
58b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com        SkMaskFilter* mf = SkBlurMaskFilter::Create(
59e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org                               kNormal_SkBlurStyle,
60b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com                               SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
610b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com                               SkBlurMaskFilter::kHighQuality_BlurFlag);
620b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        p.setMaskFilter(mf)->unref();
630b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        fPaints.push_back(p);
640b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        }
650b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
660b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        {
670b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        // AA with radial shader
680b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        SkPaint p;
690b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        p.setAntiAlias(true);
700b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        SkPoint center = SkPoint::Make(SkIntToScalar(40), SkIntToScalar(40));
710b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        SkColor colors[] = { SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN };
720b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        SkScalar pos[] = { 0, SK_ScalarHalf, SK_Scalar1 };
730b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        SkShader* s = SkGradientShader::CreateRadial(center,
740b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com                                                     SkIntToScalar(20),
750b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com                                                     colors,
760b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com                                                     pos,
770b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com                                                     SK_ARRAY_COUNT(colors),
780b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com                                                     SkShader::kClamp_TileMode);
790b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        p.setShader(s)->unref();
800b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        fPaints.push_back(p);
810b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        }
820b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
830b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        {
840b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        // AA with blur
850b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        SkPaint p;
860b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        p.setAntiAlias(true);
870b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        SkBlurDrawLooper* shadowLooper =
8873cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org            SkBlurDrawLooper::Create(SK_ColorBLUE,
8973cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                     SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(10)),
9073cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                     SkIntToScalar(5), SkIntToScalar(10),
9173cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                     SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
9273cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                     SkBlurDrawLooper::kOverrideColor_BlurFlag |
9373cb15351f33459e0c861a96135c634dec77ef9dcommit-bot@chromium.org                                     SkBlurDrawLooper::kHighQuality_BlurFlag);
940b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        SkAutoUnref aurL0(shadowLooper);
950b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        p.setLooper(shadowLooper);
960b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        fPaints.push_back(p);
970b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        }
980b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
990b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        {
1000b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        // AA with stroke style
1010b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        SkPaint p;
1020b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        p.setAntiAlias(true);
1030b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        p.setStyle(SkPaint::kStroke_Style);
1040b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        p.setStrokeWidth(SkIntToScalar(3));
1050b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        fPaints.push_back(p);
1060b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        }
1070b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
1080b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        {
1090b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        // AA with stroke style, width = 0
1100b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        SkPaint p;
1110b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        p.setAntiAlias(true);
1120b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        p.setStyle(SkPaint::kStroke_Style);
1130b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        fPaints.push_back(p);
1140b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        }
1150b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
1160b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        {
1170b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        // AA with stroke and fill style
1180b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        SkPaint p;
1190b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        p.setAntiAlias(true);
1200b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        p.setStyle(SkPaint::kStrokeAndFill_Style);
1210b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        p.setStrokeWidth(SkIntToScalar(2));
1220b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        fPaints.push_back(p);
1230b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        }
1240b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com    }
1250b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
1260b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com    void makeMatrices() {
1270b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        {
1280b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        SkMatrix m;
1290b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        m.setScale(SkIntToScalar(2), SkIntToScalar(3));
1300b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        fMatrices.push_back(m);
1310b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        }
1320b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
1330b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        {
1340b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        SkMatrix m;
1350b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        m.setScale(SkIntToScalar(2), SkIntToScalar(2));
1360b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        fMatrices.push_back(m);
1370b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        }
1380b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
1390b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        {
1400b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        SkMatrix m;
1410b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        m.setSkew(SkIntToScalar(2), SkIntToScalar(3));
1420b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        fMatrices.push_back(m);
1430b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        }
1440b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
1450b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        {
1460b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        SkMatrix m;
1470b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        m.setSkew(SkIntToScalar(2), SkIntToScalar(2));
1480b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        fMatrices.push_back(m);
1490b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        }
1500b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
1510b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        {
1520b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        SkMatrix m;
1530b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        m.setRotate(SkIntToScalar(30));
1540b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        fMatrices.push_back(m);
1550b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        }
1560b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com    }
1570b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
1580b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
159e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkLCGRandom rand;
1600b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1);
1610b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        int i;
1620b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        for (i = 0; i < fPaints.count(); ++i) {
1630b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com            canvas->save();
1640b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com            // position the path, and make it at off-integer coords.
1650b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com            canvas->translate(SK_Scalar1 * 200 * (i % 5) + SK_Scalar1 / 4,
1660b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com                              SK_Scalar1 * 200 * (i / 5) + 3 * SK_Scalar1 / 4);
1670b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com            SkColor color = rand.nextU();
1680b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com            color |= 0xff000000;
1690b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com            fPaints[i].setColor(color);
1700b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
1710b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com            canvas->drawCircle(SkIntToScalar(40), SkIntToScalar(40),
1720b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com                               SkIntToScalar(20),
1730b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com                               fPaints[i]);
1740b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com            canvas->restore();
1750b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        }
1760b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
1770b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        for (int j = 0; j < fMatrices.count(); ++j, ++i) {
1780b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com            canvas->save();
1790b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
1800b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com            canvas->translate(SK_Scalar1 * 200 * (i % 5) + SK_Scalar1 / 4,
1810b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com                              SK_Scalar1 * 200 * (i / 5) + 3 * SK_Scalar1 / 4);
1820b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
1830b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com            canvas->concat(fMatrices[j]);
1840b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
1850b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com            SkPaint paint;
1860b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com            paint.setAntiAlias(true);
1870b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
1880b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com            SkColor color = rand.nextU();
1890b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com            color |= 0xff000000;
1900b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com            paint.setColor(color);
1910b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
1920b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com            canvas->drawCircle(SkIntToScalar(40), SkIntToScalar(40),
1930b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com                               SkIntToScalar(20),
1940b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com                               paint);
1950b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
1960b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com            canvas->restore();
1970b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com        }
1980b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com    }
1990b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
2000b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.comprivate:
2010b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com    typedef GM INHERITED;
2020b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com    SkTArray<SkPaint> fPaints;
2030b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com    SkTArray<SkMatrix> fMatrices;
2040b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com};
2050b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
2060b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com//////////////////////////////////////////////////////////////////////////////
2070b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
2080b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.comstatic GM* MyFactory(void*) { return new CircleGM; }
2090b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.comstatic GMRegistry reg(MyFactory);
2100b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com
2110b26c158769beea0393462c8d4aa86c74ccf6261bsalomon@google.com}
212