Reorganized all integer line and polygon drawing functions

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11016 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Matthias Melcher
2016-01-20 15:21:11 +00:00
parent d3bd470734
commit d34974ace7
3 changed files with 443 additions and 376 deletions
+52 -15
View File
@@ -250,21 +250,21 @@ protected:
/** \brief see fl_line_style(int style, int width, char* dashes). */ /** \brief see fl_line_style(int style, int width, char* dashes). */
virtual void line_style(int style, int width=0, char* dashes=0); virtual void line_style(int style, int width=0, char* dashes=0);
/** \brief see fl_xyline(int x, int y, int x1). */ /** \brief see fl_xyline(int x, int y, int x1). */
virtual void xyline(int x, int y, int x1); virtual void xyline(int x, int y, int x1) = 0;
/** \brief see fl_xyline(int x, int y, int x1, int y2). */ /** \brief see fl_xyline(int x, int y, int x1, int y2). */
virtual void xyline(int x, int y, int x1, int y2); virtual void xyline(int x, int y, int x1, int y2) = 0;
/** \brief see fl_xyline(int x, int y, int x1, int y2, int x3). */ /** \brief see fl_xyline(int x, int y, int x1, int y2, int x3). */
virtual void xyline(int x, int y, int x1, int y2, int x3); virtual void xyline(int x, int y, int x1, int y2, int x3) = 0;
/** \brief see fl_yxline(int x, int y, int y1). */ /** \brief see fl_yxline(int x, int y, int y1). */
virtual void yxline(int x, int y, int y1); virtual void yxline(int x, int y, int y1) = 0;
/** \brief see fl_yxline(int x, int y, int y1, int x2). */ /** \brief see fl_yxline(int x, int y, int y1, int x2). */
virtual void yxline(int x, int y, int y1, int x2); virtual void yxline(int x, int y, int y1, int x2) = 0;
/** \brief see fl_yxline(int x, int y, int y1, int x2, int y3). */ /** \brief see fl_yxline(int x, int y, int y1, int x2, int y3). */
virtual void yxline(int x, int y, int y1, int x2, int y3); virtual void yxline(int x, int y, int y1, int x2, int y3) = 0;
/** \brief see fl_line(int x, int y, int x1, int y1). */ /** \brief see fl_line(int x, int y, int x1, int y1). */
virtual void line(int x, int y, int x1, int y1); virtual void line(int x, int y, int x1, int y1) = 0;
/** \brief see fl_line(int x, int y, int x1, int y1, int x2, int y2). */ /** \brief see fl_line(int x, int y, int x1, int y1, int x2, int y2). */
virtual void line(int x, int y, int x1, int y1, int x2, int y2); virtual void line(int x, int y, int x1, int y1, int x2, int y2) = 0;
/** \brief see fl_draw(const char *str, int n, int x, int y). */ /** \brief see fl_draw(const char *str, int n, int x, int y). */
virtual void draw(const char *str, int n, int x, int y) {} virtual void draw(const char *str, int n, int x, int y) {}
#ifdef __APPLE__ #ifdef __APPLE__
@@ -287,13 +287,13 @@ protected:
/** \brief see fl_point(int x, int y). */ /** \brief see fl_point(int x, int y). */
virtual void point(int x, int y) = 0; virtual void point(int x, int y) = 0;
/** \brief see fl_loop(int x0, int y0, int x1, int y1, int x2, int y2). */ /** \brief see fl_loop(int x0, int y0, int x1, int y1, int x2, int y2). */
virtual void loop(int x0, int y0, int x1, int y1, int x2, int y2); virtual void loop(int x0, int y0, int x1, int y1, int x2, int y2) = 0;
/** \brief see fl_loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3). */ /** \brief see fl_loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3). */
virtual void loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3); virtual void loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3) = 0;
/** \brief see fl_polygon(int x0, int y0, int x1, int y1, int x2, int y2). */ /** \brief see fl_polygon(int x0, int y0, int x1, int y1, int x2, int y2). */
virtual void polygon(int x0, int y0, int x1, int y1, int x2, int y2); virtual void polygon(int x0, int y0, int x1, int y1, int x2, int y2) = 0;
/** \brief see fl_polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3). */ /** \brief see fl_polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3). */
virtual void polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3); virtual void polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3) = 0;
/** \brief see fl_begin_points(). */ /** \brief see fl_begin_points(). */
virtual void begin_points(); virtual void begin_points();
/** \brief see fl_begin_line(). */ /** \brief see fl_begin_line(). */
@@ -474,10 +474,22 @@ public:
static Fl_Offscreen create_offscreen_with_alpha(int w, int h); static Fl_Offscreen create_offscreen_with_alpha(int w, int h);
#endif #endif
void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy); void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
// --- recently moved implementations (see FL_PORTING efforts) // --- implementation is in src/fl_rect.cxx which includes src/cfg_gfx/quartz_rect.cxx
void point(int x, int y); void point(int x, int y);
void rect(int x, int y, int w, int h); void rect(int x, int y, int w, int h);
void rectf(int x, int y, int w, int h); void rectf(int x, int y, int w, int h);
void line(int x, int y, int x1, int y1);
void line(int x, int y, int x1, int y1, int x2, int y2);
void xyline(int x, int y, int x1);
void xyline(int x, int y, int x1, int y2);
void xyline(int x, int y, int x1, int y2, int x3);
void yxline(int x, int y, int y1);
void yxline(int x, int y, int y1, int x2);
void yxline(int x, int y, int y1, int x2, int y3);
void loop(int x0, int y0, int x1, int y1, int x2, int y2);
void loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
void polygon(int x0, int y0, int x1, int y1, int x2, int y2);
void polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
}; };
// FIXME: add Fl_Quartz_Printer_Graphics_Driver // FIXME: add Fl_Quartz_Printer_Graphics_Driver
@@ -515,10 +527,22 @@ public:
void copy_offscreen_with_alpha(int x,int y,int w,int h,HBITMAP bitmap,int srcx,int srcy); void copy_offscreen_with_alpha(int x,int y,int w,int h,HBITMAP bitmap,int srcx,int srcy);
#endif #endif
void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy); void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
// --- recently moved implementations (see FL_PORTING efforts) // --- implementation is in src/fl_rect.cxx which includes src/cfg_gfx/gdi_rect.cxx
void point(int x, int y); void point(int x, int y);
void rect(int x, int y, int w, int h); void rect(int x, int y, int w, int h);
void rectf(int x, int y, int w, int h); void rectf(int x, int y, int w, int h);
void line(int x, int y, int x1, int y1);
void line(int x, int y, int x1, int y1, int x2, int y2);
void xyline(int x, int y, int x1);
void xyline(int x, int y, int x1, int y2);
void xyline(int x, int y, int x1, int y2, int x3);
void yxline(int x, int y, int y1);
void yxline(int x, int y, int y1, int x2);
void yxline(int x, int y, int y1, int x2, int y3);
void loop(int x0, int y0, int x1, int y1, int x2, int y2);
void loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
void polygon(int x0, int y0, int x1, int y1, int x2, int y2);
void polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
}; };
/** /**
@@ -578,10 +602,22 @@ public:
#if ! defined(FL_DOXYGEN) #if ! defined(FL_DOXYGEN)
void copy_offscreen_with_alpha(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy); void copy_offscreen_with_alpha(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
#endif #endif
// --- recently moved implementations (see FL_PORTING efforts) // --- implementation is in src/fl_rect.cxx which includes src/cfg_gfx/xlib_rect.cxx
void point(int x, int y); void point(int x, int y);
void rect(int x, int y, int w, int h); void rect(int x, int y, int w, int h);
void rectf(int x, int y, int w, int h); void rectf(int x, int y, int w, int h);
void line(int x, int y, int x1, int y1);
void line(int x, int y, int x1, int y1, int x2, int y2);
void xyline(int x, int y, int x1);
void xyline(int x, int y, int x1, int y2);
void xyline(int x, int y, int x1, int y2, int x3);
void yxline(int x, int y, int y1);
void yxline(int x, int y, int y1, int x2);
void yxline(int x, int y, int y1, int x2, int y3);
void loop(int x0, int y0, int x1, int y1, int x2, int y2);
void loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
void polygon(int x0, int y0, int x1, int y1, int x2, int y2);
void polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
}; };
#endif #endif
@@ -637,6 +673,7 @@ public:
There is no need to create any other object of this class. There is no need to create any other object of this class.
*/ */
class FL_EXPORT Fl_Display_Device : public Fl_Surface_Device { class FL_EXPORT Fl_Display_Device : public Fl_Surface_Device {
friend class Fl_Quartz_Graphics_Driver;
static Fl_Display_Device *_display; // the platform display device static Fl_Display_Device *_display; // the platform display device
#ifdef __APPLE__ #ifdef __APPLE__
friend class Fl_X; friend class Fl_X;
+60 -19
View File
@@ -66,6 +66,32 @@ public:
unsigned int c = (r<<24)|(g<<16)|(b<<8); unsigned int c = (r<<24)|(g<<16)|(b<<8);
gl_color(c); gl_color(c);
} }
// --- implementation will eventually be in src/fl_rect.cxx which includes src/cfg_gfx/xlib_rect.cxx
// --- line and polygon drawing with integer coordinates
void point(int x, int y) {
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
}
void rect(int x, int y, int w, int h) {
glBegin(GL_LINE_LOOP);
glVertex2i(x, y);
glVertex2i(x+w, y);
glVertex2i(x+w, y+h);
glVertex2i(x, y+h);
glEnd();
}
void rectf(int x, int y, int w, int h) {
if (w<=0 || h<=0) return;
// OpenGL has the natural origin at the bottom left. Drawing in FLTK
// coordinates requires that we shift the rectangle one pixel up.
glBegin(GL_POLYGON);
glVertex2i(x, y-1);
glVertex2i(x+w, y-1);
glVertex2i(x+w, y+h-1);
glVertex2i(x, y+h-1);
glEnd();
}
void line(int x, int y, int x1, int y1) { void line(int x, int y, int x1, int y1) {
glBegin(GL_LINE_STRIP); glBegin(GL_LINE_STRIP);
glVertex2i(x, y); glVertex2i(x, y);
@@ -73,6 +99,14 @@ public:
glEnd(); glEnd();
point(x1, y1); point(x1, y1);
} }
void line(int x, int y, int x1, int y1, int x2, int y2) {
glBegin(GL_LINE_STRIP);
glVertex2i(x, y);
glVertex2i(x1, y1);
glVertex2i(x2, y2);
glEnd();
point(x2, y2);
}
void xyline(int x, int y, int x1) { void xyline(int x, int y, int x1) {
glBegin(GL_LINE_STRIP); glBegin(GL_LINE_STRIP);
glVertex2i(x, y); glVertex2i(x, y);
@@ -121,29 +155,34 @@ public:
glEnd(); glEnd();
point(x2, y3); point(x2, y3);
} }
// --- recently moved implementations (see FL_PORTING efforts) void loop(int x0, int y0, int x1, int y1, int x2, int y2) {
void point(int x, int y) {
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
}
void rect(int x, int y, int w, int h) {
glBegin(GL_LINE_LOOP); glBegin(GL_LINE_LOOP);
glVertex2i(x, y); glVertex2i(x0, y0);
glVertex2i(x+w, y); glVertex2i(x1, y1);
glVertex2i(x+w, y+h); glVertex2i(x2, y2);
glVertex2i(x, y+h);
glEnd(); glEnd();
} }
void rectf(int x, int y, int w, int h) { void loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3) {
if (w<=0 || h<=0) return; glBegin(GL_LINE_LOOP);
// OpenGL has the natural origin at the bottom left. Drawing in FLTK glVertex2i(x0, y0);
// coordinates requires that we shift the rectangle one pixel up. glVertex2i(x1, y1);
glVertex2i(x2, y2);
glVertex2i(x3, y3);
glEnd();
}
void polygon(int x0, int y0, int x1, int y1, int x2, int y2) {
glBegin(GL_POLYGON); glBegin(GL_POLYGON);
glVertex2i(x, y-1); glVertex2i(x0, y0);
glVertex2i(x+w, y-1); glVertex2i(x1, y1);
glVertex2i(x+w, y+h-1); glVertex2i(x2, y2);
glVertex2i(x, y+h-1); glEnd();
}
void polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3) {
glBegin(GL_POLYGON);
glVertex2i(x0, y0);
glVertex2i(x1, y1);
glVertex2i(x2, y2);
glVertex2i(x3, y3);
glEnd(); glEnd();
} }
}; };
@@ -681,6 +720,8 @@ void Fl_Gl_Window::draw() {
glOrtho(-0.5, w()-0.5, h()-0.5, -0.5, -1, 1); glOrtho(-0.5, w()-0.5, h()-0.5, -0.5, -1, 1);
// glOrtho(0, w(), h(), 0, -1, 1); // glOrtho(0, w(), h(), 0, -1, 1);
glLineWidth(pixels_per_unit()); // should be 1 or 2 (2 if highres OpenGL) glLineWidth(pixels_per_unit()); // should be 1 or 2 (2 if highres OpenGL)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // FIXME: push on state stack
glEnable(GL_BLEND); // FIXME: push on state stack
Fl_Window::draw(); Fl_Window::draw();
+330 -341
View File
File diff suppressed because it is too large Load Diff