180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2008 The Android Open Source Project
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkFlipPixelRef_DEFINED
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkFlipPixelRef_DEFINED
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkBitmap.h"
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPageFlipper.h"
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPixelRef.h"
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkThread.h"
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkRegion;
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkFlipPixelRef : public SkPixelRef {
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkFlipPixelRef(SkBitmap::Config, int width, int height);
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual ~SkFlipPixelRef();
241d0f5a1e3b467fc2211e2a94b3806770b228b6e0Derek Sollenberger
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool isDirty() const { return fFlipper.isDirty(); }
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkRegion& dirtyRgn() const { return fFlipper.dirtyRgn(); }
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void inval() { fFlipper.inval(); }
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void inval(const SkIRect& rect) { fFlipper.inval(rect); }
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void inval(const SkRegion& rgn) { fFlipper.inval(rgn); }
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void inval(const SkRect& r, bool doAA) { fFlipper.inval(r, doAA); }
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkRegion& beginUpdate(SkBitmap* device);
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void endUpdate();
351d0f5a1e3b467fc2211e2a94b3806770b228b6e0Derek Sollenberger
361d0f5a1e3b467fc2211e2a94b3806770b228b6e0Derek Sollenberger    SK_DECLARE_UNFLATTENABLE_OBJECT()
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void getFrontBack(const void** front, void** back) const {
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (front) {
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            *front = fPage0;
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (back) {
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            *back = fPage1;
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void    swapPages();
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // Helper to copy pixels from srcAddr to the dst bitmap, clipped to clip.
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // srcAddr points to memory with the same config as dst.
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    static void CopyBitsFromAddr(const SkBitmap& dst, const SkRegion& clip,
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                 const void* srcAddr);
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
541d0f5a1e3b467fc2211e2a94b3806770b228b6e0Derek Sollenbergerprotected:
551d0f5a1e3b467fc2211e2a94b3806770b228b6e0Derek Sollenberger    virtual void* onLockPixels(SkColorTable**);
561d0f5a1e3b467fc2211e2a94b3806770b228b6e0Derek Sollenberger    virtual void onUnlockPixels();
571d0f5a1e3b467fc2211e2a94b3806770b228b6e0Derek Sollenberger
581d0f5a1e3b467fc2211e2a94b3806770b228b6e0Derek Sollenbergerprivate:
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMutex         fMutex;
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPageFlipper   fFlipper;
611d0f5a1e3b467fc2211e2a94b3806770b228b6e0Derek Sollenberger
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void*           fStorage;
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void*           fPage0; // points into fStorage;
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void*           fPage1; // points into fStorage;
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    size_t          fSize;  // size of 1 page. fStorage holds 2 pages
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkBitmap::Config fConfig;
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef SkPixelRef INHERITED;
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkAutoFlipUpdate : SkNoncopyable {
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAutoFlipUpdate(SkFlipPixelRef* ref) : fRef(ref) {
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fDirty = &ref->beginUpdate(&fBitmap);
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    ~SkAutoFlipUpdate() {
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (fRef) {
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fRef->endUpdate();
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
811d0f5a1e3b467fc2211e2a94b3806770b228b6e0Derek Sollenberger
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkBitmap& bitmap() const { return fBitmap; }
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkRegion& dirty() const { return *fDirty; }
841d0f5a1e3b467fc2211e2a94b3806770b228b6e0Derek Sollenberger
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // optional. This gets automatically called in the destructor (only once)
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void endUpdate() {
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (fRef) {
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fRef->endUpdate();
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fRef = NULL;
9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkFlipPixelRef* fRef;
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkBitmap        fBitmap;
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkRegion* fDirty;
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
100