CanvasStateTest.cpp revision 15a140599942f70e47380e3f700a825c7cece3b4
15587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com/* 25587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com * Copyright 2013 Google Inc. 35587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com * 45587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com * Use of this source code is governed by a BSD-style license that can be 55587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com * found in the LICENSE file. 65587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com */ 75587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 85587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com#include "SkBitmapDevice.h" 95587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com#include "SkCanvas.h" 105587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com#include "SkCanvasStateUtils.h" 115587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com#include "SkDrawFilter.h" 1207f6cf372dc003694c79cfb313923fef9eaf8dc8commit-bot@chromium.org#include "SkError.h" 135587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com#include "SkPaint.h" 145587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com#include "SkRRect.h" 158f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "SkRect.h" 168f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h" 175587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 185587ac09beec4c056332504f3fa85990520b43fddjsollen@google.comstatic void test_complex_layers(skiatest::Reporter* reporter) { 195587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com const int WIDTH = 400; 205587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com const int HEIGHT = 400; 215587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com const int SPACER = 10; 225587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 2320146b3f7339d2c71c416397135e70e34f7fedb1djsollen@google.com SkRect rect = SkRect::MakeXYWH(SkIntToScalar(SPACER), SkIntToScalar(SPACER), 2420146b3f7339d2c71c416397135e70e34f7fedb1djsollen@google.com SkIntToScalar(WIDTH-(2*SPACER)), 2520146b3f7339d2c71c416397135e70e34f7fedb1djsollen@google.com SkIntToScalar((HEIGHT-(2*SPACER)) / 7)); 265587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 27fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org const SkColorType colorTypes[] = { 28fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org kRGB_565_SkColorType, kPMColor_SkColorType 295587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com }; 30fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org const int configCount = sizeof(colorTypes) / sizeof(SkBitmap::Config); 315587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 325587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com const int layerAlpha[] = { 255, 255, 0 }; 335587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com const SkCanvas::SaveFlags flags[] = { SkCanvas::kARGB_NoClipLayer_SaveFlag, 345587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com SkCanvas::kARGB_ClipLayer_SaveFlag, 355587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com SkCanvas::kARGB_NoClipLayer_SaveFlag 365587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com }; 375587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com REPORTER_ASSERT(reporter, sizeof(layerAlpha) == sizeof(flags)); 385587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com const int layerCombinations = sizeof(layerAlpha) / sizeof(int); 395587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 405587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com for (int i = 0; i < configCount; ++i) { 415587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com SkBitmap bitmaps[2]; 425587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com for (int j = 0; j < 2; ++j) { 43fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org bitmaps[j].allocPixels(SkImageInfo::Make(WIDTH, HEIGHT, 44fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org colorTypes[i], 45fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org kPremul_SkAlphaType)); 465587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 475587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com SkCanvas canvas(bitmaps[j]); 485587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 495587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com canvas.drawColor(SK_ColorRED); 505587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 515587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com for (int k = 0; k < layerCombinations; ++k) { 525587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com // draw a rect within the layer's bounds and again outside the layer's bounds 535587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com canvas.saveLayerAlpha(&rect, layerAlpha[k], flags[k]); 545587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 555587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com SkCanvasState* state = NULL; 565587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com SkCanvas* tmpCanvas = NULL; 575587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com if (j) { 585587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com state = SkCanvasStateUtils::CaptureCanvasState(&canvas); 595587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com REPORTER_ASSERT(reporter, state); 605587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com tmpCanvas = SkCanvasStateUtils::CreateFromCanvasState(state); 615587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com REPORTER_ASSERT(reporter, tmpCanvas); 625587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com } else { 635587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com tmpCanvas = SkRef(&canvas); 645587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com } 655587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 665587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com SkPaint bluePaint; 675587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com bluePaint.setColor(SK_ColorBLUE); 685587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com bluePaint.setStyle(SkPaint::kFill_Style); 695587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 705587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com tmpCanvas->drawRect(rect, bluePaint); 715587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com tmpCanvas->translate(0, rect.height() + SPACER); 725587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com tmpCanvas->drawRect(rect, bluePaint); 735587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 745587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com tmpCanvas->unref(); 755587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com SkCanvasStateUtils::ReleaseCanvasState(state); 765587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 775587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com canvas.restore(); 785587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 795587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com // translate the canvas for the next iteration 805587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com canvas.translate(0, 2*(rect.height() + SPACER)); 815587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com } 825587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com } 835587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 845587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com // now we memcmp the two bitmaps 855587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com REPORTER_ASSERT(reporter, bitmaps[0].getSize() == bitmaps[1].getSize()); 865587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com REPORTER_ASSERT(reporter, !memcmp(bitmaps[0].getPixels(), 875587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com bitmaps[1].getPixels(), 885587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com bitmaps[0].getSize())); 895587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com } 905587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com} 915587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 925587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com//////////////////////////////////////////////////////////////////////////////// 935587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 94339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.comstatic void test_complex_clips(skiatest::Reporter* reporter) { 95339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 96339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com const int WIDTH = 400; 97339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com const int HEIGHT = 400; 981037c7b9f2f0220c4f0a90faebe3c89d4981c1e3djsollen@google.com const int SPACER = 10; 99339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 1001037c7b9f2f0220c4f0a90faebe3c89d4981c1e3djsollen@google.com SkIRect layerRect = SkIRect::MakeWH(WIDTH, HEIGHT / 4); 101339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com layerRect.inset(2*SPACER, 2*SPACER); 102339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 1031037c7b9f2f0220c4f0a90faebe3c89d4981c1e3djsollen@google.com SkIRect clipRect = layerRect; 104339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com clipRect.fRight = clipRect.fLeft + (clipRect.width() / 2) - (2*SPACER); 105339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com clipRect.outset(SPACER, SPACER); 106339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 1071037c7b9f2f0220c4f0a90faebe3c89d4981c1e3djsollen@google.com SkIRect regionBounds = clipRect; 108339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com regionBounds.offset(clipRect.width() + (2*SPACER), 0); 109339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 110339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com SkIRect regionInterior = regionBounds; 111339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com regionInterior.inset(SPACER*3, SPACER*3); 112339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 113339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com SkRegion clipRegion; 114339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com clipRegion.setRect(regionBounds); 115339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com clipRegion.op(regionInterior, SkRegion::kDifference_Op); 116339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 117339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 118339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com const SkRegion::Op clipOps[] = { SkRegion::kIntersect_Op, 119339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com SkRegion::kIntersect_Op, 120339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com SkRegion::kReplace_Op, 121339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com }; 122339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com const SkCanvas::SaveFlags flags[] = { SkCanvas::kARGB_NoClipLayer_SaveFlag, 123339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com SkCanvas::kARGB_ClipLayer_SaveFlag, 124339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com SkCanvas::kARGB_NoClipLayer_SaveFlag, 125339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com }; 126339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com REPORTER_ASSERT(reporter, sizeof(clipOps) == sizeof(flags)); 127339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com const int layerCombinations = sizeof(flags) / sizeof(SkCanvas::SaveFlags); 128339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 129339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com SkBitmap bitmaps[2]; 130339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com for (int i = 0; i < 2; ++i) { 131fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org bitmaps[i].allocN32Pixels(WIDTH, HEIGHT); 132339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 133339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com SkCanvas canvas(bitmaps[i]); 134339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 135339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com canvas.drawColor(SK_ColorRED); 136339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 137339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com SkRegion localRegion = clipRegion; 138339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 139339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com for (int j = 0; j < layerCombinations; ++j) { 1401037c7b9f2f0220c4f0a90faebe3c89d4981c1e3djsollen@google.com SkRect layerBounds = SkRect::Make(layerRect); 1411037c7b9f2f0220c4f0a90faebe3c89d4981c1e3djsollen@google.com canvas.saveLayerAlpha(&layerBounds, 128, flags[j]); 142339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 143339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com SkCanvasState* state = NULL; 144339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com SkCanvas* tmpCanvas = NULL; 145339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com if (i) { 146339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com state = SkCanvasStateUtils::CaptureCanvasState(&canvas); 147339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com REPORTER_ASSERT(reporter, state); 148339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com tmpCanvas = SkCanvasStateUtils::CreateFromCanvasState(state); 149339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com REPORTER_ASSERT(reporter, tmpCanvas); 150339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com } else { 151339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com tmpCanvas = SkRef(&canvas); 152339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com } 153339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 154339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com tmpCanvas->save(); 1551037c7b9f2f0220c4f0a90faebe3c89d4981c1e3djsollen@google.com tmpCanvas->clipRect(SkRect::Make(clipRect), clipOps[j]); 156339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com tmpCanvas->drawColor(SK_ColorBLUE); 157339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com tmpCanvas->restore(); 158339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 159339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com tmpCanvas->clipRegion(localRegion, clipOps[j]); 160339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com tmpCanvas->drawColor(SK_ColorBLUE); 161339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 162339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com tmpCanvas->unref(); 163339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com SkCanvasStateUtils::ReleaseCanvasState(state); 164339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 165339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com canvas.restore(); 166339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 167339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com // translate the canvas and region for the next iteration 1681037c7b9f2f0220c4f0a90faebe3c89d4981c1e3djsollen@google.com canvas.translate(0, SkIntToScalar(2*(layerRect.height() + (SPACER)))); 169339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com localRegion.translate(0, 2*(layerRect.height() + SPACER)); 170339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com } 171339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com } 172339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 173339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com // now we memcmp the two bitmaps 174339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com REPORTER_ASSERT(reporter, bitmaps[0].getSize() == bitmaps[1].getSize()); 175339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com REPORTER_ASSERT(reporter, !memcmp(bitmaps[0].getPixels(), 176339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com bitmaps[1].getPixels(), 177339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com bitmaps[0].getSize())); 178339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com} 179339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 180339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com//////////////////////////////////////////////////////////////////////////////// 181339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com 1825587ac09beec4c056332504f3fa85990520b43fddjsollen@google.comclass TestDrawFilter : public SkDrawFilter { 1835587ac09beec4c056332504f3fa85990520b43fddjsollen@google.compublic: 1845587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com virtual bool filter(SkPaint*, Type) SK_OVERRIDE { return true; } 1855587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com}; 1865587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 1875587ac09beec4c056332504f3fa85990520b43fddjsollen@google.comstatic void test_draw_filters(skiatest::Reporter* reporter) { 1885587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com TestDrawFilter drawFilter; 18915a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org SkBitmap bitmap; 19015a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org bitmap.allocN32Pixels(10, 10); 19115a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org SkCanvas canvas(bitmap); 1925587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 1935587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com canvas.setDrawFilter(&drawFilter); 1945587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 1955587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com SkCanvasState* state = SkCanvasStateUtils::CaptureCanvasState(&canvas); 1965587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com REPORTER_ASSERT(reporter, state); 1975587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com SkCanvas* tmpCanvas = SkCanvasStateUtils::CreateFromCanvasState(state); 1985587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com REPORTER_ASSERT(reporter, tmpCanvas); 1995587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 2005587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com REPORTER_ASSERT(reporter, NULL != canvas.getDrawFilter()); 2015587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com REPORTER_ASSERT(reporter, NULL == tmpCanvas->getDrawFilter()); 2025587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 2035587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com tmpCanvas->unref(); 2045587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com SkCanvasStateUtils::ReleaseCanvasState(state); 2055587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com} 2065587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 2075587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com//////////////////////////////////////////////////////////////////////////////// 2085587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 20907f6cf372dc003694c79cfb313923fef9eaf8dc8commit-bot@chromium.org// we need this function to prevent SkError from printing to stdout 21007f6cf372dc003694c79cfb313923fef9eaf8dc8commit-bot@chromium.orgstatic void error_callback(SkError code, void* ctx) {} 21107f6cf372dc003694c79cfb313923fef9eaf8dc8commit-bot@chromium.org 2125587ac09beec4c056332504f3fa85990520b43fddjsollen@google.comstatic void test_soft_clips(skiatest::Reporter* reporter) { 21315a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org SkBitmap bitmap; 21415a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org bitmap.allocN32Pixels(10, 10); 21515a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org SkCanvas canvas(bitmap); 2165587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 2175587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com SkRRect roundRect; 2185587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com roundRect.setOval(SkRect::MakeWH(5, 5)); 2195587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 2205587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com canvas.clipRRect(roundRect, SkRegion::kIntersect_Op, true); 2215587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 22207f6cf372dc003694c79cfb313923fef9eaf8dc8commit-bot@chromium.org SkSetErrorCallback(error_callback, NULL); 22307f6cf372dc003694c79cfb313923fef9eaf8dc8commit-bot@chromium.org 2245587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com SkCanvasState* state = SkCanvasStateUtils::CaptureCanvasState(&canvas); 2255587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com REPORTER_ASSERT(reporter, !state); 22607f6cf372dc003694c79cfb313923fef9eaf8dc8commit-bot@chromium.org 22707f6cf372dc003694c79cfb313923fef9eaf8dc8commit-bot@chromium.org REPORTER_ASSERT(reporter, kInvalidOperation_SkError == SkGetLastError()); 22807f6cf372dc003694c79cfb313923fef9eaf8dc8commit-bot@chromium.org SkClearLastError(); 2295587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com} 2305587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com 231e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(CanvasState, reporter) { 2325587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com test_complex_layers(reporter); 233339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com test_complex_clips(reporter); 2345587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com test_draw_filters(reporter); 2355587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com test_soft_clips(reporter); 2365587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com} 237