CanvasTest.cpp revision 5c70cdca5efe541b70d010e91607bf8626ea49ca
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" 581cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkProxyCanvas.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 675c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.orgstatic bool equal_clips(const SkCanvas& a, const SkCanvas& b) { 685c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org if (a.isClipEmpty()) { 695c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org return b.isClipEmpty(); 705c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org } 715c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org if (!a.isClipRect()) { 725c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org // this is liberally true, since we don't expose a way to know this exactly (for non-rects) 735c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org return !b.isClipRect(); 745c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org } 755c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org SkIRect ar, br; 765c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org a.getClipDeviceBounds(&ar); 775c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org b.getClipDeviceBounds(&br); 785c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org return ar == br; 795c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org} 805c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org 8190c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.comclass Canvas2CanvasClipVisitor : public SkCanvas::ClipVisitor { 8290c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.compublic: 8390c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com Canvas2CanvasClipVisitor(SkCanvas* target) : fTarget(target) {} 8490c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 85e5b2af955b7d06815ddd405659ad62a2a8355ca3commit-bot@chromium.org virtual void clipRect(const SkRect& r, SkRegion::Op op, bool aa) SK_OVERRIDE { 8690c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com fTarget->clipRect(r, op, aa); 8790c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com } 88e5b2af955b7d06815ddd405659ad62a2a8355ca3commit-bot@chromium.org virtual void clipRRect(const SkRRect& r, SkRegion::Op op, bool aa) SK_OVERRIDE { 89e5b2af955b7d06815ddd405659ad62a2a8355ca3commit-bot@chromium.org fTarget->clipRRect(r, op, aa); 90e5b2af955b7d06815ddd405659ad62a2a8355ca3commit-bot@chromium.org } 91e5b2af955b7d06815ddd405659ad62a2a8355ca3commit-bot@chromium.org virtual void clipPath(const SkPath& p, SkRegion::Op op, bool aa) SK_OVERRIDE { 9290c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com fTarget->clipPath(p, op, aa); 9390c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com } 9490c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 9590c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.comprivate: 9690c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com SkCanvas* fTarget; 9790c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com}; 9890c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 9990c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.comstatic void test_clipVisitor(skiatest::Reporter* reporter, SkCanvas* canvas) { 10090c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com SkISize size = canvas->getDeviceSize(); 101d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 10290c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com SkBitmap bm; 103fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org bm.setConfig(SkImageInfo::MakeN32Premul(size.width(), size.height())); 10490c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com SkCanvas c(bm); 10590c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 10690c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com Canvas2CanvasClipVisitor visitor(&c); 10790c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com canvas->replayClips(&visitor); 10890c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 1095c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org REPORTER_ASSERT(reporter, equal_clips(c, *canvas)); 11090c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com} 11190c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 1121cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const int kWidth = 2; 1131cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const int kHeight = 2; 1141cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 1151cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// Format strings that describe the test context. The %s token is where 1161cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// the name of the test step is inserted. The context is required for 1171cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// disambiguating the error in the case of failures that are reported in 1181cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// functions that are called multiple times in different contexts (test 1191cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// cases and test steps). 1201cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kDefaultAssertMessageFormat = "%s"; 121d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic const char* const kCanvasDrawAssertMessageFormat = 1221cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "Drawing test step %s with SkCanvas"; 123d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic const char* const kPictureDrawAssertMessageFormat = 1241cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "Drawing test step %s with SkPicture"; 125d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic const char* const kPictureSecondDrawAssertMessageFormat = 1261cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "Duplicate draw of test step %s with SkPicture"; 127d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic const char* const kDeferredDrawAssertMessageFormat = 1281cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "Drawing test step %s with SkDeferredCanvas"; 129d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic const char* const kProxyDrawAssertMessageFormat = 1301cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "Drawing test step %s with SkProxyCanvas"; 131d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic const char* const kNWayDrawAssertMessageFormat = 1321cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "Drawing test step %s with SkNWayCanvas"; 133d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic const char* const kDeferredPreFlushAssertMessageFormat = 1341cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkDeferredCanvas state consistency before flush"; 135cff01c5b60d4969d817c34d002752cd379b1862ajunov@chromium.orgstatic const char* const kDeferredPostFlushPlaybackAssertMessageFormat = 136cff01c5b60d4969d817c34d002752cd379b1862ajunov@chromium.org "test step %s, SkDeferredCanvas playback canvas state consistency after flush"; 137fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.orgstatic const char* const kDeferredPostSilentFlushPlaybackAssertMessageFormat = 138fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org "test step %s, SkDeferredCanvas playback canvas state consistency after silent flush"; 1391cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kPictureResourceReuseMessageFormat = 1401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkPicture duplicate flattened object test"; 1411cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kProxyStateAssertMessageFormat = 1421cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkProxyCanvas state consistency"; 1431cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kProxyIndirectStateAssertMessageFormat = 1441cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkProxyCanvas indirect canvas state consistency"; 1451cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kNWayStateAssertMessageFormat = 1461cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkNWayCanvas state consistency"; 1471cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kNWayIndirect1StateAssertMessageFormat = 1481cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkNWayCanvas indirect canvas 1 state consistency"; 1491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kNWayIndirect2StateAssertMessageFormat = 1501cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkNWayCanvas indirect canvas 2 state consistency"; 1517790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.comstatic const char* const kPdfAssertMessageFormat = 1527790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com "PDF sanity check failed %s"; 1531cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 154fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.orgstatic void createBitmap(SkBitmap* bm, SkColor color) { 155fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org bm->allocN32Pixels(kWidth, kHeight); 1561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org bm->eraseColor(color); 1571cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 1581cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 15928183b4043a969df12592e8dd47cf95b80755284reed@google.comstatic SkSurface* createSurface(SkColor color) { 16028183b4043a969df12592e8dd47cf95b80755284reed@google.com SkSurface* surface = SkSurface::NewRasterPMColor(kWidth, kHeight); 16128183b4043a969df12592e8dd47cf95b80755284reed@google.com surface->getCanvas()->clear(color); 16228183b4043a969df12592e8dd47cf95b80755284reed@google.com return surface; 16328183b4043a969df12592e8dd47cf95b80755284reed@google.com} 16428183b4043a969df12592e8dd47cf95b80755284reed@google.com 1651cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgclass CanvasTestStep; 1661cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic SkTDArray<CanvasTestStep*>& testStepArray() { 1671cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org static SkTDArray<CanvasTestStep*> theTests; 1681cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org return theTests; 1691cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 1701cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 1711cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgclass CanvasTestStep { 1721cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgpublic: 1737790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com CanvasTestStep(bool fEnablePdfTesting = true) { 1741cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org *testStepArray().append() = this; 1751cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org fAssertMessageFormat = kDefaultAssertMessageFormat; 1767790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com this->fEnablePdfTesting = fEnablePdfTesting; 1771cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 178e63793a2c8d2871bf7d95195be7b93ff669688d7djsollen@google.com virtual ~CanvasTestStep() { } 1791cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 1801cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org virtual void draw(SkCanvas*, skiatest::Reporter*) = 0; 1811cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org virtual const char* name() const = 0; 1821cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 1831cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org const char* assertMessage() { 1841cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org fAssertMessage.printf(fAssertMessageFormat, name()); 1851cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org return fAssertMessage.c_str(); 1861cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 1871cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 1881cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org void setAssertMessageFormat(const char* format) { 1891cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org fAssertMessageFormat = format; 1901cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 1911cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 1927790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com bool enablePdfTesting() { return fEnablePdfTesting; } 1937790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com 1941cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgprivate: 1951cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkString fAssertMessage; 1961cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org const char* fAssertMessageFormat; 1977790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com bool fEnablePdfTesting; 1981cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org}; 1991cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2001cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org/////////////////////////////////////////////////////////////////////////////// 2011cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// Constants used by test steps 2021cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 203d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comconst SkRect kTestRect = 2041cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkRect::MakeXYWH(SkIntToScalar(0), SkIntToScalar(0), 2051cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkIntToScalar(2), SkIntToScalar(1)); 2061cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic SkMatrix testMatrix() { 2071cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkMatrix matrix; 2081cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org matrix.reset(); 2091cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org matrix.setScale(SkIntToScalar(2), SkIntToScalar(3)); 2101cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org return matrix; 2111cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 2121cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgconst SkMatrix kTestMatrix = testMatrix(); 2138c2ee5963505cdbe128f68d67f064a3901d22a3ccommit-bot@chromium.orgstatic SkPath test_path() { 2141cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPath path; 2151cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org path.addRect(SkRect::MakeXYWH(SkIntToScalar(0), SkIntToScalar(0), 2161cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkIntToScalar(2), SkIntToScalar(1))); 2171cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org return path; 2181cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 2198c2ee5963505cdbe128f68d67f064a3901d22a3ccommit-bot@chromium.orgconst SkPath kTestPath = test_path(); 2208c2ee5963505cdbe128f68d67f064a3901d22a3ccommit-bot@chromium.orgstatic SkPath test_nearly_zero_length_path() { 2218c2ee5963505cdbe128f68d67f064a3901d22a3ccommit-bot@chromium.org SkPath path; 2228c2ee5963505cdbe128f68d67f064a3901d22a3ccommit-bot@chromium.org SkPoint pt1 = { 0, 0 }; 2238c2ee5963505cdbe128f68d67f064a3901d22a3ccommit-bot@chromium.org SkPoint pt2 = { 0, SK_ScalarNearlyZero }; 2248c2ee5963505cdbe128f68d67f064a3901d22a3ccommit-bot@chromium.org SkPoint pt3 = { SkIntToScalar(1), 0 }; 2258c2ee5963505cdbe128f68d67f064a3901d22a3ccommit-bot@chromium.org SkPoint pt4 = { SkIntToScalar(1), SK_ScalarNearlyZero/2 }; 2268c2ee5963505cdbe128f68d67f064a3901d22a3ccommit-bot@chromium.org path.moveTo(pt1); 2278c2ee5963505cdbe128f68d67f064a3901d22a3ccommit-bot@chromium.org path.lineTo(pt2); 2288c2ee5963505cdbe128f68d67f064a3901d22a3ccommit-bot@chromium.org path.lineTo(pt3); 2298c2ee5963505cdbe128f68d67f064a3901d22a3ccommit-bot@chromium.org path.lineTo(pt4); 2308c2ee5963505cdbe128f68d67f064a3901d22a3ccommit-bot@chromium.org return path; 2318c2ee5963505cdbe128f68d67f064a3901d22a3ccommit-bot@chromium.org} 2328c2ee5963505cdbe128f68d67f064a3901d22a3ccommit-bot@chromium.orgconst SkPath kNearlyZeroLengthPath = test_nearly_zero_length_path(); 2331cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic SkRegion testRegion() { 2341cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkRegion region; 2351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkIRect rect = SkIRect::MakeXYWH(0, 0, 2, 1); 2361cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org region.setRect(rect); 2371cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org return region; 2381cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 2391cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgconst SkIRect kTestIRect = SkIRect::MakeXYWH(0, 0, 2, 1); 2401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgconst SkRegion kTestRegion = testRegion(); 2411cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgconst SkColor kTestColor = 0x01020304; 2421cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgconst SkPaint kTestPaint; 2431cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgconst SkPoint kTestPoints[3] = { 2441cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org {SkIntToScalar(0), SkIntToScalar(0)}, 2451cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org {SkIntToScalar(2), SkIntToScalar(1)}, 2461cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org {SkIntToScalar(0), SkIntToScalar(2)} 2471cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org}; 2481cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgconst size_t kTestPointCount = 3; 2491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic SkBitmap testBitmap() { 2501cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkBitmap bitmap; 251fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org createBitmap(&bitmap, 0x05060708); 2521cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org return bitmap; 2531cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 2541cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSkBitmap kTestBitmap; // cannot be created during static init 2551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSkString kTestText("Hello World"); 256977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.comSkPoint kTestPoints2[] = { 257977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(0), SkIntToScalar(1) }, 258977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(1), SkIntToScalar(1) }, 259977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(2), SkIntToScalar(1) }, 260977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(3), SkIntToScalar(1) }, 261977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(4), SkIntToScalar(1) }, 262977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(5), SkIntToScalar(1) }, 263977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(6), SkIntToScalar(1) }, 264977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(7), SkIntToScalar(1) }, 265977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(8), SkIntToScalar(1) }, 266977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(9), SkIntToScalar(1) }, 267977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(10), SkIntToScalar(1) }, 268977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com}; 269d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 2701cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2711cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org/////////////////////////////////////////////////////////////////////////////// 2721cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// Macros for defining test steps 2731cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2741cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#define TEST_STEP(NAME, FUNCTION) \ 2751cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgclass NAME##_TestStep : public CanvasTestStep{ \ 2761cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgpublic: \ 2771cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org virtual void draw(SkCanvas* canvas, skiatest::Reporter* reporter) { \ 2781cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org FUNCTION (canvas, reporter, this); \ 2791cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } \ 2801cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org virtual const char* name() const {return #NAME ;} \ 2811cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org}; \ 2821cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic NAME##_TestStep NAME##_TestStepInstance; 2831cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2847790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com#define TEST_STEP_NO_PDF(NAME, FUNCTION) \ 2857790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.comclass NAME##_TestStep : public CanvasTestStep{ \ 2867790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.compublic: \ 2877790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com NAME##_TestStep() : CanvasTestStep(false) {} \ 2887790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com virtual void draw(SkCanvas* canvas, skiatest::Reporter* reporter) { \ 2897790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com FUNCTION (canvas, reporter, this); \ 2907790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com } \ 2917790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com virtual const char* name() const {return #NAME ;} \ 2927790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com}; \ 2937790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.comstatic NAME##_TestStep NAME##_TestStepInstance; 2947790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com 2951cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#define SIMPLE_TEST_STEP(NAME, CALL) \ 2961cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void NAME##TestStep(SkCanvas* canvas, skiatest::Reporter*, \ 2971cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep*) { \ 2981cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas-> CALL ; \ 2991cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} \ 3001cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgTEST_STEP(NAME, NAME##TestStep ) 3011cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 3021cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#define SIMPLE_TEST_STEP_WITH_ASSERT(NAME, CALL) \ 3031cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void NAME##TestStep(SkCanvas* canvas, skiatest::Reporter* reporter, \ 3041cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep) { \ 3051cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas-> CALL , \ 3061cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); \ 3071cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} \ 3081cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgTEST_STEP(NAME, NAME##TestStep ) 3091cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 3101cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 3111cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org/////////////////////////////////////////////////////////////////////////////// 312d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com// Basic test steps for most virtual methods in SkCanvas that draw or affect 3131cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// the state of the canvas. 3141cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 315a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP_WITH_ASSERT(Translate, 316a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.org translate(SkIntToScalar(1), SkIntToScalar(2))); 317a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP_WITH_ASSERT(Scale, 318a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.org scale(SkIntToScalar(1), SkIntToScalar(2))); 319a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP_WITH_ASSERT(Rotate, rotate(SkIntToScalar(1))); 320a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP_WITH_ASSERT(Skew, 321a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.org skew(SkIntToScalar(1), SkIntToScalar(2))); 322a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP_WITH_ASSERT(Concat, concat(kTestMatrix)); 323a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP(SetMatrix, setMatrix(kTestMatrix)); 3244e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.orgSIMPLE_TEST_STEP(ClipRect, clipRect(kTestRect)); 3254e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.orgSIMPLE_TEST_STEP(ClipPath, clipPath(kTestPath)); 3264e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.orgSIMPLE_TEST_STEP(ClipRegion, 327a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.org clipRegion(kTestRegion, SkRegion::kReplace_Op)); 3281cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(Clear, clear(kTestColor)); 3291cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawPaint, drawPaint(kTestPaint)); 3301cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawPointsPoints, drawPoints(SkCanvas::kPoints_PointMode, 3311cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kTestPointCount, kTestPoints, kTestPaint)); 3321cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawPointsLiness, drawPoints(SkCanvas::kLines_PointMode, 3331cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kTestPointCount, kTestPoints, kTestPaint)); 3341cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawPointsPolygon, drawPoints(SkCanvas::kPolygon_PointMode, 3351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kTestPointCount, kTestPoints, kTestPaint)); 3361cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawRect, drawRect(kTestRect, kTestPaint)); 3371cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawPath, drawPath(kTestPath, kTestPaint)); 33887f982c80833eeebf541becec8e27b96c8c889f7junov@chromium.orgSIMPLE_TEST_STEP(DrawBitmap, drawBitmap(kTestBitmap, 0, 0)); 3391cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawBitmapPaint, drawBitmap(kTestBitmap, 0, 0, &kTestPaint)); 3401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawBitmapRect, drawBitmapRect(kTestBitmap, NULL, kTestRect, 3411cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org NULL)); 3421cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawBitmapRectSrcRect, drawBitmapRect(kTestBitmap, 3431cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org &kTestIRect, kTestRect, NULL)); 3441cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawBitmapRectPaint, drawBitmapRect(kTestBitmap, NULL, 3451cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kTestRect, &kTestPaint)); 3461cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawBitmapMatrix, drawBitmapMatrix(kTestBitmap, kTestMatrix, 3471cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org NULL)); 3481cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawBitmapMatrixPaint, drawBitmapMatrix(kTestBitmap, 3491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kTestMatrix, &kTestPaint)); 3501cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawBitmapNine, drawBitmapNine(kTestBitmap, kTestIRect, 3511cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kTestRect, NULL)); 3521cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawBitmapNinePaint, drawBitmapNine(kTestBitmap, kTestIRect, 3531cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kTestRect, &kTestPaint)); 35487f982c80833eeebf541becec8e27b96c8c889f7junov@chromium.orgSIMPLE_TEST_STEP(DrawSprite, drawSprite(kTestBitmap, 0, 0, NULL)); 3551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawSpritePaint, drawSprite(kTestBitmap, 0, 0, &kTestPaint)); 3561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawText, drawText(kTestText.c_str(), kTestText.size(), 3571cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 0, 1, kTestPaint)); 3581cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawPosText, drawPosText(kTestText.c_str(), 359977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com kTestText.size(), kTestPoints2, kTestPaint)); 3601cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawTextOnPath, drawTextOnPath(kTestText.c_str(), 3611cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kTestText.size(), kTestPath, NULL, kTestPaint)); 3621cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawTextOnPathMatrix, drawTextOnPath(kTestText.c_str(), 3631cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kTestText.size(), kTestPath, &kTestMatrix, kTestPaint)); 3641cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawData, drawData(kTestText.c_str(), kTestText.size())); 3650a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comSIMPLE_TEST_STEP(BeginGroup, beginCommentGroup(kTestText.c_str())); 3660a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comSIMPLE_TEST_STEP(AddComment, addComment(kTestText.c_str(), kTestText.c_str())); 3670a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comSIMPLE_TEST_STEP(EndGroup, endCommentGroup()); 3681cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 3691cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org/////////////////////////////////////////////////////////////////////////////// 3701cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// Complex test steps 3711cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 372d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com// Save/restore calls cannot be in isolated simple test steps because the test 3734e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org// cases that use SkPicture require that save and restore calls be balanced. 374d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic void SaveMatrixStep(SkCanvas* canvas, 3754e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org skiatest::Reporter* reporter, 3764e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org CanvasTestStep* testStep) { 3774e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org int saveCount = canvas->getSaveCount(); 3784e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->save(SkCanvas::kMatrix_SaveFlag); 3794e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->clipRegion(kTestRegion); 3804e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->translate(SkIntToScalar(1), SkIntToScalar(2)); 3814e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->restore(); 382d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT_MESSAGE(reporter, canvas->getSaveCount() == saveCount, 3834e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org testStep->assertMessage()); 384d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT_MESSAGE(reporter, canvas->getTotalMatrix().isIdentity(), 3854e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org testStep->assertMessage()); 3865c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org// REPORTER_ASSERT_MESSAGE(reporter, canvas->getTotalClip() == kTestRegion, testStep->assertMessage()); 3874e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org} 3884e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.orgTEST_STEP(SaveMatrix, SaveMatrixStep); 3894e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org 390d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic void SaveClipStep(SkCanvas* canvas, 3914e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org skiatest::Reporter* reporter, 3924e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org CanvasTestStep* testStep) { 3934e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org int saveCount = canvas->getSaveCount(); 3944e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->save(SkCanvas::kClip_SaveFlag); 3954e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->translate(SkIntToScalar(1), SkIntToScalar(2)); 3964e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->clipRegion(kTestRegion); 3974e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->restore(); 398d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT_MESSAGE(reporter, canvas->getSaveCount() == saveCount, 3994e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org testStep->assertMessage()); 400d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT_MESSAGE(reporter, !canvas->getTotalMatrix().isIdentity(), 4014e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org testStep->assertMessage()); 4025c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org// REPORTER_ASSERT_MESSAGE(reporter, canvas->getTotalClip() != kTestRegion, testStep->assertMessage()); 4034e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org} 4044e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.orgTEST_STEP(SaveClip, SaveClipStep); 4054e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org 406d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic void SaveMatrixClipStep(SkCanvas* canvas, 4074e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org skiatest::Reporter* reporter, 4084e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org CanvasTestStep* testStep) { 4094e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org int saveCount = canvas->getSaveCount(); 4104e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->save(SkCanvas::kMatrixClip_SaveFlag); 4114e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->translate(SkIntToScalar(1), SkIntToScalar(2)); 4124e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->clipRegion(kTestRegion); 4134e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->restore(); 414d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT_MESSAGE(reporter, canvas->getSaveCount() == saveCount, 4154e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org testStep->assertMessage()); 416d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT_MESSAGE(reporter, canvas->getTotalMatrix().isIdentity(), 4174e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org testStep->assertMessage()); 4185c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org// REPORTER_ASSERT_MESSAGE(reporter, canvas->getTotalClip() != kTestRegion, testStep->assertMessage()); 4194e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org} 4204e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.orgTEST_STEP(SaveMatrixClip, SaveMatrixClipStep); 4214e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org 422d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic void SaveLayerStep(SkCanvas* canvas, 4234e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org skiatest::Reporter* reporter, 4244e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org CanvasTestStep* testStep) { 4254e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org int saveCount = canvas->getSaveCount(); 4264e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->saveLayer(NULL, NULL); 4274e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->restore(); 428d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT_MESSAGE(reporter, canvas->getSaveCount() == saveCount, 4294e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org testStep->assertMessage()); 4304e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org} 4314e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.orgTEST_STEP(SaveLayer, SaveLayerStep); 4324e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org 433d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic void BoundedSaveLayerStep(SkCanvas* canvas, 4344e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org skiatest::Reporter* reporter, 4354e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org CanvasTestStep* testStep) { 4364e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org int saveCount = canvas->getSaveCount(); 4374e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->saveLayer(&kTestRect, NULL); 4384e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->restore(); 439d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT_MESSAGE(reporter, canvas->getSaveCount() == saveCount, 4404e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org testStep->assertMessage()); 4414e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org} 4424e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.orgTEST_STEP(BoundedSaveLayer, BoundedSaveLayerStep); 4434e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org 444d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic void PaintSaveLayerStep(SkCanvas* canvas, 4454e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org skiatest::Reporter* reporter, 4464e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org CanvasTestStep* testStep) { 4474e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org int saveCount = canvas->getSaveCount(); 4484e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->saveLayer(NULL, &kTestPaint); 4494e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->restore(); 450d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT_MESSAGE(reporter, canvas->getSaveCount() == saveCount, 4514e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org testStep->assertMessage()); 4524e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org} 4534e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.orgTEST_STEP(PaintSaveLayer, PaintSaveLayerStep); 4544e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org 455d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic void TwoClipOpsStep(SkCanvas* canvas, 45654f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com skiatest::Reporter*, 45754f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com CanvasTestStep*) { 458a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.org // This test exercises a functionality in SkPicture that leads to the 459d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com // recording of restore offset placeholders. This test will trigger an 460a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.org // assertion at playback time if the placeholders are not properly 461a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.org // filled when the recording ends. 462a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.org canvas->clipRect(kTestRect); 463a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.org canvas->clipRegion(kTestRegion); 464a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.org} 465a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.orgTEST_STEP(TwoClipOps, TwoClipOpsStep); 466a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.org 46794fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com// exercise fix for http://code.google.com/p/skia/issues/detail?id=560 46894fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com// ('SkPathStroker::lineTo() fails for line with length SK_ScalarNearlyZero') 469d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic void DrawNearlyZeroLengthPathTestStep(SkCanvas* canvas, 47054f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com skiatest::Reporter*, 47154f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com CanvasTestStep*) { 47294fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com SkPaint paint; 47394fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com paint.setStrokeWidth(SkIntToScalar(1)); 47494fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com paint.setStyle(SkPaint::kStroke_Style); 47594fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com 4768c2ee5963505cdbe128f68d67f064a3901d22a3ccommit-bot@chromium.org canvas->drawPath(kNearlyZeroLengthPath, paint); 47794fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com} 47894fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.comTEST_STEP(DrawNearlyZeroLengthPath, DrawNearlyZeroLengthPathTestStep); 47994fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com 480d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic void DrawVerticesShaderTestStep(SkCanvas* canvas, 48154f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com skiatest::Reporter*, 48254f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com CanvasTestStep*) { 4831cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPoint pts[4]; 4841cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org pts[0].set(0, 0); 4851cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org pts[1].set(SkIntToScalar(kWidth), 0); 4861cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org pts[2].set(SkIntToScalar(kWidth), SkIntToScalar(kHeight)); 4871cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org pts[3].set(0, SkIntToScalar(kHeight)); 4881cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPaint paint; 4891cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkShader* shader = SkShader::CreateBitmapShader(kTestBitmap, 4901cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkShader::kClamp_TileMode, SkShader::kClamp_TileMode); 4911cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org paint.setShader(shader)->unref(); 4921cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->drawVertices(SkCanvas::kTriangleFan_VertexMode, 4, pts, pts, 4931cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org NULL, NULL, NULL, 0, paint); 4941cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 4957790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com// NYI: issue 240. 4967790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.comTEST_STEP_NO_PDF(DrawVerticesShader, DrawVerticesShaderTestStep); 4971cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 498d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic void DrawPictureTestStep(SkCanvas* canvas, 49954f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com skiatest::Reporter*, 50054f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com CanvasTestStep*) { 5011cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPicture* testPicture = SkNEW_ARGS(SkPicture, ()); 5021cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkAutoUnref aup(testPicture); 5031cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas* testCanvas = testPicture->beginRecording(kWidth, kHeight); 5041cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testCanvas->scale(SkIntToScalar(2), SkIntToScalar(1)); 5051cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testCanvas->clipRect(kTestRect); 5061cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testCanvas->drawRect(kTestRect, kTestPaint); 5071cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->drawPicture(*testPicture); 5081cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 5091cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgTEST_STEP(DrawPicture, DrawPictureTestStep); 5101cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 511d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic void SaveRestoreTestStep(SkCanvas* canvas, 5121cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org skiatest::Reporter* reporter, 5131cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep) { 5144e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org int baseSaveCount = canvas->getSaveCount(); 5158afae61a57f87e4a50578effce6c428031499301tomhudson@google.com int n = canvas->save(); 5164e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, baseSaveCount == n, testStep->assertMessage()); 5174e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, baseSaveCount + 1 == canvas->getSaveCount(), 5181cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5191cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->save(); 5201cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->save(); 5214e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, baseSaveCount + 3 == canvas->getSaveCount(), 5221cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5234e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->restoreToCount(baseSaveCount + 1); 5244e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, baseSaveCount + 1 == canvas->getSaveCount(), 5251cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5261cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 5271cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // should this pin to 1, or be a no-op, or crash? 5281cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->restoreToCount(0); 5291cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 1 == canvas->getSaveCount(), 5301cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5311cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 5321cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgTEST_STEP(SaveRestore, SaveRestoreTestStep); 5337c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com 534d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic void DrawLayerTestStep(SkCanvas* canvas, 5351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org skiatest::Reporter* reporter, 5361cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep) { 5371cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, !canvas->isDrawingToLayer(), 5381cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5391cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->save(); 5401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, !canvas->isDrawingToLayer(), 5411cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5424e6dfa51525e174d79cb88800d8e5f2c88291270junov@chromium.org canvas->restore(); 543d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 5447c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com const SkRect* bounds = NULL; // null means include entire bounds 5457c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com const SkPaint* paint = NULL; 5467c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com 5471cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->saveLayer(bounds, paint); 5481cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas->isDrawingToLayer(), 5491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5501cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->restore(); 5511cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, !canvas->isDrawingToLayer(), 5521cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5531cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 5541cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->saveLayer(bounds, paint); 5551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->saveLayer(bounds, paint); 5561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas->isDrawingToLayer(), 5571cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5581cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->restore(); 5591cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas->isDrawingToLayer(), 5601cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5611cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->restore(); 5627c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com // now layer count should be 0 5631cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, !canvas->isDrawingToLayer(), 5641cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5657c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com} 5661cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgTEST_STEP(DrawLayer, DrawLayerTestStep); 5673b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com 5683b3e895df6f8ee0f33010367c215944cd16a8334reed@google.comstatic void NestedSaveRestoreWithSolidPaintTestStep(SkCanvas* canvas, 56954f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com skiatest::Reporter*, 57054f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com CanvasTestStep*) { 5713b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // This test step challenges the TestDeferredCanvasStateConsistency 5723b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // test cases because the opaque paint can trigger an optimization 5733b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // that discards previously recorded commands. The challenge is to maintain 5743b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // correct clip and matrix stack state. 5753b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->resetMatrix(); 5763b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->rotate(SkIntToScalar(30)); 5773b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->save(); 5783b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->translate(SkIntToScalar(2), SkIntToScalar(1)); 5793b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->save(); 5803b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->scale(SkIntToScalar(3), SkIntToScalar(3)); 5813b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com SkPaint paint; 5823b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com paint.setColor(0xFFFFFFFF); 5833b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->drawPaint(paint); 5843b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->restore(); 5853b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->restore(); 5863b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com} 5873b3e895df6f8ee0f33010367c215944cd16a8334reed@google.comTEST_STEP(NestedSaveRestoreWithSolidPaint, \ 5883b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com NestedSaveRestoreWithSolidPaintTestStep); 5893b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com 5903b3e895df6f8ee0f33010367c215944cd16a8334reed@google.comstatic void NestedSaveRestoreWithFlushTestStep(SkCanvas* canvas, 59154f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com skiatest::Reporter*, 59254f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com CanvasTestStep*) { 5933b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // This test step challenges the TestDeferredCanvasStateConsistency 5943b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // test case because the canvas flush on a deferred canvas will 5953b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // reset the recording session. The challenge is to maintain correct 5963b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com // clip and matrix stack state on the playback canvas. 5973b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->resetMatrix(); 5983b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->rotate(SkIntToScalar(30)); 5993b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->save(); 6003b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->translate(SkIntToScalar(2), SkIntToScalar(1)); 6013b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->save(); 6023b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->scale(SkIntToScalar(3), SkIntToScalar(3)); 6033b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->drawRect(kTestRect,kTestPaint); 6043b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->flush(); 6053b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->restore(); 6063b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas->restore(); 6073b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com} 6083b3e895df6f8ee0f33010367c215944cd16a8334reed@google.comTEST_STEP(NestedSaveRestoreWithFlush, \ 6093b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com NestedSaveRestoreWithFlushTestStep); 61037f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com 6111cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void AssertCanvasStatesEqual(skiatest::Reporter* reporter, 612d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com const SkCanvas* canvas1, 6131cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org const SkCanvas* canvas2, 6141cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep) { 6151cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->getDeviceSize() == 6161cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getDeviceSize(), testStep->assertMessage()); 6171cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->getSaveCount() == 6181cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getSaveCount(), testStep->assertMessage()); 6191cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->isDrawingToLayer() == 6201cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->isDrawingToLayer(), testStep->assertMessage()); 6213b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com 6221cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkRect bounds1, bounds2; 6231cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 6243b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com canvas1->getClipBounds(&bounds1) == canvas2->getClipBounds(&bounds2), 6251cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 6261cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, bounds1 == bounds2, 6273b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com testStep->assertMessage()); 6283b3e895df6f8ee0f33010367c215944cd16a8334reed@google.com 6291cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->getDrawFilter() == 6301cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getDrawFilter(), testStep->assertMessage()); 6311cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkIRect deviceBounds1, deviceBounds2; 6321cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 6331cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas1->getClipDeviceBounds(&deviceBounds1) == 6341cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getClipDeviceBounds(&deviceBounds2), 6351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 6361cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, deviceBounds1 == deviceBounds2, 6371cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 6381cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->getBounder() == 6391cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getBounder(), testStep->assertMessage()); 6401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->getTotalMatrix() == 6411cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getTotalMatrix(), testStep->assertMessage()); 6425c70cdca5efe541b70d010e91607bf8626ea49cacommit-bot@chromium.org REPORTER_ASSERT_MESSAGE(reporter, equal_clips(*canvas1, *canvas2), testStep->assertMessage()); 64337f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com 6441cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // The following test code is commented out because the test fails when 645d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com // the canvas is an SkPictureRecord or SkDeferredCanvas 6461cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Issue: http://code.google.com/p/skia/issues/detail?id=498 6471cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Also, creating a LayerIter on an SkProxyCanvas crashes 6481cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Issue: http://code.google.com/p/skia/issues/detail?id=499 6491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org /* 6501cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas::LayerIter layerIter1(const_cast<SkCanvas*>(canvas1), false); 6511cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas::LayerIter layerIter2(const_cast<SkCanvas*>(canvas2), false); 6521cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org while (!layerIter1.done() && !layerIter2.done()) { 6531cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.matrix() == 6541cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.matrix(), testStep->assertMessage()); 6551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.clip() == 6561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.clip(), testStep->assertMessage()); 6571cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.paint() == 6581cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.paint(), testStep->assertMessage()); 6591cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.x() == 6601cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.x(), testStep->assertMessage()); 6611cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.y() == 6621cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.y(), testStep->assertMessage()); 6631cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter1.next(); 6641cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.next(); 6651cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 6661cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.done(), 6671cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 6681cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter2.done(), 6691cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 6701cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org */ 6711cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 6721cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 6731cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// The following class groups static functions that need to access 6741cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// the privates members of SkPictureRecord 6751cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgclass SkPictureTester { 6761cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgprivate: 677e2589aeebf321f6d3b5005c19740beacee964be7reed@google.com static int EQ(const SkFlatData* a, const SkFlatData* b) { 678e2589aeebf321f6d3b5005c19740beacee964be7reed@google.com return *a == *b; 679e2589aeebf321f6d3b5005c19740beacee964be7reed@google.com } 680e2589aeebf321f6d3b5005c19740beacee964be7reed@google.com 6811cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org static void AssertFlattenedObjectsEqual( 6821cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPictureRecord* referenceRecord, 6831cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPictureRecord* testRecord, 6841cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org skiatest::Reporter* reporter, 6851cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep) { 6861cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 6871cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 688c9ab987efcb7e8b69237d565f73c28c137610232djsollen@google.com referenceRecord->fBitmapHeap->count() == 689c9ab987efcb7e8b69237d565f73c28c137610232djsollen@google.com testRecord->fBitmapHeap->count(), testStep->assertMessage()); 6901cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 6911cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org referenceRecord->fPaints.count() == 6921cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testRecord->fPaints.count(), testStep->assertMessage()); 6931cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org for (int i = 0; i < referenceRecord->fPaints.count(); ++i) { 6941cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 695e2589aeebf321f6d3b5005c19740beacee964be7reed@google.com EQ(referenceRecord->fPaints[i], testRecord->fPaints[i]), 696e2589aeebf321f6d3b5005c19740beacee964be7reed@google.com testStep->assertMessage()); 6971cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 6981cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 6991cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org !referenceRecord->fPathHeap == 7001cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org !testRecord->fPathHeap, 7011cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 702dadcfdc92982498344a15ad38cc213504aebd372junov@chromium.org // The following tests are commented out because they currently 703dadcfdc92982498344a15ad38cc213504aebd372junov@chromium.org // fail. Issue: http://code.google.com/p/skia/issues/detail?id=507 704dadcfdc92982498344a15ad38cc213504aebd372junov@chromium.org /* 7051cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org if (referenceRecord->fPathHeap) { 7061cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 7071cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org referenceRecord->fPathHeap->count() == 7081cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testRecord->fPathHeap->count(), 7091cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 7101cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org for (int i = 0; i < referenceRecord->fPathHeap->count(); ++i) { 7111cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 7121cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org (*referenceRecord->fPathHeap)[i] == 7131cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org (*testRecord->fPathHeap)[i], testStep->assertMessage()); 7141cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 7151cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 716dadcfdc92982498344a15ad38cc213504aebd372junov@chromium.org */ 717d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 7181cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 7191cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 7201cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgpublic: 7211cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 722d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com static void TestPictureFlattenedObjectReuse(skiatest::Reporter* reporter, 7234866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org CanvasTestStep* testStep, 7244866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org uint32_t recordFlags) { 7251cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Verify that when a test step is executed twice, no extra resources 7261cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // are flattened during the second execution 7271cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kPictureDrawAssertMessageFormat); 7281cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPicture referencePicture; 7291cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas* referenceCanvas = referencePicture.beginRecording(kWidth, 7304866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org kHeight, recordFlags); 7311cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->draw(referenceCanvas, reporter); 7321cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPicture testPicture; 733dadcfdc92982498344a15ad38cc213504aebd372junov@chromium.org SkCanvas* testCanvas = testPicture.beginRecording(kWidth, 7344866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org kHeight, recordFlags); 735dadcfdc92982498344a15ad38cc213504aebd372junov@chromium.org testStep->draw(testCanvas, reporter); 7361cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kPictureSecondDrawAssertMessageFormat); 737dadcfdc92982498344a15ad38cc213504aebd372junov@chromium.org testStep->draw(testCanvas, reporter); 7381cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 7391cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPictureRecord* referenceRecord = static_cast<SkPictureRecord*>( 7401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org referenceCanvas); 7411cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPictureRecord* testRecord = static_cast<SkPictureRecord*>( 7421cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testCanvas); 7431cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kPictureResourceReuseMessageFormat); 7441cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org AssertFlattenedObjectsEqual(referenceRecord, testRecord, 74576b9c4b71b8498d59cd6879f8fcdca4b9ffc4bd0junov@chromium.org reporter, testStep); 7461cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 7471cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org}; 7481cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 7497790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.comstatic void TestPdfDevice(skiatest::Reporter* reporter, 7507790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com CanvasTestStep* testStep) { 7517790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com SkISize pageSize = SkISize::Make(kWidth, kHeight); 7527790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com SkPDFDevice device(pageSize, pageSize, SkMatrix::I()); 7537790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com SkCanvas canvas(&device); 7547790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com testStep->setAssertMessageFormat(kPdfAssertMessageFormat); 7557790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com testStep->draw(&canvas, reporter); 7567790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com SkPDFDocument doc; 7577790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com doc.appendPage(&device); 7587790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com SkDynamicMemoryWStream stream; 7597790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com doc.emitPDF(&stream); 7607790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com} 7617790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com 76288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org// The following class groups static functions that need to access 76388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org// the privates members of SkDeferredCanvas 76488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgclass SkDeferredCanvasTester { 76588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgpublic: 76688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org static void TestDeferredCanvasStateConsistency( 76788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org skiatest::Reporter* reporter, 76888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org CanvasTestStep* testStep, 769fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org const SkCanvas& referenceCanvas, bool silent) { 77088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 77128183b4043a969df12592e8dd47cf95b80755284reed@google.com SkAutoTUnref<SkSurface> surface(createSurface(0xFFFFFFFF)); 77228183b4043a969df12592e8dd47cf95b80755284reed@google.com SkAutoTUnref<SkDeferredCanvas> deferredCanvas(SkDeferredCanvas::Create(surface.get())); 77328183b4043a969df12592e8dd47cf95b80755284reed@google.com 77488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org testStep->setAssertMessageFormat(kDeferredDrawAssertMessageFormat); 77566070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org testStep->draw(deferredCanvas, reporter); 77688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org testStep->setAssertMessageFormat(kDeferredPreFlushAssertMessageFormat); 77766070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org AssertCanvasStatesEqual(reporter, deferredCanvas, &referenceCanvas, 77888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org testStep); 77988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 780fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org if (silent) { 78166070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org deferredCanvas->silentFlush(); 782fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } else { 78366070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org deferredCanvas->flush(); 784fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 785fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org 7864c5ea4480341f0f663b51e9d78b948bc0a785f4dskia.committer@gmail.com testStep->setAssertMessageFormat( 787fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org silent ? kDeferredPostSilentFlushPlaybackAssertMessageFormat : 78888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org kDeferredPostFlushPlaybackAssertMessageFormat); 789d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com AssertCanvasStatesEqual(reporter, 79066070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org deferredCanvas->immediateCanvas(), 79188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org &referenceCanvas, testStep); 79288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 79388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // Verified that deferred canvas state is not affected by flushing 79488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // pending draw operations 79588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 79688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // The following test code is commented out because it currently fails. 79788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // Issue: http://code.google.com/p/skia/issues/detail?id=496 79888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org /* 79988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org testStep->setAssertMessageFormat(kDeferredPostFlushAssertMessageFormat); 80088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org AssertCanvasStatesEqual(reporter, &deferredCanvas, &referenceCanvas, 80188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org testStep); 80288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org */ 80388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org } 80488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}; 8051cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 80642639cddc33746b351bbf07c540711eefffe191acaryclark@google.com// unused 8071cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void TestProxyCanvasStateConsistency( 8081cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org skiatest::Reporter* reporter, 8091cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep, 8101cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org const SkCanvas& referenceCanvas) { 8111cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 8121cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkBitmap indirectStore; 813fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org createBitmap(&indirectStore, 0xFFFFFFFF); 8141f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com SkBitmapDevice indirectDevice(indirectStore); 8151cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas indirectCanvas(&indirectDevice); 8161cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkProxyCanvas proxyCanvas(&indirectCanvas); 8171cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kProxyDrawAssertMessageFormat); 8181cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->draw(&proxyCanvas, reporter); 8191cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Verify that the SkProxyCanvas reports consitent state 8201cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kProxyStateAssertMessageFormat); 8211cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org AssertCanvasStatesEqual(reporter, &proxyCanvas, &referenceCanvas, 8221cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep); 8231cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Verify that the indirect canvas reports consitent state 8241cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kProxyIndirectStateAssertMessageFormat); 8251cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org AssertCanvasStatesEqual(reporter, &indirectCanvas, &referenceCanvas, 8261cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep); 8271cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 8281cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 82942639cddc33746b351bbf07c540711eefffe191acaryclark@google.com// unused 8301cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void TestNWayCanvasStateConsistency( 8311cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org skiatest::Reporter* reporter, 8321cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep, 8331cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org const SkCanvas& referenceCanvas) { 8341cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 8351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkBitmap indirectStore1; 836fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org createBitmap(&indirectStore1, 0xFFFFFFFF); 8371f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com SkBitmapDevice indirectDevice1(indirectStore1); 8381cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas indirectCanvas1(&indirectDevice1); 8391cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 8401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkBitmap indirectStore2; 841fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org createBitmap(&indirectStore2, 0xFFFFFFFF); 8421f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com SkBitmapDevice indirectDevice2(indirectStore2); 8431cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas indirectCanvas2(&indirectDevice2); 8441cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 845f0a062bc4573323abcf37394bb68e0230347a974djsollen@google.com SkISize canvasSize = referenceCanvas.getDeviceSize(); 846f0a062bc4573323abcf37394bb68e0230347a974djsollen@google.com SkNWayCanvas nWayCanvas(canvasSize.width(), canvasSize.height()); 8471cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org nWayCanvas.addCanvas(&indirectCanvas1); 8481cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org nWayCanvas.addCanvas(&indirectCanvas2); 8491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 8501cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kNWayDrawAssertMessageFormat); 8511cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->draw(&nWayCanvas, reporter); 8521cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Verify that the SkProxyCanvas reports consitent state 8531cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kNWayStateAssertMessageFormat); 8541cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org AssertCanvasStatesEqual(reporter, &nWayCanvas, &referenceCanvas, 8551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep); 8561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Verify that the indirect canvases report consitent state 8571cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kNWayIndirect1StateAssertMessageFormat); 8581cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org AssertCanvasStatesEqual(reporter, &indirectCanvas1, &referenceCanvas, 8591cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep); 8601cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kNWayIndirect2StateAssertMessageFormat); 8611cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org AssertCanvasStatesEqual(reporter, &indirectCanvas2, &referenceCanvas, 8621cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep); 8631cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 8641cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 8651cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org/* 8661cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * This sub-test verifies that the test step passes when executed 8671cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * with SkCanvas and with classes derrived from SkCanvas. It also verifies 8681cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * that the all canvas derivatives report the same state as an SkCanvas 8691cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * after having executed the test step. 8701cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org */ 871d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic void TestOverrideStateConsistency(skiatest::Reporter* reporter, 8721cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep) { 8731cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkBitmap referenceStore; 874fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org createBitmap(&referenceStore, 0xFFFFFFFF); 8751f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com SkBitmapDevice referenceDevice(referenceStore); 8761cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas referenceCanvas(&referenceDevice); 8771cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kCanvasDrawAssertMessageFormat); 8781cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->draw(&referenceCanvas, reporter); 8791cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 880fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org SkDeferredCanvasTester::TestDeferredCanvasStateConsistency(reporter, testStep, referenceCanvas, false); 881fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org 882fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org SkDeferredCanvasTester::TestDeferredCanvasStateConsistency(reporter, testStep, referenceCanvas, true); 8831cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 88442639cddc33746b351bbf07c540711eefffe191acaryclark@google.com // The following test code is disabled because SkProxyCanvas is 8851cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // missing a lot of virtual overrides on get* methods, which are used 8861cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // to verify canvas state. 8871cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Issue: http://code.google.com/p/skia/issues/detail?id=500 8881cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 88942639cddc33746b351bbf07c540711eefffe191acaryclark@google.com if (false) { // avoid bit rot, suppress warning 89042639cddc33746b351bbf07c540711eefffe191acaryclark@google.com TestProxyCanvasStateConsistency(reporter, testStep, referenceCanvas); 89142639cddc33746b351bbf07c540711eefffe191acaryclark@google.com } 89242639cddc33746b351bbf07c540711eefffe191acaryclark@google.com 89342639cddc33746b351bbf07c540711eefffe191acaryclark@google.com // The following test code is disabled because SkNWayCanvas does not 8941cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // report correct clipping and device bounds information 8951cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Issue: http://code.google.com/p/skia/issues/detail?id=501 89642639cddc33746b351bbf07c540711eefffe191acaryclark@google.com 89742639cddc33746b351bbf07c540711eefffe191acaryclark@google.com if (false) { // avoid bit rot, suppress warning 89842639cddc33746b351bbf07c540711eefffe191acaryclark@google.com TestNWayCanvasStateConsistency(reporter, testStep, referenceCanvas); 89942639cddc33746b351bbf07c540711eefffe191acaryclark@google.com } 900d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 90142639cddc33746b351bbf07c540711eefffe191acaryclark@google.com if (false) { // avoid bit rot, suppress warning 90242639cddc33746b351bbf07c540711eefffe191acaryclark@google.com test_clipVisitor(reporter, &referenceCanvas); 90342639cddc33746b351bbf07c540711eefffe191acaryclark@google.com } 9041cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 9051cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 9063107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.orgstatic void test_newraster(skiatest::Reporter* reporter) { 9073107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org SkImageInfo info = SkImageInfo::MakeN32Premul(10, 10); 9083107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org SkCanvas* canvas = SkCanvas::NewRaster(info); 9093107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, canvas); 9103107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org 9113107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org SkImageInfo info2; 9123107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org size_t rowBytes; 9133107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org const SkPMColor* addr = (const SkPMColor*)canvas->peekPixels(&info2, &rowBytes); 9143107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, addr); 9153107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, info == info2); 9163107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org for (int y = 0; y < info.height(); ++y) { 9173107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org for (int x = 0; x < info.width(); ++x) { 9183107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, 0 == addr[x]); 9193107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org } 9203107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org addr = (const SkPMColor*)((const char*)addr + rowBytes); 9213107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org } 9223107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org SkDELETE(canvas); 9233107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org 9243107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org // now try a deliberately bad info 9253107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org info.fWidth = -1; 9263107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, NULL == SkCanvas::NewRaster(info)); 9273107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org 9283107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org // too big 9293107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org info.fWidth = 1 << 30; 9303107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org info.fHeight = 1 << 30; 9313107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, NULL == SkCanvas::NewRaster(info)); 9320e530754d36d942f6408c65cc93ba0a8ccd93610skia.committer@gmail.com 9333107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org // not a valid pixel type 9343107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org info.fWidth = info.fHeight = 10; 9353107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org info.fColorType = kUnknown_SkColorType; 9363107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, NULL == SkCanvas::NewRaster(info)); 9373107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org 9383107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org // We should succeed with a zero-sized valid info 9393107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org info = SkImageInfo::MakeN32Premul(0, 0); 9403107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org canvas = SkCanvas::NewRaster(info); 9413107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org REPORTER_ASSERT(reporter, canvas); 9423107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org SkDELETE(canvas); 9433107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org} 9443107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org 945e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(Canvas, reporter) { 9461cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Init global here because bitmap pixels cannot be alocated during 9471cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // static initialization 9481cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kTestBitmap = testBitmap(); 9497c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com 9501cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org for (int testStep = 0; testStep < testStepArray().count(); testStep++) { 9511cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org TestOverrideStateConsistency(reporter, testStepArray()[testStep]); 9524866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org SkPictureTester::TestPictureFlattenedObjectReuse(reporter, 9534866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org testStepArray()[testStep], 0); 9547790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com if (testStepArray()[testStep]->enablePdfTesting()) { 9557790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com TestPdfDevice(reporter, testStepArray()[testStep]); 9567790912e6e8a64fc9161e0df26d76e695aa9f05cedisonn@google.com } 9571cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 958cd62ecf39a81d9d85a7eb8508e14ce2834899e88junov@chromium.org 959cd62ecf39a81d9d85a7eb8508e14ce2834899e88junov@chromium.org // Explicitly call reset(), so we don't leak the pixels (since kTestBitmap is a global) 960cd62ecf39a81d9d85a7eb8508e14ce2834899e88junov@chromium.org kTestBitmap.reset(); 9613107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org 9623107b6a85eee7914b37382f7145ab658e8c27667commit-bot@chromium.org test_newraster(reporter); 96337f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com} 964