diff options
| author | Matthias Melcher <fltk@matthiasm.com> | 2016-01-24 20:58:12 +0000 |
|---|---|---|
| committer | Matthias Melcher <fltk@matthiasm.com> | 2016-01-24 20:58:12 +0000 |
| commit | 6a12d167508ec8fb8747e480a12813dbef421586 (patch) | |
| tree | e590d9646d596aaf7efd6a5f2afa7ee068bcffe5 /src | |
| parent | 60c114ba3bd15fe97745945945d1e6d8329723bb (diff) | |
Extracting OpenGL text calls. This is a minimum implementation for testing. Don;t worry. I have a cunning plan for rendering perfect antialiased text into OpenGL contexts quickly on all platforms.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11048 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src')
| -rw-r--r-- | src/Fl_Gl_Device_Plugin.cxx | 1 | ||||
| -rw-r--r-- | src/cfg_gfx/opengl.H | 7 | ||||
| -rw-r--r-- | src/cfg_gfx/opengl_font.cxx | 133 | ||||
| -rw-r--r-- | src/cfg_gfx/opengl_rect.cxx | 4 | ||||
| -rw-r--r-- | src/cfg_gfx/quartz.H | 24 | ||||
| -rw-r--r-- | src/cfg_gfx/quartz_font.cxx (renamed from src/fl_font_mac.cxx) | 2 | ||||
| -rw-r--r-- | src/fl_font.cxx | 2 |
7 files changed, 154 insertions, 19 deletions
diff --git a/src/Fl_Gl_Device_Plugin.cxx b/src/Fl_Gl_Device_Plugin.cxx index 12430df07..a21aef2b0 100644 --- a/src/Fl_Gl_Device_Plugin.cxx +++ b/src/Fl_Gl_Device_Plugin.cxx @@ -55,6 +55,7 @@ const char *Fl_OpenGL_Display_Device::class_id = "Fl_OpenGL_Display_Device"; #include "cfg_gfx/opengl_arci.cxx" #include "cfg_gfx/opengl_color.cxx" +#include "cfg_gfx/opengl_font.cxx" #include "cfg_gfx/opengl_line_style.cxx" #include "cfg_gfx/opengl_rect.cxx" #include "cfg_gfx/opengl_vertex.cxx" diff --git a/src/cfg_gfx/opengl.H b/src/cfg_gfx/opengl.H index dc25d32ec..48944fcb8 100644 --- a/src/cfg_gfx/opengl.H +++ b/src/cfg_gfx/opengl.H @@ -35,7 +35,6 @@ class FL_EXPORT Fl_OpenGL_Graphics_Driver : public Fl_Graphics_Driver { public: static const char *class_id; const char *class_name() {return class_id;}; - void draw(const char* str, int n, int x, int y); // --- line and polygon drawing with integer coordinates void point(int x, int y); void rect(int x, int y, int w, int h); @@ -86,6 +85,12 @@ public: void color(Fl_Color c); Fl_Color color() { return color_; } void color(uchar r, uchar g, uchar b); + // --- implementation is in src/fl_font.cxx which includes src/cfg_gfx/xxx_font.cxx + void draw(const char *str, int n, int x, int y); + double width(const char *str, int n); + void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h); + int height(); + int descent(); }; diff --git a/src/cfg_gfx/opengl_font.cxx b/src/cfg_gfx/opengl_font.cxx new file mode 100644 index 000000000..a42b92394 --- /dev/null +++ b/src/cfg_gfx/opengl_font.cxx @@ -0,0 +1,133 @@ +// +// "$Id$" +// +// Standard X11 font selection code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2016 by Bill Spitzak and others. +// +// This library is free software. Distribution and use rights are outlined in +// the file "COPYING" which should have been included with this file. If this +// file is missing or damaged, see the license at: +// +// http://www.fltk.org/COPYING.php +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +/* + This module implements a lowest-common-denominator font for OpenGL. + It will always work, even if the main graphics library does not support + rendering text into a texture buffer. + + The font is limited to a single face and ASCII characters. It is drawn using + lines which makes it arbitrarily scalable. I am trying to keep font data really + compact. + */ + + +#include <FL/gl.h> + +/* + |01234567| + -+--------+ + 0| |____ + 1|++++++++|font + 2|++++++++| + 3|++++++++| + 4|++++++++| + 5|++++++++|____ + 6| |descent + 7| | + -+--------+ + */ + + +static const char *font_data[128] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, /*T*/"\11\71\100\41\45", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, /*e*/"\55\25\14\13\22\52\63\64\14", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, /*s*/"\62\22\13\64\55\15", /*t*/"\41\44\55\65\100\22\62", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + + +#if 0 + +void Fl_OpenGL_Graphics_Driver::draw(const char* str, int n, int x, int y) { + gl_draw(str, n, x, y); +} + +#else + +double Fl_OpenGL_Graphics_Driver::width(const char *str, int n) { + return size_*n*0.5; +} + +int Fl_OpenGL_Graphics_Driver::descent() { + return (int)(size_ - size_*0.8); +} + +int Fl_OpenGL_Graphics_Driver::height() { + return (int)(size_*0.8); +} + +void Fl_OpenGL_Graphics_Driver::text_extents(const char *str, int n, int& dx, int& dy, int& w, int& h) +{ + dx = 0; + dy = descent(); + w = width(str, n); + h = size_; +} + +void Fl_OpenGL_Graphics_Driver::draw(const char *str, int n, int x, int y) +{ + int i; + for (i=0; i<n; i++) { + char c = str[i] & 0x7f; + const char *fd = font_data[(int)c]; + if (fd) { + char rendering = 0; + float px, py; + for (;;) { + char cmd = *fd++; + if (cmd==0) { + if (rendering) { + glEnd(); + glBegin(GL_POINTS); glVertex2f(px, py); glEnd(); + rendering = 0; + } + break; + } else if (cmd>63) { + if (cmd=='\100' && rendering) { + glEnd(); + glBegin(GL_POINTS); glVertex2f(px, py); glEnd(); + rendering = 0; + } + } else { + if (!rendering) { glBegin(GL_LINE_STRIP); rendering = 1; } + int vx = (cmd & '\70')>>3; + int vy = (cmd & '\07'); + px = 0.5+x+vx*size_*0.5/8.0; + py = 0.5+y+vy*size_/8.0-0.8*size_; + glVertex2f(px, py); + } + } + } + x += size_*0.5; + } +} + +#endif + + +// +// End of "$Id$". +// diff --git a/src/cfg_gfx/opengl_rect.cxx b/src/cfg_gfx/opengl_rect.cxx index ff10474a1..b1617fcd3 100644 --- a/src/cfg_gfx/opengl_rect.cxx +++ b/src/cfg_gfx/opengl_rect.cxx @@ -28,10 +28,6 @@ #include <FL/gl.h> #include "opengl.H" -void Fl_OpenGL_Graphics_Driver::draw(const char* str, int n, int x, int y) { - gl_draw(str, n, x, y); -} - // --- line and polygon drawing with integer coordinates void Fl_OpenGL_Graphics_Driver::point(int x, int y) { diff --git a/src/cfg_gfx/quartz.H b/src/cfg_gfx/quartz.H index 6a6c5f337..ae597fe13 100644 --- a/src/cfg_gfx/quartz.H +++ b/src/cfg_gfx/quartz.H @@ -43,13 +43,7 @@ class FL_EXPORT Fl_Quartz_Graphics_Driver : public Fl_Graphics_Driver { public: static const char *class_id; const char *class_name() {return class_id;}; - void draw(const char* str, int n, int x, int y); -#ifdef __APPLE__ - void draw(const char *str, int n, float x, float y); -#endif - void draw(int angle, const char *str, int n, int x, int y); - void rtl_draw(const char* str, int n, int x, int y); - void font(Fl_Font face, Fl_Fontsize size); + void draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy); void draw(Fl_Bitmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy); void draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int cx, int cy); @@ -58,11 +52,6 @@ public: void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3); void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0); void draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=1); - double width(const char *str, int n); - double width(unsigned int c); - void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h); - int height(); - int descent(); #if ! defined(FL_DOXYGEN) static Fl_Offscreen create_offscreen_with_alpha(int w, int h); #endif @@ -113,6 +102,17 @@ protected: void color(Fl_Color c); Fl_Color color() { return color_; } void color(uchar r, uchar g, uchar b); + // --- implementation is in src/fl_font.cxx which includes src/cfg_gfx/xxx_font.cxx + void draw(const char *str, int n, int x, int y); + void draw(const char *str, int n, float x, float y); + void draw(int angle, const char *str, int n, int x, int y); + void rtl_draw(const char *str, int n, int x, int y); + void font(Fl_Font face, Fl_Fontsize fsize); + double width(const char *str, int n); + double width(unsigned int c); + void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h); + int height(); + int descent(); }; diff --git a/src/fl_font_mac.cxx b/src/cfg_gfx/quartz_font.cxx index 1ab6f3bf6..84a2a707e 100644 --- a/src/fl_font_mac.cxx +++ b/src/cfg_gfx/quartz_font.cxx @@ -3,7 +3,7 @@ // // MacOS font selection routines for the Fast Light Tool Kit (FLTK). // -// Copyright 1998-2015 by Bill Spitzak and others. +// Copyright 1998-2016 by Bill Spitzak and others. // // This library is free software. Distribution and use rights are outlined in // the file "COPYING" which should have been included with this file. If this diff --git a/src/fl_font.cxx b/src/fl_font.cxx index a2e5675cb..ca7e87560 100644 --- a/src/fl_font.cxx +++ b/src/fl_font.cxx @@ -48,7 +48,7 @@ #ifdef WIN32 # include "fl_font_win32.cxx" #elif defined(__APPLE__) -# include "fl_font_mac.cxx" +# include "cfg_gfx/quartz_font.cxx" #elif USE_XFT # include "fl_font_xft.cxx" #elif defined(FL_PORTING) |
