summaryrefslogtreecommitdiff
path: root/java/org/gnu/emacs/EmacsFontDriver.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/org/gnu/emacs/EmacsFontDriver.java')
-rw-r--r--java/org/gnu/emacs/EmacsFontDriver.java180
1 files changed, 180 insertions, 0 deletions
diff --git a/java/org/gnu/emacs/EmacsFontDriver.java b/java/org/gnu/emacs/EmacsFontDriver.java
new file mode 100644
index 00000000000..09d0377bd5e
--- /dev/null
+++ b/java/org/gnu/emacs/EmacsFontDriver.java
@@ -0,0 +1,180 @@
+/* Font backend for Android terminals. -*- c-file-style: "GNU" -*-
+
+Copyright (C) 2023-2024 Free Software Foundation, Inc.
+
+This file is part of GNU Emacs.
+
+GNU Emacs is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
+
+package org.gnu.emacs;
+
+import android.os.Build;
+
+/* This code is mostly unused. See sfntfont-android.c for the code
+ that is actually used. */
+
+public abstract class EmacsFontDriver
+{
+ /* Font weights. */
+ public static final int THIN = 0;
+ public static final int ULTRA_LIGHT = 40;
+ public static final int LIGHT = 50;
+ public static final int SEMI_LIGHT = 55;
+ public static final int REGULAR = 80;
+ public static final int MEDIUM = 100;
+ public static final int SEMI_BOLD = 180;
+ public static final int BOLD = 200;
+ public static final int EXTRA_BOLD = 205;
+ public static final int BLACK = 210;
+ public static final int ULTRA_HEAVY = 250;
+
+ /* Font slants. */
+ public static final int REVERSE_OBLIQUE = 0;
+ public static final int REVERSE_ITALIC = 10;
+ public static final int NORMAL = 100;
+ public static final int ITALIC = 200;
+ public static final int OBLIQUE = 210;
+
+ /* Font widths. */
+ public static final int ULTRA_CONDENSED = 50;
+ public static final int EXTRA_CONDENSED = 63;
+ public static final int CONDENSED = 75;
+ public static final int SEMI_CONDENSED = 87;
+ public static final int UNSPECIFIED = 100;
+ public static final int SEMI_EXPANDED = 113;
+ public static final int EXPANDED = 125;
+ public static final int EXTRA_EXPANDED = 150;
+ public static final int ULTRA_EXPANDED = 200;
+
+ /* Font spacings. */
+ public static final int PROPORTIONAL = 0;
+ public static final int DUAL = 90;
+ public static final int MONO = 100;
+ public static final int CHARCELL = 110;
+
+ /* Special glyph codes. */
+ public static final int FONT_INVALID_CODE = 0xFFFFFFFF;
+
+
+
+ public static class FontSpec
+ {
+ /* The fields below mean the same as they do in enum
+ font_property_index in font.h. */
+
+ public String foundry;
+ public String family;
+ public String adstyle;
+ public String registry;
+ public Integer width;
+ public Integer weight;
+ public Integer slant;
+ public Integer size;
+ public Integer spacing;
+ public Integer avgwidth;
+ public Integer dpi;
+
+ @Override
+ public String
+ toString ()
+ {
+ return ("foundry: " + foundry
+ + " family: " + family
+ + " adstyle: " + adstyle
+ + " registry: " + registry
+ + " width: " + width
+ + " weight: " + weight
+ + " slant: " + slant
+ + " spacing: " + spacing
+ + " avgwidth: " + avgwidth
+ + " dpi: " + dpi);
+ }
+ };
+
+ public static class FontMetrics
+ {
+ public short lbearing;
+ public short rbearing;
+ public short width;
+ public short ascent;
+ public short descent;
+
+ @Override
+ public String
+ toString ()
+ {
+ return ("lbearing " + lbearing
+ + " rbearing " + rbearing
+ + " width " + width
+ + " ascent " + ascent
+ + " descent " + descent);
+ }
+ }
+
+ public static class FontEntity extends FontSpec
+ {
+ /* No extra fields here. */
+ };
+
+ public abstract class FontObject extends FontSpec
+ {
+ public int minWidth;
+ public int maxWidth;
+ public int pixelSize;
+ public int height;
+ public int spaceWidth;
+ public int averageWidth;
+ public int ascent;
+ public int descent;
+ public int underlineThickness;
+ public int underlinePosition;
+ public int baselineOffset;
+ public int relativeCompose;
+ public int defaultAscent;
+ public int encodingCharset;
+ public int repertoryCharset;
+
+ public
+ FontObject ()
+ {
+ encodingCharset = -1;
+ repertoryCharset = -1;
+ }
+ };
+
+
+
+ /* These mean the same as they do in struct font_driver. */
+ public abstract FontEntity[] list (FontSpec fontSpec);
+ public abstract FontEntity match (FontSpec fontSpec);
+ public abstract String[] listFamilies ();
+ public abstract FontObject openFont (FontEntity fontEntity, int pixelSize);
+ public abstract int hasChar (FontSpec font, int charCode);
+ public abstract void textExtents (FontObject font, int code[],
+ FontMetrics fontMetrics);
+ public abstract int encodeChar (FontObject fontObject, int charCode);
+ public abstract int draw (FontObject fontObject, EmacsGC gc,
+ EmacsDrawable drawable, int[] chars,
+ int x, int y, int backgroundWidth,
+ boolean withBackground);
+
+ public static EmacsFontDriver
+ createFontDriver ()
+ {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
+ return new EmacsSdk23FontDriver ();
+
+ return new EmacsSdk7FontDriver ();
+ }
+};