1ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com/* 2ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com * Copyright 2011 Google Inc. 3ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com * 4ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com * Use of this source code is governed by a BSD-style license that can be 5ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com * found in the LICENSE file. 6ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com */ 7ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com 8ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com#include "gm.h" 933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h" 10ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com#include "SkCanvas.h" 11ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com#include "SkPath.h" 125df4934b3e40cdc378e225d1dda39f015cae9baeMike Reed#include "SkMakeUnique.h" 13ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com 144c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed 154c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed#include "SkCubicMap.h" 164c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed 174c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reedstatic void test_cubic(SkCanvas* canvas) { 184c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed const SkPoint pts[] = { 194c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed { 0.333333f, 0.333333f }, { 0.666666f, 0.666666f }, 204c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed { 1, 0 }, { 0, 1 }, 214c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed { 0, 1 }, { 1, 0 }, 224c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed { 0, 0 }, { 1, 1 }, 234c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed { 1, 1 }, { 0, 0 }, 244c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed { 0, 1 }, { 0, 1 }, 254c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed { 1, 0 }, { 1, 0 }, 264c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed }; 274c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed 284c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed SkPaint paint0, paint1; 294c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed paint0.setAntiAlias(true); paint0.setStrokeWidth(3/256.0f); paint0.setColor(SK_ColorRED); 304c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed paint1.setAntiAlias(true); 314c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed 324c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed SkCubicMap cmap; 334c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed 344c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed canvas->translate(10, 266); 354c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed canvas->scale(256, -256); 364c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed for (size_t i = 0; i < SK_ARRAY_COUNT(pts); i += 2) { 374c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed cmap.setPts(pts[i], pts[i+1]); 384c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed 394c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed const int N = 128; 404c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed SkPoint tmp0[N+1], tmp1[N+1], tmp2[N+1]; 414c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed for (int j = 0; j <= N; ++j) { 424c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed float p = j * 1.0f / N; 434c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed tmp0[j] = cmap.computeFromT(p); 444c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed tmp1[j].set(p, cmap.computeYFromX(p)); 454c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed tmp2[j].set(p, cmap.hackYFromX(p)); 464c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed } 474c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed 484c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed canvas->save(); 494c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed canvas->drawPoints(SkCanvas::kPolygon_PointMode, N+1, tmp0, paint0); 504c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed canvas->drawPoints(SkCanvas::kPolygon_PointMode, N+1, tmp1, paint1); 514c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed canvas->translate(0, -1.2f); 524c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed canvas->drawPoints(SkCanvas::kPolygon_PointMode, N+1, tmp0, paint0); 534c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed canvas->drawPoints(SkCanvas::kPolygon_PointMode, N+1, tmp2, paint1); 544c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed canvas->restore(); 554c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed 564c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed canvas->translate(1.1f, 0); 574c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed } 584c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed} 594c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed 6002f9ed74ead11fcb01a24faa7d93f853e869f1abreedstatic void do_draw(SkCanvas* canvas, const SkRect& r) { 6102f9ed74ead11fcb01a24faa7d93f853e869f1abreed SkPaint paint; 62374772bd61951f01bf84fe17bf53d8867681c9aereed paint.setBlendMode(SkBlendMode::kSrc); 6302f9ed74ead11fcb01a24faa7d93f853e869f1abreed paint.setColor(0x800000FF); 6402f9ed74ead11fcb01a24faa7d93f853e869f1abreed canvas->drawRect(r, paint); 6502f9ed74ead11fcb01a24faa7d93f853e869f1abreed} 6602f9ed74ead11fcb01a24faa7d93f853e869f1abreed 6702f9ed74ead11fcb01a24faa7d93f853e869f1abreed/** 6802f9ed74ead11fcb01a24faa7d93f853e869f1abreed * Exercise kDontClipToLayer_Legacy_SaveLayerFlag flag, which does not limit the clip to the 6902f9ed74ead11fcb01a24faa7d93f853e869f1abreed * layer's bounds. Thus when a draw occurs, it can (depending on "where" it is) draw into the layer 7002f9ed74ead11fcb01a24faa7d93f853e869f1abreed * and/or draw onto the surrounding portions of the canvas, or both. 7102f9ed74ead11fcb01a24faa7d93f853e869f1abreed * 7202f9ed74ead11fcb01a24faa7d93f853e869f1abreed * This GM has a 100x100 rectangle (r), which its going to draw. However first it creates a layer 7302f9ed74ead11fcb01a24faa7d93f853e869f1abreed * with this flag covering 1/2 of the rectangle (upper half). Then it draws the rect in SRC mode. 7402f9ed74ead11fcb01a24faa7d93f853e869f1abreed * 7502f9ed74ead11fcb01a24faa7d93f853e869f1abreed * The portion of the draw that intersects the layer should see the SRC draw, apply it to the layer 7602f9ed74ead11fcb01a24faa7d93f853e869f1abreed * and then during restore, it will SRC_OVER that layer onto the canvas (SRC_OVER since the layer 7702f9ed74ead11fcb01a24faa7d93f853e869f1abreed * has no paint, so it gets the default xfermode during restore). 7802f9ed74ead11fcb01a24faa7d93f853e869f1abreed * 7928d1ce5c40123e2fbd802cf9c32cd6ebcf72ea0breed * Note: when we talk about drawing directly into the "canvas", in fact we are drawing into an 8028d1ce5c40123e2fbd802cf9c32cd6ebcf72ea0breed * "outer" layer we created (filled with red). This is a testing detail, so that our final 8128d1ce5c40123e2fbd802cf9c32cd6ebcf72ea0breed * output image is itself opaque, otherwise we make it harder to view the GM as a PNG. 8228d1ce5c40123e2fbd802cf9c32cd6ebcf72ea0breed * 8302f9ed74ead11fcb01a24faa7d93f853e869f1abreed * The portion of the draw below the layer draws directly into the canvas. Since it is in SRC mode, 8428d1ce5c40123e2fbd802cf9c32cd6ebcf72ea0breed * it will write 0x80 to the canvas' alpha, overwriting the "red", which then gets blended with 8528d1ce5c40123e2fbd802cf9c32cd6ebcf72ea0breed * the GM's white background. 8628d1ce5c40123e2fbd802cf9c32cd6ebcf72ea0breed * 8728d1ce5c40123e2fbd802cf9c32cd6ebcf72ea0breed * The portion in the layer, will end up SRC_OVERing the 0x80 layer pixels onto the canvas' red 8828d1ce5c40123e2fbd802cf9c32cd6ebcf72ea0breed * pixels, making magenta. 8902f9ed74ead11fcb01a24faa7d93f853e869f1abreed * 9028d1ce5c40123e2fbd802cf9c32cd6ebcf72ea0breed * Thus the expected result is the upper half to be magenta 0xFF7F0080, and the lower half to be 9128d1ce5c40123e2fbd802cf9c32cd6ebcf72ea0breed * light blue 0xFF7F7FFF. 9202f9ed74ead11fcb01a24faa7d93f853e869f1abreed */ 9302f9ed74ead11fcb01a24faa7d93f853e869f1abreedDEF_SIMPLE_GM(dont_clip_to_layer, canvas, 120, 120) { 9428d1ce5c40123e2fbd802cf9c32cd6ebcf72ea0breed const SkRect r { 10, 10, 110, 110 }; 9528d1ce5c40123e2fbd802cf9c32cd6ebcf72ea0breed 9628d1ce5c40123e2fbd802cf9c32cd6ebcf72ea0breed // Wrap the entire test inside a red layer, so we don't punch the actual gm's alpha with 9728d1ce5c40123e2fbd802cf9c32cd6ebcf72ea0breed // kSrc_Mode, which makes it hard to view (we like our GMs to have opaque pixels). 9828d1ce5c40123e2fbd802cf9c32cd6ebcf72ea0breed canvas->saveLayer(&r, nullptr); 9928d1ce5c40123e2fbd802cf9c32cd6ebcf72ea0breed canvas->drawColor(SK_ColorRED); 10028d1ce5c40123e2fbd802cf9c32cd6ebcf72ea0breed 1018a8937c3d18e42f5d878885b40f3c1f8140627b7Mike Reed SkRect r0 = { 20, 20, 100, 55 }; 1028a8937c3d18e42f5d878885b40f3c1f8140627b7Mike Reed SkRect r1 = { 20, 65, 100, 100 }; 10302f9ed74ead11fcb01a24faa7d93f853e869f1abreed 10402f9ed74ead11fcb01a24faa7d93f853e869f1abreed SkCanvas::SaveLayerRec rec; 10502f9ed74ead11fcb01a24faa7d93f853e869f1abreed rec.fPaint = nullptr; 10602f9ed74ead11fcb01a24faa7d93f853e869f1abreed rec.fBounds = &r0; 10702f9ed74ead11fcb01a24faa7d93f853e869f1abreed rec.fBackdrop = nullptr; 10802f9ed74ead11fcb01a24faa7d93f853e869f1abreed rec.fSaveLayerFlags = 1 << 31;//SkCanvas::kDontClipToLayer_Legacy_SaveLayerFlag; 10902f9ed74ead11fcb01a24faa7d93f853e869f1abreed canvas->saveLayer(rec); 1108a8937c3d18e42f5d878885b40f3c1f8140627b7Mike Reed rec.fBounds = &r1; 1118a8937c3d18e42f5d878885b40f3c1f8140627b7Mike Reed canvas->saveLayer(rec); 11202f9ed74ead11fcb01a24faa7d93f853e869f1abreed do_draw(canvas, r); 11302f9ed74ead11fcb01a24faa7d93f853e869f1abreed canvas->restore(); 11425d82961ffae0bd274c0ea44070d01e906c11215Matt Sarett canvas->restore(); 11528d1ce5c40123e2fbd802cf9c32cd6ebcf72ea0breed 11628d1ce5c40123e2fbd802cf9c32cd6ebcf72ea0breed canvas->restore(); // red-layer 11702f9ed74ead11fcb01a24faa7d93f853e869f1abreed} 11802f9ed74ead11fcb01a24faa7d93f853e869f1abreed 119ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com/** Draw a 2px border around the target, then red behind the target; 120ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com set the clip to match the target, then draw >> the target in blue. 121ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com*/ 122ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com 123c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.orgstatic void draw(SkCanvas* canvas, SkRect& target, int x, int y) { 124ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com SkPaint borderPaint; 125ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com borderPaint.setColor(SkColorSetRGB(0x0, 0xDD, 0x0)); 126ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com borderPaint.setAntiAlias(true); 127ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com SkPaint backgroundPaint; 128ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com backgroundPaint.setColor(SkColorSetRGB(0xDD, 0x0, 0x0)); 129ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com backgroundPaint.setAntiAlias(true); 130ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com SkPaint foregroundPaint; 131ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com foregroundPaint.setColor(SkColorSetRGB(0x0, 0x0, 0xDD)); 132ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com foregroundPaint.setAntiAlias(true); 133ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com 134ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com canvas->save(); 135abfa8d137b84a043bea2a27d16e379fa5f96a7fftomhudson@google.com canvas->translate(SkIntToScalar(x), SkIntToScalar(y)); 136abfa8d137b84a043bea2a27d16e379fa5f96a7fftomhudson@google.com target.inset(SkIntToScalar(-2), SkIntToScalar(-2)); 137ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com canvas->drawRect(target, borderPaint); 138abfa8d137b84a043bea2a27d16e379fa5f96a7fftomhudson@google.com target.inset(SkIntToScalar(2), SkIntToScalar(2)); 139ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com canvas->drawRect(target, backgroundPaint); 140669983856d99b9312be3166b7dd1f8483a90c315reed canvas->clipRect(target, true); 141abfa8d137b84a043bea2a27d16e379fa5f96a7fftomhudson@google.com target.inset(SkIntToScalar(-4), SkIntToScalar(-4)); 142ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com canvas->drawRect(target, foregroundPaint); 143ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com canvas->restore(); 144ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com} 145ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com 146c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.orgstatic void draw_square(SkCanvas* canvas, int x, int y) { 147ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com SkRect target (SkRect::MakeWH(10 * SK_Scalar1, 10 * SK_Scalar1)); 148ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com draw(canvas, target, x, y); 149ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com} 150ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com 151c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.orgstatic void draw_column(SkCanvas* canvas, int x, int y) { 152ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com SkRect target (SkRect::MakeWH(1 * SK_Scalar1, 10 * SK_Scalar1)); 153ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com draw(canvas, target, x, y); 154ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com} 155ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com 156c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.orgstatic void draw_bar(SkCanvas* canvas, int x, int y) { 157ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com SkRect target (SkRect::MakeWH(10 * SK_Scalar1, 1 * SK_Scalar1)); 158ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com draw(canvas, target, x, y); 159ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com} 160ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com 161c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.orgstatic void draw_rect_tests(SkCanvas* canvas) { 162ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com draw_square(canvas, 10, 10); 163ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com draw_column(canvas, 30, 10); 164ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com draw_bar(canvas, 10, 30); 165ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com} 166ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com 167ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com/** 168ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com Test a set of clipping problems discovered while writing blitAntiRect, 169ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com and test all the code paths through the clipping blitters. 170ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com Each region should show as a blue center surrounded by a 2px green 171ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com border, with no red. 172ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com*/ 173ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com 174ff26b7ea7cd57ab2c809c11986249b695d616d8creed@google.comclass AAClipGM : public skiagm::GM { 175ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.compublic: 176ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com AAClipGM() { 1777112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com 178ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com } 179ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com 180ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.comprotected: 18136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkString onShortName() override { 182ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com return SkString("aaclip"); 183ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com } 184ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com 18536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkISize onISize() override { 1865d0b150257f9a630154a39ab6aa5cffc850d4622commit-bot@chromium.org return SkISize::Make(240, 120); 187ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com } 188ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com 18936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(SkCanvas* canvas) override { 1904c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed if (0) { test_cubic(canvas); return; } 1914c79ecf2f493c0eaa4f58cf0bb086d61ea2aebcbMike Reed 192ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com // Initial pixel-boundary-aligned draw 193ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com draw_rect_tests(canvas); 194ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com 195ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com // Repeat 4x with .2, .4, .6, .8 px offsets 196ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5); 197abfa8d137b84a043bea2a27d16e379fa5f96a7fftomhudson@google.com canvas->translate(SkIntToScalar(50), 0); 198ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com draw_rect_tests(canvas); 199ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com 200ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5); 201abfa8d137b84a043bea2a27d16e379fa5f96a7fftomhudson@google.com canvas->translate(SkIntToScalar(50), 0); 202ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com draw_rect_tests(canvas); 203ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com 204ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5); 205abfa8d137b84a043bea2a27d16e379fa5f96a7fftomhudson@google.com canvas->translate(SkIntToScalar(50), 0); 206ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com draw_rect_tests(canvas); 207ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com 208ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5); 209abfa8d137b84a043bea2a27d16e379fa5f96a7fftomhudson@google.com canvas->translate(SkIntToScalar(50), 0); 210ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com draw_rect_tests(canvas); 211ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com } 212ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com 213ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.comprivate: 214ff26b7ea7cd57ab2c809c11986249b695d616d8creed@google.com typedef skiagm::GM INHERITED; 215ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com}; 216ef279d36ca176d3669b1623aa4692f469ec52a58tomhudson@google.com 217385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new AAClipGM;) 21860b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org 21960b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org///////////////////////////////////////////////////////////////////////// 22060b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org 22160b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org#ifdef SK_BUILD_FOR_MAC 22260b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org 2235df4934b3e40cdc378e225d1dda39f015cae9baeMike Reedstatic std::unique_ptr<SkCanvas> make_canvas(const SkBitmap& bm) { 22460b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org const SkImageInfo& info = bm.info(); 22560b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org if (info.bytesPerPixel() == 4) { 2265df4934b3e40cdc378e225d1dda39f015cae9baeMike Reed return SkCanvas::MakeRasterDirectN32(info.width(), info.height(), 2275df4934b3e40cdc378e225d1dda39f015cae9baeMike Reed (SkPMColor*)bm.getPixels(), 2285df4934b3e40cdc378e225d1dda39f015cae9baeMike Reed bm.rowBytes()); 22960b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org } else { 2305df4934b3e40cdc378e225d1dda39f015cae9baeMike Reed return skstd::make_unique<SkCanvas>(bm); 23160b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org } 23260b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org} 23360b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org 23460b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org#include "SkCGUtils.h" 23560b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.orgstatic void test_image(SkCanvas* canvas, const SkImageInfo& info) { 23660b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org SkBitmap bm; 23760b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org bm.allocPixels(info); 23860b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org 23960b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org if (info.isOpaque()) { 24060b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org bm.eraseColor(SK_ColorGREEN); 24160b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org } else { 24260b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org bm.eraseColor(0); 24360b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org } 244ede0c5c7784ff4bd86e268d33df89c0ac432ca5bskia.committer@gmail.com 24560b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org SkPaint paint; 24660b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org paint.setAntiAlias(true); 24760b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org paint.setColor(SK_ColorBLUE); 2485df4934b3e40cdc378e225d1dda39f015cae9baeMike Reed make_canvas(bm)->drawCircle(50, 50, 49, paint); 24960b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org canvas->drawBitmap(bm, 10, 10); 250ede0c5c7784ff4bd86e268d33df89c0ac432ca5bskia.committer@gmail.com 25196fcdcc219d2a0d3579719b84b28bede76efba64halcanary CGImageRef image = SkCreateCGImageRefWithColorspace(bm, nullptr); 252ede0c5c7784ff4bd86e268d33df89c0ac432ca5bskia.committer@gmail.com 25360b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org SkBitmap bm2; 25460b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org SkCreateBitmapFromCGImage(&bm2, image); 25560b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org canvas->drawBitmap(bm2, 10, 120); 256463c848f3b63b52e3834e405ff11fd1e653ed271Mike Reed canvas->drawImage(SkMakeImageFromCGImage(image), 10, 120 + bm2.height() + 10); 257463c848f3b63b52e3834e405ff11fd1e653ed271Mike Reed 258463c848f3b63b52e3834e405ff11fd1e653ed271Mike Reed CGImageRelease(image); 25960b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org} 26060b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org 26160b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.orgclass CGImageGM : public skiagm::GM { 26260b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.orgpublic: 26360b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org CGImageGM() {} 264ede0c5c7784ff4bd86e268d33df89c0ac432ca5bskia.committer@gmail.com 26560b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.orgprotected: 26636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkString onShortName() override { 26760b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org return SkString("cgimage"); 26860b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org } 269ede0c5c7784ff4bd86e268d33df89c0ac432ca5bskia.committer@gmail.com 27036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkISize onISize() override { 27160b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org return SkISize::Make(800, 250); 27260b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org } 273ede0c5c7784ff4bd86e268d33df89c0ac432ca5bskia.committer@gmail.com 27436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(SkCanvas* canvas) override { 27560b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org const struct { 27660b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org SkColorType fCT; 27760b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org SkAlphaType fAT; 27860b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org } rec[] = { 27960b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org { kRGB_565_SkColorType, kOpaque_SkAlphaType }, 28060b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org 28160b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org { kRGBA_8888_SkColorType, kPremul_SkAlphaType }, 28260b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org { kRGBA_8888_SkColorType, kUnpremul_SkAlphaType }, 28360b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org { kRGBA_8888_SkColorType, kOpaque_SkAlphaType }, 28460b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org 28560b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org { kBGRA_8888_SkColorType, kPremul_SkAlphaType }, 28660b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org { kBGRA_8888_SkColorType, kUnpremul_SkAlphaType }, 28760b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org { kBGRA_8888_SkColorType, kOpaque_SkAlphaType }, 28860b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org }; 289ede0c5c7784ff4bd86e268d33df89c0ac432ca5bskia.committer@gmail.com 29060b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(rec); ++i) { 29160b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org SkImageInfo info = SkImageInfo::Make(100, 100, rec[i].fCT, rec[i].fAT); 29260b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org test_image(canvas, info); 29360b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org canvas->translate(info.width() + 10, 0); 29460b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org } 29560b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org } 296ede0c5c7784ff4bd86e268d33df89c0ac432ca5bskia.committer@gmail.com 29760b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.orgprivate: 29860b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org typedef skiagm::GM INHERITED; 29960b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org}; 300463c848f3b63b52e3834e405ff11fd1e653ed271Mike Reed//DEF_GM( return new CGImageGM; ) 30160b5dce19984a5165f6b2f1d6d477f5e8a940761commit-bot@chromium.org#endif 3028f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed 3038f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed/////////////////////////////////////////////////////////////////////////////////////////////////// 3048f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed 3056950de6c4166fabb35e6c756fc009e0cf1c47819halcanary// https://bug.skia.org/3716 3068f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reedclass ClipCubicGM : public skiagm::GM { 3078f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed const SkScalar W = 100; 3088f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed const SkScalar H = 240; 3098f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed 3108f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed SkPath fVPath, fHPath; 3118f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reedpublic: 3128f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed ClipCubicGM() { 3138f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed fVPath.moveTo(W, 0); 3148f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed fVPath.cubicTo(W, H-10, 0, 10, 0, H); 3159d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary 3168f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed SkMatrix pivot; 3178f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed pivot.setRotate(90, W/2, H/2); 3188f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed fVPath.transform(pivot, &fHPath); 3198f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed } 3208f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed 3218f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reedprotected: 3228f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed SkString onShortName() override { 3238f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed return SkString("clipcubic"); 3248f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed } 3259d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary 3268f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed SkISize onISize() override { 3278f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed return SkISize::Make(400, 410); 3288f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed } 3298f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed 3308f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed void doDraw(SkCanvas* canvas, const SkPath& path) { 3318f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed SkPaint paint; 3328f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed paint.setAntiAlias(true); 3339d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary 334125960152dfd7f2aba4c2239131bdf75d9ac2705caryclark paint.setColor(sk_tool_utils::color_to_565(0xFFCCCCCC)); 3358f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed canvas->drawPath(path, paint); 3369d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary 3378f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed paint.setColor(SK_ColorRED); 3388f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed paint.setStyle(SkPaint::kStroke_Style); 3398f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed canvas->drawPath(path, paint); 3408f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed } 3418f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed 3428f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed void drawAndClip(SkCanvas* canvas, const SkPath& path, SkScalar dx, SkScalar dy) { 3438f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed SkAutoCanvasRestore acr(canvas, true); 3448f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed 3458f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed SkRect r = SkRect::MakeXYWH(0, H/4, W, H/2); 3468f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed SkPaint paint; 347125960152dfd7f2aba4c2239131bdf75d9ac2705caryclark paint.setColor(sk_tool_utils::color_to_565(0xFF8888FF)); 3488f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed 3498f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed canvas->drawRect(r, paint); 3508f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed this->doDraw(canvas, path); 3519d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary 3528f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed canvas->translate(dx, dy); 3538f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed 3548f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed canvas->drawRect(r, paint); 3558f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed canvas->clipRect(r); 3568f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed this->doDraw(canvas, path); 3578f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed } 3588f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed 3598f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed void onDraw(SkCanvas* canvas) override { 3608f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed canvas->translate(80, 10); 3618f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed this->drawAndClip(canvas, fVPath, 200, 0); 3628f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed canvas->translate(0, 200); 3638f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed this->drawAndClip(canvas, fHPath, 200, 0); 3648f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed } 3659d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary 3668f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reedprivate: 3678f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed typedef skiagm::GM INHERITED; 3688f76cb905a7c62dd0ffec4ba7e5ad82caa4b9446reed}; 369385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new ClipCubicGM;) 370