]> git.eshelyaron.com Git - emacs.git/commitdiff
Update Android port
authorPo Lu <luangruo@yahoo.com>
Thu, 6 Jul 2023 01:35:27 +0000 (09:35 +0800)
committerPo Lu <luangruo@yahoo.com>
Thu, 6 Jul 2023 01:35:27 +0000 (09:35 +0800)
* java/org/gnu/emacs/EmacsNative.java (scaledDensity): Announce
new argument `scaledDensity'.
* java/org/gnu/emacs/EmacsNoninteractive.java (main): Specify
new argument.
* java/org/gnu/emacs/EmacsService.java (onCreate): Compute an
adjusted DPI for the font size based on the ratio between
density and scaledDensity.
(run): Specify that adjusted density.
* src/android.c (setEmacsParams): Set
`android_scaled_pixel_density'.
* src/android.h: (android_scaled_pixel_density: New variable.
* src/androidterm.c (android_term_init): Set `font_resolution'.
* src/androidterm.h (struct android_display_info): New field.
* src/font.c (font_pixel_size, font_find_for_lface)
(font_open_for_lface, Ffont_face_attributes, Fopen_font): Use
FRAME_RES instead of FRAME_RES_Y.
* src/frame.h (FRAME_RES): New macro.  Use this to convert
between font point and pixel sizes as opposed to FRAME_RES_Y.
* src/w32font.c (fill_in_logfont):
* src/xfaces.c (Fx_family_fonts, set_lface_from_font): Use
FRAME_RES instead of FRAME_RES_Y.  (bug#64444)

java/org/gnu/emacs/EmacsNative.java
java/org/gnu/emacs/EmacsNoninteractive.java
java/org/gnu/emacs/EmacsService.java
src/android.c
src/android.h
src/androidterm.c
src/androidterm.h
src/font.c
src/frame.h
src/w32font.c
src/xfaces.c

index 9e87c419f956c23e9ff757d828efef5f8bc29a8a..5b8b0f1eae51c85d5b0c34f91a93bb65c58d9204 100644 (file)
@@ -60,6 +60,9 @@ public final class EmacsNative
      pixelDensityX and pixelDensityY are the DPI values that will be
      used by Emacs.
 
+     scaledDensity is the DPI value used to translate point sizes to
+     pixel sizes when loading fonts.
+
      classPath must be the classpath of this app_process process, or
      NULL.
 
@@ -70,6 +73,7 @@ public final class EmacsNative
                                            String cacheDir,
                                            float pixelDensityX,
                                            float pixelDensityY,
+                                           float scaledDensity,
                                            String classPath,
                                            EmacsService emacsService);
 
index aaba74d877cf9c08dd803efc23eb15e8bfbca33e..aa6fa41ba97281d6a566d49e64b8781a06569d05 100644 (file)
@@ -190,7 +190,7 @@ public final class EmacsNoninteractive
 
     EmacsNative.setEmacsParams (assets, filesDir,
                                libDir, cacheDir, 0.0f,
-                               0.0f, null, null);
+                               0.0f, 0.0f, null, null);
 
     /* Now find the dump file that Emacs should use, if it has already
        been dumped.  */
index e1fd2dbffda3b4bca76ed11999d0c5885d7db4d1..37048960f25010796921c92dc8542c8ed906db61 100644 (file)
@@ -211,6 +211,7 @@ public final class EmacsService extends Service
     final String filesDir, libDir, cacheDir, classPath;
     final double pixelDensityX;
     final double pixelDensityY;
+    final double scaledDensity;
 
     SERVICE = this;
     handler = new Handler (Looper.getMainLooper ());
@@ -219,6 +220,9 @@ public final class EmacsService extends Service
     metrics = getResources ().getDisplayMetrics ();
     pixelDensityX = metrics.xdpi;
     pixelDensityY = metrics.ydpi;
+    scaledDensity = ((metrics.scaledDensity
+                     / metrics.density)
+                    * pixelDensityX);
     resolver = getContentResolver ();
 
     try
@@ -247,6 +251,7 @@ public final class EmacsService extends Service
              EmacsNative.setEmacsParams (manager, filesDir, libDir,
                                          cacheDir, (float) pixelDensityX,
                                          (float) pixelDensityY,
+                                         (float) scaledDensity,
                                          classPath, EmacsService.this);
            }
          }, extraStartupArgument,
index 2a2d134c3c8e4c23896f07800f89d8f3b0c52bcb..a6bc82178203f146080e55693a009d4419228ef5 100644 (file)
@@ -198,6 +198,10 @@ char *android_class_path;
 /* The display's pixel densities.  */
 double android_pixel_density_x, android_pixel_density_y;
 
+/* The display pixel density used to convert between point and pixel
+   font sizes.  */
+double android_scaled_pixel_density;
+
 /* The Android application data directory.  */
 static char *android_files_dir;
 
@@ -2000,6 +2004,7 @@ NATIVE_NAME (setEmacsParams) (JNIEnv *env, jobject object,
                              jobject cache_dir,
                              jfloat pixel_density_x,
                              jfloat pixel_density_y,
+                             jfloat scaled_density,
                              jobject class_path,
                              jobject emacs_service_object)
 {
@@ -2021,6 +2026,7 @@ NATIVE_NAME (setEmacsParams) (JNIEnv *env, jobject object,
 
   android_pixel_density_x = pixel_density_x;
   android_pixel_density_y = pixel_density_y;
+  android_scaled_pixel_density = scaled_density;
 
   __android_log_print (ANDROID_LOG_INFO, __func__,
                       "Initializing "PACKAGE_STRING"...\nPlease report bugs to "
index 8634ba01a3d7006aa75651413e6f472543ee3505..33ca379e6ba499b8e85c718348556287e22bd6da 100644 (file)
@@ -58,6 +58,7 @@ extern int android_fclose (FILE *);
 extern const char *android_get_home_directory (void);
 
 extern double android_pixel_density_x, android_pixel_density_y;
+extern double android_scaled_pixel_density;
 
 enum android_handle_type
   {
index aed8e24b9fa2fe649903923bf684ef1ef6ad8cbf..20a8860a9136c18efeb9b3259be9cfa3592cfa96 100644 (file)
@@ -6295,11 +6295,10 @@ android_term_init (void)
   dpyinfo->color_map = color_map;
 
 #ifndef ANDROID_STUBIFY
-
   dpyinfo->resx = android_pixel_density_x;
   dpyinfo->resy = android_pixel_density_y;
-
-#endif
+  dpyinfo->font_resolution = android_scaled_pixel_density;
+#endif /* ANDROID_STUBIFY */
 
   /* https://lists.gnu.org/r/emacs-devel/2015-11/msg00194.html  */
   dpyinfo->smallest_font_height = 1;
index e3738fb2192056f3790157dfbf61ae1506b84140..e75d46b1dfbea476c1cbb70cd98f24aa0f373a65 100644 (file)
@@ -65,6 +65,11 @@ struct android_display_info
   /* DPI of the display.  */
   double resx, resy;
 
+  /* DPI used to convert font point sizes into pixel dimensions.
+     This is resy adjusted by a fixed scaling factor specified by
+     the user.  */
+  double font_resolution;
+
   /* Scratch GC for drawing a cursor in a non-default face. */
   struct android_gc *scratch_cursor_gc;
 
index 9dcafb3bb3353749e551a7882529e1edd1b0a220..7f8ddc4dc34d865bcc4a2cb6b2a40d23cfcbe23f 100644 (file)
@@ -348,7 +348,7 @@ font_pixel_size (struct frame *f, Lisp_Object spec)
       if (FIXNUMP (val))
        dpi = XFIXNUM (val);
       else
-       dpi = FRAME_RES_Y (f);
+       dpi = FRAME_RES (f);
       pixel_size = POINT_TO_PIXEL (point_size, dpi);
       return pixel_size;
     }
@@ -3023,7 +3023,7 @@ font_find_for_lface (struct frame *f, Lisp_Object *attrs, Lisp_Object spec, int
     {
       double pt = XFIXNUM (attrs[LFACE_HEIGHT_INDEX]);
 
-      pixel_size = POINT_TO_PIXEL (pt / 10, FRAME_RES_Y (f));
+      pixel_size = POINT_TO_PIXEL (pt / 10, FRAME_RES (f));
       if (pixel_size < 1)
        pixel_size = 1;
     }
@@ -3175,13 +3175,13 @@ font_open_for_lface (struct frame *f, Lisp_Object entity, Lisp_Object *attrs, Li
            }
 
          pt /= 10;
-         size = POINT_TO_PIXEL (pt, FRAME_RES_Y (f));
+         size = POINT_TO_PIXEL (pt, FRAME_RES (f));
 #ifdef HAVE_NS
          if (size == 0)
            {
              Lisp_Object ffsize = get_frame_param (f, Qfontsize);
              size = (NUMBERP (ffsize)
-                     ? POINT_TO_PIXEL (XFLOATINT (ffsize), FRAME_RES_Y (f))
+                     ? POINT_TO_PIXEL (XFLOATINT (ffsize), FRAME_RES (f))
                      : 0);
            }
 #endif
@@ -4082,7 +4082,7 @@ are to be displayed on.  If omitted, the selected frame is used.  */)
   if (FIXNUMP (val))
     {
       Lisp_Object font_dpi = AREF (font, FONT_DPI_INDEX);
-      int dpi = FIXNUMP (font_dpi) ? XFIXNUM (font_dpi) : FRAME_RES_Y (f);
+      int dpi = FIXNUMP (font_dpi) ? XFIXNUM (font_dpi) : FRAME_RES (f);
       plist[n++] = QCheight;
       plist[n++] = make_fixnum (PIXEL_TO_POINT (XFIXNUM (val) * 10, dpi));
     }
@@ -4986,7 +4986,7 @@ DEFUN ("open-font", Fopen_font, Sopen_font, 1, 3, 0,
     {
       CHECK_NUMBER (size);
       if (FLOATP (size))
-       isize = POINT_TO_PIXEL (XFLOAT_DATA (size), FRAME_RES_Y (f));
+       isize = POINT_TO_PIXEL (XFLOAT_DATA (size), FRAME_RES (f));
       else if (! integer_to_intmax (size, &isize))
        args_out_of_range (font_entity, size);
       if (! (INT_MIN <= isize && isize <= INT_MAX))
index 8ed9c0f37d88d400fcfe1d0ac2bc1f874ab9a45a..62fc63c7c1f2dc5f2688e31b50e6c61cae5fbbf6 100644 (file)
@@ -981,12 +981,26 @@ default_pixels_per_inch_y (void)
 #define FRAME_RES_Y(f)                                         \
   (eassert (FRAME_WINDOW_P (f)), FRAME_DISPLAY_INFO (f)->resy)
 
+#ifdef HAVE_ANDROID
+
+/* Android systems use a font scaling factor independent from the
+   display DPI.  */
+
+#define FRAME_RES(f)                                           \
+  (eassert (FRAME_WINDOW_P (f)),                               \
+   FRAME_DISPLAY_INFO (f)->font_resolution)
+
+#else /* !HAVE_ANDROID */
+#define FRAME_RES(f) (FRAME_RES_Y (f))
+#endif /* HAVE_ANDROID */
+
 #else /* !HAVE_WINDOW_SYSTEM */
 
 /* Defaults when no window system available.  */
 
-#define FRAME_RES_X(f) default_pixels_per_inch_x ()
-#define FRAME_RES_Y(f) default_pixels_per_inch_y ()
+#define FRAME_RES_X(f) default_pixels_per_inch_x ()
+#define FRAME_RES_Y(f) default_pixels_per_inch_y ()
+#define FRAME_RES(f)   default_pixels_per_inch_y ()
 
 #endif /* HAVE_WINDOW_SYSTEM */
 
index 2917fa55f9f55910e5952f77c95a06a93ca09a79..0371b24e1d128419203197981da4c034766a76b6 100644 (file)
@@ -2031,7 +2031,7 @@ static void
 fill_in_logfont (struct frame *f, LOGFONT *logfont, Lisp_Object font_spec)
 {
   Lisp_Object tmp, extra;
-  int dpi = FRAME_RES_Y (f);
+  int dpi = FRAME_RES (f);
 
   tmp = AREF (font_spec, FONT_DPI_INDEX);
   if (FIXNUMP (tmp))
index af3428ad99522be511d7c884f8d21bc391360f2c..30487c0e8fbe4fb8ab31d18e650713e820ce7efc 100644 (file)
@@ -1612,7 +1612,7 @@ the face font sort order, see `face-font-selection-order'.  */)
     {
       Lisp_Object font = AREF (vec, i);
       int point = PIXEL_TO_POINT (XFIXNUM (AREF (font, FONT_SIZE_INDEX)) * 10,
-                                 FRAME_RES_Y (f));
+                                 FRAME_RES (f));
       Lisp_Object spacing = Ffont_get (font, QCspacing);
       Lisp_Object v = CALLN (Fvector,
                             AREF (font, FONT_FAMILY_INDEX),
@@ -2173,7 +2173,7 @@ set_lface_from_font (struct frame *f, Lisp_Object lface,
 
   if (force_p || UNSPECIFIEDP (LFACE_HEIGHT (lface)))
     {
-      int pt = PIXEL_TO_POINT (font->pixel_size * 10, FRAME_RES_Y (f));
+      int pt = PIXEL_TO_POINT (font->pixel_size * 10, FRAME_RES (f));
 
       eassert (pt > 0);
       ASET (lface, LFACE_HEIGHT_INDEX, make_fixnum (pt));