ec3ed6a5eb
I have manually examined all of these diffs and restored a few files that seem to require manual adjustment. The following files still need to be modified manually, in a separate CL: android_sample/SampleApp/AndroidManifest.xml android_sample/SampleApp/res/layout/layout.xml android_sample/SampleApp/res/menu/sample.xml android_sample/SampleApp/res/values/strings.xml android_sample/SampleApp/src/com/skia/sampleapp/SampleApp.java android_sample/SampleApp/src/com/skia/sampleapp/SampleView.java experimental/CiCarbonSampleMain.c experimental/CocoaDebugger/main.m experimental/FileReaderApp/main.m experimental/SimpleCocoaApp/main.m experimental/iOSSampleApp/Shared/SkAlertPrompt.h experimental/iOSSampleApp/Shared/SkAlertPrompt.m experimental/iOSSampleApp/SkiOSSampleApp-Base.xcconfig experimental/iOSSampleApp/SkiOSSampleApp-Debug.xcconfig experimental/iOSSampleApp/SkiOSSampleApp-Release.xcconfig gpu/src/android/GrGLDefaultInterface_android.cpp gyp/common.gypi gyp_skia include/ports/SkHarfBuzzFont.h include/views/SkOSWindow_wxwidgets.h make.bat make.py src/opts/memset.arm.S src/opts/memset16_neon.S src/opts/memset32_neon.S src/opts/opts_check_arm.cpp src/ports/SkDebug_brew.cpp src/ports/SkMemory_brew.cpp src/ports/SkOSFile_brew.cpp src/ports/SkXMLParser_empty.cpp src/utils/ios/SkImageDecoder_iOS.mm src/utils/ios/SkOSFile_iOS.mm src/utils/ios/SkStream_NSData.mm tests/FillPathTest.cpp Review URL: http://codereview.appspot.com/4816058 git-svn-id: http://skia.googlecode.com/svn/trunk@1982 2bbb7eff-a529-9590-31e7-b0007b416f81
108 lines
2.7 KiB
C++
108 lines
2.7 KiB
C++
|
|
/*
|
|
* 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.
|
|
*/
|
|
|
|
|
|
#ifndef SkFlipPixelRef_DEFINED
|
|
#define SkFlipPixelRef_DEFINED
|
|
|
|
#include "SkBitmap.h"
|
|
#include "SkPageFlipper.h"
|
|
#include "SkPixelRef.h"
|
|
#include "SkThread.h"
|
|
|
|
class SkRegion;
|
|
|
|
class SkFlipPixelRef : public SkPixelRef {
|
|
public:
|
|
SkFlipPixelRef(SkBitmap::Config, int width, int height);
|
|
virtual ~SkFlipPixelRef();
|
|
|
|
bool isDirty() const { return fFlipper.isDirty(); }
|
|
const SkRegion& dirtyRgn() const { return fFlipper.dirtyRgn(); }
|
|
|
|
void inval() { fFlipper.inval(); }
|
|
void inval(const SkIRect& rect) { fFlipper.inval(rect); }
|
|
void inval(const SkRegion& rgn) { fFlipper.inval(rgn); }
|
|
void inval(const SkRect& r, bool doAA) { fFlipper.inval(r, doAA); }
|
|
|
|
const SkRegion& beginUpdate(SkBitmap* device);
|
|
void endUpdate();
|
|
|
|
private:
|
|
void getFrontBack(const void** front, void** back) const {
|
|
if (front) {
|
|
*front = fPage0;
|
|
}
|
|
if (back) {
|
|
*back = fPage1;
|
|
}
|
|
}
|
|
|
|
void swapPages();
|
|
|
|
// Helper to copy pixels from srcAddr to the dst bitmap, clipped to clip.
|
|
// srcAddr points to memory with the same config as dst.
|
|
static void CopyBitsFromAddr(const SkBitmap& dst, const SkRegion& clip,
|
|
const void* srcAddr);
|
|
|
|
// serialization
|
|
|
|
public:
|
|
virtual Factory getFactory() const { return Create; }
|
|
virtual void flatten(SkFlattenableWriteBuffer&) const;
|
|
static SkPixelRef* Create(SkFlattenableReadBuffer& buffer);
|
|
|
|
protected:
|
|
virtual void* onLockPixels(SkColorTable**);
|
|
virtual void onUnlockPixels();
|
|
|
|
SkFlipPixelRef(SkFlattenableReadBuffer&);
|
|
|
|
private:
|
|
SkMutex fMutex;
|
|
SkPageFlipper fFlipper;
|
|
|
|
void* fStorage;
|
|
void* fPage0; // points into fStorage;
|
|
void* fPage1; // points into fStorage;
|
|
size_t fSize; // size of 1 page. fStorage holds 2 pages
|
|
SkBitmap::Config fConfig;
|
|
|
|
typedef SkPixelRef INHERITED;
|
|
};
|
|
|
|
class SkAutoFlipUpdate : SkNoncopyable {
|
|
public:
|
|
SkAutoFlipUpdate(SkFlipPixelRef* ref) : fRef(ref) {
|
|
fDirty = &ref->beginUpdate(&fBitmap);
|
|
}
|
|
~SkAutoFlipUpdate() {
|
|
if (fRef) {
|
|
fRef->endUpdate();
|
|
}
|
|
}
|
|
|
|
const SkBitmap& bitmap() const { return fBitmap; }
|
|
const SkRegion& dirty() const { return *fDirty; }
|
|
|
|
// optional. This gets automatically called in the destructor (only once)
|
|
void endUpdate() {
|
|
if (fRef) {
|
|
fRef->endUpdate();
|
|
fRef = NULL;
|
|
}
|
|
}
|
|
|
|
private:
|
|
SkFlipPixelRef* fRef;
|
|
SkBitmap fBitmap;
|
|
const SkRegion* fDirty;
|
|
};
|
|
|
|
#endif
|