Updated SkUIView to use the current code, added a default gl interface for ios
http://codereview.appspot.com/4717043/


git-svn-id: http://skia.googlecode.com/svn/trunk@1855 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/include/SkUIView.h b/gpu/include/SkUIView.h
index 5e12e00..c862744 100644
--- a/gpu/include/SkUIView.h
+++ b/gpu/include/SkUIView.h
@@ -12,7 +12,6 @@
 
 @interface SkUIView : UIView <UIAccelerometerDelegate> {
     BOOL fRedrawRequestPending;
-    SkOSWindow* fWind;
     SkMatrix    fMatrix, fLocalMatrix;
     bool        fNeedGestureEnded;
 
@@ -38,8 +37,6 @@
         GLint           fHeight;
     } fGL;
     
-    UILabel* fTitleLabel;
-
     enum Backend {
         kGL_Backend,
         kRaster_Backend,
@@ -48,14 +45,20 @@
     // these are visible to DetailViewController
     Backend fBackend;
     bool    fComplexClip;
+    
+    UINavigationItem* fTitle;
+    SkOSWindow* fWind;
 }
 
 @property (nonatomic, assign) SkOSWindow *fWind;
-@property (nonatomic, retain) UILabel* fTitleLabel;
+@property (nonatomic, retain) UINavigationItem* fTitle;
 @property (nonatomic, assign) Backend fBackend;
 @property (nonatomic, assign) bool fComplexClip;
 @property (nonatomic, assign, setter=setWarpState) bool fUseWarp;
 
+- (void)initGestures;
+- (void)flushLocalMatrix;
+
 - (void)setSkTitle:(const char*)title;
 - (void)postInvalWithRect:(const SkIRect*)rectOrNil;
 - (BOOL)onHandleEvent:(const SkEvent&)event;
diff --git a/gpu/src/ios/GrGLDefaultInterface_iOS.cpp b/gpu/src/ios/GrGLDefaultInterface_iOS.cpp
new file mode 100644
index 0000000..4126d25
--- /dev/null
+++ b/gpu/src/ios/GrGLDefaultInterface_iOS.cpp
@@ -0,0 +1,156 @@
+/*
+ Copyright 2011 Google Inc.
+ 
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ 
+ http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+#include "GrGLInterface.h"
+
+#import <OpenGLES/ES1/gl.h>
+#import <OpenGLES/ES1/glext.h>
+
+#import <OpenGLES/ES2/gl.h>
+#import <OpenGLES/ES2/glext.h>
+
+void GrGLSetDefaultGLInterface() {
+    static GrGLInterface gDefaultInterface;
+    static bool gDefaultInterfaceInit;
+    if (!gDefaultInterfaceInit) {
+        gDefaultInterface.fNPOTRenderTargetSupport = kProbe_GrGLCapability;
+        gDefaultInterface.fMinRenderTargetHeight = kProbe_GrGLCapability;
+        gDefaultInterface.fMinRenderTargetWidth = kProbe_GrGLCapability;
+        
+        gDefaultInterface.fActiveTexture = glActiveTexture;
+        gDefaultInterface.fAttachShader = glAttachShader;
+        gDefaultInterface.fBindAttribLocation = glBindAttribLocation;
+        gDefaultInterface.fBindBuffer = glBindBuffer;
+        gDefaultInterface.fBindTexture = glBindTexture;
+        gDefaultInterface.fBlendColor = glBlendColor;
+        gDefaultInterface.fBlendFunc = glBlendFunc;
+        gDefaultInterface.fBufferData = (GrGLBufferDataProc)glBufferData;
+        gDefaultInterface.fBufferSubData = (GrGLBufferSubDataProc)glBufferSubData;
+        gDefaultInterface.fClear = glClear;
+        gDefaultInterface.fClearColor = glClearColor;
+        gDefaultInterface.fClearStencil = glClearStencil;
+        gDefaultInterface.fClientActiveTexture = glClientActiveTexture;
+        gDefaultInterface.fColorMask = glColorMask;
+        gDefaultInterface.fColorPointer = glColorPointer;
+        gDefaultInterface.fColor4ub = glColor4ub;
+        gDefaultInterface.fCompileShader = glCompileShader;
+        gDefaultInterface.fCompressedTexImage2D = glCompressedTexImage2D;
+        gDefaultInterface.fCreateProgram = glCreateProgram;
+        gDefaultInterface.fCreateShader = glCreateShader;
+        gDefaultInterface.fCullFace = glCullFace;
+        gDefaultInterface.fDeleteBuffers = glDeleteBuffers;
+        gDefaultInterface.fDeleteProgram = glDeleteProgram;
+        gDefaultInterface.fDeleteShader = glDeleteShader;
+        gDefaultInterface.fDeleteTextures = glDeleteTextures;
+        gDefaultInterface.fDepthMask = glDepthMask;
+        gDefaultInterface.fDisable = glDisable;
+        gDefaultInterface.fDisableClientState = glDisableClientState;
+        gDefaultInterface.fDisableVertexAttribArray =
+        glDisableVertexAttribArray;
+        gDefaultInterface.fDrawArrays = glDrawArrays;
+        gDefaultInterface.fDrawElements = glDrawElements;
+        gDefaultInterface.fEnable = glEnable;
+        gDefaultInterface.fEnableClientState = glEnableClientState;
+        gDefaultInterface.fEnableVertexAttribArray = glEnableVertexAttribArray;
+        gDefaultInterface.fFrontFace = glFrontFace;
+        gDefaultInterface.fGenBuffers = glGenBuffers;
+        gDefaultInterface.fGetBufferParameteriv = glGetBufferParameteriv;
+        gDefaultInterface.fGetError = glGetError;
+        gDefaultInterface.fGetIntegerv = glGetIntegerv;
+        gDefaultInterface.fGetProgramInfoLog = glGetProgramInfoLog;
+        gDefaultInterface.fGetProgramiv = glGetProgramiv;
+        gDefaultInterface.fGetShaderInfoLog = glGetShaderInfoLog;
+        gDefaultInterface.fGetShaderiv = glGetShaderiv;
+        gDefaultInterface.fGetString = glGetString;
+        gDefaultInterface.fGenTextures = glGenTextures;
+        gDefaultInterface.fGetUniformLocation = glGetUniformLocation;
+        gDefaultInterface.fLineWidth = glLineWidth;
+        gDefaultInterface.fLinkProgram = glLinkProgram;
+        gDefaultInterface.fLoadMatrixf = glLoadMatrixf;
+        gDefaultInterface.fMatrixMode = glMatrixMode;
+        gDefaultInterface.fPointSize = glPointSize;
+        gDefaultInterface.fPixelStorei = glPixelStorei;
+        gDefaultInterface.fReadPixels = glReadPixels;
+        gDefaultInterface.fScissor = glScissor;
+        gDefaultInterface.fShadeModel = glShadeModel;
+        gDefaultInterface.fShaderSource = glShaderSource;
+        gDefaultInterface.fStencilFunc = glStencilFunc;
+        gDefaultInterface.fStencilFuncSeparate = glStencilFuncSeparate;
+        gDefaultInterface.fStencilMask = glStencilMask;
+        gDefaultInterface.fStencilMaskSeparate = glStencilMaskSeparate;
+        gDefaultInterface.fStencilOp = glStencilOp;
+        gDefaultInterface.fStencilOpSeparate = glStencilOpSeparate;
+        gDefaultInterface.fTexCoordPointer = glTexCoordPointer;
+        gDefaultInterface.fTexEnvi = glTexEnvi;
+        // mac uses GLenum for internalFormat param (non-standard)
+        // amounts to int vs. uint.
+        gDefaultInterface.fTexImage2D = (GrGLTexImage2DProc)glTexImage2D;
+        gDefaultInterface.fTexParameteri = glTexParameteri;
+        gDefaultInterface.fTexSubImage2D = glTexSubImage2D;
+        gDefaultInterface.fUniform1f = glUniform1f;
+        gDefaultInterface.fUniform1i = glUniform1i;
+        gDefaultInterface.fUniform1fv = glUniform1fv;
+        gDefaultInterface.fUniform1iv = glUniform1iv;
+        gDefaultInterface.fUniform2f = glUniform2f;
+        gDefaultInterface.fUniform2i = glUniform2i;
+        gDefaultInterface.fUniform2fv = glUniform2fv;
+        gDefaultInterface.fUniform2iv = glUniform2iv;
+        gDefaultInterface.fUniform3f = glUniform3f;
+        gDefaultInterface.fUniform3i = glUniform3i;
+        gDefaultInterface.fUniform3fv = glUniform3fv;
+        gDefaultInterface.fUniform3iv = glUniform3iv;
+        gDefaultInterface.fUniform4f = glUniform4f;
+        gDefaultInterface.fUniform4i = glUniform4i;
+        gDefaultInterface.fUniform4fv = glUniform4fv;
+        gDefaultInterface.fUniform4iv = glUniform4iv;
+        gDefaultInterface.fUniform4fv = glUniform4fv;
+        gDefaultInterface.fUniformMatrix2fv = glUniformMatrix2fv;
+        gDefaultInterface.fUniformMatrix3fv = glUniformMatrix3fv;
+        gDefaultInterface.fUniformMatrix4fv = glUniformMatrix4fv;
+        gDefaultInterface.fUseProgram = glUseProgram;
+        gDefaultInterface.fVertexAttrib4fv = glVertexAttrib4fv;
+        gDefaultInterface.fVertexAttribPointer = glVertexAttribPointer;
+        gDefaultInterface.fVertexPointer = glVertexPointer;
+        gDefaultInterface.fViewport = glViewport;
+        
+        gDefaultInterface.fGenFramebuffers = glGenFramebuffers;
+        gDefaultInterface.fBindFramebuffer = glBindFramebuffer;
+        gDefaultInterface.fFramebufferTexture2D = glFramebufferTexture2D;
+        gDefaultInterface.fCheckFramebufferStatus = glCheckFramebufferStatus;
+        gDefaultInterface.fDeleteFramebuffers = glDeleteFramebuffers;
+        gDefaultInterface.fRenderbufferStorage = glRenderbufferStorage;
+        gDefaultInterface.fGenRenderbuffers = glGenRenderbuffers;
+        gDefaultInterface.fDeleteRenderbuffers = glDeleteRenderbuffers;
+        gDefaultInterface.fFramebufferRenderbuffer = glFramebufferRenderbuffer;
+        gDefaultInterface.fBindRenderbuffer = glBindRenderbuffer;
+       
+#if GL_OES_mapbuffer
+        gDefaultInterface.fMapBuffer = glMapBufferOES;
+        gDefaultInterface.fUnmapBuffer = glUnmapBufferOES;
+#endif
+        
+#if GL_APPLE_framebuffer_multisample
+        gDefaultInterface.fRenderbufferStorageMultisample = glRenderbufferStorageMultisampleAPPLE;
+        gDefaultInterface.fResolveMultisampleFramebuffer = glResolveMultisampleFramebufferAPPLE;
+#endif
+        gDefaultInterface.fBindFragDataLocationIndexed = NULL;
+        
+        gDefaultInterface.fBindingsExported = kES2_GrGLBinding;
+        
+        gDefaultInterfaceInit = true;
+    }
+    GrGLSetGLInterface(&gDefaultInterface);
+}
\ No newline at end of file
diff --git a/gpu/src/ios/SkUIView.mm b/gpu/src/ios/SkUIView.mm
index 58550ae..261ed9c 100644
--- a/gpu/src/ios/SkUIView.mm
+++ b/gpu/src/ios/SkUIView.mm
@@ -1,7 +1,8 @@
 #import "SkUIView.h"
 #include <QuartzCore/QuartzCore.h>
 
-#include "SkGpuCanvas.h"
+//#include "SkGpuCanvas.h"
+#include "SkGpuDevice.h"
 #include "SkCGUtils.h"
 #include "GrContext.h"
 
@@ -32,7 +33,7 @@
 #endif
 
 //#define USE_GL_1
-#define USE_GL_2
+//#define USE_GL_2
 
 #if defined(USE_GL_1) || defined(USE_GL_2)
     #define USE_GL
@@ -42,7 +43,7 @@
 
 
 @synthesize fWind;
-@synthesize fTitleLabel;
+@synthesize fTitle;
 @synthesize fBackend;
 @synthesize fComplexClip;
 @synthesize fUseWarp;
@@ -56,7 +57,7 @@
 
 #define kREDRAW_UIVIEW_GL "sk_redraw_uiview_gl_iOS"
 
-#define TITLE_HEIGHT  44
+#define TITLE_HEIGHT  0
 
 static const float SCALE_FOR_ZOOM_LENS = 4.0;
 #define Y_OFFSET_FOR_ZOOM_LENS           200
@@ -156,8 +157,8 @@
     fUseWarp = false;
     fRedrawRequestPending = false;
     // FIXME:  If iOS has argc & argv, pass them here.
-    fWind = create_sk_window(self, 0, NULL);
-    fWind->setConfig(SKWIND_CONFIG);
+    //fWind = create_sk_window(self, 0, NULL);
+    //fWind->setConfig(SKWIND_CONFIG);
     fMatrix.reset();
     fLocalMatrix.reset();
     fNeedGestureEnded = false;
@@ -295,15 +296,14 @@
 #ifdef SHOULD_COUNTER_INIT
     gShouldCounter = SHOULD_COUNTER_INIT;
 #endif
-
     {
         int saveCount = canvas->save();
         canvas->concat(matrix);
-//        SkRect r = { 10, 10, 500, 600 }; canvas->clipRect(r);
+        //        SkRect r = { 10, 10, 500, 600 }; canvas->clipRect(r);
         fWind->draw(canvas);
         canvas->restoreToCount(saveCount);
     }
-
+    
     if (fZoomAround) {
         zoom_around(canvas, fZoomAroundX, fZoomAroundY, SCALE_FOR_ZOOM_LENS);
         canvas->concat(matrix);
@@ -328,6 +328,7 @@
     if ([self respondsToSelector:@selector(setContentScaleFactor:)]) {
         self.contentScaleFactor = gScreenScale;
     }
+    
     // Allocate color buffer backing based on the current layer size
     glBindRenderbufferOES(GL_RENDERBUFFER_OES, fGL.fRenderbuffer);
     [fGL.fContext renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:eaglLayer];
@@ -335,14 +336,15 @@
     glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &fGL.fWidth);
     glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &fGL.fHeight);
 
+    glBindRenderbufferOES(GL_RENDERBUFFER_OES, fGL.fStencilbuffer);
+    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_STENCIL_INDEX8_OES, fGL.fWidth, fGL.fHeight);
+
+    
     if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
     {
         NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
     }
-
-    glBindRenderbufferOES(GL_RENDERBUFFER_OES, fGL.fStencilbuffer);
-    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_STENCIL_INDEX8_OES, fGL.fWidth, fGL.fHeight);
-
+    
     W = fGL.fWidth;
     H = fGL.fHeight;
 #else
@@ -363,9 +365,9 @@
     // should be pthread-local at least
     if (NULL == gCtx) {        
 #ifdef USE_GL_1
-        gCtx = GrContext::Create(GrGpu::kOpenGL_Fixed_Engine, 0);
+        gCtx = GrContext::Create(kOpenGL_Fixed_GrEngine, 0);
 #else
-        gCtx = GrContext::Create(GrGpu::kOpenGL_Shaders_Engine, 0);
+        gCtx = GrContext::Create(kOpenGL_Shaders_GrEngine, 0);
 #endif
     }
     return gCtx;
@@ -478,17 +480,22 @@
     if (scissorEnable) {
         glEnable(GL_SCISSOR_TEST);
     }
+    glViewport(0, 0, fWind->width(), fWind->height());
     
     GrContext* ctx = get_global_grctx();
-    SkGpuCanvas origCanvas(ctx);
-    origCanvas.setBitmapDevice(fWind->getBitmap());
     
-    //    gl->reset();
-    SkGpuCanvas glCanvas(ctx);
+    //SkGpuCanvas origCanvas(ctx);
+    //origCanvas.setBitmapDevice(fWind->getBitmap());
+    //gl->reset();
+    
+    SkCanvas glCanvas;
+    SkGpuDevice* dev = new SkGpuDevice(ctx, SkGpuDevice::Current3DApiRenderTarget());
+    glCanvas.setDevice(dev)->unref();
+    
     SkCanvas   rasterCanvas;
 
     SkCanvas* canvas;
-    SkDevice* dev = NULL;
+    //SkDevice* dev = NULL;
     
     switch (fBackend) {
         case kRaster_Backend:
@@ -499,18 +506,18 @@
             break;
     }
 
-    if (fUseWarp || fWarpState.isActive()) {
-        if (kGL_Backend == fBackend) {
-            dev = origCanvas.createDevice(fWind->getBitmap(), true);
-            canvas->setDevice(dev)->unref();
-        } else {
-            canvas->setBitmapDevice(fWind->getBitmap());
-            dev = canvas->getDevice();
-        }
-    } else {
-        canvas->setBitmapDevice(fWind->getBitmap());
-        dev = NULL;
-    }
+//    if (fUseWarp || fWarpState.isActive()) {
+//        if (kGL_Backend == fBackend) {
+//            dev = origCanvas.createDevice(fWind->getBitmap(), true);
+//            canvas->setDevice(dev)->unref();
+//        } else {
+//            canvas->setBitmapDevice(fWind->getBitmap());
+//            dev = canvas->getDevice();
+//        }
+//    } else {
+//        canvas->setBitmapDevice(fWind->getBitmap());
+//        dev = NULL;
+//    }
     
     canvas->translate(0, TITLE_HEIGHT);
 
@@ -523,15 +530,15 @@
     [self drawWithCanvas:canvas];
     FPS_EndDraw();
 
-    if (dev) {
-        draw_device(&origCanvas, dev, fWind->width(), fWind->height(),
-                    fWarpState.evaluate());
-    } else {
-        if (kRaster_Backend == fBackend) {
-            origCanvas.drawBitmap(fWind->getBitmap(), 0, 0, NULL);
-        }
-        // else GL - we're already on screen
-    }
+//    if (dev) {
+//        draw_device(&origCanvas, dev, fWind->width(), fWind->height(),
+//                    fWarpState.evaluate());
+//    } else {
+//        if (kRaster_Backend == fBackend) {
+//            origCanvas.drawBitmap(fWind->getBitmap(), 0, 0, NULL);
+//        }
+//        // else GL - we're already on screen
+//    }
 
     show_fontcache(ctx, canvas);
     ctx->flush(false);
@@ -562,13 +569,13 @@
 #else   // raster case
 
 - (void)drawRect:(CGRect)rect {
-    CGContextRef cg = UIGraphicsGetCurrentContext();
-    SkCanvas* canvas = NULL;
-
+    SkCanvas canvas;
+    canvas.setBitmapDevice(fWind->getBitmap());
     FPS_StartDraw();
-    [self drawWithCanvas:canvas];
-
+    [self drawWithCanvas:&canvas];
     FPS_EndDraw();
+    
+    CGContextRef cg = UIGraphicsGetCurrentContext();
     SkCGDrawBitmap(cg, fWind->getBitmap(), 0, TITLE_HEIGHT);
 
     FPS_Flush(fWind);
@@ -629,35 +636,6 @@
     }
 }
 
-- (void)handleDTapGesture:(UIGestureRecognizer*)sender {
-    [self flushLocalMatrix];
-    fMatrix.reset();
-}
-
-static float discretize(float x) {
-    return (int)x;
-}
-
-- (void)handlePanGesture:(UIPanGestureRecognizer*)sender {
-    [self commonHandleGesture:sender];
-
-    CGPoint delta = [sender translationInView:self];
-    delta.x *= gScreenScale;
-    delta.y *= gScreenScale;
-    // avoid flickering where the drawing might toggle in and out of a pixel
-    // center if translated by a fractional value
-    delta.x = discretize(delta.x);
-    delta.y = discretize(delta.y);
-    fLocalMatrix.setTranslate(delta.x, delta.y);
-    [self localMatrixWithGesture:sender];
-
-    if (UIGestureRecognizerStateEnded == sender.state) {
-        CGPoint velocity = [sender velocityInView:self];
-        fFlingState.reset(velocity.x, velocity.y);
-        fNeedGestureEnded = true;
-    }
-}
-
 - (float)limitTotalZoom:(float)scale {
     // this query works 'cause we know that we're square-scale w/ no skew/rotation
     const float curr = fMatrix[0];
@@ -670,33 +648,6 @@
     return scale;
 }
 
-- (void)handleScaleGesture:(UIPinchGestureRecognizer*)sender {
-    [self commonHandleGesture:sender];
-
-    if ([sender numberOfTouches] == 2) {
-        float scale = sender.scale;
-        CGPoint p0 = [sender locationOfTouch:0 inView:self];
-        CGPoint p1 = [sender locationOfTouch:0 inView:self];
-        float cx = (p0.x + p1.x) * 0.5;
-        float cy = (p0.y + p1.y) * 0.5;
-
-        if (fNeedFirstPinch) {
-            fFirstPinchX = cx;
-            fFirstPinchY = cy;
-            fNeedFirstPinch = false;
-        }
-
-        scale = [self limitTotalZoom:scale];
-
-        fLocalMatrix.setTranslate(-fFirstPinchX, -fFirstPinchY);
-        fLocalMatrix.postScale(scale, scale);
-        fLocalMatrix.postTranslate(cx, cy);
-        [self localMatrixWithGesture:sender];
-    } else {
-        [self flushLocalMatrix];
-    }
-}
-
 - (void)handleLongPressGesture:(UILongPressGestureRecognizer*)sender {
     [self commonHandleGesture:sender];
 
@@ -727,20 +678,38 @@
     [gesture release];
 }
 
+
+
+//Gesture Handlers
+- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
+    for (UITouch *touch in touches) {
+        CGPoint loc = [touch locationInView:self];
+        fWind->handleClick(loc.x, loc.y, SkView::Click::kDown_State, touch);
+    }
+}
+
+- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
+    for (UITouch *touch in touches) {
+        CGPoint loc = [touch locationInView:self];
+        fWind->handleClick(loc.x, loc.y, SkView::Click::kMoved_State, touch);
+    }
+}
+
+- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
+    for (UITouch *touch in touches) {
+        CGPoint loc = [touch locationInView:self];
+        fWind->handleClick(loc.x, loc.y, SkView::Click::kUp_State, touch);
+    }
+}
+
+- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
+    for (UITouch *touch in touches) {
+        CGPoint loc = [touch locationInView:self];
+        fWind->handleClick(loc.x, loc.y, SkView::Click::kUp_State, touch);
+    }
+}
+
 - (void)initGestures {
-    UITapGestureRecognizer* tapG = [UITapGestureRecognizer alloc];
-    [tapG initWithTarget:self action:@selector(handleDTapGesture:)];
-    tapG.numberOfTapsRequired = 2;
-    [self addAndReleaseGesture:tapG];
-
-    UIPanGestureRecognizer* panG = [UIPanGestureRecognizer alloc];
-    [panG initWithTarget:self action:@selector(handlePanGesture:)];
-    [self addAndReleaseGesture:panG];
-    
-    UIPinchGestureRecognizer* pinchG = [UIPinchGestureRecognizer alloc];
-    [pinchG initWithTarget:self action:@selector(handleScaleGesture:)];
-    [self addAndReleaseGesture:pinchG];
-
     UILongPressGestureRecognizer* longG = [UILongPressGestureRecognizer alloc];
     [longG initWithTarget:self action:@selector(handleLongPressGesture:)];
     [self addAndReleaseGesture:longG];
@@ -807,9 +776,8 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 - (void)setSkTitle:(const char *)title {
-    if (fTitleLabel) {
-        fTitleLabel.text = [NSString stringWithUTF8String:title];
-        [fTitleLabel setNeedsDisplay];
+    if (fTitle) {
+        fTitle.title = [NSString stringWithUTF8String:title];
     }
 }