
/*
 * Copyright 2008 The Android Open Source Project
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */


#include "SkPageFlipper.h"

SkPageFlipper::SkPageFlipper() {
    fWidth = 0;
    fHeight = 0;
    fDirty0 = &fDirty0Storage;
    fDirty1 = &fDirty1Storage;

    fDirty0->setEmpty();
    fDirty1->setEmpty();
}

SkPageFlipper::SkPageFlipper(int width, int height) {
    fWidth = width;
    fHeight = height;
    fDirty0 = &fDirty0Storage;
    fDirty1 = &fDirty1Storage;

    fDirty0->setRect(0, 0, width, height);
    fDirty1->setEmpty();
}

void SkPageFlipper::resize(int width, int height) {
    fWidth = width;
    fHeight = height;
    
    // this is the opposite of the constructors
    fDirty1->setRect(0, 0, width, height);
    fDirty0->setEmpty();
}

void SkPageFlipper::inval() {
    fDirty1->setRect(0, 0, fWidth, fHeight);
}

void SkPageFlipper::inval(const SkIRect& rect) {
    SkIRect r;
    r.set(0, 0, fWidth, fHeight);
    if (r.intersect(rect)) {
        fDirty1->op(r, SkRegion::kUnion_Op);
    }
}

void SkPageFlipper::inval(const SkRegion& rgn) {
    SkRegion r;
    r.setRect(0, 0, fWidth, fHeight);
    if (r.op(rgn, SkRegion::kIntersect_Op)) {
        fDirty1->op(r, SkRegion::kUnion_Op);
    }
}

void SkPageFlipper::inval(const SkRect& rect, bool antialias) {
    SkIRect r;
    rect.round(&r);
    if (antialias) {
        r.inset(-1, -1);
    }
    this->inval(r);
}

const SkRegion& SkPageFlipper::update(SkRegion* copyBits) {
    // Copy over anything new from page0 that isn't dirty in page1
    copyBits->op(*fDirty0, *fDirty1, SkRegion::kDifference_Op);
    SkTSwap<SkRegion*>(fDirty0, fDirty1);
    fDirty1->setEmpty();
    return *fDirty0;
}


