]> git.eshelyaron.com Git - emacs.git/commitdiff
Optimize damage region tracking under Android
authorPo Lu <luangruo@yahoo.com>
Mon, 18 Sep 2023 02:59:55 +0000 (10:59 +0800)
committerPo Lu <luangruo@yahoo.com>
Mon, 18 Sep 2023 02:59:55 +0000 (10:59 +0800)
* java/org/gnu/emacs/EmacsDrawLine.java (perform):

* java/org/gnu/emacs/EmacsDrawRectangle.java (perform): Call
damageRect with integer coordinates in lieu of consing a new
Rect.

* java/org/gnu/emacs/EmacsDrawable.java (damageRect) <IIII>:
Declare a new variant of damageRect, accepting four integers
designating the extents of the damage rectangle.

* java/org/gnu/emacs/EmacsPixmap.java (damageRect) <IIII>: New
stub.

* java/org/gnu/emacs/EmacsView.java (damageRect) <IIII>:
Implement this overloaded variant of damageRect.

* java/org/gnu/emacs/EmacsWindow.java (damageRect): Ditto.

* src/android.c (android_init_emacs_drawable)
(android_init_emacs_window): Move search for `damageRect' to
android_init_emacs_window.
(android_damage_window): Call IIII variant of `damageRect' to
avoid consing a new rectangle.  Ameliorate dynamic method
dispatch overhead.

java/org/gnu/emacs/EmacsDrawLine.java
java/org/gnu/emacs/EmacsDrawRectangle.java
java/org/gnu/emacs/EmacsDrawable.java
java/org/gnu/emacs/EmacsPixmap.java
java/org/gnu/emacs/EmacsView.java
java/org/gnu/emacs/EmacsWindow.java
src/android.c

index d367ccff9c499a296a411d9207ea7495a7a55e66..be4da54c075e20fa5a19ab148a7dea8e775dec63 100644 (file)
@@ -29,7 +29,6 @@ public final class EmacsDrawLine
   perform (EmacsDrawable drawable, EmacsGC gc,
           int x, int y, int x2, int y2)
   {
-    Rect rect;
     Canvas canvas;
     Paint paint;
     int x0, x1, y0, y1;
@@ -48,7 +47,6 @@ public final class EmacsDrawLine
     /* And the clip rectangle.  */
 
     paint = gc.gcPaint;
-    rect = new Rect (x0, y0, x1, y1);
     canvas = drawable.lockCanvas (gc);
 
     if (canvas == null)
@@ -74,6 +72,6 @@ public final class EmacsDrawLine
 
     /* DrawLine with clip mask not implemented; it is not used by
        Emacs.  */
-    drawable.damageRect (rect);
+    drawable.damageRect (x0, y0, x1, y1);
   }
 }
index e1261b4a2d2cda7eff879148f403ecc1bd42737d..ee9110daaafed7f15cc8518316b597d7eb323ef6 100644 (file)
@@ -114,7 +114,6 @@ public final class EmacsDrawRectangle
        maskBitmap.recycle ();
       }
 
-    drawable.damageRect (new Rect (x, y, x + width + 1,
-                                  y + height + 1));
+    drawable.damageRect (x, y, x + width + 1, y + height + 1);
   }
 }
index f2f8885e976353d60105ffa6721be54bd13b3dc7..3ed72a836e5fba1cbcb426387efc199c62c24330 100644 (file)
@@ -27,6 +27,7 @@ public interface EmacsDrawable
 {
   public Canvas lockCanvas (EmacsGC gc);
   public void damageRect (Rect damageRect);
+  public void damageRect (int left, int top, int right, int bottom);
   public Bitmap getBitmap ();
   public boolean isDestroyed ();
 };
index 2cbf7a430cf7dee77191c4589418660c33af1aba..e02699ecba7f068cf5ba012a48f3bb07e37dc91e 100644 (file)
@@ -175,6 +175,13 @@ public final class EmacsPixmap extends EmacsHandleObject
 
   }
 
+  @Override
+  public void
+  damageRect (int left, int top, int right, int bottom)
+  {
+
+  }
+
   @Override
   public Bitmap
   getBitmap ()
index 0f83af882ae67ad05ed1c0ddea7e3a385873657d..d09dcc7e50d74c66d83457109df169a62fc763dc 100644 (file)
@@ -437,6 +437,16 @@ public final class EmacsView extends ViewGroup
     damageRegion.union (damageRect);
   }
 
+  /* This function enables damage to be recorded without consing a new
+     Rect object.  */
+
+  public void
+  damageRect (int left, int top, int right, int bottom)
+  {
+    EmacsService.checkEmacsThread ();
+    damageRegion.op (left, top, right, bottom, Region.Op.UNION);
+  }
+
   /* This method is called from both the UI thread and the Emacs
      thread.  */
 
index 3738376a6f45a293523e02452d1e1fcae83d73fa..1f28d5f4f5353892fc45743e0139e7bbb9e78ebb 100644 (file)
@@ -514,7 +514,17 @@ public final class EmacsWindow extends EmacsHandleObject
   public void
   damageRect (Rect damageRect)
   {
-    view.damageRect (damageRect);
+    view.damageRect (damageRect.left,
+                    damageRect.top,
+                    damageRect.right,
+                    damageRect.bottom);
+  }
+
+  @Override
+  public void
+  damageRect (int left, int top, int right, int bottom)
+  {
+    view.damageRect (left, top, right, bottom);
   }
 
   public void
index e07b3a9935218fbd5b3b0c15a6b9ac951b441cd8..2cc86d8c56f313aa366d149435f659d49d65f134 100644 (file)
@@ -87,7 +87,6 @@ struct android_emacs_drawable
 {
   jclass class;
   jmethodID get_bitmap;
-  jmethodID damage_rect;
 };
 
 struct android_emacs_window
@@ -111,6 +110,7 @@ struct android_emacs_window
   jmethodID set_dont_accept_focus;
   jmethodID set_dont_focus_on_map;
   jmethodID define_cursor;
+  jmethodID damage_rect;
 };
 
 struct android_emacs_cursor
@@ -1712,7 +1712,6 @@ android_init_emacs_drawable (void)
   assert (drawable_class.c_name);
 
   FIND_METHOD (get_bitmap, "getBitmap", "()Landroid/graphics/Bitmap;");
-  FIND_METHOD (damage_rect, "damageRect", "(Landroid/graphics/Rect;)V");
 #undef FIND_METHOD
 }
 
@@ -1766,6 +1765,12 @@ android_init_emacs_window (void)
   FIND_METHOD (set_dont_accept_focus, "setDontAcceptFocus", "(Z)V");
   FIND_METHOD (define_cursor, "defineCursor",
               "(Lorg/gnu/emacs/EmacsCursor;)V");
+
+  /* In spite of the declaration of this function being located within
+     EmacsDrawable, the ID of the `damage_rect' method is retrieved
+     from EmacsWindow, which avoids virtual function dispatch within
+     android_damage_window.  */
+  FIND_METHOD (damage_rect, "damageRect", "(IIII)V");
 #undef FIND_METHOD
 }
 
@@ -5284,25 +5289,18 @@ android_damage_window (android_drawable handle,
 
   drawable = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW);
 
-  /* Now turn DAMAGE into a Java rectangle.  */
-  rect = (*android_java_env)->NewObject (android_java_env,
-                                        android_rect_class,
-                                        android_rect_constructor,
-                                        (jint) damage->x,
-                                        (jint) damage->y,
-                                        (jint) (damage->x
-                                                + damage->width),
-                                        (jint) (damage->y
-                                                + damage->height));
-  android_exception_check ();
-
   /* Post the damage to the drawable.  */
-  (*android_java_env)->CallVoidMethod (android_java_env,
-                                      drawable,
-                                      drawable_class.damage_rect,
-                                      rect);
-  android_exception_check_1 (rect);
-  ANDROID_DELETE_LOCAL_REF (rect);
+  (*android_java_env)->CallNonvirtualVoidMethod (android_java_env,
+                                                drawable,
+                                                window_class.class,
+                                                window_class.damage_rect,
+                                                (jint) damage->x,
+                                                (jint) damage->y,
+                                                (jint) (damage->x
+                                                        + damage->width),
+                                                (jint) (damage->y
+                                                        + damage->height));
+  android_exception_check ();
 }
 
 \f