Skip to content

Commit

Permalink
Android: added fontattributes, so formatting works well now.
Browse files Browse the repository at this point in the history
Next: add clipping

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12768 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
  • Loading branch information
Matthias Melcher committed Mar 17, 2018
1 parent e599a01 commit 6bf8fe9
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 5 deletions.
2 changes: 1 addition & 1 deletion ide/AndroidStudio3/app/src/main/cpp/HelloAndroid.cxx
Expand Up @@ -68,7 +68,7 @@ int main(int argc, char **argv)
btn2 = new Fl_Button(10, 10, 480, 100, "-@circle;-");
btn2->color(FL_BLUE);

btn = new MyButton((win->w()-280)/2, 200, 280, 35, "Hello, Android!");
btn = new MyButton((win->w()-280)/2, 200-45, 280, 80, "Hello, Android!\nWhere were you?");
btn->color(FL_LIGHT2);
btn->labelsize(30);
btn->callback(
Expand Down
6 changes: 6 additions & 0 deletions src/drivers/Android/Fl_Android_Graphics_Driver.H
Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions src/drivers/Android/Fl_Android_Graphics_Font.H
Expand Up @@ -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);
};


Expand All @@ -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);
};
Expand Down
94 changes: 90 additions & 4 deletions src/drivers/Android/Fl_Android_Graphics_Font.cxx
Expand Up @@ -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"
};
Expand Down Expand Up @@ -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);
}


// -----------------------------------------------------------------------------

/**
Expand All @@ -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);
}
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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?
Expand Down

0 comments on commit 6bf8fe9

Please sign in to comment.