blob: 7fbb5811e5b0bd150a6ea20a1510df056a6f9dd8 [file] [log] [blame]
junov@chromium.org1f9767c2012-02-07 16:27:57 +00001
2/*
3 * Copyright 2012 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8#include "Test.h"
9#include "SkBitmap.h"
10#include "SkDeferredCanvas.h"
junov@chromium.org8f9ecbd2012-02-13 21:53:45 +000011#include "SkShader.h"
junov@chromium.org1f9767c2012-02-07 16:27:57 +000012
13
14static const int gWidth = 2;
15static const int gHeight = 2;
16
17static void create(SkBitmap* bm, SkBitmap::Config config, SkColor color) {
18 bm->setConfig(config, gWidth, gHeight);
19 bm->allocPixels();
20 bm->eraseColor(color);
21}
22
23static void TestDeferredCanvasBitmapAccess(skiatest::Reporter* reporter) {
24 SkBitmap store;
25
26 create(&store, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF);
27 SkDevice device(store);
28 SkDeferredCanvas canvas(&device);
29
30 canvas.clear(0x00000000);
31
32 SkAutoLockPixels alp(store);
33 REPORTER_ASSERT(reporter, store.getColor(0,0) == 0xFFFFFFFF); //verify that clear was deferred
34 SkBitmap accessed = canvas.getDevice()->accessBitmap(false);
35 REPORTER_ASSERT(reporter, store.getColor(0,0) == 0x00000000); //verify that clear was executed
36 REPORTER_ASSERT(reporter, accessed.pixelRef() == store.pixelRef());
37}
38
39static void TestDeferredCanvasFlush(skiatest::Reporter* reporter) {
40 SkBitmap store;
41
42 create(&store, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF);
43 SkDevice device(store);
44 SkDeferredCanvas canvas(&device);
45
46 canvas.clear(0x00000000);
47
48 SkAutoLockPixels alp(store);
49 REPORTER_ASSERT(reporter, store.getColor(0,0) == 0xFFFFFFFF); //verify that clear was deferred
50 canvas.flush();
51 REPORTER_ASSERT(reporter, store.getColor(0,0) == 0x00000000); //verify that clear was executed
52}
53
junov@chromium.org8f9ecbd2012-02-13 21:53:45 +000054static void TestDeferredCanvasFreshFrame(skiatest::Reporter* reporter) {
55 SkBitmap store;
56 SkRect fullRect;
57 fullRect.setXYWH(SkIntToScalar(0), SkIntToScalar(0), SkIntToScalar(gWidth),
58 SkIntToScalar(gHeight));
59 SkRect partialRect;
60 partialRect.setXYWH(0, 0, 1, 1);
61 create(&store, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF);
62 SkDevice device(store);
63 SkDeferredCanvas canvas(&device);
64
65 // verify that frame is intially fresh
66 REPORTER_ASSERT(reporter, canvas.getDeferredDevice()->isFreshFrame());
67 // no clearing op since last call to isFreshFrame -> not fresh
68 REPORTER_ASSERT(reporter, !canvas.getDeferredDevice()->isFreshFrame());
69
70 // Verify that clear triggers a fresh frame
71 canvas.clear(0x00000000);
72 REPORTER_ASSERT(reporter, canvas.getDeferredDevice()->isFreshFrame());
73
74 // Verify that clear with saved state triggers a fresh frame
75 canvas.save(SkCanvas::kMatrixClip_SaveFlag);
76 canvas.clear(0x00000000);
77 canvas.restore();
78 REPORTER_ASSERT(reporter, canvas.getDeferredDevice()->isFreshFrame());
79
80 // Verify that clear within a layer does NOT trigger a fresh frame
81 canvas.saveLayer(NULL, NULL, SkCanvas::kARGB_ClipLayer_SaveFlag);
82 canvas.clear(0x00000000);
83 canvas.restore();
84 REPORTER_ASSERT(reporter, !canvas.getDeferredDevice()->isFreshFrame());
85
86 // Verify that a clear with clipping triggers a fresh frame
87 // (clear is not affected by clipping)
88 canvas.save(SkCanvas::kMatrixClip_SaveFlag);
89 canvas.clipRect(partialRect, SkRegion::kIntersect_Op, false);
90 canvas.clear(0x00000000);
91 canvas.restore();
92 REPORTER_ASSERT(reporter, canvas.getDeferredDevice()->isFreshFrame());
93
94 // Verify that full frame rects with different forms of opaque paint
95 // trigger frames to be marked as fresh
96 {
97 SkPaint paint;
98 paint.setStyle( SkPaint::kFill_Style );
99 paint.setAlpha( 255 );
100 canvas.drawRect(fullRect, paint);
101 REPORTER_ASSERT(reporter, canvas.getDeferredDevice()->isFreshFrame());
102 }
103 {
104 SkPaint paint;
105 paint.setStyle( SkPaint::kFill_Style );
106 SkBitmap bmp;
107 create(&bmp, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF);
108 bmp.setIsOpaque(true);
109 SkShader* shader = SkShader::CreateBitmapShader(bmp,
110 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
111 paint.setShader(shader)->unref();
112 canvas.drawRect(fullRect, paint);
113 REPORTER_ASSERT(reporter, canvas.getDeferredDevice()->isFreshFrame());
114 }
115
116 // Verify that full frame rects with different forms of non-opaque paint
117 // do not trigger frames to be marked as fresh
118 {
119 SkPaint paint;
120 paint.setStyle( SkPaint::kFill_Style );
121 paint.setAlpha( 254 );
122 canvas.drawRect(fullRect, paint);
123 REPORTER_ASSERT(reporter, !canvas.getDeferredDevice()->isFreshFrame());
124 }
125 {
126 SkPaint paint;
127 paint.setStyle( SkPaint::kFill_Style );
128 SkBitmap bmp;
129 create(&bmp, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF);
130 bmp.setIsOpaque(false);
131 SkShader* shader = SkShader::CreateBitmapShader(bmp,
132 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
133 paint.setShader(shader)->unref();
134 canvas.drawRect(fullRect, paint);
135 REPORTER_ASSERT(reporter, !canvas.getDeferredDevice()->isFreshFrame());
136 }
137
138 // Verify that incomplete coverage does not trigger a fresh frame
139 {
140 SkPaint paint;
141 paint.setStyle(SkPaint::kFill_Style);
142 paint.setAlpha(255);
143 canvas.drawRect(partialRect, paint);
144 REPORTER_ASSERT(reporter, !canvas.getDeferredDevice()->isFreshFrame());
145 }
146
147 // Verify that incomplete coverage due to clipping does not trigger a fresh
148 // frame
149 {
150 canvas.save(SkCanvas::kMatrixClip_SaveFlag);
151 canvas.clipRect(partialRect, SkRegion::kIntersect_Op, false);
152 SkPaint paint;
153 paint.setStyle(SkPaint::kFill_Style);
154 paint.setAlpha(255);
155 canvas.drawRect(fullRect, paint);
156 REPORTER_ASSERT(reporter, !canvas.getDeferredDevice()->isFreshFrame());
157 }
158
159 // Verify that stroked rect does not trigger a fresh frame
160 {
161 SkPaint paint;
162 paint.setStyle( SkPaint::kStroke_Style );
163 paint.setAlpha( 255 );
164 canvas.drawRect(fullRect, paint);
165 REPORTER_ASSERT(reporter, !canvas.getDeferredDevice()->isFreshFrame());
166 }
167
168 // Verify kSrcMode triggers a fresh frame even with transparent color
169 {
170 SkPaint paint;
171 paint.setStyle( SkPaint::kFill_Style );
172 paint.setAlpha( 100 );
173 paint.setXfermodeMode(SkXfermode::kSrc_Mode);
174 canvas.drawRect(fullRect, paint);
175 REPORTER_ASSERT(reporter, !canvas.getDeferredDevice()->isFreshFrame());
176 }
177}
178
junov@chromium.org1f9767c2012-02-07 16:27:57 +0000179static void TestDeferredCanvas(skiatest::Reporter* reporter) {
180 TestDeferredCanvasBitmapAccess(reporter);
181 TestDeferredCanvasFlush(reporter);
junov@chromium.org8f9ecbd2012-02-13 21:53:45 +0000182 TestDeferredCanvasFreshFrame(reporter);
junov@chromium.org1f9767c2012-02-07 16:27:57 +0000183}
184
185#include "TestClassDef.h"
186DEFINE_TESTCLASS("DeferredCanvas", TestDeferredCanvasClass, TestDeferredCanvas)