Skip to content

Commit

Permalink
Android: Implemented vector drawing and polygons.
Browse files Browse the repository at this point in the history
         Started to implement arc and pie drawing

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12783 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
  • Loading branch information
Matthias Melcher committed Mar 22, 2018
1 parent 3a20682 commit 0b8116f
Show file tree
Hide file tree
Showing 7 changed files with 750 additions and 38 deletions.
17 changes: 17 additions & 0 deletions FL/android.H
Expand Up @@ -25,6 +25,23 @@
# error "Never use <FL/android.H> directly; include <FL/platform.H> instead."
#endif // !FL_PLATFORM_H


#ifdef __cplusplus
extern "C" {
#endif

/*
* This is the function that application code must implement, representing
* the main entry to the app.
*/
extern int main(int argc, char **argv);

#ifdef __cplusplus
}
#endif



typedef void *Window; // used by fl_find(), fl_xid() and class Fl_X

/* Reference to the current device context
Expand Down
254 changes: 249 additions & 5 deletions ide/AndroidStudio3/app/src/main/cpp/HelloAndroid.cxx
Expand Up @@ -15,11 +15,182 @@
*
*/


#include <stdlib.h>
#include <stdio.h>
#include <FL/Fl.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Box.H>
#include <FL/fl_draw.H>

int N = 0;
#define W 200
#define H 50
#define ROWS 14

// Note: Run the program with command line '-s abc' to view boxtypes
// with scheme 'abc'.

// class BoxGroup - minimal class to enable visible box size debugging
//
// Set the following static variables to 0 (default) to disable
// or 1 to enable the given feature.
//
// If you enable the 'outline' variable, then a red frame should be drawn
// around each box, and it should ideally be fully visible.
//
// The white background is optional (otherwise you see the window background).
//
// Set BOTH variables = 0 to show the default image for the FLTK manual.
//
// Note: As of FLTK 1.3.3 (probably since FLTK 1.0/1.1) there are some
// shadows 'leaking' outside their widget bounding boxes (x,y,w,h).
// Is this intentional?

static const int outline = 0; // draw 1-px red frame around all boxes
static const int box_bg = 0; // draw white background inside all boxes
static const int inactive = 0; // deactivate boxes and use green background
class BoxGroup : public Fl_Group {
public:
BoxGroup(int x, int y, int w, int h) : Fl_Group(x,y,w,h) {};
void draw() {
draw_box();
if (outline + box_bg) { // outline or box_bg or both
Fl_Widget*const* a = array();
for (int i=children(); i--;) {
Fl_Widget& o = **a++;
if (outline) {
fl_color(FL_RED);
fl_rect(o.x()-1,o.y()-1,o.w()+2,o.h()+2);
}
if (box_bg) {
fl_color(FL_WHITE);
fl_rectf(o.x(),o.y(),o.w(),o.h());
}
fl_color(FL_BLACK);
}
} // outline or box_bg or both
Fl_Group::draw_children();
} // draw()
}; // class BoxGroup

Fl_Double_Window *window;

void bt(const char *name, Fl_Boxtype type, int square=0) {
int x = N%4;
int y = N/4;
N++;
x = x*W+10;
y = y*H+10;
Fl_Box *b = new Fl_Box(type,x,y,square ? H-20 : W-20,H-20,name);
b->labelsize(11);
if (inactive) {
b->color(FL_GREEN);
b->deactivate();
}
if (square) b->align(FL_ALIGN_RIGHT);
}

int main(int argc, char ** argv) {
window = new Fl_Double_Window(4*W,ROWS*H);
window->box(FL_FLAT_BOX);
#if 0 // this code uses the command line arguments to set arbitrary color schemes
Fl::args(argc, argv);
Fl::get_system_colors();
#elif 0 // this code uses a single color to define a scheme
Fl::args(argc, argv);
Fl::get_system_colors();
Fl::background(113,113,198);
#else // this code uses the nice bright blue background to show box vs. frame types
Fl::args(argc, argv);
Fl::get_system_colors();
window->color(12);// light blue
#endif

// set window title to show active scheme
Fl::scheme(Fl::scheme()); // init scheme
char title[100];
sprintf(title,"FLTK boxtypes: scheme = '%s'",Fl::scheme()?Fl::scheme():"none");
window->label(title);

// create special container group for box size debugging
BoxGroup *bg = new BoxGroup(0,0,window->w(),window->h());
bg->box(FL_NO_BOX);

// create demo boxes
bt("FL_NO_BOX",FL_NO_BOX);
bt("FL_FLAT_BOX",FL_FLAT_BOX);
N += 2; // go to start of next row to line up boxes & frames
bt("FL_UP_BOX",FL_UP_BOX);
bt("FL_DOWN_BOX",FL_DOWN_BOX);
bt("FL_UP_FRAME",FL_UP_FRAME);
bt("FL_DOWN_FRAME",FL_DOWN_FRAME);
bt("FL_THIN_UP_BOX",FL_THIN_UP_BOX);
bt("FL_THIN_DOWN_BOX",FL_THIN_DOWN_BOX);
bt("FL_THIN_UP_FRAME",FL_THIN_UP_FRAME);
bt("FL_THIN_DOWN_FRAME",FL_THIN_DOWN_FRAME);
bt("FL_ENGRAVED_BOX",FL_ENGRAVED_BOX);
bt("FL_EMBOSSED_BOX",FL_EMBOSSED_BOX);
bt("FL_ENGRAVED_FRAME",FL_ENGRAVED_FRAME);
bt("FL_EMBOSSED_FRAME",FL_EMBOSSED_FRAME);
bt("FL_BORDER_BOX",FL_BORDER_BOX);
bt("FL_SHADOW_BOX",FL_SHADOW_BOX);
bt("FL_BORDER_FRAME",FL_BORDER_FRAME);
bt("FL_SHADOW_FRAME",FL_SHADOW_FRAME);
bt("FL_ROUNDED_BOX",FL_ROUNDED_BOX);
bt("FL_RSHADOW_BOX",FL_RSHADOW_BOX);
bt("FL_ROUNDED_FRAME",FL_ROUNDED_FRAME);
bt("FL_RFLAT_BOX",FL_RFLAT_BOX);
bt("FL_OVAL_BOX",FL_OVAL_BOX);
bt("FL_OSHADOW_BOX",FL_OSHADOW_BOX);
bt("FL_OVAL_FRAME",FL_OVAL_FRAME);
bt("FL_OFLAT_BOX",FL_OFLAT_BOX);
bt("FL_ROUND_UP_BOX",FL_ROUND_UP_BOX);
bt("FL_ROUND_DOWN_BOX",FL_ROUND_DOWN_BOX);
bt("FL_DIAMOND_UP_BOX",FL_DIAMOND_UP_BOX);
bt("FL_DIAMOND_DOWN_BOX",FL_DIAMOND_DOWN_BOX);

bt("FL_PLASTIC_UP_BOX",FL_PLASTIC_UP_BOX);
bt("FL_PLASTIC_DOWN_BOX",FL_PLASTIC_DOWN_BOX);
bt("FL_PLASTIC_UP_FRAME",FL_PLASTIC_UP_FRAME);
bt("FL_PLASTIC_DOWN_FRAME",FL_PLASTIC_DOWN_FRAME);
bt("FL_PLASTIC_THIN_UP_BOX",FL_PLASTIC_THIN_UP_BOX);
bt("FL_PLASTIC_THIN_DOWN_BOX",FL_PLASTIC_THIN_DOWN_BOX);
N += 2;
bt("FL_PLASTIC_ROUND_UP_BOX",FL_PLASTIC_ROUND_UP_BOX);
bt("FL_PLASTIC_ROUND_DOWN_BOX",FL_PLASTIC_ROUND_DOWN_BOX);
N += 2;

bt("FL_GTK_UP_BOX",FL_GTK_UP_BOX);
bt("FL_GTK_DOWN_BOX",FL_GTK_DOWN_BOX);
bt("FL_GTK_UP_FRAME",FL_GTK_UP_FRAME);
bt("FL_GTK_DOWN_FRAME",FL_GTK_DOWN_FRAME);
bt("FL_GTK_THIN_UP_BOX",FL_GTK_THIN_UP_BOX);
bt("FL_GTK_THIN_DOWN_BOX",FL_GTK_THIN_DOWN_BOX);
bt("FL_GTK_THIN_UP_FRAME",FL_GTK_THIN_UP_FRAME);
bt("FL_GTK_THIN_DOWN_FRAME",FL_GTK_THIN_DOWN_FRAME);
bt("FL_GTK_ROUND_UP_BOX",FL_GTK_ROUND_UP_BOX);
bt("FL_GTK_ROUND_DOWN_BOX",FL_GTK_ROUND_DOWN_BOX);
bg->end();
window->resizable(window);
window->end();
window->show();
return Fl::run();
}






#if 0

#include <src/drivers/Android/Fl_Android_Application.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <FL/Enumerations.H>
#include <FL/fl_draw.H>
#include <FL/fl_ask.H>


Fl_Window *win, *win1, *win2;
Expand All @@ -31,9 +202,16 @@ class MyButton : public Fl_Button
public:
MyButton(int x, int y, int w, int h, const char *l) : Fl_Button(x, y, w, h, l) { }
void draw() {
//fl_push_clip(x(), y(), w()*2/3, h()*2/3);
Fl_Button::draw();
//fl_pop_clip();
fl_push_clip(x(), y(), w(), h());
fl_color(FL_BLUE);
for (int i=0; i<h(); i+=5) {
fl_line(x(), y()+h()/2, x()+w(), y()+i);
}
for (int i=0; i<w(); i+=5) {
fl_line(x()+w()/2, y()-50, x()+i, y()+h()+50);
}
fl_pop_clip();
}
};

Expand All @@ -53,7 +231,7 @@ void hello_cb(void*)
}


int main(int argc, char **argv)
int xmain(int argc, char **argv)
{
// Fl::scheme("gleam");
win1 = new Fl_Window(20+50, 10, 200, 200, "back");
Expand Down Expand Up @@ -88,6 +266,9 @@ int main(int argc, char **argv)
btn->labelsize(30);
btn->callback(
[](Fl_Widget *w, void*) {
// FIXME: we can't seem to re-enter the event loop without locking
// the entire app!
// fl_alert("This will change\nthe font for the entir\napplication");
Fl::set_font(FL_COURIER_BOLD_ITALIC, "$DancingScript-Regular.ttf");
w->redraw();
}
Expand All @@ -102,9 +283,9 @@ int main(int argc, char **argv)
win->show(argc, argv);

win2 = new Fl_Window(380-50, 10, 200, 200, "front");
win2->color(FL_BLUE);
win2->color(FL_LIGHT3);
win2->box(FL_UP_BOX);
Fl_Button *b2 = new Fl_Button(10, 10, 180, 180, "front");
Fl_Button *b2 = new MyButton(10, 10, 180, 180, "front");
b2->color(FL_DARK_BLUE);
win2->end();
win2->show();
Expand All @@ -114,3 +295,66 @@ int main(int argc, char **argv)
return 0;
}

#endif

/*
Missing:
- screen scale and size: most desktop apps expect to be in a draggable window
on a larger desktop surface. For Android, there is usually no desktop, and
screen resolution is often very high, so that a regular FLTK window would
hide as a tiny gray spot in the top left corner
* windows should probably be centered by default
? the screen resolution should adapt to the first opened window
? we should be able to hint at a prefered screen resolution
* drawing call must scale at some point (line width!)
* rotating the screen must call the app handler and(?) window resize
* proportions: pixels should be square
test/CubeMain.cxx test/line_style.cxx
test/CubeView.cxx test/list_visuals.cxx
test/adjuster.cxx test/mandelbrot.cxx
test/animated.cxx test/menubar.cxx
* test/arc.cxx : + 'arc' works as expected
test/message.cxx
test/ask.cxx test/minimum.cxx
test/bitmap.cxx test/native-filechooser.cxx
test/blocks.cxx test/navigation.cxx
* test/boxtype.cxx : !! testing
test/offscreen.cxx
test/browser.cxx test/output.cxx
test/button.cxx test/overlay.cxx
test/buttons.cxx test/pack.cxx
test/cairo_test.cxx test/pixmap.cxx
test/checkers.cxx test/pixmap_browser.cxx
test/clock.cxx test/resizebox.cxx
test/colbrowser.cxx test/rotated_text.cxx
test/color_chooser.cxx test/scroll.cxx
test/connect.cxx test/shape.cxx
test/cube.cxx test/subwindow.cxx
test/cursor.cxx test/sudoku.cxx
test/curve.cxx test/symbols.cxx
test/demo.cxx test/table.cxx
test/device.cxx test/threads.cxx
test/doublebuffer.cxx test/tile.cxx
test/editor.cxx test/tiled_image.cxx
test/file_chooser.cxx test/twowin.cxx
test/fonts.cxx test/unittest_about.cxx
test/forms.cxx test/unittest_circles.cxx
test/fractals.cxx test/unittest_images.cxx
test/fracviewer.cxx test/unittest_lines.cxx
test/fullscreen.cxx test/unittest_points.cxx
test/gl_overlay.cxx test/unittest_rects.cxx
test/glpuzzle.cxx test/unittest_schemes.cxx
test/hello.cxx : + 'hello' works fine, italics, shadow, etc.
test/unittest_scrollbarsize.cxx
test/help_dialog.cxx test/unittest_simple_terminal.cxx
test/icon.cxx test/unittest_symbol.cxx
test/iconize.cxx test/unittest_text.cxx
test/image.cxx test/unittest_viewport.cxx
test/input.cxx test/unittests.cxx
test/input_choice.cxx test/utf8.cxx
test/keyboard.cxx test/windowfocus.cxx
test/label.cxx
*/
16 changes: 0 additions & 16 deletions src/drivers/Android/Fl_Android_Application.H
Expand Up @@ -245,22 +245,6 @@ private:
};


#ifdef __cplusplus
extern "C" {
#endif

/**
* This is the function that application code must implement, representing
* the main entry to the app.
*/
extern int main(int argc, char **argv);

#ifdef __cplusplus
}
#endif



#endif // FL_ANDROID_APPLICATION_H

//
Expand Down
1 change: 1 addition & 0 deletions src/drivers/Android/Fl_Android_Application.cxx
Expand Up @@ -25,6 +25,7 @@
#include "Fl_Android_Application.H"
#include "Fl_Android_Window_Driver.H"

#include <FL/platform.H>
#include <FL/fl_draw.H>

#include <jni.h>
Expand Down

0 comments on commit 0b8116f

Please sign in to comment.