CanvasTest.cpp revision f05f5a7399b7d748403b234d1faced9f4c61891f
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" 481cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkDeferredCanvas.h" 491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkDevice.h" 501cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkMatrix.h" 511cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkNWayCanvas.h" 527790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com#include "SkPDFDevice.h" 537790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com#include "SkPDFDocument.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 "SkProxyCanvas.h" 601cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkRect.h" 611cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkRegion.h" 621cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkShader.h" 631cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkStream.h" 6428183b4043a969df12592e8dd47cf95b80755284reed@google.com#include "SkSurface.h" 651cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkTDArray.h" 661cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "Test.h" 6737f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com 68f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic const int kWidth = 2, kHeight = 2; 69f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr 70f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void createBitmap(SkBitmap* bm, SkColor color) { 71f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr bm->allocN32Pixels(kWidth, kHeight); 72f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr bm->eraseColor(color); 73f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr} 74f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr 75f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic SkSurface* createSurface(SkColor color) { 76f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkSurface* surface = SkSurface::NewRasterPMColor(kWidth, kHeight); 77f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr surface->getCanvas()->clear(color); 78f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr return surface; 79f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr} 80f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr 81f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr/////////////////////////////////////////////////////////////////////////////// 82f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr// Constants used by test steps 83f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrconst SkPoint kTestPoints[] = { 84f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr {SkIntToScalar(0), SkIntToScalar(0)}, 85f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr {SkIntToScalar(2), SkIntToScalar(1)}, 86f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr {SkIntToScalar(0), SkIntToScalar(2)} 87f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr}; 88f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrconst SkPoint kTestPoints2[] = { 89f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(0), SkIntToScalar(1) }, 90f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(1), SkIntToScalar(1) }, 91f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(2), SkIntToScalar(1) }, 92f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(3), SkIntToScalar(1) }, 93f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(4), SkIntToScalar(1) }, 94f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(5), SkIntToScalar(1) }, 95f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(6), SkIntToScalar(1) }, 96f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(7), SkIntToScalar(1) }, 97f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(8), SkIntToScalar(1) }, 98f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(9), SkIntToScalar(1) }, 99f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { SkIntToScalar(10), SkIntToScalar(1) } 100f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr}; 101f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr 102f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstruct TestData { 103f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrpublic: 104f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr TestData() 105f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr : fRect(SkRect::MakeXYWH(SkIntToScalar(0), SkIntToScalar(0), 106f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkIntToScalar(2), SkIntToScalar(1))) 107f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fMatrix(TestMatrix()) 108f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fPath(TestPath()) 109f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fNearlyZeroLengthPath(TestNearlyZeroLengthPath()) 110f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fIRect(SkIRect::MakeXYWH(0, 0, 2, 1)) 111f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fRegion(TestRegion()) 112f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fColor(0x01020304) 113f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fPoints(kTestPoints) 114f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fPointCount(3) 115f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fWidth(2) 116f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fHeight(2) 117f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fText("Hello World") 118f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fPoints2(kTestPoints2) 119f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr , fBitmap(TestBitmap()) 120f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr { } 121f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr 122f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkRect fRect; 123f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkMatrix fMatrix;; 124f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkPath fPath; 125f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkPath fNearlyZeroLengthPath; 126f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkIRect fIRect; 127f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkRegion fRegion; 128f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkColor fColor; 129f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkPaint fPaint; 130f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr const SkPoint* fPoints; 131f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr size_t fPointCount; 132f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr int fWidth; 133f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr int fHeight; 134f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkString fText; 135f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr const SkPoint* fPoints2; 136f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkBitmap fBitmap; 137f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr 138f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrprivate: 139f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr static SkMatrix TestMatrix() { 140f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkMatrix matrix; 141f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr matrix.reset(); 142f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr matrix.setScale(SkIntToScalar(2), SkIntToScalar(3)); 143f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr 144f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr return matrix; 145f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr } 146f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr static SkPath TestPath() { 147f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkPath path; 148f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr path.addRect(SkRect::MakeXYWH(SkIntToScalar(0), SkIntToScalar(0), 149f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkIntToScalar(2), SkIntToScalar(1))); 150f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr return path; 151f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr } 152f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr static SkPath TestNearlyZeroLengthPath() { 153f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkPath path; 154f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkPoint pt1 = { 0, 0 }; 155f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkPoint pt2 = { 0, SK_ScalarNearlyZero }; 156f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkPoint pt3 = { SkIntToScalar(1), 0 }; 157f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkPoint pt4 = { SkIntToScalar(1), SK_ScalarNearlyZero/2 }; 158f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr path.moveTo(pt1); 159f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr path.lineTo(pt2); 160f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr path.lineTo(pt3); 161f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr path.lineTo(pt4); 162f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr return path; 163f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr } 164f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr static SkRegion TestRegion() { 165f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkRegion region; 166f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkIRect rect = SkIRect::MakeXYWH(0, 0, 2, 1); 167f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr region.setRect(rect); 168f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr return region; 169f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr } 170f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr static SkBitmap TestBitmap() { 171f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkBitmap bitmap; 172f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr createBitmap(&bitmap, 0x05060708); 173f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr return bitmap; 174f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr } 175f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr}; 176f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr 1775c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.orgstatic bool equal_clips(const SkCanvas& a, const SkCanvas& b) { 1785c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org if (a.isClipEmpty()) { 1795c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org return b.isClipEmpty(); 1805c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org } 1815c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org if (!a.isClipRect()) { 1825c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org // this is liberally true, since we don't expose a way to know this exactly (for non-rects) 1835c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org return !b.isClipRect(); 1845c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org } 1855c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org SkIRect ar, br; 1865c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org a.getClipDeviceBounds(&ar); 1875c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org b.getClipDeviceBounds(&br); 1885c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org return ar == br; 1895c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org} 1905c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org 19190c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.comclass Canvas2CanvasClipVisitor : public SkCanvas::ClipVisitor { 19290c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.compublic: 19390c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com Canvas2CanvasClipVisitor(SkCanvas* target) : fTarget(target) {} 19490c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 195e5b2af955b7d06815ddd405659ad62a2a8355ca3commit-bot@chromium.org virtual void clipRect(const SkRect& r, SkRegion::Op op, bool aa) SK_OVERRIDE { 19690c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com fTarget->clipRect(r, op, aa); 19790c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com } 198e5b2af955b7d06815ddd405659ad62a2a8355ca3commit-bot@chromium.org virtual void clipRRect(const SkRRect& r, SkRegion::Op op, bool aa) SK_OVERRIDE { 199e5b2af955b7d06815ddd405659ad62a2a8355ca3commit-bot@chromium.org fTarget->clipRRect(r, op, aa); 200e5b2af955b7d06815ddd405659ad62a2a8355ca3commit-bot@chromium.org } 201e5b2af955b7d06815ddd405659ad62a2a8355ca3commit-bot@chromium.org virtual void clipPath(const SkPath& p, SkRegion::Op op, bool aa) SK_OVERRIDE { 20290c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com fTarget->clipPath(p, op, aa); 20390c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com } 20490c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 20590c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.comprivate: 20690c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com SkCanvas* fTarget; 20790c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com}; 20890c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 20990c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.comstatic void test_clipVisitor(skiatest::Reporter* reporter, SkCanvas* canvas) { 21090c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com SkISize size = canvas->getDeviceSize(); 211d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 21290c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com SkBitmap bm; 213a3264e53ee3f3c5d6a2c813df7e44b5b96d207f2commit-bot@chromium.org bm.setInfo(SkImageInfo::MakeN32Premul(size.width(), size.height())); 21490c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com SkCanvas c(bm); 21590c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 21690c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com Canvas2CanvasClipVisitor visitor(&c); 21790c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com canvas->replayClips(&visitor); 21890c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 2195c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org REPORTER_ASSERT(reporter, equal_clips(c, *canvas)); 22090c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com} 22190c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 2221cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// Format strings that describe the test context. The %s token is where 2231cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// the name of the test step is inserted. The context is required for 2241cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// disambiguating the error in the case of failures that are reported in 2251cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// functions that are called multiple times in different contexts (test 2261cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// cases and test steps). 2271cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kDefaultAssertMessageFormat = "%s"; 228d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic const char* const kCanvasDrawAssertMessageFormat = 2291cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "Drawing test step %s with SkCanvas"; 230d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic const char* const kDeferredDrawAssertMessageFormat = 2311cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "Drawing test step %s with SkDeferredCanvas"; 232d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic const char* const kProxyDrawAssertMessageFormat = 2331cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "Drawing test step %s with SkProxyCanvas"; 234d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic const char* const kNWayDrawAssertMessageFormat = 2351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "Drawing test step %s with SkNWayCanvas"; 236d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic const char* const kDeferredPreFlushAssertMessageFormat = 2371cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkDeferredCanvas state consistency before flush"; 238cff01c5b60d4969d817c34d002752cd379b1862ajunov@chromium.orgstatic const char* const kDeferredPostFlushPlaybackAssertMessageFormat = 239cff01c5b60d4969d817c34d002752cd379b1862ajunov@chromium.org "test step %s, SkDeferredCanvas playback canvas state consistency after flush"; 240fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.orgstatic const char* const kDeferredPostSilentFlushPlaybackAssertMessageFormat = 241fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org "test step %s, SkDeferredCanvas playback canvas state consistency after silent flush"; 2421cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kProxyStateAssertMessageFormat = 2431cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkProxyCanvas state consistency"; 2441cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kProxyIndirectStateAssertMessageFormat = 2451cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkProxyCanvas indirect canvas state consistency"; 2461cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kNWayStateAssertMessageFormat = 2471cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkNWayCanvas state consistency"; 2481cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kNWayIndirect1StateAssertMessageFormat = 2491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkNWayCanvas indirect canvas 1 state consistency"; 2501cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kNWayIndirect2StateAssertMessageFormat = 2511cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkNWayCanvas indirect canvas 2 state consistency"; 2527790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.comstatic const char* const kPdfAssertMessageFormat = 2537790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com "PDF sanity check failed %s"; 2541cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgclass CanvasTestStep; 2561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic SkTDArray<CanvasTestStep*>& testStepArray() { 2571cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org static SkTDArray<CanvasTestStep*> theTests; 2581cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org return theTests; 2591cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 2601cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2611cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgclass CanvasTestStep { 2621cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgpublic: 2637790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com CanvasTestStep(bool fEnablePdfTesting = true) { 2641cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org *testStepArray().append() = this; 2651cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org fAssertMessageFormat = kDefaultAssertMessageFormat; 2667790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com this->fEnablePdfTesting = fEnablePdfTesting; 2671cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 268e63793a2c8d2871bf7d95195be7b93ff669688d7djsollen@google.com virtual ~CanvasTestStep() { } 2691cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 270f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr virtual void draw(SkCanvas*, const TestData&, skiatest::Reporter*) = 0; 2711cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org virtual const char* name() const = 0; 2721cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2731cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org const char* assertMessage() { 2741cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org fAssertMessage.printf(fAssertMessageFormat, name()); 2751cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org return fAssertMessage.c_str(); 2761cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 2771cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2781cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org void setAssertMessageFormat(const char* format) { 2791cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org fAssertMessageFormat = format; 2801cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 2811cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2827790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com bool enablePdfTesting() { return fEnablePdfTesting; } 2837790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com 2841cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgprivate: 2851cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkString fAssertMessage; 2861cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org const char* fAssertMessageFormat; 2877790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com bool fEnablePdfTesting; 2881cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org}; 2891cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2901cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org/////////////////////////////////////////////////////////////////////////////// 2911cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// Macros for defining test steps 2921cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2931cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#define TEST_STEP(NAME, FUNCTION) \ 2941cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgclass NAME##_TestStep : public CanvasTestStep{ \ 2951cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgpublic: \ 296f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr virtual void draw(SkCanvas* canvas, const TestData& d, \ 297f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter* reporter) { \ 298f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr FUNCTION (canvas, d, reporter, this); \ 2991cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } \ 3001cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org virtual const char* name() const {return #NAME ;} \ 3011cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org}; \ 3021cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic NAME##_TestStep NAME##_TestStepInstance; 3031cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 304f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr#define TEST_STEP_NO_PDF(NAME, FUNCTION) \ 3057790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.comclass NAME##_TestStep : public CanvasTestStep{ \ 3067790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.compublic: \ 3077790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com NAME##_TestStep() : CanvasTestStep(false) {} \ 308f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr virtual void draw(SkCanvas* canvas, const TestData& d, \ 309f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter* reporter) { \ 310f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr FUNCTION (canvas, d, reporter, this); \ 3117790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com } \ 3127790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com virtual const char* name() const {return #NAME ;} \ 3137790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com}; \ 3147790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.comstatic NAME##_TestStep NAME##_TestStepInstance; 3157790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com 316f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr#define SIMPLE_TEST_STEP(NAME, CALL) \ 317f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void NAME##TestStep(SkCanvas* canvas, const TestData& d, \ 318f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter*, CanvasTestStep*) { \ 319f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr canvas-> CALL ; \ 320f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr} \ 3211cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgTEST_STEP(NAME, NAME##TestStep ) 3221cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 3231cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#define SIMPLE_TEST_STEP_WITH_ASSERT(NAME, CALL) \ 324f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void NAME##TestStep(SkCanvas* canvas, const TestData& d, \ 325f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter*, CanvasTestStep* testStep) { \ 3261cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas-> CALL , \ 3271cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); \ 3281cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} \ 3291cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgTEST_STEP(NAME, NAME##TestStep ) 3301cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 3311cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 3321cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org/////////////////////////////////////////////////////////////////////////////// 333d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com// Basic test steps for most virtual methods in SkCanvas that draw or affect 3341cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// the state of the canvas. 3351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 33692362383a4de7b0d819c88fa8b74242bb2507602commit-bot@chromium.orgSIMPLE_TEST_STEP(Translate, translate(SkIntToScalar(1), SkIntToScalar(2))); 33792362383a4de7b0d819c88fa8b74242bb2507602commit-bot@chromium.orgSIMPLE_TEST_STEP(Scale, scale(SkIntToScalar(1), SkIntToScalar(2))); 33892362383a4de7b0d819c88fa8b74242bb2507602commit-bot@chromium.orgSIMPLE_TEST_STEP(Rotate, rotate(SkIntToScalar(1))); 33992362383a4de7b0d819c88fa8b74242bb2507602commit-bot@chromium.orgSIMPLE_TEST_STEP(Skew, skew(SkIntToScalar(1), SkIntToScalar(2))); 340f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(Concat, concat(d.fMatrix)); 341f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(SetMatrix, setMatrix(d.fMatrix)); 342f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(ClipRect, clipRect(d.fRect)); 343f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(ClipPath, clipPath(d.fPath)); 344f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(ClipRegion, clipRegion(d.fRegion, SkRegion::kReplace_Op)); 345f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(Clear, clear(d.fColor)); 346f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(DrawPaint, drawPaint(d.fPaint)); 3471cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawPointsPoints, drawPoints(SkCanvas::kPoints_PointMode, 348f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr d.fPointCount, d.fPoints, d.fPaint)); 3491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawPointsLiness, drawPoints(SkCanvas::kLines_PointMode, 350f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr d.fPointCount, d.fPoints, d.fPaint)); 3511cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawPointsPolygon, drawPoints(SkCanvas::kPolygon_PointMode, 352f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr d.fPointCount, d.fPoints, d.fPaint)); 353f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(DrawRect, drawRect(d.fRect, d.fPaint)); 354f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(DrawPath, drawPath(d.fPath, d.fPaint)); 355f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(DrawBitmap, drawBitmap(d.fBitmap, 0, 0)); 356f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(DrawBitmapPaint, drawBitmap(d.fBitmap, 0, 0, &d.fPaint)); 357f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(DrawBitmapRect, drawBitmapRect(d.fBitmap, NULL, d.fRect, NULL)); 358f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(DrawBitmapRectSrcRect, drawBitmapRect(d.fBitmap, &d.fIRect, d.fRect, NULL)); 359f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(DrawBitmapRectPaint, drawBitmapRect(d.fBitmap, NULL, d.fRect, &d.fPaint)); 360f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(DrawBitmapMatrix, drawBitmapMatrix(d.fBitmap, d.fMatrix, NULL)); 361f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(DrawBitmapMatrixPaint, drawBitmapMatrix(d.fBitmap, d.fMatrix, &d.fPaint)); 362f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(DrawBitmapNine, drawBitmapNine(d.fBitmap, d.fIRect, d.fRect, NULL)); 363f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(DrawBitmapNinePaint, drawBitmapNine(d.fBitmap, d.fIRect, d.fRect, &d.fPaint)); 364f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(DrawSprite, drawSprite(d.fBitmap, 0, 0, NULL)); 365f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(DrawSpritePaint, drawSprite(d.fBitmap, 0, 0, &d.fPaint)); 366f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(DrawText, drawText(d.fText.c_str(), d.fText.size(), 0, 1, d.fPaint)); 367f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(DrawPosText, drawPosText(d.fText.c_str(), d.fText.size(), d.fPoints2, d.fPaint)); 368f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(DrawTextOnPath, drawTextOnPath(d.fText.c_str(), d.fText.size(), 369f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr d.fPath, NULL, d.fPaint)); 370f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(DrawTextOnPathMatrix, drawTextOnPath(d.fText.c_str(), d.fText.size(), d.fPath, 371f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr &d.fMatrix, d.fPaint)); 372f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(DrawData, drawData(d.fText.c_str(), d.fText.size())); 373f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(BeginGroup, beginCommentGroup(d.fText.c_str())); 374f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrSIMPLE_TEST_STEP(AddComment, addComment(d.fText.c_str(), d.fText.c_str())); 3750a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comSIMPLE_TEST_STEP(EndGroup, endCommentGroup()); 3761cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 3771cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org/////////////////////////////////////////////////////////////////////////////// 3781cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// Complex test steps 3791cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 380f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void SaveMatrixClipStep(SkCanvas* canvas, const TestData& d, 381f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter* reporter, CanvasTestStep* testStep) { 3824e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org int saveCount = canvas->getSaveCount(); 3835f6102d07982043542343ff0a6c67b1319ac9fc7Florin Malita canvas->save(); 3844e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->translate(SkIntToScalar(1), SkIntToScalar(2)); 385f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr canvas->clipRegion(d.fRegion); 3864e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->restore(); 387d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT_MESSAGE(reporter, canvas->getSaveCount() == saveCount, 3884e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org testStep->assertMessage()); 389d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT_MESSAGE(reporter, canvas->getTotalMatrix().isIdentity(), 3904e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org testStep->assertMessage()); 3915c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org// REPORTER_ASSERT_MESSAGE(reporter, canvas->getTotalClip() != kTestRegion, testStep->assertMessage()); 3924e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org} 3934e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.orgTEST_STEP(SaveMatrixClip, SaveMatrixClipStep); 3944e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org 395f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void SaveLayerStep(SkCanvas* canvas, const TestData& d, 396f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter* reporter, CanvasTestStep* testStep) { 3974e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org int saveCount = canvas->getSaveCount(); 3984e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->saveLayer(NULL, NULL); 3994e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->restore(); 400d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT_MESSAGE(reporter, canvas->getSaveCount() == saveCount, 4014e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org testStep->assertMessage()); 4024e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org} 4034e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.orgTEST_STEP(SaveLayer, SaveLayerStep); 4044e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org 405f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void BoundedSaveLayerStep(SkCanvas* canvas, const TestData& d, 406f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter* reporter, CanvasTestStep* testStep) { 4074e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org int saveCount = canvas->getSaveCount(); 408f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr canvas->saveLayer(&d.fRect, NULL); 4094e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->restore(); 410d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT_MESSAGE(reporter, canvas->getSaveCount() == saveCount, 4114e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org testStep->assertMessage()); 4124e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org} 4134e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.orgTEST_STEP(BoundedSaveLayer, BoundedSaveLayerStep); 4144e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org 415f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void PaintSaveLayerStep(SkCanvas* canvas, const TestData& d, 416f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter* reporter, CanvasTestStep* testStep) { 4174e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org int saveCount = canvas->getSaveCount(); 418f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr canvas->saveLayer(NULL, &d.fPaint); 4194e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->restore(); 420d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT_MESSAGE(reporter, canvas->getSaveCount() == saveCount, 4214e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org testStep->assertMessage()); 4224e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org} 4234e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.orgTEST_STEP(PaintSaveLayer, PaintSaveLayerStep); 4244e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org 425f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void TwoClipOpsStep(SkCanvas* canvas, const TestData& d, 426f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter*, CanvasTestStep*) { 427a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.org // This test exercises a functionality in SkPicture that leads to the 428d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com // recording of restore offset placeholders. This test will trigger an 429a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.org // assertion at playback time if the placeholders are not properly 430a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.org // filled when the recording ends. 431f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr canvas->clipRect(d.fRect); 432f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr canvas->clipRegion(d.fRegion); 433a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.org} 434a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.orgTEST_STEP(TwoClipOps, TwoClipOpsStep); 435a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.org 43694fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com// exercise fix for http://code.google.com/p/skia/issues/detail?id=560 43794fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com// ('SkPathStroker::lineTo() fails for line with length SK_ScalarNearlyZero') 438f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void DrawNearlyZeroLengthPathTestStep(SkCanvas* canvas, const TestData& d, 439f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter*, CanvasTestStep*) { 44094fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com SkPaint paint; 44194fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com paint.setStrokeWidth(SkIntToScalar(1)); 44294fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com paint.setStyle(SkPaint::kStroke_Style); 44394fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com 444f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr canvas->drawPath(d.fNearlyZeroLengthPath, paint); 44594fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com} 44694fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.comTEST_STEP(DrawNearlyZeroLengthPath, DrawNearlyZeroLengthPathTestStep); 44794fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com 448f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void DrawVerticesShaderTestStep(SkCanvas* canvas, const TestData& d, 449f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter*, CanvasTestStep*) { 4501cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPoint pts[4]; 4511cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org pts[0].set(0, 0); 452f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr pts[1].set(SkIntToScalar(d.fWidth), 0); 453f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr pts[2].set(SkIntToScalar(d.fWidth), SkIntToScalar(d.fHeight)); 454f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr pts[3].set(0, SkIntToScalar(d.fHeight)); 4551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPaint paint; 456f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkShader* shader = SkShader::CreateBitmapShader(d.fBitmap, 4571cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkShader::kClamp_TileMode, SkShader::kClamp_TileMode); 4581cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org paint.setShader(shader)->unref(); 4591cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->drawVertices(SkCanvas::kTriangleFan_VertexMode, 4, pts, pts, 4601cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org NULL, NULL, NULL, 0, paint); 4611cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 4627790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com// NYI: issue 240. 4637790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.comTEST_STEP_NO_PDF(DrawVerticesShader, DrawVerticesShaderTestStep); 4641cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 465f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void DrawPictureTestStep(SkCanvas* canvas, const TestData& d, 466f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter*, CanvasTestStep*) { 46784b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com SkPictureRecorder recorder; 468f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkCanvas* testCanvas = recorder.beginRecording(SkIntToScalar(d.fWidth), SkIntToScalar(d.fHeight), 469a8d7f0b13cd4c6d773fcf055fe17db75d260fa05robertphillips NULL, 0); 4701cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testCanvas->scale(SkIntToScalar(2), SkIntToScalar(1)); 471f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr testCanvas->clipRect(d.fRect); 472f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr testCanvas->drawRect(d.fRect, d.fPaint); 47384b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com SkAutoTUnref<SkPicture> testPicture(recorder.endRecording()); 47484b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com 4759b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips canvas->drawPicture(testPicture); 4761cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 4771cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgTEST_STEP(DrawPicture, DrawPictureTestStep); 4781cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 479f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void SaveRestoreTestStep(SkCanvas* canvas, const TestData& d, 480f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter* reporter, CanvasTestStep* testStep) { 4814e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org int baseSaveCount = canvas->getSaveCount(); 4828afae61a57f87e4a50578effce6c428031499301tomhudson@google.com int n = canvas->save(); 4834e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, baseSaveCount == n, testStep->assertMessage()); 4844e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, baseSaveCount + 1 == canvas->getSaveCount(), 4851cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4861cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->save(); 4871cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->save(); 4884e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, baseSaveCount + 3 == canvas->getSaveCount(), 4891cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4904e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->restoreToCount(baseSaveCount + 1); 4914e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, baseSaveCount + 1 == canvas->getSaveCount(), 4921cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4931cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 4941cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // should this pin to 1, or be a no-op, or crash? 4951cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->restoreToCount(0); 4961cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 1 == canvas->getSaveCount(), 4971cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4981cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 4991cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgTEST_STEP(SaveRestore, SaveRestoreTestStep); 5007c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com 501f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void DrawLayerTestStep(SkCanvas* canvas, const TestData& d, 502f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter* reporter, CanvasTestStep* testStep) { 5031cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, !canvas->isDrawingToLayer(), 5041cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5051cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->save(); 5061cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, !canvas->isDrawingToLayer(), 5071cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5084e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->restore(); 509d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 5107c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com const SkRect* bounds = NULL; // null means include entire bounds 5117c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com const SkPaint* paint = NULL; 5127c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com 5131cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->saveLayer(bounds, paint); 5141cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas->isDrawingToLayer(), 5151cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5161cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->restore(); 5171cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, !canvas->isDrawingToLayer(), 5181cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5191cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 5201cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->saveLayer(bounds, paint); 5211cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->saveLayer(bounds, paint); 5221cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas->isDrawingToLayer(), 5231cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5241cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->restore(); 5251cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas->isDrawingToLayer(), 5261cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5271cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->restore(); 5287c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com // now layer count should be 0 5291cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, !canvas->isDrawingToLayer(), 5301cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5317c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com} 5321cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgTEST_STEP(DrawLayer, DrawLayerTestStep); 5333b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com 534f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void NestedSaveRestoreWithSolidPaintTestStep(SkCanvas* canvas, const TestData& d, 535f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter*, CanvasTestStep*) { 5363b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // This test step challenges the TestDeferredCanvasStateConsistency 5373b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // test cases because the opaque paint can trigger an optimization 5383b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // that discards previously recorded commands. The challenge is to maintain 5393b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // correct clip and matrix stack state. 5403b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->resetMatrix(); 5413b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->rotate(SkIntToScalar(30)); 5423b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->save(); 5433b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->translate(SkIntToScalar(2), SkIntToScalar(1)); 5443b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->save(); 5453b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->scale(SkIntToScalar(3), SkIntToScalar(3)); 5463b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com SkPaint paint; 5473b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com paint.setColor(0xFFFFFFFF); 5483b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->drawPaint(paint); 5493b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->restore(); 5503b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->restore(); 5513b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com} 5523b3e895df6f8ee0f33010367c215944cd16a8334reed@google.comTEST_STEP(NestedSaveRestoreWithSolidPaint, \ 5533b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com NestedSaveRestoreWithSolidPaintTestStep); 5543b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com 555f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void NestedSaveRestoreWithFlushTestStep(SkCanvas* canvas, const TestData& d, 556f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr skiatest::Reporter*, CanvasTestStep*) { 5573b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // This test step challenges the TestDeferredCanvasStateConsistency 5583b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // test case because the canvas flush on a deferred canvas will 5593b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // reset the recording session. The challenge is to maintain correct 5603b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // clip and matrix stack state on the playback canvas. 5613b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->resetMatrix(); 5623b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->rotate(SkIntToScalar(30)); 5633b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->save(); 5643b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->translate(SkIntToScalar(2), SkIntToScalar(1)); 5653b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->save(); 5663b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->scale(SkIntToScalar(3), SkIntToScalar(3)); 567f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr canvas->drawRect(d.fRect,d.fPaint); 5683b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->flush(); 5693b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->restore(); 5703b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->restore(); 5713b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com} 572f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrTEST_STEP(NestedSaveRestoreWithFlush, NestedSaveRestoreWithFlushTestStep); 57337f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com 574f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void AssertCanvasStatesEqual(skiatest::Reporter* reporter, const TestData& d, 575f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr const SkCanvas* canvas1, const SkCanvas* canvas2, 5761cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep) { 5771cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->getDeviceSize() == 5781cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getDeviceSize(), testStep->assertMessage()); 5791cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->getSaveCount() == 5801cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getSaveCount(), testStep->assertMessage()); 5811cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->isDrawingToLayer() == 5821cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->isDrawingToLayer(), testStep->assertMessage()); 5833b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com 5841cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkRect bounds1, bounds2; 5851cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 5863b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas1->getClipBounds(&bounds1) == canvas2->getClipBounds(&bounds2), 5871cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5881cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, bounds1 == bounds2, 5893b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com testStep->assertMessage()); 5903b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com 5911cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->getDrawFilter() == 5921cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getDrawFilter(), testStep->assertMessage()); 5931cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkIRect deviceBounds1, deviceBounds2; 5941cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 5951cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas1->getClipDeviceBounds(&deviceBounds1) == 5961cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getClipDeviceBounds(&deviceBounds2), 5971cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 598868074b50b0fc3e460d2aa97c1096827fe0a1935reed REPORTER_ASSERT_MESSAGE(reporter, deviceBounds1 == deviceBounds2, testStep->assertMessage()); 5991cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->getTotalMatrix() == 6001cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getTotalMatrix(), testStep->assertMessage()); 6015c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org REPORTER_ASSERT_MESSAGE(reporter, equal_clips(*canvas1, *canvas2), testStep->assertMessage()); 60237f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com 6031cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // The following test code is commented out because the test fails when 604d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com // the canvas is an SkPictureRecord or SkDeferredCanvas 6051cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Issue: http://code.google.com/p/skia/issues/detail?id=498 6061cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Also, creating a LayerIter on an SkProxyCanvas crashes 6071cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Issue: http://code.google.com/p/skia/issues/detail?id=499 6081cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org /* 6091cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas::LayerIter layerIter1(const_cast<SkCanvas*>(canvas1), false); 6101cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas::LayerIter layerIter2(const_cast<SkCanvas*>(canvas2), false); 6111cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org while (!layerIter1.done() && !layerIter2.done()) { 6121cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.matrix() == 6131cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.matrix(), testStep->assertMessage()); 6141cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.clip() == 6151cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.clip(), testStep->assertMessage()); 6161cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.paint() == 6171cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.paint(), testStep->assertMessage()); 6181cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.x() == 6191cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.x(), testStep->assertMessage()); 6201cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.y() == 6211cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.y(), testStep->assertMessage()); 6221cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter1.next(); 6231cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.next(); 6241cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 6251cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.done(), 6261cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 6271cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter2.done(), 6281cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 6291cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org */ 6301cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 6311cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 6321cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// The following class groups static functions that need to access 6331cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// the privates members of SkPictureRecord 6341cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgclass SkPictureTester { 6351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgprivate: 636e2589aeebf321f6d3b5005c19740beacee964be7reed@google.com static int EQ(const SkFlatData* a, const SkFlatData* b) { 637e2589aeebf321f6d3b5005c19740beacee964be7reed@google.com return *a == *b; 638e2589aeebf321f6d3b5005c19740beacee964be7reed@google.com } 639e2589aeebf321f6d3b5005c19740beacee964be7reed@google.com 6401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org static void AssertFlattenedObjectsEqual( 6411cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPictureRecord* referenceRecord, 6421cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPictureRecord* testRecord, 6431cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org skiatest::Reporter* reporter, 6441cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep) { 6451cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 6461cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 647c9ab987efcb7e8b69237d565f73c28c137610232djsollen@google.com referenceRecord->fBitmapHeap->count() == 648c9ab987efcb7e8b69237d565f73c28c137610232djsollen@google.com testRecord->fBitmapHeap->count(), testStep->assertMessage()); 6491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 6501cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org referenceRecord->fPaints.count() == 6511cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testRecord->fPaints.count(), testStep->assertMessage()); 6521cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org for (int i = 0; i < referenceRecord->fPaints.count(); ++i) { 6531cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 654e2589aeebf321f6d3b5005c19740beacee964be7reed@google.com EQ(referenceRecord->fPaints[i], testRecord->fPaints[i]), 655e2589aeebf321f6d3b5005c19740beacee964be7reed@google.com testStep->assertMessage()); 6561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 6571cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 6580bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips !referenceRecord->fPathHeap == !testRecord->fPathHeap, 6591cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 660dadcfdc92982498344a15ad38cc213504aebd372junov@chromium.org // The following tests are commented out because they currently 661dadcfdc92982498344a15ad38cc213504aebd372junov@chromium.org // fail. Issue: http://code.google.com/p/skia/issues/detail?id=507 662dadcfdc92982498344a15ad38cc213504aebd372junov@chromium.org /* 6631cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org if (referenceRecord->fPathHeap) { 6641cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 6651cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org referenceRecord->fPathHeap->count() == 6661cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testRecord->fPathHeap->count(), 6671cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 6681cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org for (int i = 0; i < referenceRecord->fPathHeap->count(); ++i) { 6691cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 6701cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org (*referenceRecord->fPathHeap)[i] == 6711cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org (*testRecord->fPathHeap)[i], testStep->assertMessage()); 6721cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 6731cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 674dadcfdc92982498344a15ad38cc213504aebd372junov@chromium.org */ 675d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 6761cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 6771cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org}; 6781cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 6797790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.comstatic void TestPdfDevice(skiatest::Reporter* reporter, 680f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr const TestData& d, 6817790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com CanvasTestStep* testStep) { 682f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkISize pageSize = SkISize::Make(d.fWidth, d.fHeight); 6837790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com SkPDFDevice device(pageSize, pageSize, SkMatrix::I()); 6847790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com SkCanvas canvas(&device); 6857790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com testStep->setAssertMessageFormat(kPdfAssertMessageFormat); 686f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr testStep->draw(&canvas, d, reporter); 6877790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com SkPDFDocument doc; 6887790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com doc.appendPage(&device); 6897790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com SkDynamicMemoryWStream stream; 6907790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com doc.emitPDF(&stream); 6917790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com} 6927790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com 69388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org// The following class groups static functions that need to access 69488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org// the privates members of SkDeferredCanvas 69588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgclass SkDeferredCanvasTester { 69688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgpublic: 69788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org static void TestDeferredCanvasStateConsistency( 69888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org skiatest::Reporter* reporter, 699f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr const TestData& d, 70088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org CanvasTestStep* testStep, 701fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org const SkCanvas& referenceCanvas, bool silent) { 70288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 70328183b4043a969df12592e8dd47cf95b80755284reed@google.com SkAutoTUnref<SkSurface> surface(createSurface(0xFFFFFFFF)); 70428183b4043a969df12592e8dd47cf95b80755284reed@google.com SkAutoTUnref<SkDeferredCanvas> deferredCanvas(SkDeferredCanvas::Create(surface.get())); 70528183b4043a969df12592e8dd47cf95b80755284reed@google.com 70688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org testStep->setAssertMessageFormat(kDeferredDrawAssertMessageFormat); 707f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr testStep->draw(deferredCanvas, d, reporter); 70888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org testStep->setAssertMessageFormat(kDeferredPreFlushAssertMessageFormat); 709f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr AssertCanvasStatesEqual(reporter, d, deferredCanvas, &referenceCanvas, testStep); 71088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 711fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org if (silent) { 71266070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org deferredCanvas->silentFlush(); 713fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } else { 71466070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org deferredCanvas->flush(); 715fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 716fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org 7174c5ea4480341f0f663b51e9d78b948bc0a785f4dskia.committer@gmail.com testStep->setAssertMessageFormat( 718fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org silent ? kDeferredPostSilentFlushPlaybackAssertMessageFormat : 71988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org kDeferredPostFlushPlaybackAssertMessageFormat); 720f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr AssertCanvasStatesEqual(reporter, d, deferredCanvas->immediateCanvas(), 721f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr &referenceCanvas, testStep); 72288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 72388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // Verified that deferred canvas state is not affected by flushing 72488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // pending draw operations 72588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 72688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // The following test code is commented out because it currently fails. 72788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // Issue: http://code.google.com/p/skia/issues/detail?id=496 72888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org /* 72988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org testStep->setAssertMessageFormat(kDeferredPostFlushAssertMessageFormat); 73088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org AssertCanvasStatesEqual(reporter, &deferredCanvas, &referenceCanvas, 73188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org testStep); 73288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org */ 73388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org } 73488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}; 7351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 73642639cddc33746b351bbf07c540711eefffe191acaryclark@google.com// unused 7371cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void TestProxyCanvasStateConsistency( 7381cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org skiatest::Reporter* reporter, 739f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr const TestData& d, 7401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep, 7411cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org const SkCanvas& referenceCanvas) { 7421cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 7431cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkBitmap indirectStore; 744fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org createBitmap(&indirectStore, 0xFFFFFFFF); 7452a8ca93171041da39987ed455dfb3701f0d93ac6reed SkCanvas indirectCanvas(indirectStore); 7461cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkProxyCanvas proxyCanvas(&indirectCanvas); 7471cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kProxyDrawAssertMessageFormat); 748f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr testStep->draw(&proxyCanvas, d, reporter); 7491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Verify that the SkProxyCanvas reports consitent state 7501cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kProxyStateAssertMessageFormat); 751f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr AssertCanvasStatesEqual(reporter, d, &proxyCanvas, &referenceCanvas, testStep); 7521cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Verify that the indirect canvas reports consitent state 7531cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kProxyIndirectStateAssertMessageFormat); 754f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr AssertCanvasStatesEqual(reporter, d, &indirectCanvas, &referenceCanvas, testStep); 7551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 7561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 75742639cddc33746b351bbf07c540711eefffe191acaryclark@google.com// unused 7581cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void TestNWayCanvasStateConsistency( 7591cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org skiatest::Reporter* reporter, 760f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr const TestData& d, 7611cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep, 7621cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org const SkCanvas& referenceCanvas) { 7631cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 7641cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkBitmap indirectStore1; 765fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org createBitmap(&indirectStore1, 0xFFFFFFFF); 7662a8ca93171041da39987ed455dfb3701f0d93ac6reed SkCanvas indirectCanvas1(indirectStore1); 7671cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 7681cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkBitmap indirectStore2; 769fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org createBitmap(&indirectStore2, 0xFFFFFFFF); 7702a8ca93171041da39987ed455dfb3701f0d93ac6reed SkCanvas indirectCanvas2(indirectStore2); 7711cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 772f0a062bc4573323abcf37394bb68e0230347a974djsollen@google.com SkISize canvasSize = referenceCanvas.getDeviceSize(); 773f0a062bc4573323abcf37394bb68e0230347a974djsollen@google.com SkNWayCanvas nWayCanvas(canvasSize.width(), canvasSize.height()); 7741cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org nWayCanvas.addCanvas(&indirectCanvas1); 7751cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org nWayCanvas.addCanvas(&indirectCanvas2); 7761cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 7771cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kNWayDrawAssertMessageFormat); 778f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr testStep->draw(&nWayCanvas, d, reporter); 7791cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Verify that the SkProxyCanvas reports consitent state 7801cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kNWayStateAssertMessageFormat); 781f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr AssertCanvasStatesEqual(reporter, d, &nWayCanvas, &referenceCanvas, testStep); 7821cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Verify that the indirect canvases report consitent state 7831cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kNWayIndirect1StateAssertMessageFormat); 784f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr AssertCanvasStatesEqual(reporter, d, &indirectCanvas1, &referenceCanvas, testStep); 7851cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kNWayIndirect2StateAssertMessageFormat); 786f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr AssertCanvasStatesEqual(reporter, d, &indirectCanvas2, &referenceCanvas, testStep); 7871cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 7881cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 7891cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org/* 7901cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * This sub-test verifies that the test step passes when executed 7911cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * with SkCanvas and with classes derrived from SkCanvas. It also verifies 7921cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * that the all canvas derivatives report the same state as an SkCanvas 7931cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * after having executed the test step. 7941cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org */ 795f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixrstatic void TestOverrideStateConsistency(skiatest::Reporter* reporter, const TestData& d, 7961cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep) { 7971cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkBitmap referenceStore; 798fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org createBitmap(&referenceStore, 0xFFFFFFFF); 7992a8ca93171041da39987ed455dfb3701f0d93ac6reed SkCanvas referenceCanvas(referenceStore); 8001cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kCanvasDrawAssertMessageFormat); 801f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr testStep->draw(&referenceCanvas, d, reporter); 8021cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 803f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkDeferredCanvasTester::TestDeferredCanvasStateConsistency(reporter, d, testStep, referenceCanvas, false); 804fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org 805f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr SkDeferredCanvasTester::TestDeferredCanvasStateConsistency(reporter, d, testStep, referenceCanvas, true); 8061cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 80742639cddc33746b351bbf07c540711eefffe191acaryclark@google.com // The following test code is disabled because SkProxyCanvas is 8081cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // missing a lot of virtual overrides on get* methods, which are used 8091cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // to verify canvas state. 8101cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Issue: http://code.google.com/p/skia/issues/detail?id=500 8111cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 81242639cddc33746b351bbf07c540711eefffe191acaryclark@google.com if (false) { // avoid bit rot, suppress warning 813f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr TestProxyCanvasStateConsistency(reporter, d, testStep, referenceCanvas); 81442639cddc33746b351bbf07c540711eefffe191acaryclark@google.com } 81542639cddc33746b351bbf07c540711eefffe191acaryclark@google.com 81642639cddc33746b351bbf07c540711eefffe191acaryclark@google.com // The following test code is disabled because SkNWayCanvas does not 8171cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // report correct clipping and device bounds information 8181cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Issue: http://code.google.com/p/skia/issues/detail?id=501 81942639cddc33746b351bbf07c540711eefffe191acaryclark@google.com 82042639cddc33746b351bbf07c540711eefffe191acaryclark@google.com if (false) { // avoid bit rot, suppress warning 821f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr TestNWayCanvasStateConsistency(reporter, d, testStep, referenceCanvas); 82242639cddc33746b351bbf07c540711eefffe191acaryclark@google.com } 823d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 82442639cddc33746b351bbf07c540711eefffe191acaryclark@google.com if (false) { // avoid bit rot, suppress warning 82542639cddc33746b351bbf07c540711eefffe191acaryclark@google.com test_clipVisitor(reporter, &referenceCanvas); 82642639cddc33746b351bbf07c540711eefffe191acaryclark@google.com } 8271cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 8281cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 8293107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.orgstatic void test_newraster(skiatest::Reporter* reporter) { 8303107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org SkImageInfo info = SkImageInfo::MakeN32Premul(10, 10); 8313107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org SkCanvas* canvas = SkCanvas::NewRaster(info); 8323107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, canvas); 8333107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org 8343107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org SkImageInfo info2; 8353107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org size_t rowBytes; 8363107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org const SkPMColor* addr = (const SkPMColor*)canvas->peekPixels(&info2, &rowBytes); 8373107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, addr); 8383107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, info == info2); 8393107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org for (int y = 0; y < info.height(); ++y) { 8403107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org for (int x = 0; x < info.width(); ++x) { 8413107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, 0 == addr[x]); 8423107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org } 8433107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org addr = (const SkPMColor*)((const char*)addr + rowBytes); 8443107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org } 8453107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org SkDELETE(canvas); 8463107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org 8473107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org // now try a deliberately bad info 848e5ea500d4714a7d84de2bf913e81be3b65d2de68reed info = info.makeWH(-1, info.height()); 8493107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, NULL == SkCanvas::NewRaster(info)); 8503107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org 8513107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org // too big 852e5ea500d4714a7d84de2bf913e81be3b65d2de68reed info = info.makeWH(1 << 30, 1 << 30); 8533107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, NULL == SkCanvas::NewRaster(info)); 8540e530754d36d942f6408c65cc93ba0a8ccd93610skia.committer@gmail.com 8553107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org // not a valid pixel type 856e5ea500d4714a7d84de2bf913e81be3b65d2de68reed info = SkImageInfo::Make(10, 10, kUnknown_SkColorType, info.alphaType()); 8573107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, NULL == SkCanvas::NewRaster(info)); 8583107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org 8593107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org // We should succeed with a zero-sized valid info 8603107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org info = SkImageInfo::MakeN32Premul(0, 0); 8613107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org canvas = SkCanvas::NewRaster(info); 8623107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, canvas); 8633107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org SkDELETE(canvas); 8643107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org} 8653107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org 866e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(Canvas, reporter) { 867f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr TestData d; 8687c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com 8691cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org for (int testStep = 0; testStep < testStepArray().count(); testStep++) { 870f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr TestOverrideStateConsistency(reporter, d, testStepArray()[testStep]); 8717790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com if (testStepArray()[testStep]->enablePdfTesting()) { 872f05f5a7399b7d748403b234d1faced9f4c61891fpiotaixr TestPdfDevice(reporter, d, testStepArray()[testStep]); 8737790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com } 8741cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 875cd62ecf39a81d9d85a7eb8508e14ce2834899e88junov@chromium.org 8763107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org test_newraster(reporter); 87737f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com} 878