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 #ifndef SkFlipPixelRef_DEFINED 11 #define SkFlipPixelRef_DEFINED 12 13 #include "SkBitmap.h" 14 #include "SkPageFlipper.h" 15 #include "SkPixelRef.h" 16 #include "SkThread.h" 17 18 class SkRegion; 19 20 class SkFlipPixelRef : public SkPixelRef { 21 public: 22 SkFlipPixelRef(SkBitmap::Config, int width, int height); 23 virtual ~SkFlipPixelRef(); 24 isDirty()25 bool isDirty() const { return fFlipper.isDirty(); } dirtyRgn()26 const SkRegion& dirtyRgn() const { return fFlipper.dirtyRgn(); } 27 inval()28 void inval() { fFlipper.inval(); } inval(const SkIRect & rect)29 void inval(const SkIRect& rect) { fFlipper.inval(rect); } inval(const SkRegion & rgn)30 void inval(const SkRegion& rgn) { fFlipper.inval(rgn); } inval(const SkRect & r,bool doAA)31 void inval(const SkRect& r, bool doAA) { fFlipper.inval(r, doAA); } 32 33 const SkRegion& beginUpdate(SkBitmap* device); 34 void endUpdate(); 35 36 private: getFrontBack(const void ** front,void ** back)37 void getFrontBack(const void** front, void** back) const { 38 if (front) { 39 *front = fPage0; 40 } 41 if (back) { 42 *back = fPage1; 43 } 44 } 45 46 void swapPages(); 47 48 // Helper to copy pixels from srcAddr to the dst bitmap, clipped to clip. 49 // srcAddr points to memory with the same config as dst. 50 static void CopyBitsFromAddr(const SkBitmap& dst, const SkRegion& clip, 51 const void* srcAddr); 52 53 // serialization 54 55 public: getFactory()56 virtual Factory getFactory() const { return Create; } 57 virtual void flatten(SkFlattenableWriteBuffer&) const; 58 static SkPixelRef* Create(SkFlattenableReadBuffer& buffer); 59 60 SK_DECLARE_PIXEL_REF_REGISTRAR() 61 62 protected: 63 virtual void* onLockPixels(SkColorTable**); 64 virtual void onUnlockPixels(); 65 66 SkFlipPixelRef(SkFlattenableReadBuffer&); 67 68 private: 69 SkMutex fMutex; 70 SkPageFlipper fFlipper; 71 72 void* fStorage; 73 void* fPage0; // points into fStorage; 74 void* fPage1; // points into fStorage; 75 size_t fSize; // size of 1 page. fStorage holds 2 pages 76 SkBitmap::Config fConfig; 77 78 typedef SkPixelRef INHERITED; 79 }; 80 81 class SkAutoFlipUpdate : SkNoncopyable { 82 public: SkAutoFlipUpdate(SkFlipPixelRef * ref)83 SkAutoFlipUpdate(SkFlipPixelRef* ref) : fRef(ref) { 84 fDirty = &ref->beginUpdate(&fBitmap); 85 } ~SkAutoFlipUpdate()86 ~SkAutoFlipUpdate() { 87 if (fRef) { 88 fRef->endUpdate(); 89 } 90 } 91 bitmap()92 const SkBitmap& bitmap() const { return fBitmap; } dirty()93 const SkRegion& dirty() const { return *fDirty; } 94 95 // optional. This gets automatically called in the destructor (only once) endUpdate()96 void endUpdate() { 97 if (fRef) { 98 fRef->endUpdate(); 99 fRef = NULL; 100 } 101 } 102 103 private: 104 SkFlipPixelRef* fRef; 105 SkBitmap fBitmap; 106 const SkRegion* fDirty; 107 }; 108 109 #endif 110