perform (EmacsDrawable drawable, EmacsGC gc,
int x, int y, int x2, int y2)
{
- Rect rect;
Canvas canvas;
Paint paint;
int x0, x1, y0, y1;
/* And the clip rectangle. */
paint = gc.gcPaint;
- rect = new Rect (x0, y0, x1, y1);
canvas = drawable.lockCanvas (gc);
if (canvas == null)
/* DrawLine with clip mask not implemented; it is not used by
Emacs. */
- drawable.damageRect (rect);
+ drawable.damageRect (x0, y0, x1, y1);
}
}
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. */
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
{
jclass class;
jmethodID get_bitmap;
- jmethodID damage_rect;
};
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
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
}
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
}
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