OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright 2014 Google Inc. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license that can be | |
5 * found in the LICENSE file. | |
6 */ | |
7 | |
8 #include "SkBBHFactory.h" | |
9 #include "SkCanvas.h" | |
10 #include "SkPictureRecorder.h" | |
11 #include "SkPictureStateTree.h" | |
12 #include "Test.h" | |
13 | |
14 static SkPicture* draw_scene(SkBBHFactory* bbhFactory) { | |
15 SkPictureRecorder recorder; | |
16 SkCanvas* canvas = recorder.beginRecording(200, 200, bbhFactory, 0); | |
17 | |
18 SkPaint p1, p2; | |
19 p1.setStyle(SkPaint::kFill_Style); | |
20 p1.setARGB(0x80, 0, 0xff, 0); | |
21 p2.setStyle(SkPaint::kFill_Style); | |
22 p2.setARGB(0x80, 0xff, 0, 0); | |
23 | |
24 canvas->drawColor(SK_ColorWHITE); | |
25 | |
26 // This is intended to exercise some tricky SkPictureStateTree code paths wh
en | |
27 // played back with various clips: | |
28 // | |
29 // * cleanup/rewind when the last draw is not at the root of the state tre
e. | |
30 // * state nodes with both kSave_Flag & kSaveLayer_Flag set. | |
31 // * state tree transitions which implicitly reset the matrix via. restore
(). | |
32 | |
33 canvas->save(); | |
34 canvas->translate(10, 10); | |
35 | |
36 canvas->drawRect(SkRect::MakeWH(100, 50), p1); | |
37 canvas->drawRect(SkRect::MakeWH(50, 100), p2); | |
38 | |
39 SkRect layerBounds = SkRect::MakeXYWH(0, 0, 90, 90); | |
40 canvas->saveLayer(&layerBounds, NULL); | |
41 canvas->save(); | |
42 canvas->clipRect(layerBounds); | |
43 | |
44 canvas->save(); | |
45 canvas->clipRect(SkRect::MakeWH(25, 25)); | |
46 canvas->rotate(90); | |
47 canvas->drawRect(SkRect::MakeWH(100, 50), p1); | |
48 canvas->restore(); | |
49 | |
50 canvas->save(); | |
51 canvas->clipRect(SkRect::MakeWH(25, 25)); | |
52 canvas->save(); | |
53 canvas->rotate(90); | |
54 canvas->drawRect(SkRect::MakeWH(50, 100), p2); | |
55 canvas->restore(); | |
56 canvas->drawRect(SkRect::MakeWH(100, 50), p1); | |
57 canvas->restore(); | |
58 canvas->drawRect(SkRect::MakeXYWH(99, 99, 1, 1), p1); | |
59 canvas->restore(); | |
60 canvas->restore(); | |
61 | |
62 canvas->restore(); | |
63 | |
64 return recorder.endRecording(); | |
65 } | |
66 | |
67 static void check_bms(skiatest::Reporter* reporter, const SkBitmap& bm1, const S
kBitmap& bm2) { | |
68 SkASSERT(bm1.getSize() == bm2.getSize()); | |
69 REPORTER_ASSERT(reporter, 0 == memcmp(bm1.getAddr(0, 0), bm2.getAddr(0, 0),
bm1.getSize())); | |
70 } | |
71 | |
72 static void test_reference_picture(skiatest::Reporter* reporter) { | |
73 SkRTreeFactory bbhFactory; | |
74 | |
75 SkAutoTUnref<SkPicture> bbhPicture(draw_scene(&bbhFactory)); | |
76 SkAutoTUnref<SkPicture> referencePicture(draw_scene(NULL)); | |
77 | |
78 SkBitmap referenceBitmap; | |
79 referenceBitmap.allocN32Pixels(100, 100); | |
80 SkCanvas referenceCanvas(referenceBitmap); | |
81 | |
82 SkBitmap bbhBitmap; | |
83 bbhBitmap.allocN32Pixels(100, 100); | |
84 SkCanvas bbhCanvas(bbhBitmap); | |
85 | |
86 referenceCanvas.drawColor(SK_ColorTRANSPARENT); | |
87 referenceCanvas.drawPicture(referencePicture.get()); | |
88 bbhCanvas.drawColor(SK_ColorTRANSPARENT); | |
89 bbhCanvas.drawPicture(bbhPicture.get()); | |
90 REPORTER_ASSERT(reporter, | |
91 referenceCanvas.getSaveCount() == bbhCanvas.getSaveCount()); | |
92 REPORTER_ASSERT(reporter, | |
93 referenceCanvas.getTotalMatrix() == bbhCanvas.getTotalMatrix
()); | |
94 check_bms(reporter, referenceBitmap, bbhBitmap); | |
95 | |
96 referenceCanvas.drawColor(SK_ColorTRANSPARENT); | |
97 referenceCanvas.clipRect(SkRect::MakeWH(50, 50)); | |
98 referenceCanvas.drawPicture(referencePicture.get()); | |
99 bbhCanvas.drawColor(SK_ColorTRANSPARENT); | |
100 bbhCanvas.clipRect(SkRect::MakeWH(50, 50)); | |
101 bbhCanvas.drawPicture(bbhPicture.get()); | |
102 REPORTER_ASSERT(reporter, | |
103 referenceCanvas.getSaveCount() == bbhCanvas.getSaveCount()); | |
104 REPORTER_ASSERT(reporter, | |
105 referenceCanvas.getTotalMatrix() == bbhCanvas.getTotalMatrix
()); | |
106 check_bms(reporter, referenceBitmap, bbhBitmap); | |
107 | |
108 referenceCanvas.drawColor(SK_ColorTRANSPARENT); | |
109 referenceCanvas.clipRect(SkRect::MakeWH(10, 10)); | |
110 referenceCanvas.drawPicture(referencePicture.get()); | |
111 bbhCanvas.drawColor(SK_ColorTRANSPARENT); | |
112 bbhCanvas.clipRect(SkRect::MakeWH(10, 10)); | |
113 bbhCanvas.drawPicture(bbhPicture.get()); | |
114 REPORTER_ASSERT(reporter, | |
115 referenceCanvas.getSaveCount() == bbhCanvas.getSaveCount()); | |
116 REPORTER_ASSERT(reporter, | |
117 referenceCanvas.getTotalMatrix() == bbhCanvas.getTotalMatrix
()); | |
118 check_bms(reporter, referenceBitmap, bbhBitmap); | |
119 } | |
120 | |
121 DEF_TEST(PictureStateTree, reporter) { | |
122 test_reference_picture(reporter); | |
123 } | |
OLD | NEW |