blob: 58e5de106c48e2bd8bbb6b706d7e1fe50de80eaa [file] [log] [blame]
commit-bot@chromium.org066a28d2014-04-08 17:31:08 +00001#include "Test.h"
2
3#include "SkRecord.h"
4#include "SkRecords.h"
5
commit-bot@chromium.org506db0b2014-04-08 23:31:35 +00006// Sums the area of any DrawRect command it sees.
commit-bot@chromium.org066a28d2014-04-08 17:31:08 +00007class AreaSummer {
8public:
commit-bot@chromium.org506db0b2014-04-08 23:31:35 +00009 AreaSummer() : fArea(0) {}
commit-bot@chromium.org066a28d2014-04-08 17:31:08 +000010
11 template <typename T> void operator()(const T&) { }
12
commit-bot@chromium.org506db0b2014-04-08 23:31:35 +000013 int area() const { return fArea; }
14
commit-bot@chromium.org066a28d2014-04-08 17:31:08 +000015private:
commit-bot@chromium.org506db0b2014-04-08 23:31:35 +000016 int fArea;
commit-bot@chromium.org066a28d2014-04-08 17:31:08 +000017};
18template <> void AreaSummer::operator()(const SkRecords::DrawRect& record) {
commit-bot@chromium.org506db0b2014-04-08 23:31:35 +000019 fArea += (int) (record.rect.width() * record.rect.height());
commit-bot@chromium.org066a28d2014-04-08 17:31:08 +000020}
21
22// Scales out the bottom-right corner of any DrawRect command it sees by 2x.
23struct Stretch {
24 template <typename T> void operator()(T*) {}
25};
26template <> void Stretch::operator()(SkRecords::DrawRect* record) {
27 record->rect.fRight *= 2;
28 record->rect.fBottom *= 2;
29}
30
31// Basic tests for the low-level SkRecord code.
32DEF_TEST(Record, r) {
33 SkRecord record;
34
35 // Add a simple DrawRect command.
36 SkRect rect = SkRect::MakeWH(10, 10);
37 SkPaint paint;
38 SkNEW_PLACEMENT_ARGS(record.append<SkRecords::DrawRect>(), SkRecords::DrawRect, (rect, paint));
39
40 // Its area should be 100.
commit-bot@chromium.org506db0b2014-04-08 23:31:35 +000041 AreaSummer summer;
42 record.visit(summer);
43 REPORTER_ASSERT(r, summer.area() == 100);
commit-bot@chromium.org066a28d2014-04-08 17:31:08 +000044
commit-bot@chromium.org506db0b2014-04-08 23:31:35 +000045 // Scale 2x.
46 Stretch stretch;
47 record.mutate(stretch);
48
49 // Now its area should be 100 + 400.
50 record.visit(summer);
51 REPORTER_ASSERT(r, summer.area() == 500);
commit-bot@chromium.org066a28d2014-04-08 17:31:08 +000052}