Skip to content

Commit

Permalink
Android: Implemented font changing ( Fl::set_font(ix, name); )
Browse files Browse the repository at this point in the history
         and other font stuff. Fixed horizontal and vertical line
         drawing to include last pixel. Added stippling to focus rect.
         Added point drawing (slooow).

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12774 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
  • Loading branch information
Matthias Melcher committed Mar 18, 2018
1 parent 6dbe7ca commit c3573d1
Show file tree
Hide file tree
Showing 4 changed files with 207 additions and 79 deletions.
11 changes: 9 additions & 2 deletions ide/AndroidStudio3/app/src/main/cpp/HelloAndroid.cxx
Expand Up @@ -55,7 +55,7 @@ void hello_cb(void*)

int main(int argc, char **argv)
{
Fl::scheme("gleam");
// Fl::scheme("gleam");
win1 = new Fl_Window(20+50, 10, 200, 200, "back");
win1->color(FL_RED);
win1->box(FL_DOWN_BOX);
Expand Down Expand Up @@ -83,11 +83,18 @@ int main(int argc, char **argv)
btn->labelfont(FL_TIMES_BOLD_ITALIC);
btn->labelsize(30);

btn = new MyButton((win->w()-280)/2, 200+2*40, 280, 35, "Hello, Android!");
btn = new MyButton((win->w()-280)/2, 200+2*40, 280, 35, "Hello, Font!");
btn->labelfont(FL_COURIER_BOLD_ITALIC);
btn->labelsize(30);
btn->callback(
[](Fl_Widget *w, void*) {
Fl::set_font(FL_COURIER_BOLD_ITALIC, "$DancingScript-Regular.ttf");
w->redraw();
}
);

btn = new MyButton((win->w()-280)/2, 200+3*40, 280, 35, "Hello, Android!");
btn->box(FL_BORDER_BOX);
btn->labelfont(FL_SCREEN);
btn->labelsize(30);

Expand Down
119 changes: 48 additions & 71 deletions src/drivers/Android/Fl_Android_Graphics_Driver.H
Expand Up @@ -39,52 +39,63 @@ class Fl_Android_Bytemap;
This class is implemented only on the Windows platform.
*/
class FL_EXPORT Fl_Android_Graphics_Driver : public Fl_Scalable_Graphics_Driver {

#if 0
private:
BOOL alpha_blend_(int x, int y, int w, int h, HDC src_gc, int srcx, int srcy, int srcw, int srch);
int depth; // to support translation
POINT *origins; // to support translation
void set_current_();
protected:
HDC gc_;
int numcount;
int counts[20];
uchar **mask_bitmap_;
uchar **mask_bitmap() {return mask_bitmap_;}
void mask_bitmap(uchar **value) { mask_bitmap_ = value; }
int p_size;
POINT *p;
#endif
class FL_EXPORT Fl_Android_Graphics_Driver : public Fl_Scalable_Graphics_Driver
{
public:
Fl_Android_Graphics_Driver();
virtual ~Fl_Android_Graphics_Driver() override;
#if 0
Fl_GDI_Graphics_Driver() {mask_bitmap_ = NULL; gc_ = NULL; p_size = 0; p = NULL; depth = -1; origins = NULL;}
virtual ~Fl_GDI_Graphics_Driver() { if (p) free(p); delete[] origins;}
virtual int has_feature(driver_feature mask) { return mask & NATIVE; }
char can_do_alpha_blending();
virtual void gc(void *ctxt) { gc_ = (HDC)ctxt; global_gc(); }
virtual void *gc() {return gc_;}

// --- bitmap stuff
Fl_Bitmask create_bitmask(int w, int h, const uchar *array);
void delete_bitmask(Fl_Bitmask bm);
#endif
void make_current(Fl_Window*);

// --- text and font stuff
virtual void draw_unscaled(const char* str, int n, int x, int y) override;
#if 0
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;
virtual const char *get_font_name(Fl_Font fnum, int* ap) override;
virtual const char *font_name(int num) override;
virtual int get_font_sizes(Fl_Font fnum, int*& sizep) override;
virtual Fl_Font set_fonts(const char *name) override;
virtual void font_name(int num, const char *name) override;

// --- line drawinf stuff
virtual void rectf_unscaled(float x, float y, float w, float h) override;
void rectf_unclipped(float x, float y, float w, float h);
virtual void point_unscaled(float x, float y) override;
void rect_unscaled(float x, float y, float w, float h);
virtual void xyline_unscaled(float x, float y, float x1) override;
void xyline_unclipped(float x, float y, float x1);
virtual void yxline_unscaled(float x, float y, float y1) override;
void yxline_unclipped(float x, float y, float y1);

// --- clipping
virtual void push_clip(int x, int y, int w, int h) override;
virtual int clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H) override;
virtual int not_clipped(int x, int y, int w, int h) override;
virtual void push_no_clip() override;
virtual void pop_clip() override;
virtual void restore_clip() override;
virtual void clip_region(Fl_Region r) override;
virtual Fl_Region clip_region() override;

virtual void line_style_unscaled(int style, float width, char* dashes) override;

// --- matrix based drawing
// virtual void line_unscaled(float x, float y, float x1, float y1) override;


#if 0
virtual int has_feature(driver_feature mask) { return mask & NATIVE; }
char can_do_alpha_blending();
// --- bitmap stuff
Fl_Bitmask create_bitmask(int w, int h, const uchar *array);
void delete_bitmask(Fl_Bitmask bm);
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);
void draw_unscaled(Fl_Pixmap *pxm, float s, int XP, int YP, int WP, int HP, int cx, int cy);
void draw_unscaled(Fl_Bitmap *pxm, float s, int XP, int YP, int WP, int HP, int cx, int cy);
void draw_unscaled(Fl_RGB_Image *img, float s, int XP, int YP, int WP, int HP, int cx, int cy);
Expand All @@ -97,15 +108,7 @@ public:
virtual void uncache_pixmap(fl_uintptr_t p);
fl_uintptr_t cache(Fl_Bitmap *img, int w, int h, const uchar *array);
void uncache(Fl_RGB_Image *img, fl_uintptr_t &id_, fl_uintptr_t &mask_);
virtual double width_unscaled(const char *str, int n);
virtual double width_unscaled(unsigned int c);
void text_extents_unscaled(const char*, int n, int& dx, int& dy, int& w, int& h);
int height_unscaled();
int descent_unscaled();
Fl_Fontsize size_unscaled();
#if ! defined(FL_DOXYGEN)
void copy_offscreen_with_alpha(int x,int y,int w,int h,HBITMAP bitmap,int srcx,int srcy);
#endif
virtual void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
void add_rectangle_to_region(Fl_Region r, int x, int y, int w, int h);
Fl_Region XRectangleRegion(int x, int y, int w, int h);
Expand All @@ -118,36 +121,12 @@ protected:
void transformed_vertex0(float x, float y);
void fixloop();
// --- implementation is in src/fl_rect.cxx which includes src/cfg_gfx/gdi_rect.cxx
virtual void point_unscaled(float x, float y);
void rect_unscaled(float x, float y, float w, float h);
void focus_rect(int x, int y, int w, int h);
#endif
virtual void rectf_unscaled(float x, float y, float w, float h) override;
void rectf_unclipped(float x, float y, float w, float h);
#if 0
virtual void line_unscaled(float x, float y, float x1, float y1);
virtual void line_unscaled(float x, float y, float x1, float y1, float x2, float y2);
#endif
virtual void xyline_unscaled(float x, float y, float x1) override;
void xyline_unclipped(float x, float y, float x1);
virtual void yxline_unscaled(float x, float y, float y1) override;
void yxline_unclipped(float x, float y, float y1);
#if 0
virtual void loop_unscaled(float x0, float y0, float x1, float y1, float x2, float y2);
virtual void loop_unscaled(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3);
virtual void polygon_unscaled(float x0, float y0, float x1, float y1, float x2, float y2);
virtual void polygon_unscaled(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3);
#endif
// --- clipping
virtual void push_clip(int x, int y, int w, int h) override;
virtual int clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H) override;
virtual int not_clipped(int x, int y, int w, int h) override;
virtual void push_no_clip() override;
virtual void pop_clip() override;
virtual void restore_clip() override;
virtual void clip_region(Fl_Region r) override;
virtual Fl_Region clip_region() override;
#if 0
virtual Fl_Region scale_clip(float f);
// --- implementation is in src/fl_vertex.cxx which includes src/cfg_gfx/xxx_rect.cxx
void begin_complex_polygon();
Expand All @@ -173,28 +152,26 @@ protected:
void free_color(Fl_Color i, int overlay);
void set_spot(int font, int size, int X, int Y, int W, int H, Fl_Window *win);
void reset_spot();
virtual Fl_Font set_fonts(const char *name);
virtual int get_font_sizes(Fl_Font fnum, int*& sizep);
virtual const char* get_font_name(Fl_Font fnum, int* ap);
virtual const char *font_name(int num);
virtual void font_name(int num, const char *name);
void global_gc();
virtual void overlay_rect(int x, int y, int w , int h);

#endif

protected:
static uint16_t make565(Fl_Color crgba);

void render_bytemap(int x, int y, Fl_Android_Bytemap *bm, Fl_Rect_Region &r);
int render_letter(int xx, int yy, uint32_t c, Fl_Rect_Region &r);
void make_current(Fl_Window*);

int32_t pStride;
uint16_t *pBits;

int pLineStyle = 0;

// Clipping region of the current window in window coordinates (see: pStride and pBits)
Fl_Rect_Region pWindowRegion;

// clipping region of the window minus overlapping other windows
Fl_Complex_Region pDesktopWindowRegion;

// Final clipping region for all graphics calls to this class.
Expand Down
51 changes: 47 additions & 4 deletions src/drivers/Android/Fl_Android_Graphics_Driver.cxx
Expand Up @@ -142,25 +142,34 @@ void Fl_Android_Graphics_Driver::xyline_unscaled(float x, float y, float x1)
void Fl_Android_Graphics_Driver::xyline_unclipped(float x, float y, float x1)
{
uint16_t cc = make565(color());
float w = x1-x;
float w;
if (x1>x) {
w = x1-x+1;
} else {
w = x-x1+1;
x = x1;
}
int32_t sx = 1;
int32_t ss = pStride;
uint16_t *bits = pBits;
uint32_t xx = (uint32_t)x;
uint32_t yy = (uint32_t)y;
uint32_t ww = (uint32_t)w;
uint16_t *d = bits + yy*ss + xx;
if ((pLineStyle&0xff)==FL_DOT) { ww = ww/2; sx = sx*2; }
for (uint32_t ix = ww; ix>0; --ix) {
*d++ = cc;
*d = cc;
d+=sx;
}
}

void Fl_Android_Graphics_Driver::yxline_unscaled(float x, float y, float y1)
{
float h;
if (y1>y) {
h = y1-y;
h = y1-y+1;
} else {
h = y-y1;
h = y-y1+1;
y = y1;
}
for (const auto &it: pClippingRegion.overlapping(Fl_Rect_Region(x, y, 1, h))) {
Expand All @@ -179,13 +188,47 @@ void Fl_Android_Graphics_Driver::yxline_unclipped(float x, float y, float y1)
uint32_t yy = (uint32_t)y;
uint32_t hh = (uint32_t)h;
uint16_t *d = bits + yy*ss + xx;
if ((pLineStyle&0xff)==FL_DOT) { hh = hh/2; ss = ss*2; }
for (uint32_t iy = hh; iy>0; --iy) {
*d = cc;
d += ss;
}
}


void Fl_Android_Graphics_Driver::rect_unscaled(float x, float y, float w, float h)
{
xyline(x, y, x+w-1);
yxline(x, y, y+h-1);
yxline(x+w-1, y, y+h-1);
xyline(x, y+h-1, x+w-1);
}


void Fl_Android_Graphics_Driver::line_style_unscaled(int style, float width, char* dashes)
{
pLineStyle = style;
// TODO: finish this!
}


void Fl_Android_Graphics_Driver::point_unscaled(float x, float y)
{
// drawing a single point is insanely inefficient because we need to walk the
// entire clipping region every time to see if the point needs to be drawn.
for (const auto &it: pClippingRegion.overlapping(Fl_Rect_Region(x, y, 1, 1))) {
Fl_Rect_Region &s = it->clipped_rect();
uint16_t cc = make565(color());
int32_t ss = pStride;
uint16_t *bits = pBits;
uint32_t xx = (uint32_t)x;
uint32_t yy = (uint32_t)y;
uint16_t *d = bits + yy*ss + xx;
*d = cc;
}

}


#if 0

Expand Down

0 comments on commit c3573d1

Please sign in to comment.