Home | History | Annotate | Download | only in tests
      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 "SkRecord.h"
     11 #include "SkRecords.h"
     12 
     13 // Sums the area of any DrawRect command it sees.
     14 class AreaSummer {
     15 public:
     16     AreaSummer() : fArea(0) {}
     17 
     18     template <typename T> void operator()(const T&) { }
     19 
     20     void operator()(const SkRecords::DrawRect& draw) {
     21         fArea += (int)(draw.rect.width() * draw.rect.height());
     22     }
     23 
     24     int area() const { return fArea; }
     25 
     26     void apply(const SkRecord& record) {
     27         for (unsigned i = 0; i < record.count(); i++) {
     28             record.visit<void>(i, *this);
     29         }
     30     }
     31 
     32 private:
     33     int fArea;
     34 };
     35 
     36 // Scales out the bottom-right corner of any DrawRect command it sees by 2x.
     37 struct Stretch {
     38     template <typename T> void operator()(T*) {}
     39     void operator()(SkRecords::DrawRect* draw) {
     40         draw->rect.fRight *= 2;
     41         draw->rect.fBottom *= 2;
     42     }
     43 
     44     void apply(SkRecord* record) {
     45         for (unsigned i = 0; i < record->count(); i++) {
     46             record->mutate<void>(i, *this);
     47         }
     48     }
     49 };
     50 
     51 // Basic tests for the low-level SkRecord code.
     52 DEF_TEST(Record, r) {
     53     SkRecord record;
     54 
     55     // Add a simple DrawRect command.
     56     SkRect rect = SkRect::MakeWH(10, 10);
     57     SkPaint paint;
     58     SkNEW_PLACEMENT_ARGS(record.append<SkRecords::DrawRect>(), SkRecords::DrawRect, (paint, rect));
     59 
     60     // Its area should be 100.
     61     AreaSummer summer;
     62     summer.apply(record);
     63     REPORTER_ASSERT(r, summer.area() == 100);
     64 
     65     // Scale 2x.
     66     Stretch stretch;
     67     stretch.apply(&record);
     68 
     69     // Now its area should be 100 + 400.
     70     summer.apply(record);
     71     REPORTER_ASSERT(r, summer.area() == 500);
     72 }
     73