Added SimpleiOSApp and updated iOSSampleApp
git-svn-id: http://skia.googlecode.com/svn/trunk@2202 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/iOSSampleApp/Shared/SkUIView.mm b/experimental/iOSSampleApp/Shared/SkUIView.mm
index 9a9b07f..50d1954 100644
--- a/experimental/iOSSampleApp/Shared/SkUIView.mm
+++ b/experimental/iOSSampleApp/Shared/SkUIView.mm
@@ -1,406 +1,57 @@
#import "SkUIView.h"
-
-//#define SKWIND_CONFIG SkBitmap::kRGB_565_Config
-#define SKWIND_CONFIG SkBitmap::kARGB_8888_Config
-#define SKGL_CONFIG kEAGLColorFormatRGB565
-//#define SKGL_CONFIG kEAGLColorFormatRGBA8
-
-#define FORCE_REDRAW
-
-//#define USE_GL_1
-#define USE_GL_2
-
#include "SkCanvas.h"
-#include "GrContext.h"
-#include "GrGLInterface.h"
-#include "SkGpuDevice.h"
#include "SkCGUtils.h"
-class SkiOSDeviceManager : public SampleWindow::DeviceManager {
-public:
- SkiOSDeviceManager() {
- fGrContext = NULL;
- fGrRenderTarget = NULL;
- usingGL = false;
- }
- virtual ~SkiOSDeviceManager() {
- SkSafeUnref(fGrContext);
- SkSafeUnref(fGrRenderTarget);
- }
-
- virtual void init(SampleWindow* win) {
- win->attachGL();
- if (NULL == fGrContext) {
-#ifdef USE_GL_1
- fGrContext = GrContext::Create(kOpenGL_Fixed_GrEngine, NULL);
-#else
- fGrContext = GrContext::Create(kOpenGL_Shaders_GrEngine, NULL);
-#endif
- }
-
- if (NULL == fGrContext) {
- SkDebugf("Failed to setup 3D");
- win->detachGL();
- }
- }
-
- virtual bool supportsDeviceType(SampleWindow::DeviceType dType) {
- switch (dType) {
- case SampleWindow::kRaster_DeviceType:
- case SampleWindow::kPicture_DeviceType: // fallthru
- return true;
- case SampleWindow::kGPU_DeviceType:
- return NULL != fGrContext;
- default:
- return false;
- }
- }
- virtual bool prepareCanvas(SampleWindow::DeviceType dType,
- SkCanvas* canvas,
- SampleWindow* win) {
- if (SampleWindow::kGPU_DeviceType == dType) {
- canvas->setDevice(new SkGpuDevice(fGrContext, fGrRenderTarget))->unref();
- usingGL = true;
- }
- else {
- //The clip needs to be applied with a device attached to the canvas
- canvas->setBitmapDevice(win->getBitmap());
- usingGL = false;
- }
- return true;
- }
- virtual void publishCanvas(SampleWindow::DeviceType dType,
- SkCanvas* canvas,
- SampleWindow* win) {
- if (SampleWindow::kGPU_DeviceType == dType) {
- fGrContext->flush();
- }
- else {
- //CGContextRef cg = UIGraphicsGetCurrentContext();
- //SkCGDrawBitmap(cg, win->getBitmap(), 0, 0);
- }
- win->presentGL();
- }
-
- virtual void windowSizeChanged(SampleWindow* win) {
- if (fGrContext) {
- win->attachGL();
-
- GrPlatformSurfaceDesc desc;
- desc.reset();
- desc.fSurfaceType = kRenderTarget_GrPlatformSurfaceType;
- desc.fWidth = SkScalarRound(win->width());
- desc.fHeight = SkScalarRound(win->height());
- desc.fConfig = kRGBA_8888_GrPixelConfig;
- const GrGLInterface* gl = GrGLGetDefaultGLInterface();
- GrAssert(NULL != gl);
- GR_GL_GetIntegerv(gl, GR_GL_STENCIL_BITS, &desc.fStencilBits);
- GR_GL_GetIntegerv(gl, GR_GL_SAMPLES, &desc.fSampleCnt);
- GrGLint buffer;
- GR_GL_GetIntegerv(gl, GR_GL_FRAMEBUFFER_BINDING, &buffer);
- desc.fPlatformRenderTarget = buffer;
-
- SkSafeUnref(fGrRenderTarget);
- fGrRenderTarget = static_cast<GrRenderTarget*>(
- fGrContext->createPlatformSurface(desc));
- }
- }
-
- bool isUsingGL() { return usingGL; }
-
- virtual GrContext* getGrContext() { return fGrContext; }
-private:
- bool usingGL;
- GrContext* fGrContext;
- GrRenderTarget* fGrRenderTarget;
-};
-
-////////////////////////////////////////////////////////////////////////////////
@implementation SkUIView
-@synthesize fWind, fTitle, fTitleItem, fRasterLayer, fGLLayer, fOptionsDelegate;
+@synthesize fWind, fTitleItem, fOptionsDelegate;
-#include "SkApplication.h"
-#include "SkEvent.h"
-#include "SkWindow.h"
-
-#define kREDRAW_UIVIEW_GL "sk_redraw_uiview_gl_iOS"
-
-extern bool gDoTraceDraw;
-#define DO_TRACE_DRAW_MAX 100
-
-struct FPSState {
- static const int FRAME_COUNT = 60;
-
- CFTimeInterval fNow0, fNow1;
- CFTimeInterval fTime0, fTime1, fTotalTime;
- int fFrameCounter;
- int fDrawCounter;
- SkString str;
- FPSState() {
- fTime0 = fTime1 = fTotalTime = 0;
- fFrameCounter = 0;
- }
-
- void startDraw() {
- fNow0 = CACurrentMediaTime();
-
- if (0 == fDrawCounter && false) {
- gDoTraceDraw = true;
- SkDebugf("\n");
- }
- }
-
- void endDraw() {
- fNow1 = CACurrentMediaTime();
-
- if (0 == fDrawCounter) {
- gDoTraceDraw = true;
- }
- if (DO_TRACE_DRAW_MAX == ++fDrawCounter) {
- fDrawCounter = 0;
- }
- }
-
- void flush(SkOSWindow* hwnd) {
- CFTimeInterval now2 = CACurrentMediaTime();
-
- fTime0 += fNow1 - fNow0;
- fTime1 += now2 - fNow1;
-
- if (++fFrameCounter == FRAME_COUNT) {
- CFTimeInterval totalNow = CACurrentMediaTime();
- fTotalTime = totalNow - fTotalTime;
-
- //SkMSec ms0 = (int)(1000 * fTime0 / FRAME_COUNT);
- //SkMSec msTotal = (int)(1000 * fTotalTime / FRAME_COUNT);
- //str.printf(" ms: %d [%d], fps: %3.1f", msTotal, ms0,
- // FRAME_COUNT / fTotalTime);
- str.printf(" fps:%3.1f", FRAME_COUNT / fTotalTime);
- hwnd->setTitle(NULL);
- fTotalTime = totalNow;
- fTime0 = fTime1 = 0;
- fFrameCounter = 0;
- }
- }
-};
-
-static FPSState gFPS;
-
-#define FPS_StartDraw() gFPS.startDraw()
-#define FPS_EndDraw() gFPS.endDraw()
-#define FPS_Flush(wind) gFPS.flush(wind)
-
-///////////////////////////////////////////////////////////////////////////////
-
-- (id)initWithMyDefaults {
- fRedrawRequestPending = false;
- fFPSState = new FPSState;
-
- //Add gesture recognizer for single taps. Taps on the right half of the view
- //will cause SampleApp to go to the next sample, taps on the left will go to
- //the previous sample
- UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc]
- initWithTarget:self
- action:@selector(handleTap:)];
- [self addGestureRecognizer:tap];
- [tap release];
-
-#ifdef USE_GL_1
- fGL.fContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
-#else
- fGL.fContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
-#endif
-
- if (!fGL.fContext || ![EAGLContext setCurrentContext:fGL.fContext])
- {
- [self release];
- return nil;
- }
-
- // Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer
- glGenFramebuffers(1, &fGL.fFramebuffer);
- glBindFramebuffer(GL_FRAMEBUFFER, fGL.fFramebuffer);
-
- glGenRenderbuffers(1, &fGL.fRenderbuffer);
- glGenRenderbuffers(1, &fGL.fStencilbuffer);
-
- glBindRenderbuffer(GL_RENDERBUFFER, fGL.fRenderbuffer);
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, fGL.fRenderbuffer);
-
- glBindRenderbuffer(GL_RENDERBUFFER, fGL.fStencilbuffer);
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fGL.fStencilbuffer);
-
- self.fGLLayer = [CAEAGLLayer layer];
- fGLLayer.bounds = self.bounds;
- fGLLayer.anchorPoint = CGPointMake(0, 0);
- fGLLayer.opaque = TRUE;
- [self.layer addSublayer:fGLLayer];
- fGLLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
- [NSNumber numberWithBool:NO],
- kEAGLDrawablePropertyRetainedBacking,
- SKGL_CONFIG,
- kEAGLDrawablePropertyColorFormat,
- nil];
-
- self.fRasterLayer = [CALayer layer];
- fRasterLayer.anchorPoint = CGPointMake(0, 0);
- fRasterLayer.opaque = TRUE;
- [self.layer addSublayer:fRasterLayer];
-
- NSMutableDictionary *newActions = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNull null], @"onOrderIn",
- [NSNull null], @"onOrderOut",
- [NSNull null], @"sublayers",
- [NSNull null], @"contents",
- [NSNull null], @"bounds",
- nil];
- fGLLayer.actions = newActions;
- fRasterLayer.actions = newActions;
- [newActions release];
-
- fDevManager = new SkiOSDeviceManager;
- fWind = new SampleWindow(self, NULL, NULL, fDevManager);
- application_init();
- fWind->resize(self.frame.size.width, self.frame.size.height, SKWIND_CONFIG);
-
+- (id)initWithDefaults {
+ fWind = NULL;
return self;
}
- (id)initWithCoder:(NSCoder*)coder {
if ((self = [super initWithCoder:coder])) {
- self = [self initWithMyDefaults];
+ self = [self initWithDefaults];
+ [self setUpWindow];
}
return self;
}
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
- self = [self initWithMyDefaults];
+ self = [self initWithDefaults];
+ [self setUpWindow];
}
return self;
}
+- (void)setUpWindow {
+ if (NULL != fWind) {
+ fWind->setVisibleP(true);
+ fWind->resize(self.frame.size.width, self.frame.size.height,
+ SkBitmap::kARGB_8888_Config);
+ }
+}
+
- (void)dealloc {
delete fWind;
- delete fDevManager;
- delete fFPSState;
- self.fRasterLayer = nil;
- self.fGLLayer = nil;
- [fGL.fContext release];
- application_term();
[fTitleItem release];
[super dealloc];
}
-- (void)layoutSubviews {
- int W, H;
-
- // Allocate color buffer backing based on the current layer size
- glBindRenderbuffer(GL_RENDERBUFFER, fGL.fRenderbuffer);
- [fGL.fContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:fGLLayer];
-
- glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &fGL.fWidth);
- glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &fGL.fHeight);
-
- glBindRenderbuffer(GL_RENDERBUFFER, fGL.fStencilbuffer);
- glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, fGL.fWidth, fGL.fHeight);
-
- if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
- NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
- }
-
- if (fDevManager->isUsingGL()) {
- W = fGL.fWidth;
- H = fGL.fHeight;
- CGRect rect = CGRectMake(0, 0, W, H);
- fGLLayer.bounds = rect;
- }
- else {
- CGRect rect = self.bounds;
- W = (int)CGRectGetWidth(rect);
- H = (int)CGRectGetHeight(rect);
- fRasterLayer.bounds = rect;
- }
-
- printf("---- layoutSubviews %d %d\n", W, H);
- fWind->resize(W, H);
- fWind->inval(NULL);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-- (void)drawWithCanvas:(SkCanvas*)canvas {
- fRedrawRequestPending = false;
- fFPSState->startDraw();
- fWind->draw(canvas);
- fFPSState->endDraw();
-#ifdef FORCE_REDRAW
- fWind->inval(NULL);
-#endif
- fFPSState->flush(fWind);
-}
-
-- (void)drawInGL {
- // This application only creates a single context which is already set current at this point.
- // This call is redundant, but needed if dealing with multiple contexts.
- [EAGLContext setCurrentContext:fGL.fContext];
-
- // This application only creates a single default framebuffer which is already bound at this point.
- // This call is redundant, but needed if dealing with multiple framebuffers.
- glBindFramebuffer(GL_FRAMEBUFFER, fGL.fFramebuffer);
-
- GLint scissorEnable;
- glGetIntegerv(GL_SCISSOR_TEST, &scissorEnable);
- glDisable(GL_SCISSOR_TEST);
- glClearColor(0,0,0,0);
- glClear(GL_COLOR_BUFFER_BIT);
- if (scissorEnable) {
- glEnable(GL_SCISSOR_TEST);
- }
- glViewport(0, 0, fGL.fWidth, fGL.fHeight);
-
-
- GrContext* ctx = fDevManager->getGrContext();
- SkASSERT(NULL != ctx);
-
- SkCanvas canvas;
-
- // if we're not "retained", then we have to always redraw everything.
- // This call forces us to ignore the fDirtyRgn, and draw everywhere.
- // If we are "retained", we can skip this call (as the raster case does)
- fWind->forceInvalAll();
-
- [self drawWithCanvas:&canvas];
-
- // This application only creates a single color renderbuffer which is already bound at this point.
- // This call is redundant, but needed if dealing with multiple renderbuffers.
- glBindRenderbuffer(GL_RENDERBUFFER, fGL.fRenderbuffer);
- [fGL.fContext presentRenderbuffer:GL_RENDERBUFFER];
-
-#if GR_COLLECT_STATS
-// static int frame = 0;
-// if (!(frame % 100)) {
-// ctx->printStats();
-// }
-// ctx->resetStats();
-// ++frame;
-#endif
+- (void)forceRedraw {
+ [self drawInRaster];
}
- (void)drawInRaster {
- SkCanvas canvas;
- [self drawWithCanvas:&canvas];
+ SkCanvas canvas(fWind->getBitmap());
+ fWind->draw(&canvas);
CGImageRef cgimage = SkCreateCGImageRef(fWind->getBitmap());
- fRasterLayer.contents = (id)cgimage;
+ self.layer.contents = (id)cgimage;
CGImageRelease(cgimage);
}
-- (void)forceRedraw {
- if (fDevManager->isUsingGL())
- [self drawInGL];
- else
- [self drawInRaster];
-}
-
//Gesture Handlers
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
for (UITouch *touch in touches) {
@@ -430,25 +81,11 @@
}
}
-- (void)handleTap:(UISwipeGestureRecognizer *)sender {
-// CGPoint loc = [sender locationInView:self];
-// if (loc.x > self.bounds.size.width/2)
-// ((SampleWindow*)fWind)->nextSample();
-// else
-// ((SampleWindow*)fWind)->previousSample();
-}
-
-
///////////////////////////////////////////////////////////////////////////////
- (void)setSkTitle:(const char *)title {
- NSString* text = [NSString stringWithUTF8String:title];
- if ([text length] > 0)
- self.fTitle = text;
-
- if (fTitleItem && fTitle) {
- fTitleItem.title = [NSString stringWithFormat:@"%@%@", fTitle,
- [NSString stringWithUTF8String:fFPSState->str.c_str()]];
+ if (fTitleItem) {
+ fTitleItem.title = [NSString stringWithUTF8String:title];
}
}
@@ -465,22 +102,8 @@
}
- (void)postInvalWithRect:(const SkIRect*)r {
- if (!fRedrawRequestPending) {
- fRedrawRequestPending = true;
- bool gl = fDevManager->isUsingGL();
- [CATransaction begin];
- [CATransaction setAnimationDuration:0];
- fRasterLayer.hidden = gl;
- fGLLayer.hidden = !gl;
- [CATransaction commit];
- if (gl) {
- [self performSelector:@selector(drawInGL) withObject:nil afterDelay:0];
- }
- else {
- [self performSelector:@selector(drawInRaster) withObject:nil afterDelay:0];
- [self setNeedsDisplay];
- }
- }
+ [self performSelector:@selector(drawInRaster) withObject:nil afterDelay:0];
+ [self setNeedsDisplay];
}
@end