CanvasStateTest.cpp revision 15a140599942f70e47380e3f700a825c7cece3b4
15587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com/*
25587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com * Copyright 2013 Google Inc.
35587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com *
45587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com * Use of this source code is governed by a BSD-style license that can be
55587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com * found in the LICENSE file.
65587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com */
75587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
85587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com#include "SkBitmapDevice.h"
95587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com#include "SkCanvas.h"
105587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com#include "SkCanvasStateUtils.h"
115587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com#include "SkDrawFilter.h"
1207f6cf372dc003694c79cfb313923fef9eaf8dc8commit-bot@chromium.org#include "SkError.h"
135587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com#include "SkPaint.h"
145587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com#include "SkRRect.h"
158f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "SkRect.h"
168f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h"
175587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
185587ac09beec4c056332504f3fa85990520b43fddjsollen@google.comstatic void test_complex_layers(skiatest::Reporter* reporter) {
195587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    const int WIDTH = 400;
205587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    const int HEIGHT = 400;
215587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    const int SPACER = 10;
225587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
2320146b3f7339d2c71c416397135e70e34f7fedb1djsollen@google.com    SkRect rect = SkRect::MakeXYWH(SkIntToScalar(SPACER), SkIntToScalar(SPACER),
2420146b3f7339d2c71c416397135e70e34f7fedb1djsollen@google.com                                   SkIntToScalar(WIDTH-(2*SPACER)),
2520146b3f7339d2c71c416397135e70e34f7fedb1djsollen@google.com                                   SkIntToScalar((HEIGHT-(2*SPACER)) / 7));
265587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
27fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org    const SkColorType colorTypes[] = {
28fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org        kRGB_565_SkColorType, kPMColor_SkColorType
295587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    };
30fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org    const int configCount = sizeof(colorTypes) / sizeof(SkBitmap::Config);
315587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
325587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    const int layerAlpha[] = { 255, 255, 0 };
335587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    const SkCanvas::SaveFlags flags[] = { SkCanvas::kARGB_NoClipLayer_SaveFlag,
345587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                                          SkCanvas::kARGB_ClipLayer_SaveFlag,
355587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                                          SkCanvas::kARGB_NoClipLayer_SaveFlag
365587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    };
375587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    REPORTER_ASSERT(reporter, sizeof(layerAlpha) == sizeof(flags));
385587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    const int layerCombinations = sizeof(layerAlpha) / sizeof(int);
395587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
405587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    for (int i = 0; i < configCount; ++i) {
415587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com        SkBitmap bitmaps[2];
425587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com        for (int j = 0; j < 2; ++j) {
43fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org            bitmaps[j].allocPixels(SkImageInfo::Make(WIDTH, HEIGHT,
44fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org                                                     colorTypes[i],
45fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org                                                     kPremul_SkAlphaType));
465587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
475587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com            SkCanvas canvas(bitmaps[j]);
485587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
495587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com            canvas.drawColor(SK_ColorRED);
505587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
515587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com            for (int k = 0; k < layerCombinations; ++k) {
525587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                // draw a rect within the layer's bounds and again outside the layer's bounds
535587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                canvas.saveLayerAlpha(&rect, layerAlpha[k], flags[k]);
545587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
555587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                SkCanvasState* state = NULL;
565587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                SkCanvas* tmpCanvas = NULL;
575587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                if (j) {
585587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                    state = SkCanvasStateUtils::CaptureCanvasState(&canvas);
595587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                    REPORTER_ASSERT(reporter, state);
605587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                    tmpCanvas = SkCanvasStateUtils::CreateFromCanvasState(state);
615587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                    REPORTER_ASSERT(reporter, tmpCanvas);
625587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                } else {
635587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                    tmpCanvas = SkRef(&canvas);
645587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                }
655587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
665587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                SkPaint bluePaint;
675587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                bluePaint.setColor(SK_ColorBLUE);
685587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                bluePaint.setStyle(SkPaint::kFill_Style);
695587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
705587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                tmpCanvas->drawRect(rect, bluePaint);
715587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                tmpCanvas->translate(0, rect.height() + SPACER);
725587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                tmpCanvas->drawRect(rect, bluePaint);
735587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
745587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                tmpCanvas->unref();
755587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                SkCanvasStateUtils::ReleaseCanvasState(state);
765587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
775587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                canvas.restore();
785587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
795587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                // translate the canvas for the next iteration
805587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                canvas.translate(0, 2*(rect.height() + SPACER));
815587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com            }
825587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com        }
835587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
845587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com        // now we memcmp the two bitmaps
855587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com        REPORTER_ASSERT(reporter, bitmaps[0].getSize() == bitmaps[1].getSize());
865587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com        REPORTER_ASSERT(reporter, !memcmp(bitmaps[0].getPixels(),
875587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                                          bitmaps[1].getPixels(),
885587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com                                          bitmaps[0].getSize()));
895587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    }
905587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com}
915587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
925587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com////////////////////////////////////////////////////////////////////////////////
935587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
94339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.comstatic void test_complex_clips(skiatest::Reporter* reporter) {
95339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
96339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    const int WIDTH = 400;
97339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    const int HEIGHT = 400;
981037c7b9f2f0220c4f0a90faebe3c89d4981c1e3djsollen@google.com    const int SPACER = 10;
99339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
1001037c7b9f2f0220c4f0a90faebe3c89d4981c1e3djsollen@google.com    SkIRect layerRect = SkIRect::MakeWH(WIDTH, HEIGHT / 4);
101339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    layerRect.inset(2*SPACER, 2*SPACER);
102339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
1031037c7b9f2f0220c4f0a90faebe3c89d4981c1e3djsollen@google.com    SkIRect clipRect = layerRect;
104339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    clipRect.fRight = clipRect.fLeft + (clipRect.width() / 2) - (2*SPACER);
105339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    clipRect.outset(SPACER, SPACER);
106339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
1071037c7b9f2f0220c4f0a90faebe3c89d4981c1e3djsollen@google.com    SkIRect regionBounds = clipRect;
108339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    regionBounds.offset(clipRect.width() + (2*SPACER), 0);
109339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
110339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    SkIRect regionInterior = regionBounds;
111339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    regionInterior.inset(SPACER*3, SPACER*3);
112339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
113339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    SkRegion clipRegion;
114339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    clipRegion.setRect(regionBounds);
115339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    clipRegion.op(regionInterior, SkRegion::kDifference_Op);
116339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
117339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
118339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    const SkRegion::Op clipOps[] = { SkRegion::kIntersect_Op,
119339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com                                     SkRegion::kIntersect_Op,
120339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com                                     SkRegion::kReplace_Op,
121339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    };
122339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    const SkCanvas::SaveFlags flags[] = { SkCanvas::kARGB_NoClipLayer_SaveFlag,
123339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com                                          SkCanvas::kARGB_ClipLayer_SaveFlag,
124339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com                                          SkCanvas::kARGB_NoClipLayer_SaveFlag,
125339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    };
126339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    REPORTER_ASSERT(reporter, sizeof(clipOps) == sizeof(flags));
127339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    const int layerCombinations = sizeof(flags) / sizeof(SkCanvas::SaveFlags);
128339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
129339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    SkBitmap bitmaps[2];
130339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    for (int i = 0; i < 2; ++i) {
131fa9e5fa42a555712fb7a29d08d2ae2bdef0ed68ecommit-bot@chromium.org        bitmaps[i].allocN32Pixels(WIDTH, HEIGHT);
132339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
133339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com        SkCanvas canvas(bitmaps[i]);
134339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
135339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com        canvas.drawColor(SK_ColorRED);
136339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
137339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com        SkRegion localRegion = clipRegion;
138339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
139339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com        for (int j = 0; j < layerCombinations; ++j) {
1401037c7b9f2f0220c4f0a90faebe3c89d4981c1e3djsollen@google.com            SkRect layerBounds = SkRect::Make(layerRect);
1411037c7b9f2f0220c4f0a90faebe3c89d4981c1e3djsollen@google.com            canvas.saveLayerAlpha(&layerBounds, 128, flags[j]);
142339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
143339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com            SkCanvasState* state = NULL;
144339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com            SkCanvas* tmpCanvas = NULL;
145339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com            if (i) {
146339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com                state = SkCanvasStateUtils::CaptureCanvasState(&canvas);
147339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com                REPORTER_ASSERT(reporter, state);
148339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com                tmpCanvas = SkCanvasStateUtils::CreateFromCanvasState(state);
149339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com                REPORTER_ASSERT(reporter, tmpCanvas);
150339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com            } else {
151339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com                tmpCanvas = SkRef(&canvas);
152339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com            }
153339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
154339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com            tmpCanvas->save();
1551037c7b9f2f0220c4f0a90faebe3c89d4981c1e3djsollen@google.com            tmpCanvas->clipRect(SkRect::Make(clipRect), clipOps[j]);
156339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com            tmpCanvas->drawColor(SK_ColorBLUE);
157339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com            tmpCanvas->restore();
158339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
159339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com            tmpCanvas->clipRegion(localRegion, clipOps[j]);
160339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com            tmpCanvas->drawColor(SK_ColorBLUE);
161339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
162339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com            tmpCanvas->unref();
163339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com            SkCanvasStateUtils::ReleaseCanvasState(state);
164339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
165339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com            canvas.restore();
166339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
167339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com            // translate the canvas and region for the next iteration
1681037c7b9f2f0220c4f0a90faebe3c89d4981c1e3djsollen@google.com            canvas.translate(0, SkIntToScalar(2*(layerRect.height() + (SPACER))));
169339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com            localRegion.translate(0, 2*(layerRect.height() + SPACER));
170339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com        }
171339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    }
172339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
173339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    // now we memcmp the two bitmaps
174339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    REPORTER_ASSERT(reporter, bitmaps[0].getSize() == bitmaps[1].getSize());
175339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    REPORTER_ASSERT(reporter, !memcmp(bitmaps[0].getPixels(),
176339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com                                      bitmaps[1].getPixels(),
177339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com                                      bitmaps[0].getSize()));
178339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com}
179339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
180339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com////////////////////////////////////////////////////////////////////////////////
181339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com
1825587ac09beec4c056332504f3fa85990520b43fddjsollen@google.comclass TestDrawFilter : public SkDrawFilter {
1835587ac09beec4c056332504f3fa85990520b43fddjsollen@google.compublic:
1845587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    virtual bool filter(SkPaint*, Type) SK_OVERRIDE { return true; }
1855587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com};
1865587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
1875587ac09beec4c056332504f3fa85990520b43fddjsollen@google.comstatic void test_draw_filters(skiatest::Reporter* reporter) {
1885587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    TestDrawFilter drawFilter;
18915a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org    SkBitmap bitmap;
19015a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org    bitmap.allocN32Pixels(10, 10);
19115a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org    SkCanvas canvas(bitmap);
1925587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
1935587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    canvas.setDrawFilter(&drawFilter);
1945587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
1955587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    SkCanvasState* state = SkCanvasStateUtils::CaptureCanvasState(&canvas);
1965587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    REPORTER_ASSERT(reporter, state);
1975587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    SkCanvas* tmpCanvas = SkCanvasStateUtils::CreateFromCanvasState(state);
1985587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    REPORTER_ASSERT(reporter, tmpCanvas);
1995587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
2005587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    REPORTER_ASSERT(reporter, NULL != canvas.getDrawFilter());
2015587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    REPORTER_ASSERT(reporter, NULL == tmpCanvas->getDrawFilter());
2025587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
2035587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    tmpCanvas->unref();
2045587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    SkCanvasStateUtils::ReleaseCanvasState(state);
2055587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com}
2065587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
2075587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com////////////////////////////////////////////////////////////////////////////////
2085587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
20907f6cf372dc003694c79cfb313923fef9eaf8dc8commit-bot@chromium.org// we need this function to prevent SkError from printing to stdout
21007f6cf372dc003694c79cfb313923fef9eaf8dc8commit-bot@chromium.orgstatic void error_callback(SkError code, void* ctx) {}
21107f6cf372dc003694c79cfb313923fef9eaf8dc8commit-bot@chromium.org
2125587ac09beec4c056332504f3fa85990520b43fddjsollen@google.comstatic void test_soft_clips(skiatest::Reporter* reporter) {
21315a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org    SkBitmap bitmap;
21415a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org    bitmap.allocN32Pixels(10, 10);
21515a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org    SkCanvas canvas(bitmap);
2165587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
2175587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    SkRRect roundRect;
2185587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    roundRect.setOval(SkRect::MakeWH(5, 5));
2195587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
2205587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    canvas.clipRRect(roundRect, SkRegion::kIntersect_Op, true);
2215587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
22207f6cf372dc003694c79cfb313923fef9eaf8dc8commit-bot@chromium.org    SkSetErrorCallback(error_callback, NULL);
22307f6cf372dc003694c79cfb313923fef9eaf8dc8commit-bot@chromium.org
2245587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    SkCanvasState* state = SkCanvasStateUtils::CaptureCanvasState(&canvas);
2255587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    REPORTER_ASSERT(reporter, !state);
22607f6cf372dc003694c79cfb313923fef9eaf8dc8commit-bot@chromium.org
22707f6cf372dc003694c79cfb313923fef9eaf8dc8commit-bot@chromium.org    REPORTER_ASSERT(reporter, kInvalidOperation_SkError == SkGetLastError());
22807f6cf372dc003694c79cfb313923fef9eaf8dc8commit-bot@chromium.org    SkClearLastError();
2295587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com}
2305587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com
231e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(CanvasState, reporter) {
2325587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    test_complex_layers(reporter);
233339e79fbeabae18a8b9ea094293c7c25eaf9dd68djsollen@google.com    test_complex_clips(reporter);
2345587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    test_draw_filters(reporter);
2355587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com    test_soft_clips(reporter);
2365587ac09beec4c056332504f3fa85990520b43fddjsollen@google.com}
237