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