*/}}
浏览代码

Android progress bar and other small tweaks

YimingWu 4 月之前
父节点
当前提交
b23de8a88b
共有 6 个文件被更改,包括 47 次插入17 次删除
  1. 6 1
      la_data.c
  2. 8 0
      la_interface.h
  3. 20 4
      la_kernel.c
  4. 5 3
      la_tns_kernel.c
  5. 2 4
      la_util.c
  6. 6 5
      resources/la_templates.c

+ 6 - 1
la_data.c

@@ -3301,7 +3301,12 @@ int la_ExtractProp(laUDF *udf, laManagedUDF* mUDF, laPropPack *pp, void *ParentI
 
                     ItemType = la_ReadShort(udf);
 
-                    if(p->UDFReadProgress){ laShowProgress((real)i/NumItems,-1); } //printf("add pc %s\n",pc->Identifier);
+                    if(p->UDFReadProgress){
+#ifdef LAGUI_ANDROID    // Unbind GLES context so progress can be drawn in the thread.
+                        eglMakeCurrent(MAIN.egl_dpy,0,0,0);
+#endif
+                        laShowProgress((real)i/NumItems,-1);
+                    } //printf("add pc %s\n",pc->Identifier);
 
                     if(pc==LA_PC_SOCKET_OUT || pc==LA_PC_SOCKET_IN){ laGraphRequestRebuild(); }
 

+ 8 - 0
la_interface.h

@@ -2704,6 +2704,14 @@ int laCopyToClipboard(unsigned char * text);
 #ifdef LAGUI_ANDROID
 bool la_check_permission(const char* permission);
 void la_request_permission(const char* permission);
+extern LA MAIN; // because of progress bar
+#define LA_ACQUIRE_GLES_CONTEXT \
+        eglMakeCurrent(MAIN.egl_dpy,MAIN.egl_surf,MAIN.egl_surf,MAIN.glc)
+#define LA_LEAVE_GLES_CONTEXT \
+        eglMakeCurrent(MAIN.egl_dpy,0,0,0)
+#else
+#define LA_ACQUIRE_GLES_CONTEXT
+#define LA_LEAVE_GLES_CONTEXT
 #endif
 
 extern laUiType *_LA_UI_FIXED_GROUP;

+ 20 - 4
la_kernel.c

@@ -895,12 +895,12 @@ void laShowProgress(real p1, real p2){
     laBoxedTheme *bt = _LA_THEME_TAB; real* fg=laThemeColor(bt,LA_BT_TEXT); real* bg=laThemeColor(bt,LA_BT_NORMAL);
     if(!MAIN.Progress.Called){
         laRecordTime(&MAIN.Progress.TimeCalled); MAIN.Progress.Called=1;
-    }else{
+    }
         laTimeRecorder tm; laRecordTime(&tm);
         real t=laTimeElapsedSecondsf(&tm,&MAIN.Progress.TimeCalled); if(t<0.1){ laSpinUnlock(&MAIN.OpsLock); return; }
         memcpy(&MAIN.Progress.TimeCalled,&tm,sizeof(laTimeRecorder));
-        if(!MAIN.Progress.Shown){
-             int ww=PROGRESSW+LA_RH*2;
+        if((!MAIN.Progress.Shown) && MAIN.Progress.Called){
+            int ww=PROGRESSW+LA_RH*2;
 #ifdef LA_LINUX
             int w=XDisplayWidth(MAIN.dpy, 0),h=XDisplayHeight(MAIN.dpy, 0);
             XMoveResizeWindow(MAIN.dpy,MAIN.Progress.w,w/2-ww/2,h/2-LA_RH*2/2,ww,LA_RH*2);
@@ -918,7 +918,6 @@ void laShowProgress(real p1, real p2){
 #endif
             MAIN.Progress.Shown = 1;
         }
-    }
     if(p1>=0) MAIN.Progress.p1=p1; if(p2>=0) MAIN.Progress.p2=p2;
 #ifdef LA_LINUX
     XClearWindow(MAIN.dpy,MAIN.Progress.w);
@@ -946,6 +945,20 @@ void laShowProgress(real p1, real p2){
     EndPaint(MAIN.Progress.w,&ps);
     MSG msg;
     while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){ TranslateMessage(&msg); DispatchMessage(&msg); };
+#endif
+#ifdef LAGUI_ANDROID
+    laWindow* window=MAIN.CurrentWindow; int pw=window->CW;
+    eglMakeCurrent(MAIN.egl_dpy, MAIN.egl_surf, MAIN.egl_surf, MAIN.glc);
+    tnsViewportWithScissor(0,0,window->CW,window->CH);
+    tnsOrtho(0,window->CW,-window->CH+LA_2RH,LA_2RH,-100,100);
+    tnsClearColorv(bg); tnsClearAll(); tnsUseNoTexture(); tnsColor4dv(fg);
+    tnsVertex2d(0,0);tnsVertex2d(pw*MAIN.Progress.p2,0);tnsVertex2d(pw*MAIN.Progress.p2,LA_RH);tnsVertex2d(0,LA_RH);
+    tnsPackAs(GL_TRIANGLE_FAN);
+    tnsVertex2d(0,LA_RH);tnsVertex2d(pw*MAIN.Progress.p1,LA_RH);tnsVertex2d(pw*MAIN.Progress.p1,LA_2RH);tnsVertex2d(0,LA_2RH);
+    tnsPackAs(GL_TRIANGLE_FAN);
+    tnsFlush();
+    eglSwapBuffers(MAIN.egl_dpy, MAIN.egl_surf);
+    eglMakeCurrent(MAIN.egl_dpy,0,0,0);
 #endif
     laSpinUnlock(&MAIN.OpsLock);
 }
@@ -964,6 +977,9 @@ void laHideProgress(){
 #ifdef _WIN32
     ShowWindow(MAIN.Progress.w,SW_HIDE);
     if(MAIN.CurrentWindow) UpdateWindow(MAIN.CurrentWindow->win);
+#endif
+#ifdef LAGUI_ANDROID
+    laRedrawAllWindows();
 #endif
     laSpinUnlock(&MAIN.OpsLock);
 }

+ 5 - 3
la_tns_kernel.c

@@ -41,7 +41,7 @@ void tnsGet2DTextureSubImage(tnsTexture* t, int xoffset, int yoffset, uint32_t w
     int offscreen_framebuffer;
     glGenFramebuffers(1, &offscreen_framebuffer);
     glBindFramebuffer(GL_FRAMEBUFFER, offscreen_framebuffer);
-    glBindTexture(GL_TEXTURE_2D, texture);
+    tnsBindTexture(t);
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
     GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
     if(status != GL_FRAMEBUFFER_COMPLETE) {
@@ -52,6 +52,7 @@ void tnsGet2DTextureSubImage(tnsTexture* t, int xoffset, int yoffset, uint32_t w
     glReadPixels(xoffset, yoffset, width, height, format, type, pixels);
     glBindFramebuffer(GL_FRAMEBUFFER, 0);
     glDeleteFramebuffers(1, &offscreen_framebuffer);
+    tnsUnbindTexture();
 #else
     glGetTextureSubImage(texture,0,xoffset,yoffset,0,width,height,1,format,type,bufSize,pixels);
 #endif
@@ -62,17 +63,18 @@ void tnsClearTextureImage(tnsTexture* t, int tex_format, int tex_bits_type){
     int offscreen_framebuffer;
     glGenFramebuffers(1, &offscreen_framebuffer);
     glBindFramebuffer(GL_FRAMEBUFFER, offscreen_framebuffer);
-    glBindTexture(GL_TEXTURE_2D, texture);
+    tnsBindTexture(t);
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
     GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
     if(status != GL_FRAMEBUFFER_COMPLETE) {
-        logPrint("Failed to make complete framebuffer object in la_glGetTextureSubImage()", status);
+        logPrint("Failed to make complete framebuffer object in tnsClearTextureImage()", status);
     }
     glBindFramebuffer(GL_FRAMEBUFFER, offscreen_framebuffer);
     glViewport(0, 0, t->Width, t->Height);
     glClearColor(0,0,0,0); glClear(GL_COLOR_BUFFER_BIT);
     glBindFramebuffer(GL_FRAMEBUFFER, 0);
     glDeleteFramebuffers(1, &offscreen_framebuffer);
+    tnsUnbindTexture();
 #else
     glClearTexImage(t->GLTexHandle,0,tex_format,tex_bits_type,0);
 #endif

+ 2 - 4
la_util.c

@@ -62,7 +62,7 @@ struct tm *laGetFullTime(){
 }
 
 void laRecordTime(laTimeRecorder *tr){
-#ifdef LA_LINUX
+#if (defined(LA_LINUX) || defined(LAGUI_ANDROID))
     clock_gettime(CLOCK_REALTIME, &tr->ts);
 #endif
 #ifdef _WIN32
@@ -71,15 +71,13 @@ void laRecordTime(laTimeRecorder *tr){
 }
 real laTimeElapsedSecondsf(laTimeRecorder *End, laTimeRecorder *Begin){
     real sec=0;
-#ifdef LA_LINUX
+#if (defined(LA_LINUX) || defined(LAGUI_ANDROID))
     sec=End->ts.tv_sec-Begin->ts.tv_sec; sec+=((End->ts.tv_nsec-Begin->ts.tv_nsec)/1e9);
 #endif
 #ifdef _WIN32
     LARGE_INTEGER perfCnt; QueryPerformanceFrequency(&perfCnt);
     sec = ((real)(End->tm.QuadPart - Begin->tm.QuadPart))/ perfCnt.QuadPart;
 #endif
-#ifdef LAGUI_ANDROID
-#endif 
     return sec;
 }
 

+ 6 - 5
resources/la_templates.c

@@ -1358,11 +1358,12 @@ void laui_UserPreference(laUiList *uil, laPropPack *Base, laPropPack *OperatorIn
 
             laShowSeparator(muil, mc);
 
-            laShowLabel(muil, mc, "Viewport:", 0, 0);
-            laShowItem(muil, mcl, &UP->PP, "viewport_halftone_factor");
-            laShowItem(muil, mcr, &UP->PP, "viewport_halftone_size");
-
-            laShowSeparator(muil, mc);
+            if(MAIN.InitArgs.HasWorldObjects){
+                laShowLabel(muil, mc, "Viewport:", 0, 0);
+                laShowItem(muil, mcl, &UP->PP, "viewport_halftone_factor");
+                laShowItem(muil, mcr, &UP->PP, "viewport_halftone_size");
+                laShowSeparator(muil, mc);
+            }
 
             laShowLabel(muil, mc, "Nodes:", 0, 0);
             laShowItem(muil, mcr, &UP->PP, "wire_color_slices");