1 
2 /*
3  * Copyright 2008 The Android Open Source Project
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 
9 
10 #include "SkPageFlipper.h"
11 
SkPageFlipper()12 SkPageFlipper::SkPageFlipper() {
13     fWidth = 0;
14     fHeight = 0;
15     fDirty0 = &fDirty0Storage;
16     fDirty1 = &fDirty1Storage;
17 
18     fDirty0->setEmpty();
19     fDirty1->setEmpty();
20 }
21 
SkPageFlipper(int width,int height)22 SkPageFlipper::SkPageFlipper(int width, int height) {
23     fWidth = width;
24     fHeight = height;
25     fDirty0 = &fDirty0Storage;
26     fDirty1 = &fDirty1Storage;
27 
28     fDirty0->setRect(0, 0, width, height);
29     fDirty1->setEmpty();
30 }
31 
resize(int width,int height)32 void SkPageFlipper::resize(int width, int height) {
33     fWidth = width;
34     fHeight = height;
35 
36     // this is the opposite of the constructors
37     fDirty1->setRect(0, 0, width, height);
38     fDirty0->setEmpty();
39 }
40 
inval()41 void SkPageFlipper::inval() {
42     fDirty1->setRect(0, 0, fWidth, fHeight);
43 }
44 
inval(const SkIRect & rect)45 void SkPageFlipper::inval(const SkIRect& rect) {
46     SkIRect r;
47     r.set(0, 0, fWidth, fHeight);
48     if (r.intersect(rect)) {
49         fDirty1->op(r, SkRegion::kUnion_Op);
50     }
51 }
52 
inval(const SkRegion & rgn)53 void SkPageFlipper::inval(const SkRegion& rgn) {
54     SkRegion r;
55     r.setRect(0, 0, fWidth, fHeight);
56     if (r.op(rgn, SkRegion::kIntersect_Op)) {
57         fDirty1->op(r, SkRegion::kUnion_Op);
58     }
59 }
60 
inval(const SkRect & rect,bool antialias)61 void SkPageFlipper::inval(const SkRect& rect, bool antialias) {
62     SkIRect r;
63     rect.round(&r);
64     if (antialias) {
65         r.inset(-1, -1);
66     }
67     this->inval(r);
68 }
69 
update(SkRegion * copyBits)70 const SkRegion& SkPageFlipper::update(SkRegion* copyBits) {
71     // Copy over anything new from page0 that isn't dirty in page1
72     copyBits->op(*fDirty0, *fDirty1, SkRegion::kDifference_Op);
73     SkTSwap<SkRegion*>(fDirty0, fDirty1);
74     fDirty1->setEmpty();
75     return *fDirty0;
76 }
77