SkPageFlipper.cpp revision 0910916c0f7b951ee55c4b7c6358295b9bca0565
10910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
30910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
50910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * you may not use this file except in compliance with the License.
60910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * You may obtain a copy of the License at
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * See the License for the specific language governing permissions and
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * limitations under the License.
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPageFlipper.h"
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkPageFlipper::SkPageFlipper() {
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fWidth = 0;
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fHeight = 0;
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDirty0 = &fDirty0Storage;
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDirty1 = &fDirty1Storage;
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDirty0->setEmpty();
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDirty1->setEmpty();
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkPageFlipper::SkPageFlipper(int width, int height) {
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fWidth = width;
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fHeight = height;
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDirty0 = &fDirty0Storage;
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDirty1 = &fDirty1Storage;
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDirty0->setRect(0, 0, width, height);
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDirty1->setEmpty();
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPageFlipper::resize(int width, int height) {
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fWidth = width;
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fHeight = height;
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // this is the opposite of the constructors
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDirty1->setRect(0, 0, width, height);
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDirty0->setEmpty();
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPageFlipper::inval() {
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDirty1->setRect(0, 0, fWidth, fHeight);
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPageFlipper::inval(const SkIRect& rect) {
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkIRect r;
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    r.set(0, 0, fWidth, fHeight);
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (r.intersect(rect)) {
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fDirty1->op(r, SkRegion::kUnion_Op);
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPageFlipper::inval(const SkRegion& rgn) {
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkRegion r;
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    r.setRect(0, 0, fWidth, fHeight);
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (r.op(rgn, SkRegion::kIntersect_Op)) {
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fDirty1->op(r, SkRegion::kUnion_Op);
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPageFlipper::inval(const SkRect& rect, bool antialias) {
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkIRect r;
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    rect.round(&r);
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (antialias) {
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        r.inset(-1, -1);
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    this->inval(r);
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkRegion& SkPageFlipper::update(SkRegion* copyBits) {
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // Copy over anything new from page0 that isn't dirty in page1
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    copyBits->op(*fDirty0, *fDirty1, SkRegion::kDifference_Op);
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkTSwap<SkRegion*>(fDirty0, fDirty1);
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDirty1->setEmpty();
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return *fDirty0;
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
86