1db87c960857a19555517c017e98804af7d9bf8c1reed@google.com/* 2a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com* Copyright 2012 Google Inc. 3a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com* 4a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com* Use of this source code is governed by a BSD-style license that can be 5a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com* found in the LICENSE file. 6a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com*/ 7db87c960857a19555517c017e98804af7d9bf8c1reed@google.com 8db87c960857a19555517c017e98804af7d9bf8c1reed@google.com#include "gm.h" 97c7292c6071898d73dc935c3b66b9816183806f0humper@google.com#include "SkBlurMask.h" 10b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMaskFilter.h" 11db87c960857a19555517c017e98804af7d9bf8c1reed@google.com#include "SkCanvas.h" 12db87c960857a19555517c017e98804af7d9bf8c1reed@google.com#include "SkPath.h" 13db87c960857a19555517c017e98804af7d9bf8c1reed@google.com 14db87c960857a19555517c017e98804af7d9bf8c1reed@google.com#define STROKE_WIDTH SkIntToScalar(10) 15db87c960857a19555517c017e98804af7d9bf8c1reed@google.com 16db87c960857a19555517c017e98804af7d9bf8c1reed@google.comtypedef void (*Proc)(SkCanvas*, const SkRect&, const SkPaint&); 17db87c960857a19555517c017e98804af7d9bf8c1reed@google.com 18db87c960857a19555517c017e98804af7d9bf8c1reed@google.comstatic void fill_rect(SkCanvas* canvas, const SkRect& r, const SkPaint& p) { 19db87c960857a19555517c017e98804af7d9bf8c1reed@google.com canvas->drawRect(r, p); 20db87c960857a19555517c017e98804af7d9bf8c1reed@google.com} 21db87c960857a19555517c017e98804af7d9bf8c1reed@google.com 22db87c960857a19555517c017e98804af7d9bf8c1reed@google.comstatic void draw_donut(SkCanvas* canvas, const SkRect& r, const SkPaint& p) { 23db87c960857a19555517c017e98804af7d9bf8c1reed@google.com SkRect rect; 24db87c960857a19555517c017e98804af7d9bf8c1reed@google.com SkPath path; 253458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com 26db87c960857a19555517c017e98804af7d9bf8c1reed@google.com rect = r; 27db87c960857a19555517c017e98804af7d9bf8c1reed@google.com rect.outset(STROKE_WIDTH/2, STROKE_WIDTH/2); 28db87c960857a19555517c017e98804af7d9bf8c1reed@google.com path.addRect(rect); 29db87c960857a19555517c017e98804af7d9bf8c1reed@google.com rect = r; 30db87c960857a19555517c017e98804af7d9bf8c1reed@google.com rect.inset(STROKE_WIDTH/2, STROKE_WIDTH/2); 313458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com 32db87c960857a19555517c017e98804af7d9bf8c1reed@google.com path.addRect(rect); 33db87c960857a19555517c017e98804af7d9bf8c1reed@google.com path.setFillType(SkPath::kEvenOdd_FillType); 343458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com 35808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com canvas->drawPath(path, p); 36808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com} 37db87c960857a19555517c017e98804af7d9bf8c1reed@google.com 38808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.comstatic void draw_donut_skewed(SkCanvas* canvas, const SkRect& r, const SkPaint& p) { 39808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com SkRect rect; 40808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com SkPath path; 413458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com 42808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com rect = r; 43808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com rect.outset(STROKE_WIDTH/2, STROKE_WIDTH/2); 44808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com path.addRect(rect); 45808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com rect = r; 46808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com rect.inset(STROKE_WIDTH/2, STROKE_WIDTH/2); 473458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com 48808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com rect.offset(7, -7); 493458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com 50808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com path.addRect(rect); 51808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com path.setFillType(SkPath::kEvenOdd_FillType); 523458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com 53db87c960857a19555517c017e98804af7d9bf8c1reed@google.com canvas->drawPath(path, p); 54db87c960857a19555517c017e98804af7d9bf8c1reed@google.com} 55db87c960857a19555517c017e98804af7d9bf8c1reed@google.com 5653007a2b1724c15c170340658daac012f9d909bereed@google.com#include "SkGradientShader.h" 5753007a2b1724c15c170340658daac012f9d909bereed@google.com 5853007a2b1724c15c170340658daac012f9d909bereed@google.comtypedef void (*PaintProc)(SkPaint*, SkScalar width); 5953007a2b1724c15c170340658daac012f9d909bereed@google.com 60db87c960857a19555517c017e98804af7d9bf8c1reed@google.comclass BlurRectGM : public skiagm::GM { 61e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org SkAutoTUnref<SkMaskFilter> fMaskFilters[kLastEnum_SkBlurStyle + 1]; 62a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com SkString fName; 63a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com SkAlpha fAlpha; 64db87c960857a19555517c017e98804af7d9bf8c1reed@google.compublic: 657cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org BlurRectGM(const char name[], U8CPU alpha) 667cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org : fName(name) 677cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org , fAlpha(SkToU8(alpha)) { 6857850b9daddd941f880d94faaf83f2169355a0c8reed@google.com } 69db87c960857a19555517c017e98804af7d9bf8c1reed@google.com 70db87c960857a19555517c017e98804af7d9bf8c1reed@google.comprotected: 717cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org virtual void onOnceBeforeDraw() SK_OVERRIDE { 72e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org for (int i = 0; i <= kLastEnum_SkBlurStyle; ++i) { 73e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org fMaskFilters[i].reset(SkBlurMaskFilter::Create((SkBlurStyle)i, 747cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(STROKE_WIDTH/2)), 757cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org SkBlurMaskFilter::kHighQuality_BlurFlag)); 767cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org } 777cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org } 787cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org 79db87c960857a19555517c017e98804af7d9bf8c1reed@google.com virtual SkString onShortName() { 8053007a2b1724c15c170340658daac012f9d909bereed@google.com return fName; 81db87c960857a19555517c017e98804af7d9bf8c1reed@google.com } 82db87c960857a19555517c017e98804af7d9bf8c1reed@google.com 83db87c960857a19555517c017e98804af7d9bf8c1reed@google.com virtual SkISize onISize() { 847cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org return SkISize::Make(440, 820); 85db87c960857a19555517c017e98804af7d9bf8c1reed@google.com } 86db87c960857a19555517c017e98804af7d9bf8c1reed@google.com 87db87c960857a19555517c017e98804af7d9bf8c1reed@google.com virtual void onDraw(SkCanvas* canvas) { 88db87c960857a19555517c017e98804af7d9bf8c1reed@google.com canvas->translate(STROKE_WIDTH*3/2, STROKE_WIDTH*3/2); 89db87c960857a19555517c017e98804af7d9bf8c1reed@google.com 907cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org SkRect r = { 0, 0, 100, 50 }; 917cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org SkScalar scales[] = { SK_Scalar1, 0.6f }; 928ccf590b89cec1a5974b6f4b7b49ca67cc5036cfskia.committer@gmail.com 937cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org for (size_t s = 0; s < SK_ARRAY_COUNT(scales); ++s) { 947cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org canvas->save(); 957cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org for (size_t f = 0; f < SK_ARRAY_COUNT(fMaskFilters); ++f) { 967cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org SkPaint paint; 977cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org paint.setMaskFilter(fMaskFilters[f]); 987cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org paint.setAlpha(fAlpha); 997cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org 1007cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org static const Proc procs[] = { 1017cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org fill_rect, draw_donut, draw_donut_skewed 1027cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org }; 103db87c960857a19555517c017e98804af7d9bf8c1reed@google.com 1047cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org canvas->save(); 1057cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org canvas->scale(scales[s], scales[s]); 1067cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org this->drawProcs(canvas, r, paint, false, procs, SK_ARRAY_COUNT(procs)); 1077cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org canvas->translate(r.width() * 4/3, 0); 1087cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org this->drawProcs(canvas, r, paint, true, procs, SK_ARRAY_COUNT(procs)); 1097cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org canvas->restore(); 110db87c960857a19555517c017e98804af7d9bf8c1reed@google.com 1117cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org canvas->translate(0, SK_ARRAY_COUNT(procs) * r.height() * 4/3 * scales[s]); 1127cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org } 1137cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org canvas->restore(); 1147cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org canvas->translate(2 * r.width() * 4/3 * scales[s], 0); 1157cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org } 116db87c960857a19555517c017e98804af7d9bf8c1reed@google.com } 117db87c960857a19555517c017e98804af7d9bf8c1reed@google.com 1187cdc1ee11545a10708e857adf1d4a94a2f1e2a48mtklein virtual uint32_t onGetFlags() const { return kSkipPipe_Flag; } 119db87c960857a19555517c017e98804af7d9bf8c1reed@google.com 120db87c960857a19555517c017e98804af7d9bf8c1reed@google.comprivate: 121db87c960857a19555517c017e98804af7d9bf8c1reed@google.com void drawProcs(SkCanvas* canvas, const SkRect& r, const SkPaint& paint, 122db87c960857a19555517c017e98804af7d9bf8c1reed@google.com bool doClip, const Proc procs[], size_t procsCount) { 123db87c960857a19555517c017e98804af7d9bf8c1reed@google.com SkAutoCanvasRestore acr(canvas, true); 124db87c960857a19555517c017e98804af7d9bf8c1reed@google.com for (size_t i = 0; i < procsCount; ++i) { 125db87c960857a19555517c017e98804af7d9bf8c1reed@google.com if (doClip) { 126db87c960857a19555517c017e98804af7d9bf8c1reed@google.com SkRect clipRect(r); 127db87c960857a19555517c017e98804af7d9bf8c1reed@google.com clipRect.inset(STROKE_WIDTH/2, STROKE_WIDTH/2); 128db87c960857a19555517c017e98804af7d9bf8c1reed@google.com canvas->save(); 129db87c960857a19555517c017e98804af7d9bf8c1reed@google.com canvas->clipRect(r); 130db87c960857a19555517c017e98804af7d9bf8c1reed@google.com } 131db87c960857a19555517c017e98804af7d9bf8c1reed@google.com procs[i](canvas, r, paint); 132db87c960857a19555517c017e98804af7d9bf8c1reed@google.com if (doClip) { 133db87c960857a19555517c017e98804af7d9bf8c1reed@google.com canvas->restore(); 134db87c960857a19555517c017e98804af7d9bf8c1reed@google.com } 135db87c960857a19555517c017e98804af7d9bf8c1reed@google.com canvas->translate(0, r.height() * 4/3); 136db87c960857a19555517c017e98804af7d9bf8c1reed@google.com } 137db87c960857a19555517c017e98804af7d9bf8c1reed@google.com } 138a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprivate: 139db87c960857a19555517c017e98804af7d9bf8c1reed@google.com typedef GM INHERITED; 140db87c960857a19555517c017e98804af7d9bf8c1reed@google.com}; 141db87c960857a19555517c017e98804af7d9bf8c1reed@google.com 1423c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org 1433c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.orgclass BlurRectDirectGM : public skiagm::GM { 1443c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org SkString fName; 1453c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org int fGMWidth, fGMHeight; 1463c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org int fPadding, fMargin; 1473c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.orgpublic: 1483c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org BlurRectDirectGM(const char name[]) 1493c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org : fName(name), 1503c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org fGMWidth(1200), 1513c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org fGMHeight(1024), 1523c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org fPadding(10), 1533c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org fMargin(100) 1543c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org { 1553c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org } 1563c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org 1573c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.orgprotected: 1583c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org virtual SkString onShortName() { 1593c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org return fName; 1603c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org } 1613c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org 1623c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org virtual SkISize onISize() { 1633c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org return SkISize::Make(fGMWidth, fGMHeight); 1643c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org } 1653c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org 1663c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org virtual void onDraw(SkCanvas* canvas) { 1673c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org const int widths[] = {25, 5, 5, 100, 150, 25}; 1683c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org const int heights[] = {100, 100, 5, 25, 150, 25}; 1693c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org const SkBlurStyle styles[] = {kNormal_SkBlurStyle, kInner_SkBlurStyle, kOuter_SkBlurStyle}; 1703c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org const float radii[] = {20, 5, 10}; 1713c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org 1723c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org canvas->translate(50,20); 1733c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org 1743c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org int cur_x = 0; 1753c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org int cur_y = 0; 1763c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org 1773c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org int max_height = 0; 1783c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org 1793c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org for (size_t i = 0 ; i < SK_ARRAY_COUNT(widths) ; i++) { 1803c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org int width = widths[i]; 1813c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org int height = heights[i]; 1823c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org SkRect r; 1833c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org r.setWH(SkIntToScalar(width), SkIntToScalar(height)); 1843c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org SkAutoCanvasRestore autoRestore(canvas, true); 1853c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org 1863c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org for (size_t j = 0 ; j < SK_ARRAY_COUNT(radii) ; j++) { 1873c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org float radius = radii[j]; 1883c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org for (size_t k = 0 ; k < SK_ARRAY_COUNT(styles) ; k++) { 1893c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org SkBlurStyle style = styles[k]; 1903c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org 1913c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org SkMask mask; 1923c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org SkBlurMask::BlurRect(SkBlurMask::ConvertRadiusToSigma(radius), &mask, r, style); 1933c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org 1943c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org SkAutoMaskFreeImage amfi(mask.fImage); 1953c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org 1963c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org SkBitmap bm; 1973c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org bm.installMaskPixels(mask); 1983c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org 1993c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org if (cur_x + bm.width() >= fGMWidth - fMargin) { 2003c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org cur_x = 0; 2013c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org cur_y += max_height + fPadding; 2023c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org max_height = 0; 2033c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org } 2043c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org 2053c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org canvas->save(); 206793ddd994aae5a78b13fdbe24a6755085f7998cdcommit-bot@chromium.org canvas->translate((SkScalar)cur_x, (SkScalar)cur_y); 2073c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org canvas->translate(-(bm.width() - r.width())/2, -(bm.height()-r.height())/2); 2083c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org canvas->drawBitmap(bm, 0.f, 0.f, NULL); 2093c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org canvas->restore(); 2103c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org 2113c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org cur_x += bm.width() + fPadding; 2123c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org if (bm.height() > max_height) 2133c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org max_height = bm.height(); 2143c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org } 2153c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org } 2163c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org } 2173c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org } 2183c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org 2193c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org virtual uint32_t onGetFlags() const { return kSkipPipe_Flag; } 2203c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org 2213c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.orgprivate: 2223c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org typedef GM INHERITED; 2233c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org}; 2243c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org 2257c7292c6071898d73dc935c3b66b9816183806f0humper@google.comclass BlurRectCompareGM : public skiagm::GM { 2267c7292c6071898d73dc935c3b66b9816183806f0humper@google.com SkString fName; 2277c7292c6071898d73dc935c3b66b9816183806f0humper@google.com unsigned int fRectWidth, fRectHeight; 228140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com SkScalar fRadius; 229e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org SkBlurStyle fStyle; 2307c7292c6071898d73dc935c3b66b9816183806f0humper@google.compublic: 231b3ec29d2d81ae391e433fbdf8aabc791e426ee38skia.committer@gmail.com BlurRectCompareGM(const char name[], unsigned int rectWidth, 232b3ec29d2d81ae391e433fbdf8aabc791e426ee38skia.committer@gmail.com unsigned int rectHeight, float radius, 233e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org SkBlurStyle style) 23433cdbdea3ddcec9323b65eace86e10557312ae9bbsalomon@google.com : fName(name) 23533cdbdea3ddcec9323b65eace86e10557312ae9bbsalomon@google.com , fRectWidth(rectWidth) 23633cdbdea3ddcec9323b65eace86e10557312ae9bbsalomon@google.com , fRectHeight(rectHeight) 23733cdbdea3ddcec9323b65eace86e10557312ae9bbsalomon@google.com , fRadius(radius) 238b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com , fStyle(style) { 239b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com } 240d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com int width() const { 241d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com return fRectWidth; 242a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com } 243d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com int height() const { 244d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com return fRectHeight; 245a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com } 246d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com SkScalar radius() const { 247d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com return fRadius; 248a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com } 249e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org SkBlurStyle style() const { 250d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com return fStyle; 251a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com } 2527c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 2537c7292c6071898d73dc935c3b66b9816183806f0humper@google.comprotected: 2547c7292c6071898d73dc935c3b66b9816183806f0humper@google.com virtual SkString onShortName() { 2557c7292c6071898d73dc935c3b66b9816183806f0humper@google.com return fName; 2567c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } 2577c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 2587c7292c6071898d73dc935c3b66b9816183806f0humper@google.com virtual SkISize onISize() { 2597c7292c6071898d73dc935c3b66b9816183806f0humper@google.com return SkISize::Make(640, 480); 2607c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } 2618ae714b186ae5f4eaddee239281fbfe7282320c9skia.committer@gmail.com 262a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com virtual bool makeMask(SkMask *m, const SkRect&) = 0; 2637c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 2647c7292c6071898d73dc935c3b66b9816183806f0humper@google.com virtual void onDraw(SkCanvas* canvas) { 265a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com SkRect r; 266a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com r.setWH(SkIntToScalar(fRectWidth), SkIntToScalar(fRectHeight)); 267a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com 268a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com SkISize canvas_size = canvas->getDeviceSize(); 269d98df1a3c468a2a7a5fff5efbf6dbdaf077d1abejvanverth@google.com int center_x = (canvas_size.fWidth - (int)(r.width()))/2; 270d98df1a3c468a2a7a5fff5efbf6dbdaf077d1abejvanverth@google.com int center_y = (canvas_size.fHeight - (int)(r.height()))/2; 271a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com 272a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com SkMask mask; 273a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com 274a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com if (!this->makeMask(&mask, r)) { 275a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com SkPaint paint; 276d98df1a3c468a2a7a5fff5efbf6dbdaf077d1abejvanverth@google.com r.offset( SkIntToScalar(center_x), SkIntToScalar(center_y) ); 277a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com canvas->drawRect(r,paint); 278a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com return; 279a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com } 280a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com SkAutoMaskFreeImage amfi(mask.fImage); 2817c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 282a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com SkBitmap bm; 283dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org bm.installMaskPixels(mask); 2847c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 285a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com center_x = (canvas_size.fWidth - mask.fBounds.width())/2; 286a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com center_y = (canvas_size.fHeight - mask.fBounds.height())/2; 2877c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 288d98df1a3c468a2a7a5fff5efbf6dbdaf077d1abejvanverth@google.com canvas->drawBitmap(bm, SkIntToScalar(center_x), SkIntToScalar(center_y), NULL); 2897c7292c6071898d73dc935c3b66b9816183806f0humper@google.com } 2907c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 2917c7292c6071898d73dc935c3b66b9816183806f0humper@google.com virtual uint32_t onGetFlags() const { return kSkipPipe_Flag; } 2927c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 2937c7292c6071898d73dc935c3b66b9816183806f0humper@google.comprivate: 2947c7292c6071898d73dc935c3b66b9816183806f0humper@google.com typedef GM INHERITED; 2957c7292c6071898d73dc935c3b66b9816183806f0humper@google.com}; 2967c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 2977c7292c6071898d73dc935c3b66b9816183806f0humper@google.comclass BlurRectFastGM: public BlurRectCompareGM { 2987c7292c6071898d73dc935c3b66b9816183806f0humper@google.compublic: 2997ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com BlurRectFastGM(const char name[], unsigned int rectWidth, 3007ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com unsigned int rectHeight, float blurRadius, 301e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org SkBlurStyle style) : 3027ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com INHERITED(name, rectWidth, rectHeight, blurRadius, style) { 303a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com } 3047ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com 3057c7292c6071898d73dc935c3b66b9816183806f0humper@google.comprotected: 306a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com virtual bool makeMask(SkMask *m, const SkRect& r) SK_OVERRIDE { 307b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com return SkBlurMask::BlurRect(SkBlurMask::ConvertRadiusToSigma(this->radius()), 308b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com m, r, this->style()); 309140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com } 310a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprivate: 311a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com typedef BlurRectCompareGM INHERITED; 3127c7292c6071898d73dc935c3b66b9816183806f0humper@google.com}; 3137c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 3147c7292c6071898d73dc935c3b66b9816183806f0humper@google.comclass BlurRectSlowGM: public BlurRectCompareGM { 3157c7292c6071898d73dc935c3b66b9816183806f0humper@google.compublic: 316b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com BlurRectSlowGM(const char name[], unsigned int rectWidth, unsigned int rectHeight, 317e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org float blurRadius, SkBlurStyle style) 318b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com : INHERITED(name, rectWidth, rectHeight, blurRadius, style) { 319a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com } 320b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com 3217c7292c6071898d73dc935c3b66b9816183806f0humper@google.comprotected: 322a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com virtual bool makeMask(SkMask *m, const SkRect& r) SK_OVERRIDE { 323140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com SkMask src; 324140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com r.roundOut(&src.fBounds); 325140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com src.fBounds.offset(-src.fBounds.fLeft, -src.fBounds.fTop); // move to origin 326140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com src.fFormat = SkMask::kA8_Format; 327140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com src.fRowBytes = src.fBounds.width(); 328a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com src.fImage = SkMask::AllocImage(src.computeTotalImageSize()); 32933cdbdea3ddcec9323b65eace86e10557312ae9bbsalomon@google.com SkAutoMaskFreeImage amfi(src.fImage); 3307c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 33133cdbdea3ddcec9323b65eace86e10557312ae9bbsalomon@google.com memset(src.fImage, 0xff, src.computeTotalImageSize()); 3327c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 333b3ec29d2d81ae391e433fbdf8aabc791e426ee38skia.committer@gmail.com return SkBlurMask::BoxBlur(m, src, 334b3ec29d2d81ae391e433fbdf8aabc791e426ee38skia.committer@gmail.com SkBlurMask::ConvertRadiusToSigma(this->radius()), 335b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com this->style(), this->getQuality()); 336140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com } 337a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com 338e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org virtual SkBlurQuality getQuality() { 339e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org return kHigh_SkBlurQuality; 340a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com } 341a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprivate: 342a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com typedef BlurRectCompareGM INHERITED; 343a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com}; 344a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com 345a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comclass BlurRectSlowLowGM: public BlurRectSlowGM { 346a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.compublic: 347d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com BlurRectSlowLowGM(const char name[], unsigned int rectWidth, unsigned int rectHeight, 348e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org float blurRadius, SkBlurStyle style) 349b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com : INHERITED(name, rectWidth, rectHeight, blurRadius, style) { 350a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com } 351b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com 352a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprotected: 353e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org virtual SkBlurQuality getQuality() SK_OVERRIDE { 354e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org return kLow_SkBlurQuality; 355a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com } 356a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprivate: 357a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com typedef BlurRectSlowGM INHERITED; 358a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com}; 359a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com 360a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comclass BlurRectGroundTruthGM: public BlurRectCompareGM { 361a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.compublic: 362d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com BlurRectGroundTruthGM(const char name[], unsigned int rectWidth, unsigned int rectHeight, 363e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org float blurRadius, SkBlurStyle style) 364b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com : INHERITED(name, rectWidth, rectHeight, blurRadius, style) { 365a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com } 366b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com 367a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprotected: 368a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com virtual bool makeMask(SkMask *m, const SkRect& r) SK_OVERRIDE { 369a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com SkMask src; 370a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com r.roundOut(&src.fBounds); 371a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com src.fBounds.offset(-src.fBounds.fLeft, -src.fBounds.fTop); // move to origin 372a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com src.fFormat = SkMask::kA8_Format; 373a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com src.fRowBytes = src.fBounds.width(); 374a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com src.fImage = SkMask::AllocImage(src.computeTotalImageSize()); 375a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com SkAutoMaskFreeImage amfi(src.fImage); 376a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com 377a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com memset(src.fImage, 0xff, src.computeTotalImageSize()); 378a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com 379b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com return SkBlurMask::BlurGroundTruth(SkBlurMask::ConvertRadiusToSigma(this->radius()), 380b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com m, src, this->style()); 381a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com } 382a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com 383e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org virtual SkBlurQuality getQuality() { 384e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org return kHigh_SkBlurQuality; 385a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com } 386a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprivate: 387a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com typedef BlurRectCompareGM INHERITED; 3887c7292c6071898d73dc935c3b66b9816183806f0humper@google.com}; 3897c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 3907c7292c6071898d73dc935c3b66b9816183806f0humper@google.com 391db87c960857a19555517c017e98804af7d9bf8c1reed@google.com////////////////////////////////////////////////////////////////////////////// 392db87c960857a19555517c017e98804af7d9bf8c1reed@google.com 3937cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.orgDEF_GM(return new BlurRectGM("blurrects", 0xFF);) 3943c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.orgDEF_GM(return new BlurRectDirectGM("blurrect_gallery");) 395