diff options
Diffstat (limited to 'java/org/gnu/emacs/EmacsFontDriver.java')
-rw-r--r-- | java/org/gnu/emacs/EmacsFontDriver.java | 180 |
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 (); + } +}; |