aboutsummaryrefslogtreecommitdiffhomepage
path: root/samplecode/SampleApp.cpp
diff options
context:
space:
mode:
authorGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-01-18 20:57:22 +0000
committerGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-01-18 20:57:22 +0000
commit2e7b43d33cc495663cb814a7a9d1ecdc09c31828 (patch)
tree10d01113bbac30d6e3b121d4a9ab5552a6567fd6 /samplecode/SampleApp.cpp
parent44b2c73ca6358ba9c4a413d7b39db7991612a6a2 (diff)
Remove notion of default rendertarget. This doesn't map well to usage patterns outside sample app. Make binding between SkGpuDevice and a GrRenderTarget more explicit. Create method on GrContext to wrap the current target in the 3D API with a GrRenderTarget.
git-svn-id: http://skia.googlecode.com/svn/trunk@706 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'samplecode/SampleApp.cpp')
-rw-r--r--samplecode/SampleApp.cpp148
1 files changed, 86 insertions, 62 deletions
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index 9600b95c8f..bf8cb6bc01 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -36,7 +36,7 @@ SkViewRegister::SkViewRegister(SkViewFactory fact) : fFact(fact) {
gHead = NULL;
gOnce = true;
}
-
+
fChain = gHead;
gHead = this;
}
@@ -45,21 +45,6 @@ SkViewRegister::SkViewRegister(SkViewFactory fact) : fFact(fact) {
#define SK_USE_SHADERS
#endif
-static GrContext* get_global_grctx(SkOSWindow* oswin) {
- // should be pthread-local at least
- static GrContext* ctx;
- if (NULL == ctx) {
-#if defined(SK_SUPPORT_GL)
- #if defined(SK_USE_SHADERS)
- ctx = GrContext::Create(GrGpu::kOpenGL_Shaders_Engine, NULL);
- #else
- ctx = GrContext::Create(GrGpu::kOpenGL_Fixed_Engine, NULL);
- #endif
-#endif
- }
- return ctx;
-}
-
//////////////////////////////////////////////////////////////////////////////
static const char gCharEvtName[] = "SampleCode_Char_Event";
@@ -156,12 +141,12 @@ protected:
virtual bool onHandleKey(SkKey key);
virtual bool onHandleChar(SkUnichar);
virtual void onSizeChange();
-
+
virtual SkCanvas* beforeChildren(SkCanvas*);
virtual void afterChildren(SkCanvas*);
virtual void beforeChild(SkView* child, SkCanvas* canvas);
virtual void afterChild(SkView* child, SkCanvas* canvas);
-
+
virtual bool onEvent(const SkEvent& evt);
virtual bool onQuery(SkEvent* evt);
@@ -170,18 +155,21 @@ protected:
virtual bool handleEvent(const SkEvent& evt);
virtual bool handleKey(SkKey key);
virtual bool handleKeyUp(SkKey key);
-
+
virtual bool onClick(Click* click);
virtual Click* onFindClickHandler(SkScalar x, SkScalar y);
virtual bool onHandleKeyUp(SkKey key);
#endif
+
private:
int fCurrIndex;
-
+
SkPicture* fPicture;
SkGpuCanvas* fGpuCanvas;
+ GrContext* fGrContext;
+ GrRenderTarget* fGrRenderTarget;
SkPath fClipPath;
-
+
enum CanvasType {
kRaster_CanvasType,
kPicture_CanvasType,
@@ -196,9 +184,11 @@ private:
bool fRotate;
bool fScale;
bool fRequestGrabImage;
-
+
int fScrollTestX, fScrollTestY;
-
+
+ bool make3DReady();
+
void loadView(SkView*);
void updateTitle();
bool nextSample();
@@ -209,13 +199,48 @@ private:
evt->post(this->getSinkID(), ANIMATING_DELAY);
}
}
-
-
+
+
static CanvasType cycle_canvastype(CanvasType);
typedef SkOSWindow INHERITED;
};
+bool SampleWindow::make3DReady() {
+
+#if defined(SK_SUPPORT_GL)
+ #if defined(USE_OFFSCREEN)
+ // first clear the raster bitmap, so we don't see any leftover bits
+ bitmap.eraseColor(0);
+ // now setup our glcanvas
+ attachGL(&bitmap);
+ #else
+ attachGL(NULL);
+ #endif
+
+ if (NULL == fGrContext) {
+ SkASSERT(NULL == fGrRenderTarget);
+ #if defined(SK_USE_SHADERS)
+ fGrContext = GrContext::Create(GrGpu::kOpenGL_Shaders_Engine, NULL);
+ #else
+ fGrContext = GrContext::Create(GrGpu::kOpenGL_Fixed_Engine, NULL);
+ #endif
+ if (NULL != fGrContext) {
+ fGrRenderTarget = fGrContext->createRenderTargetFrom3DApiState();
+ }
+ }
+
+ if (NULL != fGrContext) {
+ SkASSERT(NULL != fGrRenderTarget);
+ return true;
+ } else {
+ detachGL();
+ }
+#endif
+ SkDebugf("Failed to setup 3D");
+ return false;
+}
+
SampleWindow::CanvasType SampleWindow::cycle_canvastype(CanvasType ct) {
static const CanvasType gCT[] = {
kPicture_CanvasType,
@@ -229,6 +254,9 @@ SampleWindow::SampleWindow(void* hwnd) : INHERITED(hwnd) {
fPicture = NULL;
fGpuCanvas = NULL;
+ fGrContext = NULL;
+ fGrRenderTarget = NULL;
+
#ifdef DEFAULT_TO_GPU
fCanvasType = kGPU_CanvasType;
#else
@@ -263,6 +291,12 @@ SampleWindow::SampleWindow(void* hwnd) : INHERITED(hwnd) {
SampleWindow::~SampleWindow() {
delete fPicture;
delete fGpuCanvas;
+ if (NULL != fGrRenderTarget) {
+ fGrRenderTarget->unref();
+ }
+ if (NULL != fGrContext) {
+ fGrContext->unref();
+ }
}
static SkBitmap capture_bitmap(SkCanvas* canvas) {
@@ -275,7 +309,7 @@ static SkBitmap capture_bitmap(SkCanvas* canvas) {
static bool bitmap_diff(SkCanvas* canvas, const SkBitmap& orig,
SkBitmap* diff) {
const SkBitmap& src = canvas->getDevice()->accessBitmap(false);
-
+
SkAutoLockPixels alp0(src);
SkAutoLockPixels alp1(orig);
for (int y = 0; y < src.height(); y++) {
@@ -324,7 +358,7 @@ void SampleWindow::draw(SkCanvas* canvas) {
this->INHERITED::draw(canvas);
}
}
-
+
SkBitmap diff;
if (bitmap_diff(canvas, orig, &diff)) {
}
@@ -360,13 +394,13 @@ static void reverseRedAndBlue(const SkBitmap& bm) {
SkCanvas* SampleWindow::beforeChildren(SkCanvas* canvas) {
SkIPoint viewport;
bool alreadyGPU = canvas->getViewport(&viewport);
-
+
if (kGPU_CanvasType != fCanvasType) {
#ifdef SK_SUPPORT_GL
detachGL();
-#endif
+#endif
}
-
+
switch (fCanvasType) {
case kRaster_CanvasType:
canvas = this->INHERITED::beforeChildren(canvas);
@@ -376,27 +410,17 @@ SkCanvas* SampleWindow::beforeChildren(SkCanvas* canvas) {
canvas = fPicture->beginRecording(9999, 9999);
break;
case kGPU_CanvasType: {
- if (!alreadyGPU) {
+ if (!alreadyGPU && make3DReady()) {
SkDevice* device = canvas->getDevice();
- const SkBitmap& bitmap = device->accessBitmap(true);
-#ifdef SK_SUPPORT_GL
- #ifdef USE_OFFSCREEN
- // first clear the raster bitmap, so we don't see any leftover bits
- bitmap.eraseColor(0);
- // now setup our glcanvas
- attachGL(&bitmap);
- #else
- attachGL(NULL);
- #endif
- glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
-#endif
- fGpuCanvas = new SkGpuCanvas(get_global_grctx(this));
+ const SkBitmap& bitmap = device->accessBitmap(true);
+
+ fGpuCanvas = new SkGpuCanvas(fGrContext, fGrRenderTarget);
device = fGpuCanvas->createDevice(SkBitmap::kARGB_8888_Config,
bitmap.width(), bitmap.height(),
false, false);
fGpuCanvas->setDevice(device)->unref();
canvas = fGpuCanvas;
-
+
} else {
canvas = this->INHERITED::beforeChildren(canvas);
}
@@ -425,7 +449,7 @@ static void paint_rgn(const SkBitmap& bm, const SkIRect& r,
void SampleWindow::afterChildren(SkCanvas* orig) {
if (fRequestGrabImage) {
fRequestGrabImage = false;
-
+
SkCanvas* canvas = fGpuCanvas ? fGpuCanvas : orig;
SkDevice* device = canvas->getDevice();
SkBitmap bitmap;
@@ -452,7 +476,7 @@ void SampleWindow::afterChildren(SkCanvas* orig) {
SkDynamicMemoryWStream ostream;
fPicture->serialize(&ostream);
fPicture->unref();
-
+
SkMemoryStream istream(ostream.getStream(), ostream.getOffset());
SkPicture pict(&istream);
orig->drawPicture(pict);
@@ -473,7 +497,7 @@ void SampleWindow::afterChildren(SkCanvas* orig) {
break;
#endif
}
-
+
// if ((fScrollTestX | fScrollTestY) != 0)
if (false) {
const SkBitmap& bm = orig->getDevice()->accessBitmap(true);
@@ -481,7 +505,7 @@ void SampleWindow::afterChildren(SkCanvas* orig) {
int dy = fScrollTestY * 7;
SkIRect r;
SkRegion inval;
-
+
r.set(50, 50, 50+100, 50+100);
bm.scrollRect(&r, dx, dy, &inval);
paint_rgn(bm, r, inval);
@@ -589,7 +613,7 @@ bool SampleWindow::onHandleChar(SkUnichar uni) {
}
}
}
-
+
int dx = 0xFF;
int dy = 0xFF;
@@ -603,11 +627,11 @@ bool SampleWindow::onHandleChar(SkUnichar uni) {
case '9': dx = 1; dy = -1; break;
case '3': dx = 1; dy = 1; break;
case '1': dx = -1; dy = 1; break;
-
+
default:
break;
}
-
+
if (0xFF != dx && 0xFF != dy) {
if ((dx | dy) == 0) {
fScrollTestX = fScrollTestY = 0;
@@ -618,7 +642,7 @@ bool SampleWindow::onHandleChar(SkUnichar uni) {
this->inval(NULL);
return true;
}
-
+
switch (uni) {
case 'a':
fAnimating = !fAnimating;
@@ -659,7 +683,7 @@ bool SampleWindow::onHandleChar(SkUnichar uni) {
default:
break;
}
-
+
return this->INHERITED::onHandleChar(uni);
}
@@ -724,7 +748,7 @@ void SampleWindow::loadView(SkView* view) {
if (prev) {
prev->detachFromParent();
}
-
+
if (NULL == view) {
view = create_overview(fSamples.count(), fSamples.begin());
}
@@ -768,12 +792,12 @@ void SampleWindow::updateTitle() {
if (title.size() == 0) {
title.set("<unknown>");
}
-
+
title.prepend(gCanvasTypePrefix[fCanvasType]);
title.prepend(" ");
title.prepend(configToString(this->getBitmap().config()));
-
+
if (fAnimating) {
title.prepend("<A> ");
}
@@ -795,12 +819,12 @@ void SampleWindow::onSizeChange() {
SkView::F2BIter iter(this);
SkView* view = iter.next();
view->setSize(this->width(), this->height());
-
+
// rebuild our clippath
{
const SkScalar W = this->width();
const SkScalar H = this->height();
-
+
fClipPath.reset();
#if 0
for (SkScalar y = SK_Scalar1; y < H; y += SkIntToScalar(32)) {
@@ -817,7 +841,7 @@ void SampleWindow::onSizeChange() {
fClipPath.addRect(r, SkPath::kCW_Direction);
#endif
}
-
+
this->updateTitle(); // to refresh our config
}
@@ -838,7 +862,7 @@ template <typename T> void SkTBSort(T array[], int count) {
break;
}
}
-
+
for (int k = 0; k < count - 1; k++) {
SkASSERT(!(array[k+1] < array[k]));
}
@@ -909,7 +933,7 @@ static void test() {
for (i = 0; i < SK_ARRAY_COUNT(gRecs); i++) {
test_rects(gRecs[i].fRects, gRecs[i].fCount);
}
-
+
SkRandom rand;
for (i = 0; i < 10000; i++) {
SkRegion rgn0, rgn1;