SampleApp fixes.
authorScroggo <Scroggo@2bbb7eff-a529-9590-31e7-b0007b416f81>
Tue, 21 Jun 2011 16:01:26 +0000 (16:01 +0000)
committerScroggo <Scroggo@2bbb7eff-a529-9590-31e7-b0007b416f81>
Tue, 21 Jun 2011 16:01:26 +0000 (16:01 +0000)
On Android, delete gWindow before calling application_term, avoiding a crash
each time the app closes.  Also make sure the screen is redrawn when resuming.

On Linux, delete gWindow to avoid memory leak.

In general, allow moving from sample 0 to the last sample.

Reviewed at http://codereview.appspot.com/4639060

git-svn-id: http://skia.googlecode.com/svn/trunk@1661 2bbb7eff-a529-9590-31e7-b0007b416f81

android_sample/SampleApp/jni/sample-jni.cpp
android_sample/SampleApp/src/com/skia/sampleapp/SampleApp.java
android_sample/SampleApp/src/com/skia/sampleapp/SampleView.java
samplecode/SampleApp.cpp
samplecode/SampleApp.h
unix_test_app/main.cpp

index a82256c..ffda03d 100644 (file)
@@ -173,6 +173,8 @@ JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_serviceQueueTimer(
         JNIEnv* env, jobject thiz);
 JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_saveToPdf(
         JNIEnv* env, jobject thiz);
+JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_postInval(
+        JNIEnv* env, jobject thiz);
 };
 
 JNIEXPORT bool JNICALL Java_com_skia_sampleapp_SampleApp_handleKeyDown(
@@ -251,6 +253,8 @@ JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_init(JNIEnv* env,
 JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_term(JNIEnv* env,
         jobject thiz)
 {
+    delete gWindow;
+    gWindow = NULL;
     application_term();
     if (gWindowGlue.m_obj) {
         env->DeleteWeakGlobalRef(gWindowGlue.m_obj);
@@ -260,8 +264,6 @@ JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_term(JNIEnv* env,
         env->DeleteWeakGlobalRef(gActivityGlue.m_obj);
         gActivityGlue.m_obj = NULL;
     }
-    delete gWindow;
-    gWindow = NULL;
 }
 
 
@@ -373,3 +375,9 @@ JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_saveToPdf(
 {
     gWindow->saveToPdf();
 }
+
+JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_postInval(
+        JNIEnv* env, jobject thiz)
+{
+    gWindow->postInvalDelay();    
+}
index bdd9f2b..03a6d71 100644 (file)
@@ -63,6 +63,16 @@ public class SampleApp extends Activity
     }
 
     @Override
+    protected void onResume () {
+        super.onResume();
+        int width = mView.getWidth();
+        int height = mView.getHeight();
+        if (width > 0 && height > 0) {
+            mView.postInval();
+        }
+    }
+
+    @Override
     public void onDestroy() {
         mView.queueEvent(new Runnable() {
             @Override
@@ -260,6 +270,7 @@ public class SampleApp extends Activity
     native void processSkEvent();
     native void serviceQueueTimer();
     native void saveToPdf();
+    native void postInval();
 
     static {
         System.loadLibrary("skia-sample");
index ab4e5c0..56f7c12 100644 (file)
@@ -42,6 +42,15 @@ public class SampleView extends GLSurfaceView {
         setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
     }
 
+    public void postInval() {
+        queueEvent(new Runnable() {
+            @Override
+            public void run() {
+                mApp.postInval();
+            }
+        });
+    }
+
     // Called by JNI
     @SuppressWarnings("unused")
     private void queueSkEvent() {
index 2d5d0ca..9c2b7d1 100644 (file)
@@ -53,9 +53,9 @@ extern SkView* create_overview(int, const SkViewFactory[]);
 ///////////////
 static const char view_inval_msg[] = "view-inval-msg";
 
-static void postInvalDelay(SkEventSinkID sinkID) {
+void SampleWindow::postInvalDelay() {
     SkEvent* evt = new SkEvent(view_inval_msg);
-    evt->post(sinkID, 1);
+    evt->post(this->getSinkID(), 1);
 }
 
 static bool isInvalEvent(const SkEvent& evt) {
@@ -844,7 +844,7 @@ void SampleWindow::afterChildren(SkCanvas* orig) {
     if (fMeasureFPS && fMeasureFPS_Time) {
         fMeasureFPS_Time = SkTime::GetMSecs() - fMeasureFPS_Time;
         this->updateTitle();
-        postInvalDelay(this->getSinkID());
+        this->postInvalDelay();
     }
 
     //    if ((fScrollTestX | fScrollTestY) != 0)
@@ -928,7 +928,7 @@ void SampleWindow::changeZoomLevel(float delta) {
 }
 
 bool SampleWindow::previousSample() {
-    fCurrIndex = (fCurrIndex - 1) % fSamples.count();
+    fCurrIndex = (fCurrIndex - 1 + fSamples.count()) % fSamples.count();
     this->loadView(fSamples[fCurrIndex]());
     return true;
 }
@@ -1428,7 +1428,7 @@ void SampleWindow::onSizeChange() {
 #ifdef ANDROID
     // FIXME: The first draw after a size change does not work on Android, so
     // we post an invalidate.
-    postInvalDelay(this->getSinkID());
+    this->postInvalDelay();
 #endif
     this->updateTitle();    // to refresh our config
 }
index a58c688..4d16121 100644 (file)
@@ -61,6 +61,7 @@ public:
     bool handleTouch(int ownerId, float x, float y,
             SkView::Click::State state);
     void saveToPdf();
+    void postInvalDelay();
 
 protected:
     virtual void onDraw(SkCanvas* canvas);
index 5be93bc..9dafb3c 100644 (file)
@@ -25,6 +25,7 @@ int main(){
 
     gWindow->loop();
 
+    delete gWindow;
     application_term();
     return 0;
 }