180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2012 Google Inc. 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* Description: 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * This test defines a series of elementatry test steps that perform 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * a single or a small group of canvas API calls. Each test step is 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * used in several test cases that verify that different types of SkCanvas 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * flavors and derivatives pass it and yield consistent behavior. The 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * test cases analyse results that are queryable through the API. They do 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * not look at rendering results. 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Adding test stepss: 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * The general pattern for creating a new test step is to write a test 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * function of the form: 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * static void MyTestStepFunction(SkCanvas* canvas, 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * skiatest::Reporter* reporter, 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * CanvasTestStep* testStep) 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * { 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * canvas->someCanvasAPImethod(); 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * (...) 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * REPORTER_ASSERT_MESSAGE(reporter, (...), \ 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * testStep->assertMessage()); 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * } 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * The definition of the test step function should be followed by an 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * invocation of the TEST_STEP macro, which generates a class and 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * instance for the test step: 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * TEST_STEP(MyTestStep, MyTestStepFunction) 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * There are also short hand macros for defining simple test steps 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * in a single line of code. A simple test step is a one that is made 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * of a single canvas API call. 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * SIMPLE_TEST_STEP(MytestStep, someCanvasAPIMethod()); 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * There is another macro called SIMPLE_TEST_STEP_WITH_ASSERT that 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * works the same way as SIMPLE_TEST_STEP, and additionally verifies 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * that the invoked method returns a non-zero value. 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkBitmap.h" 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkCanvas.h" 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDeferredCanvas.h" 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDevice.h" 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkMatrix.h" 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkNWayCanvas.h" 53363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkPDFDevice.h" 54363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkPDFDocument.h" 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPaint.h" 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPath.h" 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPicture.h" 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPictureRecord.h" 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkProxyCanvas.h" 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkRect.h" 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkRegion.h" 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkShader.h" 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkStream.h" 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkTDArray.h" 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "Test.h" 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass Canvas2CanvasClipVisitor : public SkCanvas::ClipVisitor { 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru Canvas2CanvasClipVisitor(SkCanvas* target) : fTarget(target) {} 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void clipRect(const SkRect& r, SkRegion::Op op, bool aa) { 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fTarget->clipRect(r, op, aa); 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void clipPath(const SkPath& p, SkRegion::Op op, bool aa) { 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fTarget->clipPath(p, op, aa); 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkCanvas* fTarget; 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void test_clipVisitor(skiatest::Reporter* reporter, SkCanvas* canvas) { 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkISize size = canvas->getDeviceSize(); 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkBitmap bm; 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bm.setConfig(SkBitmap::kARGB_8888_Config, size.width(), size.height()); 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkCanvas c(bm); 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru Canvas2CanvasClipVisitor visitor(&c); 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->replayClips(&visitor); 9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, c.getTotalClip() == canvas->getTotalClip()); 9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const int kWidth = 2; 9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const int kHeight = 2; 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// Maximum stream length for picture serialization 9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const size_t kMaxPictureBufferSize = 1024; 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// Format strings that describe the test context. The %s token is where 10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// the name of the test step is inserted. The context is required for 10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// disambiguating the error in the case of failures that are reported in 10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// functions that are called multiple times in different contexts (test 10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// cases and test steps). 10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kDefaultAssertMessageFormat = "%s"; 10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kCanvasDrawAssertMessageFormat = 10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "Drawing test step %s with SkCanvas"; 10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kPictureDrawAssertMessageFormat = 10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "Drawing test step %s with SkPicture"; 11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kPictureSecondDrawAssertMessageFormat = 11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "Duplicate draw of test step %s with SkPicture"; 11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kPictureReDrawAssertMessageFormat = 11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "Playing back test step %s from an SkPicture to another SkPicture"; 11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kDeferredDrawAssertMessageFormat = 11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "Drawing test step %s with SkDeferredCanvas"; 11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kProxyDrawAssertMessageFormat = 11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "Drawing test step %s with SkProxyCanvas"; 11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kNWayDrawAssertMessageFormat = 11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "Drawing test step %s with SkNWayCanvas"; 12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kRoundTripAssertMessageFormat = 12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "test step %s, SkPicture consistency after round trip"; 12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kPictureRecoringAssertMessageFormat = 12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "test step %s, SkPicture state consistency after recording"; 12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kPicturePlaybackAssertMessageFormat = 12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "test step %s, SkPicture state consistency in playback canvas"; 12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kDeferredPreFlushAssertMessageFormat = 12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "test step %s, SkDeferredCanvas state consistency before flush"; 12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kDeferredPostFlushPlaybackAssertMessageFormat = 12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "test step %s, SkDeferredCanvas playback canvas state consistency after flush"; 13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kDeferredPostSilentFlushPlaybackAssertMessageFormat = 13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "test step %s, SkDeferredCanvas playback canvas state consistency after silent flush"; 13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kDeferredPostFlushAssertMessageFormat = 13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "test step %s, SkDeferredCanvas state consistency after flush"; 13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kPictureResourceReuseMessageFormat = 13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "test step %s, SkPicture duplicate flattened object test"; 13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kProxyStateAssertMessageFormat = 13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "test step %s, SkProxyCanvas state consistency"; 13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kProxyIndirectStateAssertMessageFormat = 13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "test step %s, SkProxyCanvas indirect canvas state consistency"; 14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kNWayStateAssertMessageFormat = 14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "test step %s, SkNWayCanvas state consistency"; 14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kNWayIndirect1StateAssertMessageFormat = 14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "test step %s, SkNWayCanvas indirect canvas 1 state consistency"; 14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* const kNWayIndirect2StateAssertMessageFormat = 14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "test step %s, SkNWayCanvas indirect canvas 2 state consistency"; 146363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic const char* const kPdfAssertMessageFormat = 147363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger "PDF sanity check failed %s"; 14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void createBitmap(SkBitmap* bm, SkBitmap::Config config, SkColor color) { 15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bm->setConfig(config, kWidth, kHeight); 15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bm->allocPixels(); 15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bm->eraseColor(color); 15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass CanvasTestStep; 15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkTDArray<CanvasTestStep*>& testStepArray() { 15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static SkTDArray<CanvasTestStep*> theTests; 15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return theTests; 15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass CanvasTestStep { 16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 163363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger CanvasTestStep(bool fEnablePdfTesting = true) { 16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *testStepArray().append() = this; 16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fAssertMessageFormat = kDefaultAssertMessageFormat; 166363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger this->fEnablePdfTesting = fEnablePdfTesting; 16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual ~CanvasTestStep() { } 16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void draw(SkCanvas*, skiatest::Reporter*) = 0; 17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual const char* name() const = 0; 17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const char* assertMessage() { 17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fAssertMessage.printf(fAssertMessageFormat, name()); 17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fAssertMessage.c_str(); 17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void setAssertMessageFormat(const char* format) { 17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fAssertMessageFormat = format; 18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 182363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger bool enablePdfTesting() { return fEnablePdfTesting; } 183363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString fAssertMessage; 18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const char* fAssertMessageFormat; 187363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger bool fEnablePdfTesting; 18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/////////////////////////////////////////////////////////////////////////////// 19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// Constants used by test steps 19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkRect kTestRect = 19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkRect::MakeXYWH(SkIntToScalar(0), SkIntToScalar(0), 19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkIntToScalar(2), SkIntToScalar(1)); 19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkMatrix testMatrix() { 19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkMatrix matrix; 19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru matrix.reset(); 19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru matrix.setScale(SkIntToScalar(2), SkIntToScalar(3)); 20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return matrix; 20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkMatrix kTestMatrix = testMatrix(); 20380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkPath testPath() { 20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPath path; 20580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path.addRect(SkRect::MakeXYWH(SkIntToScalar(0), SkIntToScalar(0), 20680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkIntToScalar(2), SkIntToScalar(1))); 20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return path; 20880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 20980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkPath kTestPath = testPath(); 21080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkRegion testRegion() { 21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkRegion region; 21280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkIRect rect = SkIRect::MakeXYWH(0, 0, 2, 1); 21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru region.setRect(rect); 21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return region; 21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkIRect kTestIRect = SkIRect::MakeXYWH(0, 0, 2, 1); 21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkRegion kTestRegion = testRegion(); 21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkColor kTestColor = 0x01020304; 21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkPaint kTestPaint; 22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkPoint kTestPoints[3] = { 22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru {SkIntToScalar(0), SkIntToScalar(0)}, 22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru {SkIntToScalar(2), SkIntToScalar(1)}, 22380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru {SkIntToScalar(0), SkIntToScalar(2)} 22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst size_t kTestPointCount = 3; 22680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkBitmap testBitmap() { 22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkBitmap bitmap; 22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru createBitmap(&bitmap, SkBitmap::kARGB_8888_Config, 0x05060708); 22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return bitmap; 23080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 23180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkBitmap kTestBitmap; // cannot be created during static init 23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkString kTestText("Hello World"); 23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkPoint kTestPoints2[] = { 23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkIntToScalar(0), SkIntToScalar(1) }, 23580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkIntToScalar(1), SkIntToScalar(1) }, 23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkIntToScalar(2), SkIntToScalar(1) }, 23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkIntToScalar(3), SkIntToScalar(1) }, 23880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkIntToScalar(4), SkIntToScalar(1) }, 23980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkIntToScalar(5), SkIntToScalar(1) }, 24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkIntToScalar(6), SkIntToScalar(1) }, 24180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkIntToScalar(7), SkIntToScalar(1) }, 24280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkIntToScalar(8), SkIntToScalar(1) }, 24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkIntToScalar(9), SkIntToScalar(1) }, 24480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkIntToScalar(10), SkIntToScalar(1) }, 24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 24780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 24880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/////////////////////////////////////////////////////////////////////////////// 24980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// Macros for defining test steps 25080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 25180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define TEST_STEP(NAME, FUNCTION) \ 25280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass NAME##_TestStep : public CanvasTestStep{ \ 25380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: \ 25480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void draw(SkCanvas* canvas, skiatest::Reporter* reporter) { \ 25580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru FUNCTION (canvas, reporter, this); \ 25680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } \ 25780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual const char* name() const {return #NAME ;} \ 25880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; \ 25980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic NAME##_TestStep NAME##_TestStepInstance; 26080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 261363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define TEST_STEP_NO_PDF(NAME, FUNCTION) \ 262363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass NAME##_TestStep : public CanvasTestStep{ \ 263363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic: \ 264363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger NAME##_TestStep() : CanvasTestStep(false) {} \ 265363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual void draw(SkCanvas* canvas, skiatest::Reporter* reporter) { \ 266363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger FUNCTION (canvas, reporter, this); \ 267363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } \ 268363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual const char* name() const {return #NAME ;} \ 269363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}; \ 270363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic NAME##_TestStep NAME##_TestStepInstance; 271363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 27280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SIMPLE_TEST_STEP(NAME, CALL) \ 27380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void NAME##TestStep(SkCanvas* canvas, skiatest::Reporter*, \ 27480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru CanvasTestStep*) { \ 27580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas-> CALL ; \ 27680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} \ 27780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruTEST_STEP(NAME, NAME##TestStep ) 27880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 27980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SIMPLE_TEST_STEP_WITH_ASSERT(NAME, CALL) \ 28080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void NAME##TestStep(SkCanvas* canvas, skiatest::Reporter* reporter, \ 28180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru CanvasTestStep* testStep) { \ 28280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas-> CALL , \ 28380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); \ 28480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} \ 28580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruTEST_STEP(NAME, NAME##TestStep ) 28680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 28780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 28880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/////////////////////////////////////////////////////////////////////////////// 28980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// Basic test steps for most virtual methods in SkCanvas that draw or affect 29080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// the state of the canvas. 29180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 29280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP_WITH_ASSERT(Translate, 29380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru translate(SkIntToScalar(1), SkIntToScalar(2))); 29480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP_WITH_ASSERT(Scale, 29580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru scale(SkIntToScalar(1), SkIntToScalar(2))); 29680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP_WITH_ASSERT(Rotate, rotate(SkIntToScalar(1))); 29780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP_WITH_ASSERT(Skew, 29880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru skew(SkIntToScalar(1), SkIntToScalar(2))); 29980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP_WITH_ASSERT(Concat, concat(kTestMatrix)); 30080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(SetMatrix, setMatrix(kTestMatrix)); 30180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(ClipRect, clipRect(kTestRect)); 30280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(ClipPath, clipPath(kTestPath)); 30380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(ClipRegion, 30480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru clipRegion(kTestRegion, SkRegion::kReplace_Op)); 30580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(Clear, clear(kTestColor)); 30680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawPaint, drawPaint(kTestPaint)); 30780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawPointsPoints, drawPoints(SkCanvas::kPoints_PointMode, 30880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kTestPointCount, kTestPoints, kTestPaint)); 30980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawPointsLiness, drawPoints(SkCanvas::kLines_PointMode, 31080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kTestPointCount, kTestPoints, kTestPaint)); 31180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawPointsPolygon, drawPoints(SkCanvas::kPolygon_PointMode, 31280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kTestPointCount, kTestPoints, kTestPaint)); 31380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawRect, drawRect(kTestRect, kTestPaint)); 31480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawPath, drawPath(kTestPath, kTestPaint)); 31580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawBitmap, drawBitmap(kTestBitmap, 0, 0)); 31680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawBitmapPaint, drawBitmap(kTestBitmap, 0, 0, &kTestPaint)); 31780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawBitmapRect, drawBitmapRect(kTestBitmap, NULL, kTestRect, 31880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru NULL)); 31980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawBitmapRectSrcRect, drawBitmapRect(kTestBitmap, 32080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru &kTestIRect, kTestRect, NULL)); 32180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawBitmapRectPaint, drawBitmapRect(kTestBitmap, NULL, 32280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kTestRect, &kTestPaint)); 32380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawBitmapMatrix, drawBitmapMatrix(kTestBitmap, kTestMatrix, 32480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru NULL)); 32580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawBitmapMatrixPaint, drawBitmapMatrix(kTestBitmap, 32680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kTestMatrix, &kTestPaint)); 32780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawBitmapNine, drawBitmapNine(kTestBitmap, kTestIRect, 32880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kTestRect, NULL)); 32980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawBitmapNinePaint, drawBitmapNine(kTestBitmap, kTestIRect, 33080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kTestRect, &kTestPaint)); 33180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawSprite, drawSprite(kTestBitmap, 0, 0, NULL)); 33280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawSpritePaint, drawSprite(kTestBitmap, 0, 0, &kTestPaint)); 33380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawText, drawText(kTestText.c_str(), kTestText.size(), 33480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 0, 1, kTestPaint)); 33580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawPosText, drawPosText(kTestText.c_str(), 33680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kTestText.size(), kTestPoints2, kTestPaint)); 33780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawTextOnPath, drawTextOnPath(kTestText.c_str(), 33880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kTestText.size(), kTestPath, NULL, kTestPaint)); 33980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawTextOnPathMatrix, drawTextOnPath(kTestText.c_str(), 34080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kTestText.size(), kTestPath, &kTestMatrix, kTestPaint)); 34180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSIMPLE_TEST_STEP(DrawData, drawData(kTestText.c_str(), kTestText.size())); 34258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerSIMPLE_TEST_STEP(BeginGroup, beginCommentGroup(kTestText.c_str())); 34358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerSIMPLE_TEST_STEP(AddComment, addComment(kTestText.c_str(), kTestText.c_str())); 34458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerSIMPLE_TEST_STEP(EndGroup, endCommentGroup()); 34580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 34680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/////////////////////////////////////////////////////////////////////////////// 34780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// Complex test steps 34880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 34980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// Save/restore calls cannot be in isolated simple test steps because the test 35080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// cases that use SkPicture require that save and restore calls be balanced. 35180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void SaveMatrixStep(SkCanvas* canvas, 35280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru skiatest::Reporter* reporter, 35380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru CanvasTestStep* testStep) { 35480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int saveCount = canvas->getSaveCount(); 35580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->save(SkCanvas::kMatrix_SaveFlag); 35680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->clipRegion(kTestRegion); 35780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->translate(SkIntToScalar(1), SkIntToScalar(2)); 35880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->restore(); 35980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas->getSaveCount() == saveCount, 36080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 36180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas->getTotalMatrix().isIdentity(), 36280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 36380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas->getTotalClip() == kTestRegion, 36480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 36580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 36680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruTEST_STEP(SaveMatrix, SaveMatrixStep); 36780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 36880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void SaveClipStep(SkCanvas* canvas, 36980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru skiatest::Reporter* reporter, 37080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru CanvasTestStep* testStep) { 37180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int saveCount = canvas->getSaveCount(); 37280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->save(SkCanvas::kClip_SaveFlag); 37380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->translate(SkIntToScalar(1), SkIntToScalar(2)); 37480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->clipRegion(kTestRegion); 37580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->restore(); 37680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas->getSaveCount() == saveCount, 37780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 37880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, !canvas->getTotalMatrix().isIdentity(), 37980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 38080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas->getTotalClip() != kTestRegion, 38180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 38280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 38380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruTEST_STEP(SaveClip, SaveClipStep); 38480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 38580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void SaveMatrixClipStep(SkCanvas* canvas, 38680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru skiatest::Reporter* reporter, 38780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru CanvasTestStep* testStep) { 38880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int saveCount = canvas->getSaveCount(); 38980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->save(SkCanvas::kMatrixClip_SaveFlag); 39080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->translate(SkIntToScalar(1), SkIntToScalar(2)); 39180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->clipRegion(kTestRegion); 39280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->restore(); 39380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas->getSaveCount() == saveCount, 39480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 39580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas->getTotalMatrix().isIdentity(), 39680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 39780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas->getTotalClip() != kTestRegion, 39880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 39980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 40080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruTEST_STEP(SaveMatrixClip, SaveMatrixClipStep); 40180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 40280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void SaveLayerStep(SkCanvas* canvas, 40380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru skiatest::Reporter* reporter, 40480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru CanvasTestStep* testStep) { 40580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int saveCount = canvas->getSaveCount(); 40680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->saveLayer(NULL, NULL); 40780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->restore(); 40880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas->getSaveCount() == saveCount, 40980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 41080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 41180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruTEST_STEP(SaveLayer, SaveLayerStep); 41280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 41380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void BoundedSaveLayerStep(SkCanvas* canvas, 41480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru skiatest::Reporter* reporter, 41580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru CanvasTestStep* testStep) { 41680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int saveCount = canvas->getSaveCount(); 41780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->saveLayer(&kTestRect, NULL); 41880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->restore(); 41980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas->getSaveCount() == saveCount, 42080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 42180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 42280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruTEST_STEP(BoundedSaveLayer, BoundedSaveLayerStep); 42380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 42480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void PaintSaveLayerStep(SkCanvas* canvas, 42580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru skiatest::Reporter* reporter, 42680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru CanvasTestStep* testStep) { 42780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int saveCount = canvas->getSaveCount(); 42880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->saveLayer(NULL, &kTestPaint); 42980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->restore(); 43080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas->getSaveCount() == saveCount, 43180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 43280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 43380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruTEST_STEP(PaintSaveLayer, PaintSaveLayerStep); 43480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 43580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void TwoClipOpsStep(SkCanvas* canvas, 436096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger skiatest::Reporter*, 437096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger CanvasTestStep*) { 43880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // This test exercises a functionality in SkPicture that leads to the 43980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // recording of restore offset placeholders. This test will trigger an 44080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // assertion at playback time if the placeholders are not properly 44180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // filled when the recording ends. 44280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->clipRect(kTestRect); 44380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->clipRegion(kTestRegion); 44480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 44580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruTEST_STEP(TwoClipOps, TwoClipOpsStep); 44680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 44780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// exercise fix for http://code.google.com/p/skia/issues/detail?id=560 44880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// ('SkPathStroker::lineTo() fails for line with length SK_ScalarNearlyZero') 44980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void DrawNearlyZeroLengthPathTestStep(SkCanvas* canvas, 450096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger skiatest::Reporter*, 451096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger CanvasTestStep*) { 45280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPaint paint; 45380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setStrokeWidth(SkIntToScalar(1)); 45480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setStyle(SkPaint::kStroke_Style); 45580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 45680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPath path; 45780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPoint pt1 = { 0, 0 }; 45880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPoint pt2 = { 0, SK_ScalarNearlyZero }; 45980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPoint pt3 = { SkIntToScalar(1), 0 }; 46080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPoint pt4 = { SkIntToScalar(1), SK_ScalarNearlyZero/2 }; 46180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path.moveTo(pt1); 46280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path.lineTo(pt2); 46380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path.lineTo(pt3); 46480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path.lineTo(pt4); 46580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 46680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->drawPath(path, paint); 46780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 46880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruTEST_STEP(DrawNearlyZeroLengthPath, DrawNearlyZeroLengthPathTestStep); 46980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 47080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void DrawVerticesShaderTestStep(SkCanvas* canvas, 471096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger skiatest::Reporter*, 472096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger CanvasTestStep*) { 47380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPoint pts[4]; 47480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru pts[0].set(0, 0); 47580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru pts[1].set(SkIntToScalar(kWidth), 0); 47680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru pts[2].set(SkIntToScalar(kWidth), SkIntToScalar(kHeight)); 47780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru pts[3].set(0, SkIntToScalar(kHeight)); 47880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPaint paint; 47980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkShader* shader = SkShader::CreateBitmapShader(kTestBitmap, 48080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkShader::kClamp_TileMode, SkShader::kClamp_TileMode); 48180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setShader(shader)->unref(); 48280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->drawVertices(SkCanvas::kTriangleFan_VertexMode, 4, pts, pts, 48380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru NULL, NULL, NULL, 0, paint); 48480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 485363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger// NYI: issue 240. 486363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerTEST_STEP_NO_PDF(DrawVerticesShader, DrawVerticesShaderTestStep); 48780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 48880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void DrawPictureTestStep(SkCanvas* canvas, 489096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger skiatest::Reporter*, 490096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger CanvasTestStep*) { 49180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPicture* testPicture = SkNEW_ARGS(SkPicture, ()); 49280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAutoUnref aup(testPicture); 49380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkCanvas* testCanvas = testPicture->beginRecording(kWidth, kHeight); 49480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testCanvas->scale(SkIntToScalar(2), SkIntToScalar(1)); 49580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testCanvas->clipRect(kTestRect); 49680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testCanvas->drawRect(kTestRect, kTestPaint); 49780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->drawPicture(*testPicture); 49880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 49980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruTEST_STEP(DrawPicture, DrawPictureTestStep); 50080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 50180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void SaveRestoreTestStep(SkCanvas* canvas, 50280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru skiatest::Reporter* reporter, 50380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru CanvasTestStep* testStep) { 50480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int baseSaveCount = canvas->getSaveCount(); 50580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int n = canvas->save(); 50680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, baseSaveCount == n, testStep->assertMessage()); 50780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, baseSaveCount + 1 == canvas->getSaveCount(), 50880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 50980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->save(); 51080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->save(); 51180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, baseSaveCount + 3 == canvas->getSaveCount(), 51280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 51380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->restoreToCount(baseSaveCount + 1); 51480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, baseSaveCount + 1 == canvas->getSaveCount(), 51580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 51680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 51780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // should this pin to 1, or be a no-op, or crash? 51880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->restoreToCount(0); 51980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, 1 == canvas->getSaveCount(), 52080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 52180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 52280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruTEST_STEP(SaveRestore, SaveRestoreTestStep); 52380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 52480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void DrawLayerTestStep(SkCanvas* canvas, 52580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru skiatest::Reporter* reporter, 52680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru CanvasTestStep* testStep) { 52780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, !canvas->isDrawingToLayer(), 52880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 52980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->save(); 53080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, !canvas->isDrawingToLayer(), 53180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 53280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->restore(); 53380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 53480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkRect* bounds = NULL; // null means include entire bounds 53580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkPaint* paint = NULL; 53680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 53780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->saveLayer(bounds, paint); 53880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas->isDrawingToLayer(), 53980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 54080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->restore(); 54180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, !canvas->isDrawingToLayer(), 54280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 54380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 54480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->saveLayer(bounds, paint); 54580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->saveLayer(bounds, paint); 54680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas->isDrawingToLayer(), 54780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 54880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->restore(); 54980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas->isDrawingToLayer(), 55080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 55180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->restore(); 55280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // now layer count should be 0 55380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, !canvas->isDrawingToLayer(), 55480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 55580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 55680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruTEST_STEP(DrawLayer, DrawLayerTestStep); 55780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 55880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void NestedSaveRestoreWithSolidPaintTestStep(SkCanvas* canvas, 559096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger skiatest::Reporter*, 560096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger CanvasTestStep*) { 56180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // This test step challenges the TestDeferredCanvasStateConsistency 56280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // test cases because the opaque paint can trigger an optimization 56380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // that discards previously recorded commands. The challenge is to maintain 56480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // correct clip and matrix stack state. 56580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->resetMatrix(); 56680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->rotate(SkIntToScalar(30)); 56780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->save(); 56880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->translate(SkIntToScalar(2), SkIntToScalar(1)); 56980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->save(); 57080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->scale(SkIntToScalar(3), SkIntToScalar(3)); 57180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPaint paint; 57280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setColor(0xFFFFFFFF); 57380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->drawPaint(paint); 57480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->restore(); 57580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->restore(); 57680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 57780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruTEST_STEP(NestedSaveRestoreWithSolidPaint, \ 57880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru NestedSaveRestoreWithSolidPaintTestStep); 57980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 58080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void NestedSaveRestoreWithFlushTestStep(SkCanvas* canvas, 581096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger skiatest::Reporter*, 582096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger CanvasTestStep*) { 58380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // This test step challenges the TestDeferredCanvasStateConsistency 58480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // test case because the canvas flush on a deferred canvas will 58580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // reset the recording session. The challenge is to maintain correct 58680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // clip and matrix stack state on the playback canvas. 58780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->resetMatrix(); 58880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->rotate(SkIntToScalar(30)); 58980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->save(); 59080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->translate(SkIntToScalar(2), SkIntToScalar(1)); 59180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->save(); 59280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->scale(SkIntToScalar(3), SkIntToScalar(3)); 59380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->drawRect(kTestRect,kTestPaint); 59480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->flush(); 59580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->restore(); 59680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->restore(); 59780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 59880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruTEST_STEP(NestedSaveRestoreWithFlush, \ 59980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru NestedSaveRestoreWithFlushTestStep); 60080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 60180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void AssertCanvasStatesEqual(skiatest::Reporter* reporter, 60280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkCanvas* canvas1, 60380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkCanvas* canvas2, 60480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru CanvasTestStep* testStep) { 60580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas1->getDeviceSize() == 60680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas2->getDeviceSize(), testStep->assertMessage()); 60780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas1->getSaveCount() == 60880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas2->getSaveCount(), testStep->assertMessage()); 60980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas1->isDrawingToLayer() == 61080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas2->isDrawingToLayer(), testStep->assertMessage()); 61180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 61280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkRect bounds1, bounds2; 61380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, 61480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas1->getClipBounds(&bounds1) == canvas2->getClipBounds(&bounds2), 61580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 61680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, bounds1 == bounds2, 61780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 61880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 61980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas1->getDrawFilter() == 62080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas2->getDrawFilter(), testStep->assertMessage()); 62180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkIRect deviceBounds1, deviceBounds2; 62280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, 62380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas1->getClipDeviceBounds(&deviceBounds1) == 62480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas2->getClipDeviceBounds(&deviceBounds2), 62580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 62680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, deviceBounds1 == deviceBounds2, 62780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 62880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas1->getBounder() == 62980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas2->getBounder(), testStep->assertMessage()); 63080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas1->getTotalMatrix() == 63180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas2->getTotalMatrix(), testStep->assertMessage()); 63280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas1->getClipType() == 63380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas2->getClipType(), testStep->assertMessage()); 63480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, canvas1->getTotalClip() == 63580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas2->getTotalClip(), testStep->assertMessage()); 63680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 63780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // The following test code is commented out because the test fails when 63880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // the canvas is an SkPictureRecord or SkDeferredCanvas 63980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // Issue: http://code.google.com/p/skia/issues/detail?id=498 64080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // Also, creating a LayerIter on an SkProxyCanvas crashes 64180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // Issue: http://code.google.com/p/skia/issues/detail?id=499 64280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /* 64380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkCanvas::LayerIter layerIter1(const_cast<SkCanvas*>(canvas1), false); 64480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkCanvas::LayerIter layerIter2(const_cast<SkCanvas*>(canvas2), false); 64580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru while (!layerIter1.done() && !layerIter2.done()) { 64680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, layerIter1.matrix() == 64780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru layerIter2.matrix(), testStep->assertMessage()); 64880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, layerIter1.clip() == 64980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru layerIter2.clip(), testStep->assertMessage()); 65080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, layerIter1.paint() == 65180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru layerIter2.paint(), testStep->assertMessage()); 65280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, layerIter1.x() == 65380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru layerIter2.x(), testStep->assertMessage()); 65480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, layerIter1.y() == 65580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru layerIter2.y(), testStep->assertMessage()); 65680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru layerIter1.next(); 65780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru layerIter2.next(); 65880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 65980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, layerIter1.done(), 66080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 66180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, layerIter2.done(), 66280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 66380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 66480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 66580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 66680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// The following class groups static functions that need to access 66780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// the privates members of SkPictureRecord 66880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkPictureTester { 66980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 67080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static int EQ(const SkFlatData* a, const SkFlatData* b) { 67180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return *a == *b; 67280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 67380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 67480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static void AssertFlattenedObjectsEqual( 67580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPictureRecord* referenceRecord, 67680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPictureRecord* testRecord, 67780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru skiatest::Reporter* reporter, 67880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru CanvasTestStep* testStep) { 67980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 68080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, 68180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru referenceRecord->fBitmapHeap->count() == 68280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testRecord->fBitmapHeap->count(), testStep->assertMessage()); 68380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, 68480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru referenceRecord->fMatrices.count() == 68580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testRecord->fMatrices.count(), testStep->assertMessage()); 68680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 0; i < referenceRecord->fMatrices.count(); ++i) { 68780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, 68880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru EQ(referenceRecord->fMatrices[i], testRecord->fMatrices[i]), 68980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 69080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 69180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, 69280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru referenceRecord->fPaints.count() == 69380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testRecord->fPaints.count(), testStep->assertMessage()); 69480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 0; i < referenceRecord->fPaints.count(); ++i) { 69580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, 69680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru EQ(referenceRecord->fPaints[i], testRecord->fPaints[i]), 69780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 69880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 69980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, 70080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru referenceRecord->fRegions.count() == 70180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testRecord->fRegions.count(), testStep->assertMessage()); 70280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 0; i < referenceRecord->fRegions.count(); ++i) { 70380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, 70480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru EQ(referenceRecord->fRegions[i], testRecord->fRegions[i]), 70580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 70680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 70780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, 70880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru !referenceRecord->fPathHeap == 70980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru !testRecord->fPathHeap, 71080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 71180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // The following tests are commented out because they currently 71280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // fail. Issue: http://code.google.com/p/skia/issues/detail?id=507 71380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /* 71480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (referenceRecord->fPathHeap) { 71580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, 71680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru referenceRecord->fPathHeap->count() == 71780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testRecord->fPathHeap->count(), 71880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->assertMessage()); 71980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 0; i < referenceRecord->fPathHeap->count(); ++i) { 72080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT_MESSAGE(reporter, 72180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru (*referenceRecord->fPathHeap)[i] == 72280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru (*testRecord->fPathHeap)[i], testStep->assertMessage()); 72380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 72480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 72580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 72680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 72780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 72880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 72980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 73080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 73180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static void TestPictureFlattenedObjectReuse(skiatest::Reporter* reporter, 73280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru CanvasTestStep* testStep, 73380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru uint32_t recordFlags) { 73480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // Verify that when a test step is executed twice, no extra resources 73580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // are flattened during the second execution 73680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->setAssertMessageFormat(kPictureDrawAssertMessageFormat); 73780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPicture referencePicture; 73880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkCanvas* referenceCanvas = referencePicture.beginRecording(kWidth, 73980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kHeight, recordFlags); 74080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->draw(referenceCanvas, reporter); 74180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPicture testPicture; 74280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkCanvas* testCanvas = testPicture.beginRecording(kWidth, 74380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kHeight, recordFlags); 74480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->draw(testCanvas, reporter); 74580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->setAssertMessageFormat(kPictureSecondDrawAssertMessageFormat); 74680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->draw(testCanvas, reporter); 74780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 74880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPictureRecord* referenceRecord = static_cast<SkPictureRecord*>( 74980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru referenceCanvas); 75080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPictureRecord* testRecord = static_cast<SkPictureRecord*>( 75180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testCanvas); 75280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->setAssertMessageFormat(kPictureResourceReuseMessageFormat); 75380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AssertFlattenedObjectsEqual(referenceRecord, testRecord, 75480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru reporter, testStep); 75580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 75680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 75780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 758363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic void TestPdfDevice(skiatest::Reporter* reporter, 759363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger CanvasTestStep* testStep) { 760363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkISize pageSize = SkISize::Make(kWidth, kHeight); 761363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPDFDevice device(pageSize, pageSize, SkMatrix::I()); 762363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkCanvas canvas(&device); 763363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger testStep->setAssertMessageFormat(kPdfAssertMessageFormat); 764363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger testStep->draw(&canvas, reporter); 765363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPDFDocument doc; 766363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger doc.appendPage(&device); 767363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkDynamicMemoryWStream stream; 768363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger doc.emitPDF(&stream); 769363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 770363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 77180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// The following class groups static functions that need to access 77280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// the privates members of SkDeferredCanvas 77380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkDeferredCanvasTester { 77480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 77580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static void TestDeferredCanvasStateConsistency( 77680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru skiatest::Reporter* reporter, 77780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru CanvasTestStep* testStep, 77880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkCanvas& referenceCanvas, bool silent) { 77980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 78080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkBitmap deferredStore; 78180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru createBitmap(&deferredStore, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF); 78280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDevice deferredDevice(deferredStore); 783e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger SkAutoTUnref<SkDeferredCanvas> deferredCanvas(SkDeferredCanvas::Create(&deferredDevice)); 78480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->setAssertMessageFormat(kDeferredDrawAssertMessageFormat); 78558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger testStep->draw(deferredCanvas, reporter); 78680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->setAssertMessageFormat(kDeferredPreFlushAssertMessageFormat); 78758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger AssertCanvasStatesEqual(reporter, deferredCanvas, &referenceCanvas, 78880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep); 78980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 79080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (silent) { 79158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger deferredCanvas->silentFlush(); 79280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } else { 79358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger deferredCanvas->flush(); 79480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 79580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 79680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->setAssertMessageFormat( 79780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru silent ? kDeferredPostSilentFlushPlaybackAssertMessageFormat : 79880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kDeferredPostFlushPlaybackAssertMessageFormat); 79980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AssertCanvasStatesEqual(reporter, 80058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger deferredCanvas->immediateCanvas(), 80180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru &referenceCanvas, testStep); 80280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 80380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // Verified that deferred canvas state is not affected by flushing 80480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // pending draw operations 80580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 80680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // The following test code is commented out because it currently fails. 80780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // Issue: http://code.google.com/p/skia/issues/detail?id=496 80880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /* 80980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->setAssertMessageFormat(kDeferredPostFlushAssertMessageFormat); 81080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AssertCanvasStatesEqual(reporter, &deferredCanvas, &referenceCanvas, 81180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep); 81280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 81380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 81480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 81580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 81680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// unused 81780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void TestProxyCanvasStateConsistency( 81880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru skiatest::Reporter* reporter, 81980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru CanvasTestStep* testStep, 82080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkCanvas& referenceCanvas) { 82180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 82280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkBitmap indirectStore; 82380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru createBitmap(&indirectStore, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF); 82480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDevice indirectDevice(indirectStore); 82580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkCanvas indirectCanvas(&indirectDevice); 82680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkProxyCanvas proxyCanvas(&indirectCanvas); 82780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->setAssertMessageFormat(kProxyDrawAssertMessageFormat); 82880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->draw(&proxyCanvas, reporter); 82980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // Verify that the SkProxyCanvas reports consitent state 83080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->setAssertMessageFormat(kProxyStateAssertMessageFormat); 83180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AssertCanvasStatesEqual(reporter, &proxyCanvas, &referenceCanvas, 83280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep); 83380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // Verify that the indirect canvas reports consitent state 83480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->setAssertMessageFormat(kProxyIndirectStateAssertMessageFormat); 83580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AssertCanvasStatesEqual(reporter, &indirectCanvas, &referenceCanvas, 83680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep); 83780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 83880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 83980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// unused 84080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void TestNWayCanvasStateConsistency( 84180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru skiatest::Reporter* reporter, 84280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru CanvasTestStep* testStep, 84380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkCanvas& referenceCanvas) { 84480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 84580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkBitmap indirectStore1; 84680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru createBitmap(&indirectStore1, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF); 84780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDevice indirectDevice1(indirectStore1); 84880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkCanvas indirectCanvas1(&indirectDevice1); 84980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 85080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkBitmap indirectStore2; 85180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru createBitmap(&indirectStore2, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF); 85280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDevice indirectDevice2(indirectStore2); 85380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkCanvas indirectCanvas2(&indirectDevice2); 85480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 85580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkISize canvasSize = referenceCanvas.getDeviceSize(); 85680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkNWayCanvas nWayCanvas(canvasSize.width(), canvasSize.height()); 85780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru nWayCanvas.addCanvas(&indirectCanvas1); 85880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru nWayCanvas.addCanvas(&indirectCanvas2); 85980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 86080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->setAssertMessageFormat(kNWayDrawAssertMessageFormat); 86180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->draw(&nWayCanvas, reporter); 86280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // Verify that the SkProxyCanvas reports consitent state 86380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->setAssertMessageFormat(kNWayStateAssertMessageFormat); 86480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AssertCanvasStatesEqual(reporter, &nWayCanvas, &referenceCanvas, 86580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep); 86680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // Verify that the indirect canvases report consitent state 86780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->setAssertMessageFormat(kNWayIndirect1StateAssertMessageFormat); 86880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AssertCanvasStatesEqual(reporter, &indirectCanvas1, &referenceCanvas, 86980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep); 87080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->setAssertMessageFormat(kNWayIndirect2StateAssertMessageFormat); 87180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru AssertCanvasStatesEqual(reporter, &indirectCanvas2, &referenceCanvas, 87280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep); 87380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 87480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 87580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 87680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * This sub-test verifies that the test step passes when executed 87780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * with SkCanvas and with classes derrived from SkCanvas. It also verifies 87880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * that the all canvas derivatives report the same state as an SkCanvas 87980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * after having executed the test step. 88080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 88180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void TestOverrideStateConsistency(skiatest::Reporter* reporter, 88280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru CanvasTestStep* testStep) { 88380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkBitmap referenceStore; 88480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru createBitmap(&referenceStore, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF); 88580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDevice referenceDevice(referenceStore); 88680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkCanvas referenceCanvas(&referenceDevice); 88780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->setAssertMessageFormat(kCanvasDrawAssertMessageFormat); 88880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStep->draw(&referenceCanvas, reporter); 88980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 89080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDeferredCanvasTester::TestDeferredCanvasStateConsistency(reporter, testStep, referenceCanvas, false); 89180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 89280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDeferredCanvasTester::TestDeferredCanvasStateConsistency(reporter, testStep, referenceCanvas, true); 89380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 89480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // The following test code is disabled because SkProxyCanvas is 89580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // missing a lot of virtual overrides on get* methods, which are used 89680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // to verify canvas state. 89780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // Issue: http://code.google.com/p/skia/issues/detail?id=500 89880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 89980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (false) { // avoid bit rot, suppress warning 90080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru TestProxyCanvasStateConsistency(reporter, testStep, referenceCanvas); 90180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 90280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 90380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // The following test code is disabled because SkNWayCanvas does not 90480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // report correct clipping and device bounds information 90580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // Issue: http://code.google.com/p/skia/issues/detail?id=501 90680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 90780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (false) { // avoid bit rot, suppress warning 90880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru TestNWayCanvasStateConsistency(reporter, testStep, referenceCanvas); 90980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 91080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 91180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (false) { // avoid bit rot, suppress warning 91280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru test_clipVisitor(reporter, &referenceCanvas); 91380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 91480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 91580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 91680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void TestCanvas(skiatest::Reporter* reporter) { 91780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // Init global here because bitmap pixels cannot be alocated during 91880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // static initialization 91980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kTestBitmap = testBitmap(); 92080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 92180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int testStep = 0; testStep < testStepArray().count(); testStep++) { 92280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru TestOverrideStateConsistency(reporter, testStepArray()[testStep]); 92380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPictureTester::TestPictureFlattenedObjectReuse(reporter, 92480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru testStepArray()[testStep], 0); 925363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger if (testStepArray()[testStep]->enablePdfTesting()) { 926363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger TestPdfDevice(reporter, testStepArray()[testStep]); 927363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 92880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 92980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 93080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // Explicitly call reset(), so we don't leak the pixels (since kTestBitmap is a global) 93180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kTestBitmap.reset(); 93280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 93380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 93480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "TestClassDef.h" 93580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruDEFINE_TESTCLASS("Canvas", TestCanvasClass, TestCanvas) 936