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