137071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org/* 237071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org * Copyright 2012 Google Inc. 337071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org * 437071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org * Use of this source code is governed by a BSD-style license that can be 537071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org * found in the LICENSE file. 637071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org */ 737071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org 837071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org#include "gm.h" 937071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org#include "SkCanvas.h" 1037071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org#include "SkRRect.h" 1137071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org#include "SkPath.h" 1237071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org 13c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.orgtypedef void (*InsetProc)(const SkRRect&, SkScalar dx, SkScalar dy, SkRRect*); 14c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org 15c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.orgstatic void inset0(const SkRRect& src, SkScalar dx, SkScalar dy, SkRRect* dst) { 16c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org SkRect r = src.rect(); 17c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org 18c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org r.inset(dx, dy); 19c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org if (r.isEmpty()) { 20c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org dst->setEmpty(); 21c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org return; 22c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org } 237a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com 24c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org SkVector radii[4]; 25c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org for (int i = 0; i < 4; ++i) { 26c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org radii[i] = src.radii((SkRRect::Corner)i); 27c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org } 28c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org for (int i = 0; i < 4; ++i) { 29c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org radii[i].fX -= dx; 30c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org radii[i].fY -= dy; 31c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org } 32c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org dst->setRectRadii(r, radii); 33c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org} 34c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org 35c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.orgstatic void inset1(const SkRRect& src, SkScalar dx, SkScalar dy, SkRRect* dst) { 36c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org SkRect r = src.rect(); 37c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org 38c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org r.inset(dx, dy); 39c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org if (r.isEmpty()) { 40c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org dst->setEmpty(); 41c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org return; 42c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org } 437a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com 44c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org SkVector radii[4]; 45c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org for (int i = 0; i < 4; ++i) { 46c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org radii[i] = src.radii((SkRRect::Corner)i); 47c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org } 48c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org dst->setRectRadii(r, radii); 49c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org} 50c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org 51ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.comstatic void inset2(const SkRRect& src, SkScalar dx, SkScalar dy, SkRRect* dst) { 52ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com SkRect r = src.rect(); 537a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com 54ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com r.inset(dx, dy); 55ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com if (r.isEmpty()) { 56ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com dst->setEmpty(); 57ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com return; 58ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com } 597a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com 60ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com SkVector radii[4]; 61ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com for (int i = 0; i < 4; ++i) { 62ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com radii[i] = src.radii((SkRRect::Corner)i); 63ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com } 64ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com for (int i = 0; i < 4; ++i) { 65ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com if (radii[i].fX) { 66ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com radii[i].fX -= dx; 67ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com } 68ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com if (radii[i].fY) { 69ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com radii[i].fY -= dy; 70ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com } 71ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com } 72ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com dst->setRectRadii(r, radii); 73ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com} 74ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com 750f0d9b720e1afef91d30c83b379725b8a53fafc8sugoi@google.comstatic SkScalar prop(SkScalar radius, SkScalar newSize, SkScalar oldSize) { 76ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com return newSize * radius / oldSize; 77ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com} 78ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com 79ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.comstatic void inset3(const SkRRect& src, SkScalar dx, SkScalar dy, SkRRect* dst) { 80ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com SkRect r = src.rect(); 817a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com 82ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com r.inset(dx, dy); 83ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com if (r.isEmpty()) { 84ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com dst->setEmpty(); 85ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com return; 86ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com } 877a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com 88ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com SkVector radii[4]; 89ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com for (int i = 0; i < 4; ++i) { 90ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com radii[i] = src.radii((SkRRect::Corner)i); 91ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com } 92ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com for (int i = 0; i < 4; ++i) { 930f0d9b720e1afef91d30c83b379725b8a53fafc8sugoi@google.com radii[i].fX = prop(radii[i].fX, r.width(), src.rect().width()); 940f0d9b720e1afef91d30c83b379725b8a53fafc8sugoi@google.com radii[i].fY = prop(radii[i].fY, r.height(), src.rect().height()); 95ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com } 96ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com dst->setRectRadii(r, radii); 97ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com} 98ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com 9937071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.orgstatic void draw_rrect_color(SkCanvas* canvas, const SkRRect& rrect) { 10037071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org SkPaint paint; 10137071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org paint.setAntiAlias(true); 102c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org paint.setStyle(SkPaint::kStroke_Style); 103c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org 10437071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org if (rrect.isRect()) { 10537071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org paint.setColor(SK_ColorRED); 10637071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org } else if (rrect.isOval()) { 107c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org paint.setColor(0xFF008800); 10837071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org } else if (rrect.isSimple()) { 10937071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org paint.setColor(SK_ColorBLUE); 11037071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org } else { 111c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org paint.setColor(SK_ColorBLACK); 11237071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org } 11337071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org canvas->drawRRect(rrect, paint); 11437071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org} 11537071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org 116c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.orgstatic void drawrr(SkCanvas* canvas, const SkRRect& rrect, InsetProc proc) { 117c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org SkRRect rr; 1185138638143b4ebaa60a0b75e816118c35ff220f7mike@reedtribe.org for (SkScalar d = -30; d <= 30; d += 5) { 119c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org proc(rrect, d, d, &rr); 120c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org draw_rrect_color(canvas, rr); 121c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org } 12237071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org} 12337071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org 12437071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.orgclass RRectGM : public skiagm::GM { 12537071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.orgpublic: 12637071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org RRectGM() {} 1277a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com 12837071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.orgprotected: 129a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 130a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 131a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 132a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 13337071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org virtual SkString onShortName() { 13437071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org return SkString("rrect"); 13537071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org } 1367a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com 13737071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org virtual SkISize onISize() { 138ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com return SkISize::Make(820, 710); 13937071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org } 1407a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com 14137071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org virtual void onDraw(SkCanvas* canvas) { 142ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com static const InsetProc insetProcs[] = { 143ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com inset0, inset1, inset2, inset3 144ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com }; 145c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org 14637071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org SkRRect rrect[4]; 147ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com SkRect r = { 0, 0, 120, 100 }; 14837071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org SkVector radii[4] = { 149ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com { 0, 0 }, { 30, 1 }, { 10, 40 }, { 40, 40 } 15037071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org }; 1517a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com 15237071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org rrect[0].setRect(r); 15337071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org rrect[1].setOval(r); 15437071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org rrect[2].setRectXY(r, 20, 20); 15537071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org rrect[3].setRectRadii(r, radii); 15637071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org 157ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com canvas->translate(50.5f, 50.5f); 158c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org for (size_t j = 0; j < SK_ARRAY_COUNT(insetProcs); ++j) { 159c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org canvas->save(); 160c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org for (size_t i = 0; i < SK_ARRAY_COUNT(rrect); ++i) { 161c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org drawrr(canvas, rrect[i], insetProcs[j]); 162ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com canvas->translate(200, 0); 163c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org } 164c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org canvas->restore(); 165ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com canvas->translate(0, 170); 16637071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org } 16737071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org } 1687a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com 16937071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.orgprivate: 17037071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org typedef GM INHERITED; 17137071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org}; 17237071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org 17337071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.orgDEF_GM( return new RRectGM; ) 174