changeset 2637:22105f99dd6a

Android: Add support for transparent background color for text drawing.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Wed, 11 Aug 2021 23:24:06 +0000
parents 038f83009cdb
children b7cc83cf70fa
files android/DWindows.kt android/dw.cpp
diffstat 2 files changed, 39 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/android/DWindows.kt	Wed Aug 11 20:32:13 2021 +0000
+++ b/android/DWindows.kt	Wed Aug 11 23:24:06 2021 +0000
@@ -767,7 +767,7 @@
     var darkMode: Int = -1
     var lastClickView: View? = null
     private var paint = Paint()
-    private var bgcolor: Int = 0
+    private var bgcolor: Int? = null
     private var menuBar: DWMenu? = null
     private var defaultItem: View? = null
     private var fileURI: Uri? = null
@@ -3140,21 +3140,23 @@
                 colorsSet(fgColor, bgColor)
                 // Save the old color for later...
                 val rect = Rect()
-                val oldcolor = paint.color
-                // Prepare to draw the background rect
-                paint.color = bgcolor
                 paint.flags = 0
                 paint.style = Paint.Style.FILL_AND_STROKE
                 paint.textAlign = Paint.Align.LEFT
                 paint.getTextBounds(text, 0, text.length, rect)
                 val textheight = rect.bottom - rect.top
-                rect.top += y + textheight
-                rect.bottom += y + textheight
-                rect.left += x
-                rect.right += x
-                canvas.drawRect(rect, paint)
-                // Restore the color and prepare to draw text
-                paint.color = oldcolor
+                if(bgcolor != null) {
+                    val oldcolor = paint.color
+                    // Prepare to draw the background rect
+                    paint.color = bgcolor as Int
+                    rect.top += y + textheight
+                    rect.bottom += y + textheight
+                    rect.left += x
+                    rect.right += x
+                    canvas.drawRect(rect, paint)
+                    // Restore the color and prepare to draw text
+                    paint.color = oldcolor
+                }
                 paint.style = Paint.Style.STROKE
                 canvas.drawText(text, x.toFloat(), y.toFloat() + textheight.toFloat(), paint)
             }
@@ -3298,7 +3300,11 @@
     {
         waitOnUiThread {
             paint.color = colorFromDW(fgColor)
-            this.bgcolor = colorFromDW(bgColor)
+            if(bgColor != -1L) {
+                this.bgcolor = colorFromDW(bgColor)
+            } else {
+                this.bgcolor = null
+            }
         }
     }
 
@@ -3476,7 +3482,7 @@
         if(Looper.getMainLooper() == Looper.myLooper()) {
             val starttime = System.currentTimeMillis()
 
-            // Waiting for Idle to make sure Toast gets rendered.
+            // Waiting for Idle to check for sleep expiration
             Looper.myQueue().addIdleHandler(object : MessageQueue.IdleHandler {
                 var thrown: Boolean = false
 
--- a/android/dw.cpp	Wed Aug 11 20:32:13 2021 +0000
+++ b/android/dw.cpp	Wed Aug 11 23:24:06 2021 +0000
@@ -178,7 +178,7 @@
         pthread_key_create(&_dw_fgcolor_key, nullptr);
         pthread_setspecific(_dw_fgcolor_key, nullptr);
         pthread_key_create(&_dw_bgcolor_key, nullptr);
-        pthread_setspecific(_dw_bgcolor_key, nullptr);
+        pthread_setspecific(_dw_bgcolor_key, (void *)DW_RGB_TRANSPARENT);
 
         /* Create the dwmain event */
         _dw_main_event = dw_event_new();
@@ -842,6 +842,10 @@
     {
         return _dw_colors[thiscolor];
     }
+    else if(thiscolor == DW_RGB_TRANSPARENT)
+    {
+        return -1;
+    }
     return 0;
 }
 
@@ -2849,7 +2853,7 @@
  */
 void API dw_color_foreground_set(unsigned long value)
 {
-    pthread_setspecific(_dw_fgcolor_key, (void *)_dw_get_color(value));
+    pthread_setspecific(_dw_fgcolor_key, (void *)value);
 }
 
 /* Sets the current background drawing color.
@@ -2860,7 +2864,7 @@
  */
 void API dw_color_background_set(unsigned long value)
 {
-    pthread_setspecific(_dw_bgcolor_key, (void *)_dw_get_color(value));
+    pthread_setspecific(_dw_bgcolor_key, (void *)value);
 }
 
 /* Allows the user to choose a color using the system's color chooser dialog.
@@ -2887,8 +2891,8 @@
 
     if((handle || pixmap) && (env = (JNIEnv *)pthread_getspecific(_dw_env_key)))
     {
-        jlong fgcolor = (jlong)pthread_getspecific(_dw_fgcolor_key);
-        jlong bgcolor = (jlong)pthread_getspecific(_dw_bgcolor_key);
+        jlong fgcolor = _dw_get_color((unsigned long)pthread_getspecific(_dw_fgcolor_key));
+        jlong bgcolor = _dw_get_color((unsigned long)pthread_getspecific(_dw_bgcolor_key));
 
         // First get the class that contains the method you need to call
         jclass clazz = _dw_find_class(env, DW_CLASS_NAME);
@@ -2916,8 +2920,8 @@
 
     if((handle || pixmap) && (env = (JNIEnv *)pthread_getspecific(_dw_env_key)))
     {
-        jlong fgcolor = (jlong)pthread_getspecific(_dw_fgcolor_key);
-        jlong bgcolor = (jlong)pthread_getspecific(_dw_bgcolor_key);
+        jlong fgcolor = _dw_get_color((unsigned long)pthread_getspecific(_dw_fgcolor_key));
+        jlong bgcolor = _dw_get_color((unsigned long)pthread_getspecific(_dw_bgcolor_key));
 
         // First get the class that contains the method you need to call
         jclass clazz = _dw_find_class(env, DW_CLASS_NAME);
@@ -2944,8 +2948,8 @@
 
     if((handle || pixmap) && text && (env = (JNIEnv *)pthread_getspecific(_dw_env_key)))
     {
-        jlong fgcolor = (jlong)pthread_getspecific(_dw_fgcolor_key);
-        jlong bgcolor = (jlong)pthread_getspecific(_dw_bgcolor_key);
+        jlong fgcolor = _dw_get_color((unsigned long)pthread_getspecific(_dw_fgcolor_key));
+        jlong bgcolor = _dw_get_color((unsigned long)pthread_getspecific(_dw_bgcolor_key));
 
         // Construct the string
         jstring jstr = env->NewStringUTF(text);
@@ -3016,8 +3020,8 @@
 
         if(jx && jy)
         {
-            jlong fgcolor = (jlong)pthread_getspecific(_dw_fgcolor_key);
-            jlong bgcolor = (jlong)pthread_getspecific(_dw_bgcolor_key);
+            jlong fgcolor = _dw_get_color((unsigned long)pthread_getspecific(_dw_fgcolor_key));
+            jlong bgcolor = _dw_get_color((unsigned long)pthread_getspecific(_dw_bgcolor_key));
 
             // Construct the integer arrays
             env->SetIntArrayRegion(jx, 0, npoints, x);
@@ -3050,8 +3054,8 @@
 
     if((handle || pixmap) && (env = (JNIEnv *)pthread_getspecific(_dw_env_key)))
     {
-        jlong fgcolor = (jlong)pthread_getspecific(_dw_fgcolor_key);
-        jlong bgcolor = (jlong)pthread_getspecific(_dw_bgcolor_key);
+        jlong fgcolor = _dw_get_color((unsigned long)pthread_getspecific(_dw_fgcolor_key));
+        jlong bgcolor = _dw_get_color((unsigned long)pthread_getspecific(_dw_bgcolor_key));
 
         // First get the class that contains the method you need to call
         jclass clazz = _dw_find_class(env, DW_CLASS_NAME);
@@ -3083,8 +3087,8 @@
 
     if((handle || pixmap) && (env = (JNIEnv *)pthread_getspecific(_dw_env_key)))
     {
-        jlong fgcolor = (jlong)pthread_getspecific(_dw_fgcolor_key);
-        jlong bgcolor = (jlong)pthread_getspecific(_dw_bgcolor_key);
+        jlong fgcolor = _dw_get_color((unsigned long)pthread_getspecific(_dw_fgcolor_key));
+        jlong bgcolor = _dw_get_color((unsigned long)pthread_getspecific(_dw_bgcolor_key));
 
         // First get the class that contains the method you need to call
         jclass clazz = _dw_find_class(env, DW_CLASS_NAME);
@@ -6857,7 +6861,7 @@
     _dw_jvm->AttachCurrentThread(&env, nullptr);
     pthread_setspecific(_dw_env_key, env);
     pthread_setspecific(_dw_fgcolor_key, nullptr);
-    pthread_setspecific(_dw_bgcolor_key, nullptr);
+    pthread_setspecific(_dw_bgcolor_key, (void *)DW_RGB_TRANSPARENT);
 }
 
 /*