summaryrefslogtreecommitdiff
path: root/src/drivers/Android/Fl_Android_Graphics_Font.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/Android/Fl_Android_Graphics_Font.cxx')
-rw-r--r--src/drivers/Android/Fl_Android_Graphics_Font.cxx797
1 files changed, 0 insertions, 797 deletions
diff --git a/src/drivers/Android/Fl_Android_Graphics_Font.cxx b/src/drivers/Android/Fl_Android_Graphics_Font.cxx
deleted file mode 100644
index 48e61525c..000000000
--- a/src/drivers/Android/Fl_Android_Graphics_Font.cxx
+++ /dev/null
@@ -1,797 +0,0 @@
-//
-// Graphics routines for the Fast Light Tool Kit (FLTK).
-//
-// Copyright 1998-2018 by Bill Spitzak and others.
-//
-// This library is free software. Distribution and use rights are outlined in
-// the file "COPYING" which should have been included with this file. If this
-// file is missing or damaged, see the license at:
-//
-// https://www.fltk.org/COPYING.php
-//
-// Please see the following page on how to report bugs and issues:
-//
-// https://www.fltk.org/bugs.php
-//
-
-
-#include "Fl_Android_Graphics_Font.H"
-#include "Fl_Android_Application.H"
-#include <FL/fl_draw.H>
-#include <errno.h>
-#include <FL/filename.H>
-
-#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation
-#include "stb_truetype.h"
-
-
-//struct Fl_Fontdesc {
-// const char *name;
-// char fontname[128]; // "Pretty" font name
-// Fl_Font_Descriptor *first; // linked list of sizes of this style
-//};
-
-
-/**
- - font names starting with a $ will have the system font path inserted
- - font names starting with an @ will be loaded via the Asset Manager
- - all other names will be used verbatim
- */
-static Fl_Fontdesc built_in_table[] = {
- {"$Roboto-Regular.ttf"},
- {"$Roboto-Bold.ttf"},
- {"$Roboto-Italic.ttf"},
- {"$Roboto-BoldItalic.ttf"},
- {"$CutiveMono.ttf"},
- {"$CutiveMono.ttf"}, // sorry no bold
- {"$CutiveMono.ttf"}, // sorry no italic
- {"$CutiveMono.ttf"}, // sorry no bold-italic
- {"$NotoSerif-Regular.ttf"},
- {"$NotoSerif-Bold.ttf"},
- {"$NotoSerif-Italic.ttf"},
- {"$NotoSerif-BoldItalic.ttf"},
- {"$Roboto-Regular.ttf"},
- {"$DroidSansMono.ttf"},
- {"$DroidSansMono.ttf"}, // sorry no bold
- {"$Roboto-Regular.ttf"},
-};
-
-Fl_Fontdesc* fl_fonts = built_in_table;
-
-static const char *old_font_names[] = {
- "$DroidSans.ttf", "$DroidSerif-Regular.ttf",
- "$DroidSansMono.ttf", "$DroidSansMono.ttf"
-};
-
-// -----------------------------------------------------------------------------
-
-/**
- Create an empty Bytemap.
- */
-Fl_Android_Bytemap::Fl_Android_Bytemap()
-{
-}
-
-/**
- Create an empty Bytemap.
- */
-Fl_Android_Bytemap::Fl_Android_Bytemap(int w, int h)
-{
- pWidth = w; pStride = w; pHeight = h;
- pBytes = (unsigned char *)calloc(w, h);
-}
-
-/**
- Destroy the Bytemap and its allocated resources.
- */
-Fl_Android_Bytemap::~Fl_Android_Bytemap()
-{
- if (pBytes) ::free(pBytes);
-}
-
-/**
- Render a bytemap to the screen using the current fl_color.
-
- Bytes are seen as alpha values for the RGB color set by fl_color. For better
- performance, alpha is only rendered in 5 steps. All rendering is offset as
- described in the bytemap, and clipped to the clipping region.
- \param xx, yy bottom left position of the bytemap (baseline for text)
- \param bm bytemap including offsets and size
- \param r clipping rectangle
- */
-void Fl_Android_Graphics_Driver::draw(int xx, int yy, Fl_Android_Bytemap *bm,
- Fl_Rect_Region &r)
-{
- xx += bm->pXOffset; yy += bm->pYOffset;
-
- if (xx>r.right()) return;
- if (yy>r.bottom()) return;
- if (xx+bm->pWidth < r.left()) return;
- if (yy+bm->pHeight < r.top()) return;
-
- uint16_t cc = make565(fl_color()), cc12 = (cc&0xf7de)>>1, cc14 = (cc12&0xf7de)>>1, cc34 = cc12+cc14;
- int32_t ss = pStride;
- uint16_t *bits = pBits;
- uint32_t ww = bm->pWidth;
- uint32_t hh = bm->pHeight;
- unsigned char *srcBytes = bm->pBytes;
-
- int dx = r.left()-xx;
- int dy = r.top()-yy;
- int dr = (xx+ww)-r.right();
- int db = (yy+hh)-r.bottom();
- if (dx>0) { xx+=dx; ww-=dx; srcBytes+=dx; }
- if (dy>0) { yy+=dy; hh-=dy; srcBytes+=dy*bm->pStride; }
- if (dr>0) { ww-=dr; }
- if (db>0) { hh-=db; }
-
- for (uint32_t iy = 0; iy<hh; ++iy) {
- uint16_t *d = bits + (yy+iy)*ss + xx;
- unsigned char *s = srcBytes + iy*bm->pStride;
- for (uint32_t ix = 0; ix<ww; ++ix) {
-#if 1
- // 5 step antialiasing
- unsigned char v = *s++;
- if (v>200) { // 100% black
- *d = cc;
- } else if (v<50) { // 0%
- } else if (v>150) { // 75%
- uint16_t nn = *d, nn14 = (nn&(uint16_t(0xe79c)))>>2;
- *d = nn14 + cc34;
- } else if (v<100) { // 25%
- uint16_t nn = *d, nn12 = (nn&(uint16_t(0xf7de)))>>1, nn14 = (nn12&(uint16_t(0xf7de)))>>1, nn34 = nn12+nn14;
- *d = nn34 + cc14;
- } else { // 50%
- uint16_t nn = *d, nn12 = (nn&(uint16_t(0xf7de)))>>1;
- *d = nn12 + cc12;
- }
-#else
- // pure black and white
- if (*s++ > 128)
- *d = cc;
-#endif
- d++;
- }
- }
-}
-
-// -----------------------------------------------------------------------------
-
-/**
- Create an empty image.
- All initialisation of members is done in-lin (C++11)
- */
-Fl_Android_565A_Map::Fl_Android_565A_Map()
-{
-}
-
-Fl_Android_565A_Map::Fl_Android_565A_Map(int w, int h)
-{
- pWidth = w; pStride = w; pHeight = h;
- pWords = (uint32_t*)calloc(4, w*h);
-}
-
-Fl_Android_565A_Map::~Fl_Android_565A_Map()
-{
- if (pWords) ::free(pWords);
-}
-
-/**
- Render a bytemap to the screen using the current fl_color.
-
- Bytes are seen as alpha values for the RGB color set by fl_color. For better
- performance, alpha is only rendered in 5 steps. All rendering is offset as
- described in the bytemap, and clipped to the clipping region.
- \param xx, yy bottom left position of the bytemap (baseline for text)
- \param bm bytemap including offsets and size
- \param r clipping rectangle
- */
-void Fl_Android_Graphics_Driver::draw(int xx, int yy, Fl_Android_565A_Map *bm,
- Fl_Rect_Region &r)
-{
- xx += bm->pXOffset; yy += bm->pYOffset;
-
- if (xx>r.right()) return;
- if (yy>r.bottom()) return;
- if (xx+bm->pWidth < r.left()) return;
- if (yy+bm->pHeight < r.top()) return;
-
- uint16_t cc = make565(fl_color()); // TODO: alpha: , cc12 = (cc&0xf7de)>>1, cc14 = (cc12&0xf7de)>>1, cc34 = cc12+cc14;
- int32_t ss = pStride;
- uint16_t *bits = pBits;
- uint32_t ww = bm->pWidth;
- uint32_t hh = bm->pHeight;
- uint32_t *srcWords = bm->pWords;
-
- int dx = r.left()-xx;
- int dy = r.top()-yy;
- int dr = (xx+ww)-r.right();
- int db = (yy+hh)-r.bottom();
- if (dx>0) { xx+=dx; ww-=dx; srcWords+=dx; }
- if (dy>0) { yy+=dy; hh-=dy; srcWords+=dy*bm->pStride; }
- if (dr>0) { ww-=dr; }
- if (db>0) { hh-=db; }
-
- for (uint32_t iy = 0; iy<hh; ++iy) {
- uint16_t *d = bits + (yy+iy)*ss + xx;
- uint32_t *s = srcWords + iy*bm->pStride;
- for (uint32_t ix = 0; ix<ww; ++ix) {
- uint32_t c = *s++;
- uint8_t alpha = c;
- if (alpha>0) {
- uint16_t rgb = c >> 16;
- // TODO: alpha blending: *d = rgb*a + (*d)*(1-a);
- *d = rgb;
- }
- d++;
- }
- }
-}
-
-// -----------------------------------------------------------------------------
-
-/**
- Create a True Type font manager.
- \param fname the name of the font as it appears in the fl_fonts table.
- \param fnum the index into the fl_fonts table
- */
-Fl_Android_Font_Source::Fl_Android_Font_Source(const char *fname, Fl_Font fnum) :
- pFileBuffer(nullptr),
- pName(fname),
- pFontIndex(fnum),
- pError(false)
-{
-}
-
-/**
- Release all resources.
- */
-Fl_Android_Font_Source::~Fl_Android_Font_Source()
-{
- if (pFileBuffer) ::free(pFileBuffer);
- // pFont does not allocate any buffers and needs no destructor
-}
-
-/**
- Attempt to find an load a font file.
- \param name file or asset name
- \return
- */
-bool Fl_Android_Font_Source::load_font(const char *name)
-{
- if (pFileBuffer) return true;
- if (!name) return false;
- bool ret = false;
- if (name[0]=='@')
- ret = load_font_asset(name+1);
- else
- ret = load_font_file(name);
- return ret;
-}
-
-/**
- Attempt to load a font through the asset manager.
- \param name file or asset name
- \return
- */
-bool Fl_Android_Font_Source::load_font_asset(const char *name)
-{
- errno = 0;
- AAssetManager *aMgr = Fl_Android_Application::get_asset_manager();
- AAsset *aFile = AAssetManager_open(aMgr, name, AASSET_MODE_STREAMING);
- if (aFile == nullptr) {
- Fl_Android_Application::log_w("Can't open font asset at '%s': ",
- name, strerror(errno));
- return false;
- }
- size_t fsize = (size_t)AAsset_getLength(aFile);
- if (fsize == 0) {
- Fl_Android_Application::log_w("Can't read font asset at '%s': file is empty",
- name);
- AAsset_close(aFile);
- return false;
- }
- pFileBuffer = (uint8_t *)malloc(fsize);
- if (AAsset_read(aFile, pFileBuffer, fsize)<=0) {
- Fl_Android_Application::log_w("Can't read font asset at '%s': ",
- name, strerror(errno));
- free(pFileBuffer);
- pFileBuffer = 0;
- AAsset_close(aFile);
- return false;
- }
- AAsset_close(aFile);
- return true;
-}
-
-/**
- Attempt to load a font through the asset manager.
- \param name file or asset name
- \return
- */
-bool Fl_Android_Font_Source::load_font_file(const char *name)
-{
- char buf[2048];
- if (name[0] == '$') {
- // use the system path for fonts
- snprintf(buf, 2048, "/system/fonts/%s", name + 1);
- } else {
- strcpy(buf, name);
- }
- FILE *f = fopen(buf, "rb");
- if (f == nullptr) {
- Fl_Android_Application::log_w("Can't open font file at '%s': ",
- name, strerror(errno));
- return false;
- }
- fseek(f, 0, SEEK_END);
- size_t fsize = (size_t)ftell(f);
- fseek(f, 0, SEEK_SET);
- if (fsize == 0) {
- Fl_Android_Application::log_w(
- "Can't read font file at '%s': file is empty",
- name);
- fclose(f);
- return false;
- }
- pFileBuffer = (uint8_t *)malloc(fsize);
- if (fread(pFileBuffer, 1, fsize, f)<=0) {
- Fl_Android_Application::log_w("Can't read font file at '%s': ",
- name, strerror(errno));
- free(pFileBuffer);
- pFileBuffer = 0;
- fclose(f);
- return false;
- }
- fclose(f);
- return true;
-}
-
-
-/**
- Load a True Type font file and initialize the TTF interpreter.
- A copy of the font file must remain in memory for the interpreter to work.
- */
-void Fl_Android_Font_Source::load_font()
-{
- if (pError) return;
- if (pFileBuffer==0) {
- const char *name = fl_fonts[pFontIndex].name;
-
- // first attempt, try to read a font from wherever the user wishes
- bool ret = load_font(name);
-
- // if that did not work, read the old style Android fonts
- if (!ret && pFontIndex<16)
- ret = load_font(old_font_names[pFontIndex/4]);
-
- // if that still didn't work, see if we have the default font asset
- if (!ret)
- ret = load_font("@fonts/Roboto-Regular.ttf");
-
- // still no luck? Well, I guess we can't render anything in this font.
- if (!ret) {
- Fl_Android_Application::log_e("Giving up. Can't load font '%s'", name);
- pError = true;
- return;
- }
- stbtt_InitFont(&pFont, pFileBuffer, stbtt_GetFontOffsetForIndex(pFileBuffer,0));
- }
-}
-
-/**
- Return a bytemap for the give unicode character.
- \param c unicode character
- \param size height in pixels
- \return a bytemap
- */
-Fl_Android_Bytemap *Fl_Android_Font_Source::get_bytemap(uint32_t c, int size)
-{
- if (pFileBuffer==0) load_font();
- if (pError) return nullptr;
-
- Fl_Android_Bytemap *bm = new Fl_Android_Bytemap();
-
- float hgt = stbtt_ScaleForPixelHeight(&pFont, size);
- bm->pBytes = stbtt_GetCodepointBitmap(&pFont, 0, hgt, c,
- &bm->pWidth, &bm->pHeight,
- &bm->pXOffset, &bm->pYOffset);
- bm->pStride = bm->pWidth;
-
- int advance, lsb;
- stbtt_GetCodepointHMetrics(&pFont, c, &advance, &lsb);
- float scale = stbtt_ScaleForPixelHeight(&pFont, size);
- bm->pAdvance = (int)((scale * advance)+0.5f);
-
- return bm;
-}
-
-/**
- Get the width of the character in pixels.
- This is not a good function because character advance also depends on kerning
- which takes the next character in a text line into account. Also, FLTK is
- limited to integer character positions, and so is the Android driver.
- \param c unicode character
- \param size height in pixels
- \return width in pixels to the start of the next character
- */
-float Fl_Android_Font_Source::get_advance(uint32_t c, Fl_Fontsize size)
-{
- int advance, lsb;
-
- if (pFileBuffer==0) load_font();
- if (pError) return 0.0f;
-
- stbtt_GetCodepointHMetrics(&pFont, c, &advance, &lsb);
- float scale = stbtt_ScaleForPixelHeight(&pFont, size);
- return scale * advance;
-}
-
-
-int Fl_Android_Font_Source::get_descent(Fl_Fontsize size)
-{
- if (pFileBuffer==0) load_font();
- if (pError) return 0.0f;
-
- int ascent, descent, lineGap;
- stbtt_GetFontVMetrics(&pFont, &ascent, &descent, &lineGap);
- float scale = stbtt_ScaleForPixelHeight(&pFont, size);
-
- return -(descent*scale-0.5f);
-}
-
-
-// -----------------------------------------------------------------------------
-
-/**
- Create a new font descriptor.
- \param fname name of this font as in fl_fonts
- \param fsrc the font source for this font; there is one single font source
- for all hights of a single font
- \param fnum index into the fl_fonts array
- \param fsize height of font in pixels
- */
-Fl_Android_Font_Descriptor::Fl_Android_Font_Descriptor(const char *fname, Fl_Android_Font_Source *fsrc, Fl_Font fnum, Fl_Fontsize fsize) :
- Fl_Font_Descriptor(fname, fsize),
- pFontSource(fsrc),
- pFontIndex(fnum)
-{
- descent = -1;
- if (!pFontSource) {
- pFontSource = new Fl_Android_Font_Source(fname, fnum);
- }
- // --- We probably must fill these values in:
- // Fl_Font_Descriptor *next;
- // Fl_Fontsize size; /**< font size */
- // Fl_Font_Descriptor(const char* fontname, Fl_Fontsize size);
- // FL_EXPORT ~Fl_Font_Descriptor() {}
- // short ascent, descent, q_width;
- // unsigned int listbase; // base of display list, 0 = none
-}
-
-/**
- Release resources, including all cached unicode character shapes.
- */
-Fl_Android_Font_Descriptor::~Fl_Android_Font_Descriptor()
-{
-#ifdef FL_ALLOW_STL
- // Life is easy in C++11.
- for (auto &i: pBytemapTable) {
- delete i.second; i.second = nullptr;
- }
-#else
- for (int i=0; i<256; i++) {
- if (pBytemapTable[i]) delete pBytemapTable[i];
- }
-#endif
-}
-
-/*
- Get the width of the character in pixels.
- \param c unicode character
- \return width in pixels to the start of the next character
- */
-float Fl_Android_Font_Descriptor::get_advance(uint32_t c)
-{
- // TODO: should we use the cached value in the Bytemap?
- // Yes, we should, because if FLTK requests the width of a character, it is
- // more than likely to render that character soon after.
- return pFontSource->get_advance(c, size);
-}
-
-/**
- Get the pixels for a given Unicode character.
-
- Calculating a bitmap is relatively expensive. This class will cache every
- bitmap ever generated. Currently, this is pretty much brute force because
- none of the bitmaps are ever released.
-
- \param c unicode character
- \return a bytemap
- */
-Fl_Android_Bytemap *Fl_Android_Font_Descriptor::get_bytemap(uint32_t c)
-{
- Fl_Android_Bytemap *bm = 0;
-#ifdef FL_ALLOW_STL
- auto it = pBytemapTable.find(c);
- if (it==pBytemapTable.end()) {
- bm = pFontSource->get_bytemap(c, size);
- if (bm)
- pBytemapTable[c] = bm;
- } else {
- bm = it->second;
- }
-#else
- if (c<256) {
- if (pBytemapTable[c]) {
- bm = pBytemapTable[c];
- } else {
- bm = pFontSource->get_bytemap(c, size);
- if (bm)
- pBytemapTable[c] = bm;
- }
- }
-#endif
- return bm;
-}
-
-
-int Fl_Android_Font_Descriptor::get_descent()
-{
- if (descent==-1)
- descent = (short)pFontSource->get_descent(size);
- return descent;
-}
-
-
-/**
- Find or create a font descriptor for a given font and height.
- \param fnum index into fl_fonts
- \param size height in pixels
- \return an existing oder newly created descriptor
- */
-Fl_Android_Font_Descriptor* Fl_Android_Font_Descriptor::find(Fl_Font fnum, Fl_Fontsize size)
-{
- Fl_Fontdesc &s = fl_fonts[fnum];
- if (!s.name) s = fl_fonts[0]; // use 0 if fnum undefined
-
- Fl_Font_Descriptor *f;
- for (f = s.first; f; f = f->next) {
- if (f->size==size) return (Fl_Android_Font_Descriptor*)f;
- }
-
- Fl_Android_Font_Source *fsrc = nullptr;
- if (s.first) fsrc = ((Fl_Android_Font_Descriptor*)s.first)->get_font_source();
-
- Fl_Android_Font_Descriptor *af = new Fl_Android_Font_Descriptor(s.name, fsrc, fnum, size);
- af->next = s.first;
- s.first = af;
- return af;
-}
-
-// =============================================================================
-
-/**
- Set a font for future use in text rendering calls.
- \param fnum index into fl_fonts
- \param size height in pixels
- */
-void Fl_Android_Graphics_Driver::font(Fl_Font fnum, Fl_Fontsize size) {
- font_descriptor( Fl_Android_Font_Descriptor::find(fnum, size) );
- size_ = size;
- font_ = fnum;
-}
-
-/**
- Copy a single letter to the screen.
- \param xx, yy position of character on screen
- \param c unicode character
- \return x position of next character on screen
- */
-int Fl_Android_Graphics_Driver::render_letter(int xx, int yy, uint32_t c, Fl_Rect_Region &r)
-{
- int oxx = xx;
-
- // find the font descriptor
- Fl_Android_Font_Descriptor *fd = (Fl_Android_Font_Descriptor*)font_descriptor();
- if (!fd) return xx; // this should not happen
-
- Fl_Android_Bytemap *bm = fd->get_bytemap(c);
- if (!bm) return oxx;
-
- draw(xx, yy, bm, r);
-
- return oxx + bm->pAdvance;
-}
-
-/**
- Render a string to screen.
- \param str text in utf-8 encoding
- \param n number of bytes to render
- \param x, y position on screen
- */
-void Fl_Android_Graphics_Driver::draw(const char* str, int n, int x, int y)
-{
- if (str) {
- int dx, dy, w, h;
- text_extents(str, n, dx, dy, w, h);
- //pClippingRegion.print("<---- clip text to this");
- //Fl_Rect_Region(x+dx, y+dy, w, h).print(str);
- for (const auto &it: pClippingRegion.overlapping(Fl_Rect_Region(x+dx, y+dy, w, h))) {
- Fl_Rect_Region &r = it->clipped_rect();
- //r.print("Clip");
- const char *e = str + n;
- for (int i = 0; i < n;) {
- int incr = 1;
- unsigned uniChar = fl_utf8decode(str + i, e, &incr);
- int x1 = x;
- x = render_letter(x, y, uniChar, r);
-#if 0
- // use this to make the character baseline visible
- Fl_Color old = fl_color();
- fl_color(FL_RED);
- fl_xyline(x1, y, x);
- fl_yxline(x1, y-5, y+5);
- fl_color(old);
-#endif
- i += incr;
- }
- }
- }
-}
-
-
-double Fl_Android_Graphics_Driver::width(const char *str, int n)
-{
- Fl_Android_Font_Descriptor *fd = (Fl_Android_Font_Descriptor*)font_descriptor();
- if (!fd) return 0;
-
- int width = 0;
- const char *e = str+n;
- for (int i=0; i<n; ) {
- int incr = 1;
- unsigned uniChar = fl_utf8decode(str + i, e, &incr);
- width += ((int)(fd->get_advance(uniChar)+0.5f));
- i += incr;
- }
- return width;
-}
-
-
-double Fl_Android_Graphics_Driver::width(unsigned int uniChar)
-{
- Fl_Android_Font_Descriptor *fd = (Fl_Android_Font_Descriptor*)font_descriptor();
- if (!fd) return 0;
- return ((int)(fd->get_advance(uniChar)+0.5f));
-}
-
-
-Fl_Fontsize Fl_Android_Graphics_Driver::size()
-{
- Fl_Android_Font_Descriptor *fd = (Fl_Android_Font_Descriptor*)font_descriptor();
- if (!fd) return 0;
- return fd->size;
-}
-
-/**
- FIXME: use the actual size of all glyphs, which is easily found in the Bytemap!
- */
-void Fl_Android_Graphics_Driver::text_extents(const char *str, int n, int &dx, int &dy, int &w, int &h)
-{
- w = width(str, n);
- h = height();
- dx = 0;
- dy = descent() - h;
-}
-
-
-int Fl_Android_Graphics_Driver::height()
-{
- // This should really be "ascent - descent + lineGap"
- Fl_Android_Font_Descriptor *fd = (Fl_Android_Font_Descriptor*)font_descriptor();
- if (!fd) return 0;
- return fd->size;
-}
-
-
-int Fl_Android_Graphics_Driver::descent()
-{
- Fl_Android_Font_Descriptor *fd = (Fl_Android_Font_Descriptor*)font_descriptor();
- if (!fd) return 0;
- if (fd->descent==-1) fd->get_descent();
- return fd->descent;
-}
-
-/**
- Get a human-readable string describing the family of this face.
- \param fnum index into font table
- \param ap[out] returns if the face is bold or italic or both.
- \return pointer to a string; don't free, don't write
- */
-const char *Fl_Android_Graphics_Driver::get_font_name(Fl_Font fnum, int* ap)
-{
- const char *name = fl_fonts[fnum].name;
- if (ap) {
- *ap = 0;
- if (strstr(name, "BoldItalic")) *ap = FL_BOLD_ITALIC;
- else if (strstr(name, "Bold")) *ap = FL_BOLD;
- else if (strstr(name, "Italic")) *ap = FL_ITALIC;
- }
- return name;
-}
-
-/**
- Gets the string for this face.
- \param num index into font table
- \return pointer to a string; don't free, don't write
- */
-const char *Fl_Android_Graphics_Driver::font_name(int num)
-{
- // TODO: we should probably beatify the font name, remove file path and
- // extension, and save the result in fl_fonts[num].fontname ...
- return fl_fonts[num].name;
-}
-
-/**
- Return an array of sizes in sizep.
- \param fnum index into font table
- \param sizep[out] a static array that contains the single value 0, indicating
- that all fonts are arbitrarily resizable.
- \return 1, because our array has a size of 1
- */
-int Fl_Android_Graphics_Driver::get_font_sizes(Fl_Font fnum, int*& sizep)
-{
- static int sSizes[] = { 0 };
- sizep = sSizes;
- return 1;
-}
-
-/**
- FLTK will open the display, and add every fonts on the server to the face table.
- TODO: This is not supported under Android.
- \param name basically a wildcard for finding fonts
- \return number of fonts found
- */
-Fl_Font Fl_Android_Graphics_Driver::set_fonts(const char *name)
-{
- return 16;
-}
-
-/**
- Changes a face.
- \param num index of the font
- \param name Path to font file, prepend $ for system fonts, @ for font assets.
- The string pointer is simply stored, the string is not copied, so the
- string must be in static memory.
- */
-void Fl_Android_Graphics_Driver::font_name(int num, const char *name)
-{
- Fl_Fontdesc *s = fl_fonts + num;
-
- // if the same font is requested, do nothing
- if (s && s->name && name && strcmp(s->name, name)==0) {
- s->name = name;
- return;
- }
-
- // if a font is loaded, delete the all descriptors, caches, and the source
- Fl_Android_Font_Descriptor *desc = (Fl_Android_Font_Descriptor*)s->first;
- if (desc) {
- Fl_Android_Font_Source *src = desc->get_font_source();
- while (desc) {
- auto nDesc = (Fl_Android_Font_Descriptor*)desc->next;
- delete desc; desc = nDesc;
- }
- delete src; src = nullptr;
- }
- s->name = nullptr;
- s->fontname[0] = 0;
- s->first = nullptr;
-
- // set the new font name
- if (name) {
- // the next time the font is used, it will be loaded and initialized
- s->name = name;
- s->fontname[0] = 0;
- }
-}