summaryrefslogtreecommitdiff
path: root/src/drivers/Android
diff options
context:
space:
mode:
authorMatthias Melcher <fltk@matthiasm.com>2018-03-17 20:33:51 +0000
committerMatthias Melcher <fltk@matthiasm.com>2018-03-17 20:33:51 +0000
commit6bf8fe983dbde42b10b1d864ab12077ba155685f (patch)
tree63d15a035c8d9d7dd0b062f03652fcd74d0f04dc /src/drivers/Android
parente599a0194d14ff36b29b8baa2dfc47230d382f92 (diff)
Android: added fontattributes, so formatting works well now.
Next: add clipping git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12768 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/drivers/Android')
-rw-r--r--src/drivers/Android/Fl_Android_Graphics_Driver.H6
-rw-r--r--src/drivers/Android/Fl_Android_Graphics_Font.H2
-rw-r--r--src/drivers/Android/Fl_Android_Graphics_Font.cxx94
3 files changed, 98 insertions, 4 deletions
diff --git a/src/drivers/Android/Fl_Android_Graphics_Driver.H b/src/drivers/Android/Fl_Android_Graphics_Driver.H
index cb60cdb32..a1c9f887a 100644
--- a/src/drivers/Android/Fl_Android_Graphics_Driver.H
+++ b/src/drivers/Android/Fl_Android_Graphics_Driver.H
@@ -76,6 +76,12 @@ public:
virtual void draw_unscaled(int angle, const char *str, int n, int x, int y);
virtual void rtl_draw_unscaled(const char* str, int n, int x, int y);
#endif
+ virtual double width_unscaled(const char *str, int n) override;
+ virtual double width_unscaled(unsigned int c) override;
+ virtual Fl_Fontsize size_unscaled() override;
+ virtual void text_extents_unscaled(const char *str, int n, int &dx, int &dy, int &w, int &h) override;
+ virtual int height_unscaled() override;
+ virtual int descent_unscaled() override;
virtual void font_unscaled(Fl_Font face, Fl_Fontsize size) override;
#if 0
void draw_unscaled(Fl_Pixmap *pxm, float s, int XP, int YP, int WP, int HP, int cx, int cy);
diff --git a/src/drivers/Android/Fl_Android_Graphics_Font.H b/src/drivers/Android/Fl_Android_Graphics_Font.H
index 539c0d444..789651dc6 100644
--- a/src/drivers/Android/Fl_Android_Graphics_Font.H
+++ b/src/drivers/Android/Fl_Android_Graphics_Font.H
@@ -67,6 +67,7 @@ public:
void load_font();
Fl_Android_Bytemap *get_bytemap(uint32_t c, int size);
float get_advance(uint32_t c, Fl_Fontsize size);
+ int get_descent(Fl_Fontsize size);
};
@@ -86,6 +87,7 @@ public:
float get_advance(uint32_t c);
Fl_Android_Bytemap *get_bytemap(uint32_t c);
Fl_Android_Font_Source *get_font_source() { return pFontSource; }
+ int get_descent();
static Fl_Android_Font_Descriptor* find(Fl_Font fnum, Fl_Fontsize size);
};
diff --git a/src/drivers/Android/Fl_Android_Graphics_Font.cxx b/src/drivers/Android/Fl_Android_Graphics_Font.cxx
index 3866d5348..76f662002 100644
--- a/src/drivers/Android/Fl_Android_Graphics_Font.cxx
+++ b/src/drivers/Android/Fl_Android_Graphics_Font.cxx
@@ -60,7 +60,7 @@ static Fl_Fontdesc built_in_table[] = {
Fl_Fontdesc* fl_fonts = built_in_table;
-static char *old_font_names[] = {
+static const char *old_font_names[] = {
"$DroidSans.ttf", "$DroidSerif-Regular.ttf",
"$DroidSansMono.ttf", "$DroidSansMono.ttf"
};
@@ -282,6 +282,19 @@ float Fl_Android_Font_Source::get_advance(uint32_t c, Fl_Fontsize size)
}
+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);
+}
+
+
// -----------------------------------------------------------------------------
/**
@@ -297,6 +310,7 @@ Fl_Android_Font_Descriptor::Fl_Android_Font_Descriptor(const char *fname, Fl_And
pFontSource(fsrc),
pFontIndex(fnum)
{
+ descent = -1;
if (!pFontSource) {
pFontSource = new Fl_Android_Font_Source(fname, fnum);
}
@@ -344,16 +358,26 @@ float Fl_Android_Font_Descriptor::get_advance(uint32_t c)
Fl_Android_Bytemap *Fl_Android_Font_Descriptor::get_bytemap(uint32_t c)
{
Fl_Android_Bytemap *bm = 0;
- try {
- bm = pBytemapTable.at(c);
- } catch(...) {
+ auto it = pBytemapTable.find(c);
+ if (it==pBytemapTable.end()) {
bm = pFontSource->get_bytemap(c, size);
if (bm)
pBytemapTable[c] = bm;
+ } else {
+ bm = it->second;
}
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
@@ -475,6 +499,68 @@ void Fl_Android_Graphics_Driver::draw_unscaled(const char* str, int n, int x, in
}
}
+
+double Fl_Android_Graphics_Driver::width_unscaled(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_unscaled(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_unscaled()
+{
+ Fl_Android_Font_Descriptor *fd = (Fl_Android_Font_Descriptor*)font_descriptor();
+ if (!fd) return 0;
+ return fd->size;
+}
+
+
+void Fl_Android_Graphics_Driver::text_extents_unscaled(const char *str, int n, int &dx, int &dy, int &w, int &h)
+{
+ dx = 0;
+ dy = descent_unscaled();
+ w = width_unscaled(str, n);
+ h = height_unscaled();
+}
+
+
+int Fl_Android_Graphics_Driver::height_unscaled()
+{
+ // 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_unscaled()
+{
+ 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;
+}
+
+
+
#if 0
// TODO: do we need that?