CanvasTest.cpp revision 977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9
137f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com 237f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com/* 31cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * Copyright 2012 Google Inc. 437f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com * 537f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com * Use of this source code is governed by a BSD-style license that can be 637f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com * found in the LICENSE file. 737f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com */ 81cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 91cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org/* Description: 101cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * This test defines a series of elementatry test steps that perform 111cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * a single or a small group of canvas API calls. Each test step is 121cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * used in several test cases that verify that different types of SkCanvas 131cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * flavors and derivatives pass it and yield consistent behavior. The 141cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * test cases analyse results that are queryable through the API. They do 151cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * not look at rendering results. 161cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * 171cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * Adding test stepss: 181cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * The general pattern for creating a new test step is to write a test 191cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * function of the form: 201cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * 211cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * static void MyTestStepFunction(SkCanvas* canvas, 221cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * skiatest::Reporter* reporter, 231cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * CanvasTestStep* testStep) 241cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * { 251cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * canvas->someCanvasAPImethod(); 261cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * (...) 271cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * REPORTER_ASSERT_MESSAGE(reporter, (...), \ 281cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * testStep->assertMessage()); 291cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * } 301cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * 311cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * The definition of the test step function should be followed by an 321cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * invocation of the TEST_STEP macro, which generates a class and 331cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * instance for the test step: 341cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * 351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * TEST_STEP(MyTestStep, MyTestStepFunction) 361cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * 371cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * There are also short hand macros for defining simple test steps 381cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * in a single line of code. A simple test step is a one that is made 391cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * of a single canvas API call. 401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * 411cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * SIMPLE_TEST_STEP(MytestStep, someCanvasAPIMethod()); 421cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * 431cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * There is another macro called SIMPLE_TEST_STEP_WITH_ASSERT that 441cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * works the same way as SIMPLE_TEST_STEP, and additionally verifies 451cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * that the invoked method returns a non-zero value. 461cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org */ 4737f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com#include "SkBitmap.h" 4837f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com#include "SkCanvas.h" 491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkDeferredCanvas.h" 501cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkDevice.h" 511cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkMatrix.h" 521cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkNWayCanvas.h" 531cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkPaint.h" 541cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkPath.h" 551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkPicture.h" 561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkPictureRecord.h" 571cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkProxyCanvas.h" 581cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkRect.h" 591cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkRegion.h" 601cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkShader.h" 611cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkStream.h" 621cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "SkTDArray.h" 631cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#include "Test.h" 6437f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com 6590c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.comclass Canvas2CanvasClipVisitor : public SkCanvas::ClipVisitor { 6690c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.compublic: 6790c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com Canvas2CanvasClipVisitor(SkCanvas* target) : fTarget(target) {} 6890c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 6990c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com virtual void clipRect(const SkRect& r, SkRegion::Op op, bool aa) { 7090c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com fTarget->clipRect(r, op, aa); 7190c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com } 7290c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com virtual void clipPath(const SkPath& p, SkRegion::Op op, bool aa) { 7390c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com fTarget->clipPath(p, op, aa); 7490c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com } 7590c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 7690c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.comprivate: 7790c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com SkCanvas* fTarget; 7890c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com}; 7990c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 8090c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.comstatic void test_clipVisitor(skiatest::Reporter* reporter, SkCanvas* canvas) { 8190c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com SkISize size = canvas->getDeviceSize(); 8290c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 8390c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com SkBitmap bm; 8490c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com bm.setConfig(SkBitmap::kARGB_8888_Config, size.width(), size.height()); 8590c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com SkCanvas c(bm); 8690c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 8790c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com Canvas2CanvasClipVisitor visitor(&c); 8890c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com canvas->replayClips(&visitor); 8990c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 9090c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com REPORTER_ASSERT(reporter, c.getTotalClip() == canvas->getTotalClip()); 9190c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com} 9290c07ea1d0aa6b7f20252c43fe23ee5ddc1d23cbreed@google.com 931cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const int kWidth = 2; 941cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const int kHeight = 2; 951cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// Maximum stream length for picture serialization 961cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const size_t kMaxPictureBufferSize = 1024; 971cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 981cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// Format strings that describe the test context. The %s token is where 991cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// the name of the test step is inserted. The context is required for 1001cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// disambiguating the error in the case of failures that are reported in 1011cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// functions that are called multiple times in different contexts (test 1021cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// cases and test steps). 1031cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kDefaultAssertMessageFormat = "%s"; 1041cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kCanvasDrawAssertMessageFormat = 1051cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "Drawing test step %s with SkCanvas"; 1061cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kPictureDrawAssertMessageFormat = 1071cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "Drawing test step %s with SkPicture"; 1081cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kPictureSecondDrawAssertMessageFormat = 1091cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "Duplicate draw of test step %s with SkPicture"; 1101cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kPictureReDrawAssertMessageFormat = 1111cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "Playing back test step %s from an SkPicture to another SkPicture"; 1121cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kDeferredDrawAssertMessageFormat = 1131cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "Drawing test step %s with SkDeferredCanvas"; 1141cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kProxyDrawAssertMessageFormat = 1151cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "Drawing test step %s with SkProxyCanvas"; 1161cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kNWayDrawAssertMessageFormat = 1171cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "Drawing test step %s with SkNWayCanvas"; 1181cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kRoundTripAssertMessageFormat = 1191cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkPicture consistency after round trip"; 1201cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kPictureRecoringAssertMessageFormat = 1211cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkPicture state consistency after recording"; 1221cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kPicturePlaybackAssertMessageFormat = 1231cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkPicture state consistency in playback canvas"; 1241cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kDeferredPreFlushAssertMessageFormat = 1251cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkDeferredCanvas state consistency before flush"; 1261cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kDeferredPostFlushAssertMessageFormat = 1271cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkDeferredCanvas state consistency after flush"; 1281cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kPictureResourceReuseMessageFormat = 1291cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkPicture duplicate flattened object test"; 1301cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kProxyStateAssertMessageFormat = 1311cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkProxyCanvas state consistency"; 1321cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kProxyIndirectStateAssertMessageFormat = 1331cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkProxyCanvas indirect canvas state consistency"; 1341cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kNWayStateAssertMessageFormat = 1351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkNWayCanvas state consistency"; 1361cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kNWayIndirect1StateAssertMessageFormat = 1371cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkNWayCanvas indirect canvas 1 state consistency"; 1381cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic const char* const kNWayIndirect2StateAssertMessageFormat = 1391cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org "test step %s, SkNWayCanvas indirect canvas 2 state consistency"; 1401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 1411cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void createBitmap(SkBitmap* bm, SkBitmap::Config config, SkColor color) { 1421cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org bm->setConfig(config, kWidth, kHeight); 1431cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org bm->allocPixels(); 1441cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org bm->eraseColor(color); 1451cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 1461cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 1471cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgclass CanvasTestStep; 1481cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic SkTDArray<CanvasTestStep*>& testStepArray() { 1491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org static SkTDArray<CanvasTestStep*> theTests; 1501cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org return theTests; 1511cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 1521cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 1531cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgclass CanvasTestStep { 1541cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgpublic: 1551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep() { 1561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org *testStepArray().append() = this; 1571cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org fAssertMessageFormat = kDefaultAssertMessageFormat; 1581cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 159e63793a2c8d2871bf7d95195be7b93ff669688d7djsollen@google.com virtual ~CanvasTestStep() { } 1601cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 1611cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org virtual void draw(SkCanvas*, skiatest::Reporter*) = 0; 1621cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org virtual const char* name() const = 0; 1631cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 1641cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org const char* assertMessage() { 1651cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org fAssertMessage.printf(fAssertMessageFormat, name()); 1661cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org return fAssertMessage.c_str(); 1671cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 1681cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 1691cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org void setAssertMessageFormat(const char* format) { 1701cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org fAssertMessageFormat = format; 1711cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 1721cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 1731cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgprivate: 1741cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkString fAssertMessage; 1751cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org const char* fAssertMessageFormat; 1761cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org}; 1771cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 1781cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org/////////////////////////////////////////////////////////////////////////////// 1791cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// Constants used by test steps 1801cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 1811cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgconst SkRect kTestRect = 1821cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkRect::MakeXYWH(SkIntToScalar(0), SkIntToScalar(0), 1831cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkIntToScalar(2), SkIntToScalar(1)); 1841cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic SkMatrix testMatrix() { 1851cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkMatrix matrix; 1861cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org matrix.reset(); 1871cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org matrix.setScale(SkIntToScalar(2), SkIntToScalar(3)); 1881cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org return matrix; 1891cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 1901cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgconst SkMatrix kTestMatrix = testMatrix(); 1911cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic SkPath testPath() { 1921cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPath path; 1931cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org path.addRect(SkRect::MakeXYWH(SkIntToScalar(0), SkIntToScalar(0), 1941cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkIntToScalar(2), SkIntToScalar(1))); 1951cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org return path; 1961cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 1971cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgconst SkPath kTestPath = testPath(); 1981cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic SkRegion testRegion() { 1991cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkRegion region; 2001cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkIRect rect = SkIRect::MakeXYWH(0, 0, 2, 1); 2011cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org region.setRect(rect); 2021cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org return region; 2031cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 2041cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgconst SkIRect kTestIRect = SkIRect::MakeXYWH(0, 0, 2, 1); 2051cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgconst SkRegion kTestRegion = testRegion(); 2061cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgconst SkColor kTestColor = 0x01020304; 2071cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgconst SkPaint kTestPaint; 2081cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgconst SkPoint kTestPoints[3] = { 2091cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org {SkIntToScalar(0), SkIntToScalar(0)}, 2101cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org {SkIntToScalar(2), SkIntToScalar(1)}, 2111cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org {SkIntToScalar(0), SkIntToScalar(2)} 2121cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org}; 2131cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgconst size_t kTestPointCount = 3; 2141cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic SkBitmap testBitmap() { 2151cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkBitmap bitmap; 2161cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org createBitmap(&bitmap, SkBitmap::kARGB_8888_Config, 0x05060708); 2171cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org return bitmap; 2181cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 2191cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSkBitmap kTestBitmap; // cannot be created during static init 2201cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSkString kTestText("Hello World"); 221977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.comSkPoint kTestPoints2[] = { 222977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(0), SkIntToScalar(1) }, 223977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(1), SkIntToScalar(1) }, 224977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(2), SkIntToScalar(1) }, 225977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(3), SkIntToScalar(1) }, 226977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(4), SkIntToScalar(1) }, 227977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(5), SkIntToScalar(1) }, 228977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(6), SkIntToScalar(1) }, 229977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(7), SkIntToScalar(1) }, 230977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(8), SkIntToScalar(1) }, 231977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(9), SkIntToScalar(1) }, 232977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com { SkIntToScalar(10), SkIntToScalar(1) }, 233977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com}; 234977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com 2351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2361cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org/////////////////////////////////////////////////////////////////////////////// 2371cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// Macros for defining test steps 2381cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2391cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#define TEST_STEP(NAME, FUNCTION) \ 2401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgclass NAME##_TestStep : public CanvasTestStep{ \ 2411cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgpublic: \ 2421cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org virtual void draw(SkCanvas* canvas, skiatest::Reporter* reporter) { \ 2431cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org FUNCTION (canvas, reporter, this); \ 2441cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } \ 2451cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org virtual const char* name() const {return #NAME ;} \ 2461cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org}; \ 2471cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic NAME##_TestStep NAME##_TestStepInstance; 2481cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#define SIMPLE_TEST_STEP(NAME, CALL) \ 2501cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void NAME##TestStep(SkCanvas* canvas, skiatest::Reporter*, \ 2511cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep*) { \ 2521cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas-> CALL ; \ 2531cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} \ 2541cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgTEST_STEP(NAME, NAME##TestStep ) 2551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org#define SIMPLE_TEST_STEP_WITH_ASSERT(NAME, CALL) \ 2571cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void NAME##TestStep(SkCanvas* canvas, skiatest::Reporter* reporter, \ 2581cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep) { \ 2591cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas-> CALL , \ 2601cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); \ 2611cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} \ 2621cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgTEST_STEP(NAME, NAME##TestStep ) 2631cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2641cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 2651cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org/////////////////////////////////////////////////////////////////////////////// 2661cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// Basic test steps for most virtual methods in SkCanvas that draw or affect 2671cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// the state of the canvas. 2681cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 269a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP(SaveMatrix, save(SkCanvas::kMatrix_SaveFlag)); 270a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP(SaveClip, save(SkCanvas::kClip_SaveFlag)); 271a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP(SaveMatrixClip, save(SkCanvas::kMatrixClip_SaveFlag)); 272a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP(SaveLayer, saveLayer(NULL, NULL)); 273a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP(BoundedSaveLayer, saveLayer(&kTestRect, NULL)); 274a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP(PaintSaveLayer, saveLayer(NULL, &kTestPaint)); 275a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP_WITH_ASSERT(Translate, 276a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.org translate(SkIntToScalar(1), SkIntToScalar(2))); 277a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP_WITH_ASSERT(Scale, 278a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.org scale(SkIntToScalar(1), SkIntToScalar(2))); 279a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP_WITH_ASSERT(Rotate, rotate(SkIntToScalar(1))); 280a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP_WITH_ASSERT(Skew, 281a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.org skew(SkIntToScalar(1), SkIntToScalar(2))); 282a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP_WITH_ASSERT(Concat, concat(kTestMatrix)); 283a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP(SetMatrix, setMatrix(kTestMatrix)); 284a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP_WITH_ASSERT(ClipRect, clipRect(kTestRect)); 285a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP_WITH_ASSERT(ClipPath, clipPath(kTestPath)); 286a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.orgSIMPLE_TEST_STEP_WITH_ASSERT(ClipRegion, 287a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.org clipRegion(kTestRegion, SkRegion::kReplace_Op)); 2881cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(Clear, clear(kTestColor)); 2891cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawPaint, drawPaint(kTestPaint)); 2901cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawPointsPoints, drawPoints(SkCanvas::kPoints_PointMode, 2911cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kTestPointCount, kTestPoints, kTestPaint)); 2921cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawPointsLiness, drawPoints(SkCanvas::kLines_PointMode, 2931cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kTestPointCount, kTestPoints, kTestPaint)); 2941cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawPointsPolygon, drawPoints(SkCanvas::kPolygon_PointMode, 2951cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kTestPointCount, kTestPoints, kTestPaint)); 2961cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawRect, drawRect(kTestRect, kTestPaint)); 2971cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawPath, drawPath(kTestPath, kTestPaint)); 29887f982c80833eeebf541becec8e27b96c8c889f7junov@chromium.orgSIMPLE_TEST_STEP(DrawBitmap, drawBitmap(kTestBitmap, 0, 0)); 2991cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawBitmapPaint, drawBitmap(kTestBitmap, 0, 0, &kTestPaint)); 3001cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawBitmapRect, drawBitmapRect(kTestBitmap, NULL, kTestRect, 3011cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org NULL)); 3021cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawBitmapRectSrcRect, drawBitmapRect(kTestBitmap, 3031cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org &kTestIRect, kTestRect, NULL)); 3041cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawBitmapRectPaint, drawBitmapRect(kTestBitmap, NULL, 3051cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kTestRect, &kTestPaint)); 3061cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawBitmapMatrix, drawBitmapMatrix(kTestBitmap, kTestMatrix, 3071cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org NULL)); 3081cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawBitmapMatrixPaint, drawBitmapMatrix(kTestBitmap, 3091cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kTestMatrix, &kTestPaint)); 3101cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawBitmapNine, drawBitmapNine(kTestBitmap, kTestIRect, 3111cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kTestRect, NULL)); 3121cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawBitmapNinePaint, drawBitmapNine(kTestBitmap, kTestIRect, 3131cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kTestRect, &kTestPaint)); 31487f982c80833eeebf541becec8e27b96c8c889f7junov@chromium.orgSIMPLE_TEST_STEP(DrawSprite, drawSprite(kTestBitmap, 0, 0, NULL)); 3151cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawSpritePaint, drawSprite(kTestBitmap, 0, 0, &kTestPaint)); 3161cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawText, drawText(kTestText.c_str(), kTestText.size(), 3171cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 0, 1, kTestPaint)); 3181cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawPosText, drawPosText(kTestText.c_str(), 319977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com kTestText.size(), kTestPoints2, kTestPaint)); 3201cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawTextOnPath, drawTextOnPath(kTestText.c_str(), 3211cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kTestText.size(), kTestPath, NULL, kTestPaint)); 3221cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawTextOnPathMatrix, drawTextOnPath(kTestText.c_str(), 3231cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kTestText.size(), kTestPath, &kTestMatrix, kTestPaint)); 3241cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(SetExternalMatrix, setExternalMatrix(&kTestMatrix)); 3251cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgSIMPLE_TEST_STEP(DrawData, drawData(kTestText.c_str(), kTestText.size())); 3261cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 3271cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org/////////////////////////////////////////////////////////////////////////////// 3281cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// Complex test steps 3291cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 33094fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com// exercise fix for http://code.google.com/p/skia/issues/detail?id=560 33194fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com// ('SkPathStroker::lineTo() fails for line with length SK_ScalarNearlyZero') 33294fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.comstatic void DrawNearlyZeroLengthPathTestStep(SkCanvas* canvas, 33394fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com skiatest::Reporter* reporter, 33494fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com CanvasTestStep* testStep) { 33594fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com SkPaint paint; 33694fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com paint.setStrokeWidth(SkIntToScalar(1)); 33794fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com paint.setStyle(SkPaint::kStroke_Style); 33894fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com 33994fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com SkPath path; 34094fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com SkPoint pt1 = { 0, 0 }; 34194fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com SkPoint pt2 = { 0, SK_ScalarNearlyZero }; 34294fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com SkPoint pt3 = { SkIntToScalar(1), 0 }; 34394fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com SkPoint pt4 = { SkIntToScalar(1), SK_ScalarNearlyZero/2 }; 34494fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com path.moveTo(pt1); 34594fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com path.lineTo(pt2); 34694fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com path.lineTo(pt3); 34794fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com path.lineTo(pt4); 34894fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com 34994fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com canvas->drawPath(path, paint); 35094fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com} 35194fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.comTEST_STEP(DrawNearlyZeroLengthPath, DrawNearlyZeroLengthPathTestStep); 35294fa43c6255906660c2ff001fb462b6492cbdc07epoger@google.com 3531cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void DrawVerticesShaderTestStep(SkCanvas* canvas, 3541cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org skiatest::Reporter* reporter, 3551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep) { 3561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPoint pts[4]; 3571cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org pts[0].set(0, 0); 3581cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org pts[1].set(SkIntToScalar(kWidth), 0); 3591cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org pts[2].set(SkIntToScalar(kWidth), SkIntToScalar(kHeight)); 3601cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org pts[3].set(0, SkIntToScalar(kHeight)); 3611cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPaint paint; 3621cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkShader* shader = SkShader::CreateBitmapShader(kTestBitmap, 3631cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkShader::kClamp_TileMode, SkShader::kClamp_TileMode); 3641cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org paint.setShader(shader)->unref(); 3651cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->drawVertices(SkCanvas::kTriangleFan_VertexMode, 4, pts, pts, 3661cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org NULL, NULL, NULL, 0, paint); 3671cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 3681cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgTEST_STEP(DrawVerticesShader, DrawVerticesShaderTestStep); 3691cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 3701cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void DrawPictureTestStep(SkCanvas* canvas, 3711cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org skiatest::Reporter* reporter, 3721cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep) { 3731cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPicture* testPicture = SkNEW_ARGS(SkPicture, ()); 3741cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkAutoUnref aup(testPicture); 3751cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas* testCanvas = testPicture->beginRecording(kWidth, kHeight); 3761cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testCanvas->scale(SkIntToScalar(2), SkIntToScalar(1)); 3771cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testCanvas->clipRect(kTestRect); 3781cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testCanvas->drawRect(kTestRect, kTestPaint); 3791cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->drawPicture(*testPicture); 3801cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 3811cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgTEST_STEP(DrawPicture, DrawPictureTestStep); 3821cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 3831cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void SaveRestoreTestStep(SkCanvas* canvas, 3841cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org skiatest::Reporter* reporter, 3851cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep) { 3861cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 1 == canvas->getSaveCount(), 3871cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 3881cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org size_t n = canvas->save(); 3891cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 1 == n, testStep->assertMessage()); 3901cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 2 == canvas->getSaveCount(), 3911cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 3921cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->save(); 3931cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->save(); 3941cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 4 == canvas->getSaveCount(), 3951cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 3961cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->restoreToCount(2); 3971cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 2 == canvas->getSaveCount(), 3981cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 3991cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 4001cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // should this pin to 1, or be a no-op, or crash? 4011cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->restoreToCount(0); 4021cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 1 == canvas->getSaveCount(), 4031cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4041cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 4051cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgTEST_STEP(SaveRestore, SaveRestoreTestStep); 4067c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com 4071cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void DrawLayerTestStep(SkCanvas* canvas, 4081cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org skiatest::Reporter* reporter, 4091cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep) { 4101cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, !canvas->isDrawingToLayer(), 4111cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4121cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->save(); 4131cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, !canvas->isDrawingToLayer(), 4141cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4157c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com 4167c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com const SkRect* bounds = NULL; // null means include entire bounds 4177c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com const SkPaint* paint = NULL; 4187c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com 4191cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->saveLayer(bounds, paint); 4201cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas->isDrawingToLayer(), 4211cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4221cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->restore(); 4231cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, !canvas->isDrawingToLayer(), 4241cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4251cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 4261cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->saveLayer(bounds, paint); 4271cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->saveLayer(bounds, paint); 4281cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas->isDrawingToLayer(), 4291cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4301cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->restore(); 4311cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas->isDrawingToLayer(), 4321cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4331cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas->restore(); 4347c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com // now layer count should be 0 4351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, !canvas->isDrawingToLayer(), 4361cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4377c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com} 4381cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgTEST_STEP(DrawLayer, DrawLayerTestStep); 43937f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com 4401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void AssertCanvasStatesEqual(skiatest::Reporter* reporter, 4411cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org const SkCanvas* canvas1, 4421cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org const SkCanvas* canvas2, 4431cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep) { 4441cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->getDeviceSize() == 4451cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getDeviceSize(), testStep->assertMessage()); 4461cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->getSaveCount() == 4471cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getSaveCount(), testStep->assertMessage()); 4481cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->isDrawingToLayer() == 4491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->isDrawingToLayer(), testStep->assertMessage()); 4501cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkRect bounds1, bounds2; 4511cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 4521cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas1->getClipBounds(&bounds1, SkCanvas::kAA_EdgeType) == 4531cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getClipBounds(&bounds2, SkCanvas::kAA_EdgeType), 4541cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, bounds1 == bounds2, 4561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4571cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 4581cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas1->getClipBounds(&bounds1, SkCanvas::kBW_EdgeType) == 4591cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getClipBounds(&bounds2, SkCanvas::kBW_EdgeType), 4601cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4611cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, bounds1 == bounds2, 4621cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4631cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->getDrawFilter() == 4641cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getDrawFilter(), testStep->assertMessage()); 4651cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkIRect deviceBounds1, deviceBounds2; 4661cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 4671cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas1->getClipDeviceBounds(&deviceBounds1) == 4681cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getClipDeviceBounds(&deviceBounds2), 4691cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4701cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, deviceBounds1 == deviceBounds2, 4711cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 4721cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->getBounder() == 4731cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getBounder(), testStep->assertMessage()); 4741cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->getTotalMatrix() == 4751cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getTotalMatrix(), testStep->assertMessage()); 4761cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->getClipType() == 4771cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getClipType(), testStep->assertMessage()); 4781cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, canvas1->getTotalClip() == 4791cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org canvas2->getTotalClip(), testStep->assertMessage()); 48037f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com 4811cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // The following test code is commented out because the test fails when 4821cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // the canvas is an SkPictureRecord or SkDeferredCanvas 4831cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Issue: http://code.google.com/p/skia/issues/detail?id=498 4841cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Also, creating a LayerIter on an SkProxyCanvas crashes 4851cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Issue: http://code.google.com/p/skia/issues/detail?id=499 4861cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org /* 4871cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas::LayerIter layerIter1(const_cast<SkCanvas*>(canvas1), false); 4881cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas::LayerIter layerIter2(const_cast<SkCanvas*>(canvas2), false); 4891cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org while (!layerIter1.done() && !layerIter2.done()) { 4901cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.matrix() == 4911cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.matrix(), testStep->assertMessage()); 4921cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.clip() == 4931cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.clip(), testStep->assertMessage()); 4941cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.paint() == 4951cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.paint(), testStep->assertMessage()); 4961cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.x() == 4971cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.x(), testStep->assertMessage()); 4981cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.y() == 4991cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.y(), testStep->assertMessage()); 5001cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter1.next(); 5011cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org layerIter2.next(); 5021cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 5031cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter1.done(), 5041cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5051cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, layerIter2.done(), 5061cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5071cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org */ 5081cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 5091cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 5101cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// The following class groups static functions that need to access 5111cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org// the privates members of SkPictureRecord 5121cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgclass SkPictureTester { 5131cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgprivate: 5141cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org static void AssertFlattenedObjectsEqual( 5151cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPictureRecord* referenceRecord, 5161cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPictureRecord* testRecord, 5171cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org skiatest::Reporter* reporter, 5181cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep) { 5191cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 5201cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 5211cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org referenceRecord->fBitmaps.count() == 5221cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testRecord->fBitmaps.count(), testStep->assertMessage()); 5231cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org for (int i = 0; i < referenceRecord->fBitmaps.count(); ++i) { 5241cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 5251cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkFlatData::Compare(referenceRecord->fBitmaps[i], 5261cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testRecord->fBitmaps[i]) == 0, testStep->assertMessage()); 5271cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 5281cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 5291cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org referenceRecord->fMatrices.count() == 5301cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testRecord->fMatrices.count(), testStep->assertMessage()); 5311cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org for (int i = 0; i < referenceRecord->fMatrices.count(); ++i) { 5321cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 5331cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkFlatData::Compare(referenceRecord->fMatrices[i], 5341cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testRecord->fMatrices[i]) == 0, 5351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5361cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 5371cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 5381cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org referenceRecord->fPaints.count() == 5391cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testRecord->fPaints.count(), testStep->assertMessage()); 5401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org for (int i = 0; i < referenceRecord->fPaints.count(); ++i) { 5411cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 5421cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkFlatData::Compare(referenceRecord->fPaints[i], 5431cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testRecord->fPaints[i]) == 0, testStep->assertMessage()); 5441cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 5451cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 5461cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org referenceRecord->fRegions.count() == 5471cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testRecord->fRegions.count(), testStep->assertMessage()); 5481cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org for (int i = 0; i < referenceRecord->fRegions.count(); ++i) { 5491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 5501cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkFlatData::Compare(referenceRecord->fRegions[i], 5511cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testRecord->fRegions[i]) == 0, testStep->assertMessage()); 5521cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 5531cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 5541cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org !referenceRecord->fPathHeap == 5551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org !testRecord->fPathHeap, 5561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 557dadcfdc92982498344a15ad38cc213504aebd372junov@chromium.org // The following tests are commented out because they currently 558dadcfdc92982498344a15ad38cc213504aebd372junov@chromium.org // fail. Issue: http://code.google.com/p/skia/issues/detail?id=507 559dadcfdc92982498344a15ad38cc213504aebd372junov@chromium.org /* 5601cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org if (referenceRecord->fPathHeap) { 5611cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 5621cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org referenceRecord->fPathHeap->count() == 5631cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testRecord->fPathHeap->count(), 5641cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 5651cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org for (int i = 0; i < referenceRecord->fPathHeap->count(); ++i) { 5661cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 5671cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org (*referenceRecord->fPathHeap)[i] == 5681cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org (*testRecord->fPathHeap)[i], testStep->assertMessage()); 5691cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 5701cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 571dadcfdc92982498344a15ad38cc213504aebd372junov@chromium.org */ 5721cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 5731cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 5741cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 5751cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgpublic: 5761cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 5771cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org static void TestPictureSerializationRoundTrip(skiatest::Reporter* reporter, 5784866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org CanvasTestStep* testStep, 5794866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org uint32_t recordFlags) { 5801cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kPictureDrawAssertMessageFormat); 5811cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPicture referencePicture; 5824866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org testStep->draw(referencePicture.beginRecording(kWidth, kHeight, 5834866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org recordFlags), reporter); 5841cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPicture initialPicture; 5854866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org testStep->draw(initialPicture.beginRecording(kWidth, kHeight, 5864866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org recordFlags), reporter); 5871cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kPictureReDrawAssertMessageFormat); 5881cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPicture roundTripPicture; 5894866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org initialPicture.draw(roundTripPicture.beginRecording(kWidth, kHeight, 5904866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org recordFlags)); 5911cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 5921cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPictureRecord* referenceRecord = static_cast<SkPictureRecord*>( 5931cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org referencePicture.getRecordingCanvas()); 5941cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPictureRecord* roundTripRecord = static_cast<SkPictureRecord*>( 5951cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org roundTripPicture.getRecordingCanvas()); 5961cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 5971cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kPictureReDrawAssertMessageFormat); 5981cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 5991cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Verify that deserialization-serialization round trip conserves all 6001cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // data by comparing referenceRecord to roundTripRecord 601d2700eec7eb2e26beb206b88a0f0b6f3c5f49118djsollen@google.com REPORTER_ASSERT_MESSAGE(reporter, referenceRecord->fBitmaps.count() == 602d2700eec7eb2e26beb206b88a0f0b6f3c5f49118djsollen@google.com roundTripRecord->fBitmaps.count(), testStep->assertMessage()); 603d2700eec7eb2e26beb206b88a0f0b6f3c5f49118djsollen@google.com REPORTER_ASSERT_MESSAGE(reporter, referenceRecord->fMatrices.count() == 604d2700eec7eb2e26beb206b88a0f0b6f3c5f49118djsollen@google.com roundTripRecord->fMatrices.count(), testStep->assertMessage()); 605d2700eec7eb2e26beb206b88a0f0b6f3c5f49118djsollen@google.com REPORTER_ASSERT_MESSAGE(reporter, referenceRecord->fPaints.count() == 606d2700eec7eb2e26beb206b88a0f0b6f3c5f49118djsollen@google.com roundTripRecord->fPaints.count(), testStep->assertMessage()); 607d2700eec7eb2e26beb206b88a0f0b6f3c5f49118djsollen@google.com REPORTER_ASSERT_MESSAGE(reporter, referenceRecord->fRegions.count() == 608d2700eec7eb2e26beb206b88a0f0b6f3c5f49118djsollen@google.com roundTripRecord->fRegions.count(), testStep->assertMessage()); 6091cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org char referenceBuffer[kMaxPictureBufferSize]; 6101cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkMemoryWStream referenceStream(referenceBuffer, 6111cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kMaxPictureBufferSize); 6121cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org referenceRecord->fWriter.writeToStream(&referenceStream); 6131cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org char roundTripBuffer[kMaxPictureBufferSize]; 6141cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkMemoryWStream roundTripStream(roundTripBuffer, 6151cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kMaxPictureBufferSize); 6161cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org roundTripRecord->fWriter.writeToStream(&roundTripStream); 6171cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 6181cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org roundTripStream.bytesWritten() == referenceStream.bytesWritten(), 6191cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 6201cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 0 == memcmp(referenceBuffer, 6211cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org roundTripBuffer, roundTripStream.bytesWritten()), 6221cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 6231cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, referenceRecord->fRecordFlags == 6241cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org roundTripRecord->fRecordFlags, testStep->assertMessage()); 6251cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org REPORTER_ASSERT_MESSAGE(reporter, 6261cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org referenceRecord->fRestoreOffsetStack == 6271cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org roundTripRecord->fRestoreOffsetStack, 6281cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->assertMessage()); 6291cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org AssertFlattenedObjectsEqual(referenceRecord, roundTripRecord, 6301cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org reporter, testStep); 6311cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org AssertCanvasStatesEqual(reporter, referenceRecord, roundTripRecord, 6321cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep); 6331cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 6341cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 6351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org static void TestPictureFlattenedObjectReuse(skiatest::Reporter* reporter, 6364866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org CanvasTestStep* testStep, 6374866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org uint32_t recordFlags) { 6381cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Verify that when a test step is executed twice, no extra resources 6391cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // are flattened during the second execution 6401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kPictureDrawAssertMessageFormat); 6411cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPicture referencePicture; 6421cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas* referenceCanvas = referencePicture.beginRecording(kWidth, 6434866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org kHeight, recordFlags); 6441cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->draw(referenceCanvas, reporter); 6451cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPicture testPicture; 646dadcfdc92982498344a15ad38cc213504aebd372junov@chromium.org SkCanvas* testCanvas = testPicture.beginRecording(kWidth, 6474866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org kHeight, recordFlags); 648dadcfdc92982498344a15ad38cc213504aebd372junov@chromium.org testStep->draw(testCanvas, reporter); 6491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kPictureSecondDrawAssertMessageFormat); 650dadcfdc92982498344a15ad38cc213504aebd372junov@chromium.org testStep->draw(testCanvas, reporter); 6511cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 6521cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPictureRecord* referenceRecord = static_cast<SkPictureRecord*>( 6531cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org referenceCanvas); 6541cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPictureRecord* testRecord = static_cast<SkPictureRecord*>( 6551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testCanvas); 6561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kPictureResourceReuseMessageFormat); 6571cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org AssertFlattenedObjectsEqual(referenceRecord, testRecord, 65876b9c4b71b8498d59cd6879f8fcdca4b9ffc4bd0junov@chromium.org reporter, testStep); 6591cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 6601cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org}; 6611cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 6621cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void TestPictureStateConsistency(skiatest::Reporter* reporter, 6631cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep, 6644866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org const SkCanvas& referenceCanvas, 6654866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org uint32_t recordFlags) { 6661cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Verify that the recording canvas's state is consistent 6671cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // with that of a regular canvas 6681cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPicture testPicture; 6694866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org SkCanvas* pictureCanvas = testPicture.beginRecording(kWidth, kHeight, 6704866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org recordFlags); 6711cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kPictureDrawAssertMessageFormat); 6721cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->draw(pictureCanvas, reporter); 6731cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kPictureRecoringAssertMessageFormat); 6741cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org AssertCanvasStatesEqual(reporter, pictureCanvas, &referenceCanvas, 6751cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep); 6761cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 6771cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkBitmap playbackStore; 6781cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org createBitmap(&playbackStore, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF); 6791cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkDevice playbackDevice(playbackStore); 6801cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas playbackCanvas(&playbackDevice); 6811cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testPicture.draw(&playbackCanvas); 6821cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kPicturePlaybackAssertMessageFormat); 6831cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org AssertCanvasStatesEqual(reporter, &playbackCanvas, &referenceCanvas, 6841cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep); 6851cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 6861cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // The following test code is commented out because SkPicture is not 6871cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // currently expected to preserve state when restarting recording. 6881cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org /* 6894866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org SkCanvas* pictureCanvas = testPicture.beginRecording(kWidth, kHeight, 6904866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org recordFlags); 6911cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kPictureResumeAssertMessageFormat); 6921cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org AssertCanvasStatesEqual(reporter, pictureCanvas, &referenceCanvas, 6931cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep); 6941cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org */ 6951cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 6961cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 6971cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void TestDeferredCanvasStateConsistency( 6981cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org skiatest::Reporter* reporter, 6991cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep, 7001cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org const SkCanvas& referenceCanvas) { 7011cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 7021cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkBitmap deferredStore; 7031cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org createBitmap(&deferredStore, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF); 7041cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkDevice deferredDevice(deferredStore); 7051cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkDeferredCanvas deferredCanvas(&deferredDevice); 7061cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kDeferredDrawAssertMessageFormat); 7071cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->draw(&deferredCanvas, reporter); 7081cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kDeferredPreFlushAssertMessageFormat); 7091cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org AssertCanvasStatesEqual(reporter, &deferredCanvas, &referenceCanvas, 7101cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep); 7111cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 7121cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Verified that deferred canvas state is not affected by flushing 7131cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // pending draw operations 7141cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 7151cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // The following test code is commented out because it currently fails. 7161cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Issue: http://code.google.com/p/skia/issues/detail?id=496 7171cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org /* 7181cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org deferredCanvas.flush(); 7191cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kDeferredPostFlushAssertMessageFormat); 7201cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org AssertCanvasStatesEqual(reporter, &deferredCanvas, &referenceCanvas, 7211cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep); 7221cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org */ 7231cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 7241cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 7251cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void TestProxyCanvasStateConsistency( 7261cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org skiatest::Reporter* reporter, 7271cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep, 7281cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org const SkCanvas& referenceCanvas) { 7291cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 7301cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkBitmap indirectStore; 7311cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org createBitmap(&indirectStore, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF); 7321cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkDevice indirectDevice(indirectStore); 7331cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas indirectCanvas(&indirectDevice); 7341cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkProxyCanvas proxyCanvas(&indirectCanvas); 7351cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kProxyDrawAssertMessageFormat); 7361cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->draw(&proxyCanvas, reporter); 7371cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Verify that the SkProxyCanvas reports consitent state 7381cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kProxyStateAssertMessageFormat); 7391cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org AssertCanvasStatesEqual(reporter, &proxyCanvas, &referenceCanvas, 7401cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep); 7411cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Verify that the indirect canvas reports consitent state 7421cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kProxyIndirectStateAssertMessageFormat); 7431cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org AssertCanvasStatesEqual(reporter, &indirectCanvas, &referenceCanvas, 7441cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep); 7451cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 7461cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 7471cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void TestNWayCanvasStateConsistency( 7481cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org skiatest::Reporter* reporter, 7491cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep, 7501cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org const SkCanvas& referenceCanvas) { 7511cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 7521cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkBitmap indirectStore1; 7531cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org createBitmap(&indirectStore1, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF); 7541cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkDevice indirectDevice1(indirectStore1); 7551cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas indirectCanvas1(&indirectDevice1); 7561cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 7571cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkBitmap indirectStore2; 7581cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org createBitmap(&indirectStore2, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF); 7591cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkDevice indirectDevice2(indirectStore2); 7601cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas indirectCanvas2(&indirectDevice2); 7611cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 762f0a062bc4573323abcf37394bb68e0230347a974djsollen@google.com SkISize canvasSize = referenceCanvas.getDeviceSize(); 763f0a062bc4573323abcf37394bb68e0230347a974djsollen@google.com SkNWayCanvas nWayCanvas(canvasSize.width(), canvasSize.height()); 7641cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org nWayCanvas.addCanvas(&indirectCanvas1); 7651cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org nWayCanvas.addCanvas(&indirectCanvas2); 7661cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 7671cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kNWayDrawAssertMessageFormat); 7681cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->draw(&nWayCanvas, reporter); 7691cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Verify that the SkProxyCanvas reports consitent state 7701cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kNWayStateAssertMessageFormat); 7711cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org AssertCanvasStatesEqual(reporter, &nWayCanvas, &referenceCanvas, 7721cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep); 7731cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Verify that the indirect canvases report consitent state 7741cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kNWayIndirect1StateAssertMessageFormat); 7751cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org AssertCanvasStatesEqual(reporter, &indirectCanvas1, &referenceCanvas, 7761cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep); 7771cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kNWayIndirect2StateAssertMessageFormat); 7781cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org AssertCanvasStatesEqual(reporter, &indirectCanvas2, &referenceCanvas, 7791cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep); 7801cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 7811cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 7821cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org/* 7831cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * This sub-test verifies that the test step passes when executed 7841cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * with SkCanvas and with classes derrived from SkCanvas. It also verifies 7851cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * that the all canvas derivatives report the same state as an SkCanvas 7861cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org * after having executed the test step. 7871cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org */ 7881cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void TestOverrideStateConsistency(skiatest::Reporter* reporter, 7891cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org CanvasTestStep* testStep) { 7901cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkBitmap referenceStore; 7911cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org createBitmap(&referenceStore, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF); 7921cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkDevice referenceDevice(referenceStore); 7931cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkCanvas referenceCanvas(&referenceDevice); 7941cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->setAssertMessageFormat(kCanvasDrawAssertMessageFormat); 7951cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org testStep->draw(&referenceCanvas, reporter); 7961cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 7974866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org TestPictureStateConsistency(reporter, testStep, referenceCanvas, 0); 7984866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org TestPictureStateConsistency(reporter, testStep, referenceCanvas, 7994866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org SkPicture::kFlattenMutableNonTexturePixelRefs_RecordingFlag); 8001cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org TestDeferredCanvasStateConsistency(reporter, testStep, referenceCanvas); 8011cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 8021cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // The following test code is commented out because SkProxyCanvas is 8031cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // missing a lot of virtual overrides on get* methods, which are used 8041cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // to verify canvas state. 8051cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Issue: http://code.google.com/p/skia/issues/detail?id=500 8061cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 8071cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org //TestProxyCanvasStateConsistency(reporter, testStep, referenceCanvas); 8081cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 8091cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // The following test code is commented out because SkNWayCanvas does not 8101cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // report correct clipping and device bounds information 8111cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Issue: http://code.google.com/p/skia/issues/detail?id=501 8121cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 8131cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org //TestNWayCanvasStateConsistency(reporter, testStep, referenceCanvas); 8141cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org} 8151cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org 8161cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.orgstatic void TestCanvas(skiatest::Reporter* reporter) { 8171cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // Init global here because bitmap pixels cannot be alocated during 8181cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org // static initialization 8191cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org kTestBitmap = testBitmap(); 8207c2029367cea5479fa3b74fb0ca2b0297b42b709reed@google.com 8211cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org for (int testStep = 0; testStep < testStepArray().count(); testStep++) { 8221cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org TestOverrideStateConsistency(reporter, testStepArray()[testStep]); 8231cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPictureTester::TestPictureSerializationRoundTrip(reporter, 8244866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org testStepArray()[testStep], 0); 8254866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org SkPictureTester::TestPictureSerializationRoundTrip(reporter, 8264866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org testStepArray()[testStep], 8274866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org SkPicture::kFlattenMutableNonTexturePixelRefs_RecordingFlag); 8284866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org SkPictureTester::TestPictureFlattenedObjectReuse(reporter, 8294866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org testStepArray()[testStep], 0); 8301cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org SkPictureTester::TestPictureFlattenedObjectReuse(reporter, 8314866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org testStepArray()[testStep], 8324866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org SkPicture::kFlattenMutableNonTexturePixelRefs_RecordingFlag); 8331cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org } 83437f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com} 83537f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com 83637f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.com#include "TestClassDef.h" 83737f3ae0b9f31abb62f34f91b17e2eb86e514ae27reed@google.comDEFINE_TESTCLASS("Canvas", TestCanvasClass, TestCanvas) 838