137f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com/* 21cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * Copyright 2012 Google Inc. 337f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com * 437f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com * Use of this source code is governed by a BSD-style license that can be 537f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com * found in the LICENSE file. 637f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com */ 71cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 81cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org/* Description: 91cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * This test defines a series of elementatry test steps that perform 101cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * a single or a small group of canvas API calls. Each test step is 111cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * used in several test cases that verify that different types of SkCanvas 121cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * flavors and derivatives pass it and yield consistent behavior. The 131cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * test cases analyse results that are queryable through the API. They do 141cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * not look at rendering results. 151cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * 161cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * Adding test stepss: 171cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * The general pattern for creating a new test step is to write a test 181cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * function of the form: 191cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * 20d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com * static void MyTestStepFunction(SkCanvas* canvas, 211cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * skiatest::Reporter* reporter, 221cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * CanvasTestStep* testStep) 231cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * { 241cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * canvas->someCanvasAPImethod(); 251cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * (...) 261cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * REPORTER_ASSERT_MESSAGE(reporter, (...), \ 271cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * testStep->assertMessage()); 281cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * } 291cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * 301cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * The definition of the test step function should be followed by an 311cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * invocation of the TEST_STEP macro, which generates a class and 321cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * instance for the test step: 331cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * 341cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * TEST_STEP(MyTestStep, MyTestStepFunction) 351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * 361cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * There are also short hand macros for defining simple test steps 371cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * in a single line of code. A simple test step is a one that is made 381cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * of a single canvas API call. 391cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * 401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * SIMPLE_TEST_STEP(MytestStep, someCanvasAPIMethod()); 411cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * 421cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * There is another macro called SIMPLE_TEST_STEP_WITH_ASSERT that 431cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * works the same way as SIMPLE_TEST_STEP, and additionally verifies 441cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * that the invoked method returns a non-zero value. 451cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org */ 4637f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com#include "SkBitmap.h" 4737f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com#include "SkCanvas.h" 48687fa1c745febb57f42b0d5f03d7c1f4be2530careed#include "SkClipStack.h" 491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkDeferredCanvas.h" 501cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkDevice.h" 513d32d50364d1b63777fbf05c3593a35601bde9e2halcanary#include "SkDocument.h" 521cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkMatrix.h" 531cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkNWayCanvas.h" 541cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkPaint.h" 551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkPath.h" 561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkPicture.h" 571cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkPictureRecord.h" 58770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com#include "SkPictureRecorder.h" 591cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkRect.h" 601cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkRegion.h" 611cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkShader.h" 621cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkStream.h" 6328183b4043a969df12592e8dd47cf95b80755284reed@google.com#include "SkSurface.h" 641cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkTDArray.h" 651cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "Test.h" 6637f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com 67f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic const int kWidth = 2, kHeight = 2; 68f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr 69f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void createBitmap(SkBitmap* bm, SkColor color) { 70f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr bm->allocN32Pixels(kWidth, kHeight); 71f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr bm->eraseColor(color); 72f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr} 73f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr 74f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic SkSurface* createSurface(SkColor color) { 753054be16dfdb0d06233770cbfc338958edef44eareed SkSurface* surface = SkSurface::NewRasterN32Premul(kWidth, kHeight); 76f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr surface->getCanvas()->clear(color); 77f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr return surface; 78f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr} 79f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr 80f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr/////////////////////////////////////////////////////////////////////////////// 81f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr// Constants used by test steps 82f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrconst SkPoint kTestPoints[] = { 83f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr {SkIntToScalar(0), SkIntToScalar(0)}, 84f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr {SkIntToScalar(2), SkIntToScalar(1)}, 85f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr {SkIntToScalar(0), SkIntToScalar(2)} 86f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr}; 87f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrconst SkPoint kTestPoints2[] = { 88f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(0), SkIntToScalar(1) }, 89f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(1), SkIntToScalar(1) }, 90f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(2), SkIntToScalar(1) }, 91f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(3), SkIntToScalar(1) }, 92f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(4), SkIntToScalar(1) }, 93f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(5), SkIntToScalar(1) }, 94f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(6), SkIntToScalar(1) }, 95f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(7), SkIntToScalar(1) }, 96f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(8), SkIntToScalar(1) }, 97f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(9), SkIntToScalar(1) }, 98f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(10), SkIntToScalar(1) } 99f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr}; 100f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr 101f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstruct TestData { 102f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrpublic: 103f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr TestData() 104f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr : fRect(SkRect::MakeXYWH(SkIntToScalar(0), SkIntToScalar(0), 105f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkIntToScalar(2), SkIntToScalar(1))) 106f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fMatrix(TestMatrix()) 107f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fPath(TestPath()) 108f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fNearlyZeroLengthPath(TestNearlyZeroLengthPath()) 109f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fIRect(SkIRect::MakeXYWH(0, 0, 2, 1)) 110f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fRegion(TestRegion()) 111f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fColor(0x01020304) 112f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fPoints(kTestPoints) 113f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fPointCount(3) 114f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fWidth(2) 115f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fHeight(2) 116f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fText("Hello World") 117f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fPoints2(kTestPoints2) 118f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fBitmap(TestBitmap()) 119f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { } 120f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr 121f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkRect fRect; 122567ff2f6143ecb993dbedede402a43feb71c420atfarina SkMatrix fMatrix; 123f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkPath fPath; 124f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkPath fNearlyZeroLengthPath; 125f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkIRect fIRect; 126f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkRegion fRegion; 127f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkColor fColor; 128f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkPaint fPaint; 129f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr const SkPoint* fPoints; 130f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr size_t fPointCount; 131f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr int fWidth; 132f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr int fHeight; 133f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkString fText; 134f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr const SkPoint* fPoints2; 135f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkBitmap fBitmap; 136f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr 137f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrprivate: 138f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr static SkMatrix TestMatrix() { 139f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkMatrix matrix; 140f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr matrix.reset(); 141f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr matrix.setScale(SkIntToScalar(2), SkIntToScalar(3)); 142f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr 143f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr return matrix; 144f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr } 145f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr static SkPath TestPath() { 146f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkPath path; 147f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr path.addRect(SkRect::MakeXYWH(SkIntToScalar(0), SkIntToScalar(0), 148f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkIntToScalar(2), SkIntToScalar(1))); 149f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr return path; 150f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr } 151f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr static SkPath TestNearlyZeroLengthPath() { 152f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkPath path; 153f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkPoint pt1 = { 0, 0 }; 154f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkPoint pt2 = { 0, SK_ScalarNearlyZero }; 155f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkPoint pt3 = { SkIntToScalar(1), 0 }; 156f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkPoint pt4 = { SkIntToScalar(1), SK_ScalarNearlyZero/2 }; 157f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr path.moveTo(pt1); 158f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr path.lineTo(pt2); 159f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr path.lineTo(pt3); 160f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr path.lineTo(pt4); 161f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr return path; 162f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr } 163f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr static SkRegion TestRegion() { 164f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkRegion region; 165f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkIRect rect = SkIRect::MakeXYWH(0, 0, 2, 1); 166f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr region.setRect(rect); 167f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr return region; 168f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr } 169f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr static SkBitmap TestBitmap() { 170f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkBitmap bitmap; 171f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr createBitmap(&bitmap, 0x05060708); 172f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr return bitmap; 173f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr } 174f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr}; 175f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr 1765c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.orgstatic bool equal_clips(const SkCanvas& a, const SkCanvas& b) { 1775c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org if (a.isClipEmpty()) { 1785c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org return b.isClipEmpty(); 1795c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org } 1805c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org if (!a.isClipRect()) { 1815c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org // this is liberally true, since we don't expose a way to know this exactly (for non-rects) 1825c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org return !b.isClipRect(); 1835c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org } 1845c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org SkIRect ar, br; 1855c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org a.getClipDeviceBounds(&ar); 1865c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org b.getClipDeviceBounds(&br); 1875c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org return ar == br; 1885c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org} 1895c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org 19090c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.comclass Canvas2CanvasClipVisitor : public SkCanvas::ClipVisitor { 19190c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.compublic: 19290c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com Canvas2CanvasClipVisitor(SkCanvas* target) : fTarget(target) {} 19390c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 19436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void clipRect(const SkRect& r, SkRegion::Op op, bool aa) override { 19590c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com fTarget->clipRect(r, op, aa); 19690c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com } 19736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void clipRRect(const SkRRect& r, SkRegion::Op op, bool aa) override { 198e5b2af955b7d06815ddd405659ad62a2a8355ca3commit-bot@chromium.org fTarget->clipRRect(r, op, aa); 199e5b2af955b7d06815ddd405659ad62a2a8355ca3commit-bot@chromium.org } 20036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void clipPath(const SkPath& p, SkRegion::Op op, bool aa) override { 20190c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com fTarget->clipPath(p, op, aa); 20290c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com } 20390c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 20490c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.comprivate: 20590c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com SkCanvas* fTarget; 20690c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com}; 20790c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 20890c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.comstatic void test_clipVisitor(skiatest::Reporter* reporter, SkCanvas* canvas) { 20990c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com SkISize size = canvas->getDeviceSize(); 210d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 21190c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com SkBitmap bm; 212a3264e53ee3f3c5d6a2c813df7e44b5b96d207f2commit-bot@chromium.org bm.setInfo(SkImageInfo::MakeN32Premul(size.width(), size.height())); 21390c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com SkCanvas c(bm); 21490c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 21590c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com Canvas2CanvasClipVisitor visitor(&c); 21690c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com canvas->replayClips(&visitor); 21790c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 2185c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org REPORTER_ASSERT(reporter, equal_clips(c, *canvas)); 21990c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com} 22090c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 221687fa1c745febb57f42b0d5f03d7c1f4be2530careedstatic void test_clipstack(skiatest::Reporter* reporter) { 222687fa1c745febb57f42b0d5f03d7c1f4be2530careed // The clipstack is refcounted, and needs to be able to out-live the canvas if a client has 223687fa1c745febb57f42b0d5f03d7c1f4be2530careed // ref'd it. 224687fa1c745febb57f42b0d5f03d7c1f4be2530careed const SkClipStack* cs = NULL; 225687fa1c745febb57f42b0d5f03d7c1f4be2530careed { 226687fa1c745febb57f42b0d5f03d7c1f4be2530careed SkCanvas canvas(10, 10); 227687fa1c745febb57f42b0d5f03d7c1f4be2530careed cs = SkRef(canvas.getClipStack()); 228687fa1c745febb57f42b0d5f03d7c1f4be2530careed } 229687fa1c745febb57f42b0d5f03d7c1f4be2530careed REPORTER_ASSERT(reporter, cs->unique()); 230687fa1c745febb57f42b0d5f03d7c1f4be2530careed cs->unref(); 231687fa1c745febb57f42b0d5f03d7c1f4be2530careed} 232687fa1c745febb57f42b0d5f03d7c1f4be2530careed 2331cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// Format strings that describe the test context. The %s token is where 2341cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// the name of the test step is inserted. The context is required for 2351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// disambiguating the error in the case of failures that are reported in 2361cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// functions that are called multiple times in different contexts (test 2371cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// cases and test steps). 2381cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kDefaultAssertMessageFormat = "%s"; 239d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic const char* const kCanvasDrawAssertMessageFormat = 2401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "Drawing test step %s with SkCanvas"; 241d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic const char* const kDeferredDrawAssertMessageFormat = 2421cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "Drawing test step %s with SkDeferredCanvas"; 243d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic const char* const kNWayDrawAssertMessageFormat = 2441cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "Drawing test step %s with SkNWayCanvas"; 245d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic const char* const kDeferredPreFlushAssertMessageFormat = 2461cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkDeferredCanvas state consistency before flush"; 247cff01c5b60d4969d817c34d002752cd379b1862ajunov@chromium.orgstatic const char* const kDeferredPostFlushPlaybackAssertMessageFormat = 248cff01c5b60d4969d817c34d002752cd379b1862ajunov@chromium.org "test step %s, SkDeferredCanvas playback canvas state consistency after flush"; 249fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.orgstatic const char* const kDeferredPostSilentFlushPlaybackAssertMessageFormat = 250fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org "test step %s, SkDeferredCanvas playback canvas state consistency after silent flush"; 2511cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kNWayStateAssertMessageFormat = 2521cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkNWayCanvas state consistency"; 2531cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kNWayIndirect1StateAssertMessageFormat = 2541cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkNWayCanvas indirect canvas 1 state consistency"; 2551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kNWayIndirect2StateAssertMessageFormat = 2561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkNWayCanvas indirect canvas 2 state consistency"; 2577790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.comstatic const char* const kPdfAssertMessageFormat = 2587790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com "PDF sanity check failed %s"; 2591cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2601cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgclass CanvasTestStep; 2611cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic SkTDArray<CanvasTestStep*>& testStepArray() { 2621cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org static SkTDArray<CanvasTestStep*> theTests; 2631cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org return theTests; 2641cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 2651cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2661cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgclass CanvasTestStep { 2671cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgpublic: 2687790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com CanvasTestStep(bool fEnablePdfTesting = true) { 2691cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org *testStepArray().append() = this; 2701cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org fAssertMessageFormat = kDefaultAssertMessageFormat; 2717790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com this->fEnablePdfTesting = fEnablePdfTesting; 2721cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 273e63793a2c8d2871bf7d95195be7b93ff669688d7djsollen@google.com virtual ~CanvasTestStep() { } 2741cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 275f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr virtual void draw(SkCanvas*, const TestData&, skiatest::Reporter*) = 0; 2761cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org virtual const char* name() const = 0; 2771cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2781cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org const char* assertMessage() { 2791cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org fAssertMessage.printf(fAssertMessageFormat, name()); 2801cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org return fAssertMessage.c_str(); 2811cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 2821cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2831cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org void setAssertMessageFormat(const char* format) { 2841cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org fAssertMessageFormat = format; 2851cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 2861cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2877790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com bool enablePdfTesting() { return fEnablePdfTesting; } 2887790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com 2891cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgprivate: 2901cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkString fAssertMessage; 2911cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org const char* fAssertMessageFormat; 2927790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com bool fEnablePdfTesting; 2931cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org}; 2941cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2951cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org/////////////////////////////////////////////////////////////////////////////// 2961cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// Macros for defining test steps 2971cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2981cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#define TEST_STEP(NAME, FUNCTION) \ 2991cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgclass NAME##_TestStep : public CanvasTestStep{ \ 3001cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgpublic: \ 301f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr virtual void draw(SkCanvas* canvas, const TestData& d, \ 302f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter* reporter) { \ 303f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr FUNCTION (canvas, d, reporter, this); \ 3041cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } \ 3051cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org virtual const char* name() const {return #NAME ;} \ 3061cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org}; \ 3071cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic NAME##_TestStep NAME##_TestStepInstance; 3081cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 309f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr#define TEST_STEP_NO_PDF(NAME, FUNCTION) \ 3107790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.comclass NAME##_TestStep : public CanvasTestStep{ \ 3117790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.compublic: \ 3127790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com NAME##_TestStep() : CanvasTestStep(false) {} \ 313f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr virtual void draw(SkCanvas* canvas, const TestData& d, \ 314f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter* reporter) { \ 315f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr FUNCTION (canvas, d, reporter, this); \ 3167790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com } \ 3177790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com virtual const char* name() const {return #NAME ;} \ 3187790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com}; \ 3197790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.comstatic NAME##_TestStep NAME##_TestStepInstance; 3207790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com 321f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr#define SIMPLE_TEST_STEP(NAME, CALL) \ 322f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void NAME##TestStep(SkCanvas* canvas, const TestData& d, \ 323f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter*, CanvasTestStep*) { \ 324f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr canvas-> CALL ; \ 325f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr} \ 3261cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgTEST_STEP(NAME, NAME##TestStep ) 3271cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 3281cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#define SIMPLE_TEST_STEP_WITH_ASSERT(NAME, CALL) \ 329f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void NAME##TestStep(SkCanvas* canvas, const TestData& d, \ 330f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter*, CanvasTestStep* testStep) { \ 3311cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas-> CALL , \ 3321cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); \ 3331cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} \ 3341cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgTEST_STEP(NAME, NAME##TestStep ) 3351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 3361cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 3371cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org/////////////////////////////////////////////////////////////////////////////// 338d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com// Basic test steps for most virtual methods in SkCanvas that draw or affect 3391cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// the state of the canvas. 3401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 34192362383a4de7b0d819c88fa8b74242bb2507602commit-bot@chromium.orgSIMPLE_TEST_STEP(Translate, translate(SkIntToScalar(1), SkIntToScalar(2))); 34292362383a4de7b0d819c88fa8b74242bb2507602commit-bot@chromium.orgSIMPLE_TEST_STEP(Scale, scale(SkIntToScalar(1), SkIntToScalar(2))); 34392362383a4de7b0d819c88fa8b74242bb2507602commit-bot@chromium.orgSIMPLE_TEST_STEP(Rotate, rotate(SkIntToScalar(1))); 34492362383a4de7b0d819c88fa8b74242bb2507602commit-bot@chromium.orgSIMPLE_TEST_STEP(Skew, skew(SkIntToScalar(1), SkIntToScalar(2))); 345f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(Concat, concat(d.fMatrix)); 346f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(SetMatrix, setMatrix(d.fMatrix)); 347f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(ClipRect, clipRect(d.fRect)); 348f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(ClipPath, clipPath(d.fPath)); 349f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(ClipRegion, clipRegion(d.fRegion, SkRegion::kReplace_Op)); 350f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(Clear, clear(d.fColor)); 351f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(BeginGroup, beginCommentGroup(d.fText.c_str())); 352f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(AddComment, addComment(d.fText.c_str(), d.fText.c_str())); 3530a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comSIMPLE_TEST_STEP(EndGroup, endCommentGroup()); 3541cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 3551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org/////////////////////////////////////////////////////////////////////////////// 3561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// Complex test steps 3571cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 358f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void SaveMatrixClipStep(SkCanvas* canvas, const TestData& d, 359f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter* reporter, CanvasTestStep* testStep) { 3604e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org int saveCount = canvas->getSaveCount(); 3615f6102d07982043542343ff0a6c67b1319ac9fc7Florin Malita canvas->save(); 3624e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->translate(SkIntToScalar(1), SkIntToScalar(2)); 363f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr canvas->clipRegion(d.fRegion); 3644e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->restore(); 365d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT_MESSAGE(reporter, canvas->getSaveCount() == saveCount, 3664e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org testStep->assertMessage()); 367d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT_MESSAGE(reporter, canvas->getTotalMatrix().isIdentity(), 3684e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org testStep->assertMessage()); 3695c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org// REPORTER_ASSERT_MESSAGE(reporter, canvas->getTotalClip() != kTestRegion, testStep->assertMessage()); 3704e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org} 3714e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.orgTEST_STEP(SaveMatrixClip, SaveMatrixClipStep); 3724e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org 373f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void SaveLayerStep(SkCanvas* canvas, const TestData& d, 374f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter* reporter, CanvasTestStep* testStep) { 3754e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org int saveCount = canvas->getSaveCount(); 3764e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->saveLayer(NULL, NULL); 3774e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->restore(); 378d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT_MESSAGE(reporter, canvas->getSaveCount() == saveCount, 3794e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org testStep->assertMessage()); 3804e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org} 3814e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.orgTEST_STEP(SaveLayer, SaveLayerStep); 3824e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org 383f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void BoundedSaveLayerStep(SkCanvas* canvas, const TestData& d, 384f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter* reporter, CanvasTestStep* testStep) { 3854e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org int saveCount = canvas->getSaveCount(); 386f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr canvas->saveLayer(&d.fRect, NULL); 3874e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->restore(); 388d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT_MESSAGE(reporter, canvas->getSaveCount() == saveCount, 3894e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org testStep->assertMessage()); 3904e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org} 3914e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.orgTEST_STEP(BoundedSaveLayer, BoundedSaveLayerStep); 3924e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org 393f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void PaintSaveLayerStep(SkCanvas* canvas, const TestData& d, 394f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter* reporter, CanvasTestStep* testStep) { 3954e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org int saveCount = canvas->getSaveCount(); 396f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr canvas->saveLayer(NULL, &d.fPaint); 3974e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->restore(); 398d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT_MESSAGE(reporter, canvas->getSaveCount() == saveCount, 3994e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org testStep->assertMessage()); 4004e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org} 4014e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.orgTEST_STEP(PaintSaveLayer, PaintSaveLayerStep); 4024e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org 403f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void TwoClipOpsStep(SkCanvas* canvas, const TestData& d, 404f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter*, CanvasTestStep*) { 405a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.org // This test exercises a functionality in SkPicture that leads to the 406d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com // recording of restore offset placeholders. This test will trigger an 407a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.org // assertion at playback time if the placeholders are not properly 408a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.org // filled when the recording ends. 409f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr canvas->clipRect(d.fRect); 410f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr canvas->clipRegion(d.fRegion); 411a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.org} 412a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.orgTEST_STEP(TwoClipOps, TwoClipOpsStep); 413a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.org 41494fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com// exercise fix for http://code.google.com/p/skia/issues/detail?id=560 41594fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com// ('SkPathStroker::lineTo() fails for line with length SK_ScalarNearlyZero') 416f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void DrawNearlyZeroLengthPathTestStep(SkCanvas* canvas, const TestData& d, 417f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter*, CanvasTestStep*) { 41894fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com SkPaint paint; 41994fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com paint.setStrokeWidth(SkIntToScalar(1)); 42094fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com paint.setStyle(SkPaint::kStroke_Style); 42194fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com 422f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr canvas->drawPath(d.fNearlyZeroLengthPath, paint); 42394fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com} 42494fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.comTEST_STEP(DrawNearlyZeroLengthPath, DrawNearlyZeroLengthPathTestStep); 42594fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com 426f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void DrawVerticesShaderTestStep(SkCanvas* canvas, const TestData& d, 427f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter*, CanvasTestStep*) { 4281cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPoint pts[4]; 4291cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org pts[0].set(0, 0); 430f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr pts[1].set(SkIntToScalar(d.fWidth), 0); 431f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr pts[2].set(SkIntToScalar(d.fWidth), SkIntToScalar(d.fHeight)); 432f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr pts[3].set(0, SkIntToScalar(d.fHeight)); 4331cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPaint paint; 434f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkShader* shader = SkShader::CreateBitmapShader(d.fBitmap, 4351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkShader::kClamp_TileMode, SkShader::kClamp_TileMode); 4361cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org paint.setShader(shader)->unref(); 4371cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->drawVertices(SkCanvas::kTriangleFan_VertexMode, 4, pts, pts, 4381cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org NULL, NULL, NULL, 0, paint); 4391cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 4407790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com// NYI: issue 240. 4417790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.comTEST_STEP_NO_PDF(DrawVerticesShader, DrawVerticesShaderTestStep); 4421cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 443f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void DrawPictureTestStep(SkCanvas* canvas, const TestData& d, 444f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter*, CanvasTestStep*) { 44584b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com SkPictureRecorder recorder; 446f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkCanvas* testCanvas = recorder.beginRecording(SkIntToScalar(d.fWidth), SkIntToScalar(d.fHeight), 447a8d7f0b13cd4c6d773fcf055fe17db75d260fa05robertphillips NULL, 0); 4481cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testCanvas->scale(SkIntToScalar(2), SkIntToScalar(1)); 449f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr testCanvas->clipRect(d.fRect); 450f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr testCanvas->drawRect(d.fRect, d.fPaint); 45184b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com SkAutoTUnref<SkPicture> testPicture(recorder.endRecording()); 45284b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com 4539b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips canvas->drawPicture(testPicture); 4541cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 4551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgTEST_STEP(DrawPicture, DrawPictureTestStep); 4561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 457f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void SaveRestoreTestStep(SkCanvas* canvas, const TestData& d, 458f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter* reporter, CanvasTestStep* testStep) { 4594e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org int baseSaveCount = canvas->getSaveCount(); 4608afae61a57f87e4a50578effce6c428031499301tomhudson@google.com int n = canvas->save(); 4614e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, baseSaveCount == n, testStep->assertMessage()); 4624e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, baseSaveCount + 1 == canvas->getSaveCount(), 4631cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4641cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->save(); 4651cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->save(); 4664e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, baseSaveCount + 3 == canvas->getSaveCount(), 4671cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4684e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->restoreToCount(baseSaveCount + 1); 4694e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, baseSaveCount + 1 == canvas->getSaveCount(), 4701cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4711cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 4721cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // should this pin to 1, or be a no-op, or crash? 4731cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->restoreToCount(0); 4741cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 1 == canvas->getSaveCount(), 4751cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4761cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 4771cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgTEST_STEP(SaveRestore, SaveRestoreTestStep); 4787c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com 479f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void NestedSaveRestoreWithSolidPaintTestStep(SkCanvas* canvas, const TestData& d, 480f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter*, CanvasTestStep*) { 4813b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // This test step challenges the TestDeferredCanvasStateConsistency 4823b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // test cases because the opaque paint can trigger an optimization 4833b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // that discards previously recorded commands. The challenge is to maintain 4843b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // correct clip and matrix stack state. 4853b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->resetMatrix(); 4863b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->rotate(SkIntToScalar(30)); 4873b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->save(); 4883b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->translate(SkIntToScalar(2), SkIntToScalar(1)); 4893b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->save(); 4903b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->scale(SkIntToScalar(3), SkIntToScalar(3)); 4913b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com SkPaint paint; 4923b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com paint.setColor(0xFFFFFFFF); 4933b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->drawPaint(paint); 4943b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->restore(); 4953b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->restore(); 4963b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com} 4973b3e895df6f8ee0f33010367c215944cd16a8334reed@google.comTEST_STEP(NestedSaveRestoreWithSolidPaint, \ 4983b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com NestedSaveRestoreWithSolidPaintTestStep); 4993b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com 500f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void NestedSaveRestoreWithFlushTestStep(SkCanvas* canvas, const TestData& d, 501f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter*, CanvasTestStep*) { 5023b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // This test step challenges the TestDeferredCanvasStateConsistency 5033b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // test case because the canvas flush on a deferred canvas will 5043b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // reset the recording session. The challenge is to maintain correct 5053b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // clip and matrix stack state on the playback canvas. 5063b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->resetMatrix(); 5073b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->rotate(SkIntToScalar(30)); 5083b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->save(); 5093b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->translate(SkIntToScalar(2), SkIntToScalar(1)); 5103b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->save(); 5113b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->scale(SkIntToScalar(3), SkIntToScalar(3)); 512f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr canvas->drawRect(d.fRect,d.fPaint); 5133b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->flush(); 5143b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->restore(); 5153b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->restore(); 5163b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com} 517f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrTEST_STEP(NestedSaveRestoreWithFlush, NestedSaveRestoreWithFlushTestStep); 51837f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com 519f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void AssertCanvasStatesEqual(skiatest::Reporter* reporter, const TestData& d, 520f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr const SkCanvas* canvas1, const SkCanvas* canvas2, 5211cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep) { 5221cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->getDeviceSize() == 5231cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getDeviceSize(), testStep->assertMessage()); 5241cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->getSaveCount() == 5251cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getSaveCount(), testStep->assertMessage()); 5263b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com 5271cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkRect bounds1, bounds2; 5281cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 5293b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas1->getClipBounds(&bounds1) == canvas2->getClipBounds(&bounds2), 5301cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5311cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, bounds1 == bounds2, 5323b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com testStep->assertMessage()); 5333b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com 5341cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->getDrawFilter() == 5351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getDrawFilter(), testStep->assertMessage()); 5361cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkIRect deviceBounds1, deviceBounds2; 5371cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 5381cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas1->getClipDeviceBounds(&deviceBounds1) == 5391cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getClipDeviceBounds(&deviceBounds2), 5401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 541868074b50b0fc3e460d2aa97c1096827fe0a1935reed REPORTER_ASSERT_MESSAGE(reporter, deviceBounds1 == deviceBounds2, testStep->assertMessage()); 5421cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->getTotalMatrix() == 5431cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getTotalMatrix(), testStep->assertMessage()); 5445c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org REPORTER_ASSERT_MESSAGE(reporter, equal_clips(*canvas1, *canvas2), testStep->assertMessage()); 54537f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com 5461cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas::LayerIter layerIter1(const_cast<SkCanvas*>(canvas1), false); 5471cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas::LayerIter layerIter2(const_cast<SkCanvas*>(canvas2), false); 5481cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org while (!layerIter1.done() && !layerIter2.done()) { 5491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.matrix() == 5501cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.matrix(), testStep->assertMessage()); 5511cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.clip() == 5521cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.clip(), testStep->assertMessage()); 5531cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.paint() == 5541cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.paint(), testStep->assertMessage()); 5551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.x() == 5561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.x(), testStep->assertMessage()); 5571cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.y() == 5581cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.y(), testStep->assertMessage()); 5591cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter1.next(); 5601cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.next(); 5611cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 5621cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.done(), 5631cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5641cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter2.done(), 5651cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 56676993edbe5dbbde07a843507184abf90c64d9928piotaixr 5671cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 5681cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 5697790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.comstatic void TestPdfDevice(skiatest::Reporter* reporter, 570f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr const TestData& d, 5717790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com CanvasTestStep* testStep) { 5723d32d50364d1b63777fbf05c3593a35601bde9e2halcanary SkDynamicMemoryWStream outStream; 5733d32d50364d1b63777fbf05c3593a35601bde9e2halcanary SkAutoTUnref<SkDocument> doc(SkDocument::CreatePDF(&outStream)); 5743d32d50364d1b63777fbf05c3593a35601bde9e2halcanary SkCanvas* canvas = doc->beginPage(SkIntToScalar(d.fWidth), 5753d32d50364d1b63777fbf05c3593a35601bde9e2halcanary SkIntToScalar(d.fHeight)); 5763d32d50364d1b63777fbf05c3593a35601bde9e2halcanary REPORTER_ASSERT(reporter, canvas); 5777790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com testStep->setAssertMessageFormat(kPdfAssertMessageFormat); 5783d32d50364d1b63777fbf05c3593a35601bde9e2halcanary testStep->draw(canvas, d, reporter); 5793d32d50364d1b63777fbf05c3593a35601bde9e2halcanary 5803d32d50364d1b63777fbf05c3593a35601bde9e2halcanary REPORTER_ASSERT(reporter, doc->close()); 5817790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com} 5827790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com 58388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org// The following class groups static functions that need to access 58488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org// the privates members of SkDeferredCanvas 58588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgclass SkDeferredCanvasTester { 58688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgpublic: 58788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org static void TestDeferredCanvasStateConsistency( 58888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org skiatest::Reporter* reporter, 589f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr const TestData& d, 59088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org CanvasTestStep* testStep, 591fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org const SkCanvas& referenceCanvas, bool silent) { 59288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 59328183b4043a969df12592e8dd47cf95b80755284reed@google.com SkAutoTUnref<SkSurface> surface(createSurface(0xFFFFFFFF)); 59428183b4043a969df12592e8dd47cf95b80755284reed@google.com SkAutoTUnref<SkDeferredCanvas> deferredCanvas(SkDeferredCanvas::Create(surface.get())); 59528183b4043a969df12592e8dd47cf95b80755284reed@google.com 59688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org testStep->setAssertMessageFormat(kDeferredDrawAssertMessageFormat); 597f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr testStep->draw(deferredCanvas, d, reporter); 59888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org testStep->setAssertMessageFormat(kDeferredPreFlushAssertMessageFormat); 599f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr AssertCanvasStatesEqual(reporter, d, deferredCanvas, &referenceCanvas, testStep); 60088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 601fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org if (silent) { 60266070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org deferredCanvas->silentFlush(); 603fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } else { 60466070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org deferredCanvas->flush(); 605fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 606fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org 6074c5ea4480341f0f663b51e9d78b948bc0a785f4dskia.committer@gmail.com testStep->setAssertMessageFormat( 608fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org silent ? kDeferredPostSilentFlushPlaybackAssertMessageFormat : 60988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org kDeferredPostFlushPlaybackAssertMessageFormat); 610f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr AssertCanvasStatesEqual(reporter, d, deferredCanvas->immediateCanvas(), 611f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr &referenceCanvas, testStep); 61288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 61388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // Verified that deferred canvas state is not affected by flushing 61488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // pending draw operations 61588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 61688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // The following test code is commented out because it currently fails. 61788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // Issue: http://code.google.com/p/skia/issues/detail?id=496 61888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org /* 61988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org testStep->setAssertMessageFormat(kDeferredPostFlushAssertMessageFormat); 62088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org AssertCanvasStatesEqual(reporter, &deferredCanvas, &referenceCanvas, 62188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org testStep); 62288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org */ 62388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org } 62488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}; 6251cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 62642639cddc33746b351bbf07c540711eefffe191acaryclark@google.com// unused 6271cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void TestNWayCanvasStateConsistency( 6281cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org skiatest::Reporter* reporter, 629f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr const TestData& d, 6301cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep, 6311cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org const SkCanvas& referenceCanvas) { 6321cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 6331cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkBitmap indirectStore1; 634fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org createBitmap(&indirectStore1, 0xFFFFFFFF); 6352a8ca93171041da39987ed455dfb3701f0d93ac6reed SkCanvas indirectCanvas1(indirectStore1); 6361cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 6371cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkBitmap indirectStore2; 638fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org createBitmap(&indirectStore2, 0xFFFFFFFF); 6392a8ca93171041da39987ed455dfb3701f0d93ac6reed SkCanvas indirectCanvas2(indirectStore2); 6401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 641f0a062bc4573323abcf37394bb68e0230347a974djsollen@google.com SkISize canvasSize = referenceCanvas.getDeviceSize(); 642f0a062bc4573323abcf37394bb68e0230347a974djsollen@google.com SkNWayCanvas nWayCanvas(canvasSize.width(), canvasSize.height()); 6431cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org nWayCanvas.addCanvas(&indirectCanvas1); 6441cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org nWayCanvas.addCanvas(&indirectCanvas2); 6451cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 6461cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kNWayDrawAssertMessageFormat); 647f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr testStep->draw(&nWayCanvas, d, reporter); 648648238cc900994de79c9e7d17f755661222aa52fscroggo // Verify that the SkNWayCanvas reports consitent state 6491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kNWayStateAssertMessageFormat); 650f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr AssertCanvasStatesEqual(reporter, d, &nWayCanvas, &referenceCanvas, testStep); 6511cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Verify that the indirect canvases report consitent state 6521cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kNWayIndirect1StateAssertMessageFormat); 653f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr AssertCanvasStatesEqual(reporter, d, &indirectCanvas1, &referenceCanvas, testStep); 6541cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kNWayIndirect2StateAssertMessageFormat); 655f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr AssertCanvasStatesEqual(reporter, d, &indirectCanvas2, &referenceCanvas, testStep); 6561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 6571cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 6581cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org/* 6591cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * This sub-test verifies that the test step passes when executed 6601cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * with SkCanvas and with classes derrived from SkCanvas. It also verifies 6611cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * that the all canvas derivatives report the same state as an SkCanvas 6621cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * after having executed the test step. 6631cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org */ 664f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void TestOverrideStateConsistency(skiatest::Reporter* reporter, const TestData& d, 6651cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep) { 6661cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkBitmap referenceStore; 667fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org createBitmap(&referenceStore, 0xFFFFFFFF); 6682a8ca93171041da39987ed455dfb3701f0d93ac6reed SkCanvas referenceCanvas(referenceStore); 6691cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kCanvasDrawAssertMessageFormat); 670f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr testStep->draw(&referenceCanvas, d, reporter); 6711cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 672f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkDeferredCanvasTester::TestDeferredCanvasStateConsistency(reporter, d, testStep, referenceCanvas, false); 673fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org 674f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkDeferredCanvasTester::TestDeferredCanvasStateConsistency(reporter, d, testStep, referenceCanvas, true); 6751cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 67642639cddc33746b351bbf07c540711eefffe191acaryclark@google.com // The following test code is disabled because SkNWayCanvas does not 6771cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // report correct clipping and device bounds information 6781cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Issue: http://code.google.com/p/skia/issues/detail?id=501 67942639cddc33746b351bbf07c540711eefffe191acaryclark@google.com 68042639cddc33746b351bbf07c540711eefffe191acaryclark@google.com if (false) { // avoid bit rot, suppress warning 681f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr TestNWayCanvasStateConsistency(reporter, d, testStep, referenceCanvas); 68242639cddc33746b351bbf07c540711eefffe191acaryclark@google.com } 683d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 68442639cddc33746b351bbf07c540711eefffe191acaryclark@google.com if (false) { // avoid bit rot, suppress warning 68542639cddc33746b351bbf07c540711eefffe191acaryclark@google.com test_clipVisitor(reporter, &referenceCanvas); 68642639cddc33746b351bbf07c540711eefffe191acaryclark@google.com } 687687fa1c745febb57f42b0d5f03d7c1f4be2530careed test_clipstack(reporter); 6881cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 6891cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 6903107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.orgstatic void test_newraster(skiatest::Reporter* reporter) { 6913107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org SkImageInfo info = SkImageInfo::MakeN32Premul(10, 10); 6923054be16dfdb0d06233770cbfc338958edef44eareed const size_t minRowBytes = info.minRowBytes(); 6933054be16dfdb0d06233770cbfc338958edef44eareed const size_t size = info.getSafeSize(minRowBytes); 6943054be16dfdb0d06233770cbfc338958edef44eareed SkAutoMalloc storage(size); 6953054be16dfdb0d06233770cbfc338958edef44eareed SkPMColor* baseAddr = static_cast<SkPMColor*>(storage.get()); 6963054be16dfdb0d06233770cbfc338958edef44eareed sk_bzero(baseAddr, size); 6973054be16dfdb0d06233770cbfc338958edef44eareed 6983054be16dfdb0d06233770cbfc338958edef44eareed SkCanvas* canvas = SkCanvas::NewRasterDirect(info, baseAddr, minRowBytes); 6993107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, canvas); 7003107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org 7013107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org SkImageInfo info2; 7023107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org size_t rowBytes; 7033107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org const SkPMColor* addr = (const SkPMColor*)canvas->peekPixels(&info2, &rowBytes); 7043107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, addr); 7053107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, info == info2); 7063054be16dfdb0d06233770cbfc338958edef44eareed REPORTER_ASSERT(reporter, minRowBytes == rowBytes); 7073107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org for (int y = 0; y < info.height(); ++y) { 7083107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org for (int x = 0; x < info.width(); ++x) { 7093107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, 0 == addr[x]); 7103107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org } 7113107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org addr = (const SkPMColor*)((const char*)addr + rowBytes); 7123107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org } 7133107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org SkDELETE(canvas); 7143107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org 7153107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org // now try a deliberately bad info 716e5ea500d4714a7d84de2bf913e81be3b65d2de68reed info = info.makeWH(-1, info.height()); 7173054be16dfdb0d06233770cbfc338958edef44eareed REPORTER_ASSERT(reporter, NULL == SkCanvas::NewRasterDirect(info, baseAddr, minRowBytes)); 7183107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org 7193107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org // too big 720e5ea500d4714a7d84de2bf913e81be3b65d2de68reed info = info.makeWH(1 << 30, 1 << 30); 7213054be16dfdb0d06233770cbfc338958edef44eareed REPORTER_ASSERT(reporter, NULL == SkCanvas::NewRasterDirect(info, baseAddr, minRowBytes)); 7220e530754d36d942f6408c65cc93ba0a8ccd93610skia.committer@gmail.com 7233107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org // not a valid pixel type 724e5ea500d4714a7d84de2bf913e81be3b65d2de68reed info = SkImageInfo::Make(10, 10, kUnknown_SkColorType, info.alphaType()); 7253054be16dfdb0d06233770cbfc338958edef44eareed REPORTER_ASSERT(reporter, NULL == SkCanvas::NewRasterDirect(info, baseAddr, minRowBytes)); 7263107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org 7273107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org // We should succeed with a zero-sized valid info 7283107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org info = SkImageInfo::MakeN32Premul(0, 0); 7293054be16dfdb0d06233770cbfc338958edef44eareed canvas = SkCanvas::NewRasterDirect(info, baseAddr, minRowBytes); 7303107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, canvas); 7313107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org SkDELETE(canvas); 7323107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org} 7333107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org 734e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(Canvas, reporter) { 735f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr TestData d; 7367c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com 7371cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org for (int testStep = 0; testStep < testStepArray().count(); testStep++) { 738f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr TestOverrideStateConsistency(reporter, d, testStepArray()[testStep]); 7397790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com if (testStepArray()[testStep]->enablePdfTesting()) { 740f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr TestPdfDevice(reporter, d, testStepArray()[testStep]); 7417790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com } 7421cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 743cd62ecf39a81d9d85a7eb8508e14ce2834899e88junov@chromium.org 7443107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org test_newraster(reporter); 74537f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com} 746f0090cb80ab10a49e511aa5450ae38917fa058d9reed 747f0090cb80ab10a49e511aa5450ae38917fa058d9reedDEF_TEST(Canvas_SaveState, reporter) { 748f0090cb80ab10a49e511aa5450ae38917fa058d9reed SkCanvas canvas(10, 10); 749f0090cb80ab10a49e511aa5450ae38917fa058d9reed REPORTER_ASSERT(reporter, 1 == canvas.getSaveCount()); 750f0090cb80ab10a49e511aa5450ae38917fa058d9reed 751f0090cb80ab10a49e511aa5450ae38917fa058d9reed int n = canvas.save(); 752f0090cb80ab10a49e511aa5450ae38917fa058d9reed REPORTER_ASSERT(reporter, 1 == n); 753f0090cb80ab10a49e511aa5450ae38917fa058d9reed REPORTER_ASSERT(reporter, 2 == canvas.getSaveCount()); 754f0090cb80ab10a49e511aa5450ae38917fa058d9reed 755f0090cb80ab10a49e511aa5450ae38917fa058d9reed n = canvas.saveLayer(NULL, NULL); 756f0090cb80ab10a49e511aa5450ae38917fa058d9reed REPORTER_ASSERT(reporter, 2 == n); 757f0090cb80ab10a49e511aa5450ae38917fa058d9reed REPORTER_ASSERT(reporter, 3 == canvas.getSaveCount()); 758f0090cb80ab10a49e511aa5450ae38917fa058d9reed 759f0090cb80ab10a49e511aa5450ae38917fa058d9reed canvas.restore(); 760f0090cb80ab10a49e511aa5450ae38917fa058d9reed REPORTER_ASSERT(reporter, 2 == canvas.getSaveCount()); 761f0090cb80ab10a49e511aa5450ae38917fa058d9reed canvas.restore(); 762f0090cb80ab10a49e511aa5450ae38917fa058d9reed REPORTER_ASSERT(reporter, 1 == canvas.getSaveCount()); 763f0090cb80ab10a49e511aa5450ae38917fa058d9reed} 764c1b11f1db69bea8d64ebf656ae92ea9ec6dbb40freed 765c1b11f1db69bea8d64ebf656ae92ea9ec6dbb40freedDEF_TEST(Canvas_ClipEmptyPath, reporter) { 766c1b11f1db69bea8d64ebf656ae92ea9ec6dbb40freed SkCanvas canvas(10, 10); 767c1b11f1db69bea8d64ebf656ae92ea9ec6dbb40freed canvas.save(); 768c1b11f1db69bea8d64ebf656ae92ea9ec6dbb40freed SkPath path; 769c1b11f1db69bea8d64ebf656ae92ea9ec6dbb40freed canvas.clipPath(path); 770c1b11f1db69bea8d64ebf656ae92ea9ec6dbb40freed canvas.restore(); 771c1b11f1db69bea8d64ebf656ae92ea9ec6dbb40freed canvas.save(); 772c1b11f1db69bea8d64ebf656ae92ea9ec6dbb40freed path.moveTo(5, 5); 773c1b11f1db69bea8d64ebf656ae92ea9ec6dbb40freed canvas.clipPath(path); 774c1b11f1db69bea8d64ebf656ae92ea9ec6dbb40freed canvas.restore(); 775c1b11f1db69bea8d64ebf656ae92ea9ec6dbb40freed canvas.save(); 776c1b11f1db69bea8d64ebf656ae92ea9ec6dbb40freed path.moveTo(7, 7); 777c1b11f1db69bea8d64ebf656ae92ea9ec6dbb40freed canvas.clipPath(path); // should not assert here 778c1b11f1db69bea8d64ebf656ae92ea9ec6dbb40freed canvas.restore(); 779c1b11f1db69bea8d64ebf656ae92ea9ec6dbb40freed} 780