1a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 2a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org/* 3a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org * Copyright 2014 Google Inc. 4a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org * 5a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be 6a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org * found in the LICENSE file. 7a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org */ 8a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 9a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org#include "gm.h" 10a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 11a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org#include "SkBitmap.h" 12a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org#include "SkGradientShader.h" 13a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org#include "SkTLList.h" 14a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 15a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.orgstatic SkBitmap make_bmp(int w, int h) { 16a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkBitmap bmp; 17a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org bmp.allocN32Pixels(w, h, true); 18a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 19a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkCanvas canvas(bmp); 20a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkScalar wScalar = SkIntToScalar(w); 21a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkScalar hScalar = SkIntToScalar(h); 22a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 23a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkPoint pt = { wScalar / 2, hScalar / 2 }; 24a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 25a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkScalar radius = 3 * SkMaxScalar(wScalar, hScalar); 26a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 27a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkColor colors[] = { SK_ColorDKGRAY, 0xFF222255, 28a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 0xFF331133, 0xFF884422, 29a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 0xFF000022, SK_ColorWHITE, 30a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 0xFFAABBCC}; 31a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 32a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkScalar pos[] = {0, 33a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SK_Scalar1 / 6, 34a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 2 * SK_Scalar1 / 6, 35a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 3 * SK_Scalar1 / 6, 36a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 4 * SK_Scalar1 / 6, 37a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 5 * SK_Scalar1 / 6, 38a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SK_Scalar1}; 39a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 40a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkPaint paint; 41a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkRect rect = SkRect::MakeWH(wScalar, hScalar); 42a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkMatrix mat = SkMatrix::I(); 43a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org for (int i = 0; i < 4; ++i) { 449c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org paint.setShader(SkGradientShader::CreateRadial( 459c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org pt, radius, 469c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org colors, pos, 479c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org SK_ARRAY_COUNT(colors), 489c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org SkShader::kRepeat_TileMode, 4983f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org 0, &mat))->unref(); 50a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org canvas.drawRect(rect, paint); 51a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org rect.inset(wScalar / 8, hScalar / 8); 52a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org mat.preTranslate(6 * wScalar, 6 * hScalar); 53a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org mat.postScale(SK_Scalar1 / 3, SK_Scalar1 / 3); 54a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org } 55a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 56a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org paint.setAntiAlias(true); 57a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org paint.setTextSize(wScalar / 2.2f); 58a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org paint.setShader(0); 59a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org paint.setColor(SK_ColorLTGRAY); 60a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org static const char kTxt[] = "Skia"; 61a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkPoint texPos = { wScalar / 17, hScalar / 2 + paint.getTextSize() / 2.5f }; 62a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org canvas.drawText(kTxt, SK_ARRAY_COUNT(kTxt)-1, texPos.fX, texPos.fY, paint); 63a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org paint.setColor(SK_ColorBLACK); 64a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org paint.setStyle(SkPaint::kStroke_Style); 65a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org paint.setStrokeWidth(SK_Scalar1); 66a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org canvas.drawText(kTxt, SK_ARRAY_COUNT(kTxt)-1, texPos.fX, texPos.fY, paint); 67a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org return bmp; 68a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org} 69a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 70a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.orgnamespace skiagm { 71a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org/** 72a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org * This GM tests convex polygon clips. 73a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org */ 74a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.orgclass ConvexPolyClip : public GM { 75a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.orgpublic: 76a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org ConvexPolyClip() { 77a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org this->setBGColor(0xFFFFFFFF); 78a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org } 79a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 80a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.orgprotected: 81a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org virtual SkString onShortName() SK_OVERRIDE { 82a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org return SkString("convex_poly_clip"); 83a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org } 84a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 85a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org virtual SkISize onISize() SK_OVERRIDE { 86b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org // When benchmarking the saveLayer set of draws is skipped. 87b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org int w = 435; 88b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org if (kBench_Mode != this->getMode()) { 89b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org w *= 2; 90b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org } 91f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina return SkISize::Make(w, 540); 92a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org } 93a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 94a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org virtual void onOnceBeforeDraw() SK_OVERRIDE { 95a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkPath tri; 96a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org tri.moveTo(5.f, 5.f); 97a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org tri.lineTo(100.f, 20.f); 98a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org tri.lineTo(15.f, 100.f); 99a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 100b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org fClips.addToTail()->setPath(tri); 101a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 102a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkPath hexagon; 103a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org static const SkScalar kRadius = 45.f; 104a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org const SkPoint center = { kRadius, kRadius }; 105a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org for (int i = 0; i < 6; ++i) { 106a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkScalar angle = 2 * SK_ScalarPI * i / 6; 107a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkPoint point; 108a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org point.fY = SkScalarSinCos(angle, &point.fX); 109a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org point.scale(kRadius); 110a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org point = center + point; 111a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org if (0 == i) { 112a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org hexagon.moveTo(point); 113a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org } else { 114a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org hexagon.lineTo(point); 115a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org } 116a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org } 117b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org fClips.addToTail()->setPath(hexagon); 118a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 119a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkMatrix scaleM; 120a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org scaleM.setScale(1.1f, 0.4f, kRadius, kRadius); 121a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org hexagon.transform(scaleM); 122b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org fClips.addToTail()->setPath(hexagon); 123b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org 124b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org fClips.addToTail()->setRect(SkRect::MakeXYWH(8.3f, 11.6f, 78.2f, 72.6f)); 125a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 126a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkPath rotRect; 127a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkRect rect = SkRect::MakeLTRB(10.f, 12.f, 80.f, 86.f); 128a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org rotRect.addRect(rect); 129a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkMatrix rotM; 130a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org rotM.setRotate(23.f, rect.centerX(), rect.centerY()); 131a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org rotRect.transform(rotM); 132b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org fClips.addToTail()->setPath(rotRect); 1331dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com 134a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org fBmp = make_bmp(100, 100); 135a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org } 136a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 137a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 138a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkScalar y = 0; 139a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org static const SkScalar kMargin = 10.f; 140a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 141a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkPaint bgPaint; 142a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org bgPaint.setAlpha(0x15); 143a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkISize size = canvas->getDeviceSize(); 144a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkRect dstRect = SkRect::MakeWH(SkIntToScalar(size.fWidth), 145a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkIntToScalar(size.fHeight)); 146a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org canvas->drawBitmapRectToRect(fBmp, NULL, dstRect, &bgPaint); 147a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 148b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org static const char kTxt[] = "Clip Me!"; 149b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org SkPaint txtPaint; 150b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org txtPaint.setTextSize(23.f); 151b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org txtPaint.setAntiAlias(true); 152b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org txtPaint.setColor(SK_ColorDKGRAY); 153b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org SkScalar textW = txtPaint.measureText(kTxt, SK_ARRAY_COUNT(kTxt)-1); 154b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org 155b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org SkScalar startX = 0; 156b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org int testLayers = kBench_Mode != this->getMode(); 157b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org for (int doLayer = 0; doLayer <= testLayers; ++doLayer) { 158b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org for (SkTLList<Clip>::Iter iter(fClips, SkTLList<Clip>::Iter::kHead_IterStart); 159b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org NULL != iter.get(); 160b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org iter.next()) { 161b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org const Clip* clip = iter.get(); 162b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org SkScalar x = startX; 163b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org for (int aa = 0; aa < 2; ++aa) { 164b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org if (doLayer) { 165b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org SkRect bounds; 166b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org clip->getBounds(&bounds); 167b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org bounds.outset(2, 2); 168b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org bounds.offset(x, y); 169b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org canvas->saveLayer(&bounds, NULL); 170b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org } else { 171b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org canvas->save(); 172b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org } 173b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org canvas->translate(x, y); 174b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org clip->setOnCanvas(canvas, SkRegion::kIntersect_Op, SkToBool(aa)); 175b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org canvas->drawBitmap(fBmp, 0, 0); 176b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org canvas->restore(); 177b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org x += fBmp.width() + kMargin; 178b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org } 179b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org for (int aa = 0; aa < 2; ++aa) { 180b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org 181b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org SkPaint clipOutlinePaint; 182b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org clipOutlinePaint.setAntiAlias(true); 183b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org clipOutlinePaint.setColor(0x50505050); 184b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org clipOutlinePaint.setStyle(SkPaint::kStroke_Style); 185b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org clipOutlinePaint.setStrokeWidth(0); 186b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org 187b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org if (doLayer) { 188b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org SkRect bounds; 189b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org clip->getBounds(&bounds); 190b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org bounds.outset(2, 2); 191b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org bounds.offset(x, y); 192b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org canvas->saveLayer(&bounds, NULL); 193b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org } else { 194b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org canvas->save(); 195b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org } 196b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org canvas->translate(x, y); 197b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org SkPath closedClipPath; 198b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org clip->asClosedPath(&closedClipPath); 199b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org canvas->drawPath(closedClipPath, clipOutlinePaint); 200b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org clip->setOnCanvas(canvas, SkRegion::kIntersect_Op, SkToBool(aa)); 201b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org canvas->scale(1.f, 1.8f); 202b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org canvas->drawText(kTxt, SK_ARRAY_COUNT(kTxt)-1, 203b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org 0, 1.5f * txtPaint.getTextSize(), 204b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org txtPaint); 205b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org canvas->restore(); 206b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org x += textW + 2 * kMargin; 207b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org } 208b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org y += fBmp.height() + kMargin; 209a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org } 210b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org y = 0; 211b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org startX += 2 * fBmp.width() + SkScalarCeilToInt(2 * textW) + 6 * kMargin; 212a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org } 213a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org } 214a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 2156adce6783c5d7cbef276d04cc08a2b19789a0156commit-bot@chromium.org virtual uint32_t onGetFlags() const { 216a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kAsBench_Flag | kSkipTiled_Flag; 2176adce6783c5d7cbef276d04cc08a2b19789a0156commit-bot@chromium.org } 2186adce6783c5d7cbef276d04cc08a2b19789a0156commit-bot@chromium.org 219a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.orgprivate: 220b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org class Clip { 221b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org public: 222b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org enum ClipType { 223b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org kNone_ClipType, 224b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org kPath_ClipType, 225b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org kRect_ClipType 226b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org }; 227b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org 228b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org Clip () : fClipType(kNone_ClipType) {} 2291dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com 230b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org void setOnCanvas(SkCanvas* canvas, SkRegion::Op op, bool aa) const { 231b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org switch (fClipType) { 232b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org case kPath_ClipType: 233b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org canvas->clipPath(fPath, op, aa); 234b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org break; 235b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org case kRect_ClipType: 236b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org canvas->clipRect(fRect, op, aa); 237b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org break; 238b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org case kNone_ClipType: 239b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org SkDEBUGFAIL("Uninitialized Clip."); 240b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org break; 241b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org } 242b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org } 2431dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com 244b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org void asClosedPath(SkPath* path) const { 245b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org switch (fClipType) { 246b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org case kPath_ClipType: 247b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org *path = fPath; 248b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org path->close(); 249b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org break; 250b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org case kRect_ClipType: 251b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org path->reset(); 252b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org path->addRect(fRect); 253b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org break; 254b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org case kNone_ClipType: 255b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org SkDEBUGFAIL("Uninitialized Clip."); 256b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org break; 257b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org } 258b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org } 2591dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com 260b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org void setPath(const SkPath& path) { 261b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org fClipType = kPath_ClipType; 262b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org fPath = path; 263b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org } 2641dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com 265b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org void setRect(const SkRect& rect) { 266b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org fClipType = kRect_ClipType; 267b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org fRect = rect; 268b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org fPath.reset(); 269b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org } 2701dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com 271b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org ClipType getType() const { return fClipType; } 2721dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com 273b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org void getBounds(SkRect* bounds) const { 274b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org switch (fClipType) { 275b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org case kPath_ClipType: 276b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org *bounds = fPath.getBounds(); 277b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org break; 278b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org case kRect_ClipType: 279b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org *bounds = fRect; 280b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org break; 281b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org case kNone_ClipType: 282b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org SkDEBUGFAIL("Uninitialized Clip."); 283b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org break; 284b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org } 285b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org } 286b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org 287b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org private: 288b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org ClipType fClipType; 289b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org SkPath fPath; 290b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org SkRect fRect; 291b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org }; 2921dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com 293b511be5a9b6bf194062b79206ac1ec0204aed8eecommit-bot@chromium.org SkTLList<Clip> fClips; 294a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org SkBitmap fBmp; 295a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 296a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org typedef GM INHERITED; 297a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org}; 298a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 299a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.orgDEF_GM( return SkNEW(ConvexPolyClip); ) 300a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org 301a343c844ecefd743d23f7fba1683db14cfb3540fcommit-bot@chromium.org} 302