Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / tests / RecorderTest.cpp
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 "Test.h"
9
10 #include "SkPictureRecorder.h"
11 #include "SkRecord.h"
12 #include "SkRecorder.h"
13 #include "SkRecords.h"
14 #include "SkShader.h"
15
16 #define COUNT(T) + 1
17 static const int kRecordTypes = SK_RECORD_TYPES(COUNT);
18 #undef COUNT
19
20 // Tallies the types of commands it sees into a histogram.
21 class Tally {
22 public:
23     Tally() { sk_bzero(&fHistogram, sizeof(fHistogram)); }
24
25     template <typename T>
26     void operator()(const T&) { ++fHistogram[T::kType]; }
27
28     template <typename T>
29     int count() const { return fHistogram[T::kType]; }
30
31     void apply(const SkRecord& record) {
32         for (unsigned i = 0; i < record.count(); i++) {
33             record.visit<void>(i, *this);
34         }
35     }
36
37 private:
38     int fHistogram[kRecordTypes];
39 };
40
41 DEF_TEST(Recorder, r) {
42     SkRecord record;
43     SkRecorder recorder(&record, 1920, 1080);
44
45     recorder.drawRect(SkRect::MakeWH(10, 10), SkPaint());
46
47     Tally tally;
48     tally.apply(record);
49     REPORTER_ASSERT(r, 1 == tally.count<SkRecords::DrawRect>());
50 }
51
52 // Regression test for leaking refs held by optional arguments.
53 DEF_TEST(Recorder_RefLeaking, r) {
54     // We use SaveLayer to test:
55     //   - its SkRect argument is optional and SkRect is POD.  Just testing that that works.
56     //   - its SkPaint argument is optional and SkPaint is not POD.  The bug was here.
57
58     SkRect bounds = SkRect::MakeWH(320, 240);
59     SkPaint paint;
60     paint.setShader(SkShader::CreateEmptyShader())->unref();
61
62     REPORTER_ASSERT(r, paint.getShader()->unique());
63     {
64         SkRecord record;
65         SkRecorder recorder(&record, 1920, 1080);
66         recorder.saveLayer(&bounds, &paint);
67         REPORTER_ASSERT(r, !paint.getShader()->unique());
68     }
69     REPORTER_ASSERT(r, paint.getShader()->unique());
70 }
71
72 DEF_TEST(Recorder_RefPictures, r) {
73     SkAutoTUnref<SkPicture> pic;
74
75     {
76         SkPictureRecorder pr;
77         SkCanvas* canvas = pr.beginRecording(100, 100);
78         canvas->drawColor(SK_ColorRED);
79         pic.reset(pr.endRecording());
80     }
81     REPORTER_ASSERT(r, pic->unique());
82
83     {
84         SkRecord record;
85         SkRecorder recorder(&record, 100, 100);
86         recorder.drawPicture(pic);
87         // the recorder should now also be an owner
88         REPORTER_ASSERT(r, !pic->unique());
89     }
90     // the recorder destructor should have released us (back to unique)
91     REPORTER_ASSERT(r, pic->unique());
92 }