# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1628724246 0 # Node ID 22105f99dd6a5f6b6bfc43b0a8ba2ba39406a05c # Parent 038f83009cdbd11080588cc0e022bbc527cfa0fa Android: Add support for transparent background color for text drawing. diff -r 038f83009cdb -r 22105f99dd6a android/DWindows.kt --- 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 diff -r 038f83009cdb -r 22105f99dd6a android/dw.cpp --- 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); } /*