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