summaryrefslogtreecommitdiff
path: root/navit/graphics/opengl/graphics_opengl.c
diff options
context:
space:
mode:
Diffstat (limited to 'navit/graphics/opengl/graphics_opengl.c')
-rw-r--r--navit/graphics/opengl/graphics_opengl.c2441
1 files changed, 1123 insertions, 1318 deletions
diff --git a/navit/graphics/opengl/graphics_opengl.c b/navit/graphics/opengl/graphics_opengl.c
index 98230f0dc..2789061f1 100644
--- a/navit/graphics/opengl/graphics_opengl.c
+++ b/navit/graphics/opengl/graphics_opengl.c
@@ -50,7 +50,7 @@
#define PIXEL_FORMAT GL_BGRA
#endif
-#if HAVE_FREEIMAGE
+#ifdef HAVE_FREEIMAGE
#include <FreeImage.h>
#endif
@@ -114,73 +114,73 @@ typedef GLfixed GLf;
//#define MIRRORED_VIEW 1
struct graphics_gc_priv {
- struct graphics_priv *gr;
- float fr, fg, fb, fa;
- float br, bg, bb, ba;
- int linewidth;
- unsigned char *dash_list;
- int dash_count;
- int dash_mask;
+ struct graphics_priv *gr;
+ float fr, fg, fb, fa;
+ float br, bg, bb, ba;
+ int linewidth;
+ unsigned char *dash_list;
+ int dash_count;
+ int dash_mask;
} graphics_gc_priv;
struct graphics_priv {
- int button_timeout;
- struct point p;
- int width;
- int height;
- int library_init;
- int visible;
- int overlay_enabled;
- int overlay_autodisabled;
- int wraparound;
- struct graphics_priv *parent;
- struct graphics_priv *overlays;
- struct graphics_priv *next;
- struct graphics_gc_priv *background_gc;
- enum draw_mode_num mode;
- void (*resize_callback) (void *data, int w, int h);
- void *resize_callback_data;
- void (*motion_callback) (void *data, struct point * p);
- void *motion_callback_data;
- void (*button_callback) (void *data, int press, int button,
- struct point * p);
- void *button_callback_data;
+ int button_timeout;
+ struct point p;
+ int width;
+ int height;
+ int library_init;
+ int visible;
+ int overlay_enabled;
+ int overlay_autodisabled;
+ int wraparound;
+ struct graphics_priv *parent;
+ struct graphics_priv *overlays;
+ struct graphics_priv *next;
+ struct graphics_gc_priv *background_gc;
+ enum draw_mode_num mode;
+ void (*resize_callback) (void *data, int w, int h);
+ void *resize_callback_data;
+ void (*motion_callback) (void *data, struct point * p);
+ void *motion_callback_data;
+ void (*button_callback) (void *data, int press, int button, struct point * p);
+ void *button_callback_data;
#ifdef USE_OPENGLES
- GLuint program;
- GLint mvp_location, position_location, color_location, texture_position_location, use_texture_location, texture_location;
+ GLuint program;
+ GLint mvp_location, position_location, color_location, texture_position_location, use_texture_location,
+ texture_location;
#else
- GLuint DLid;
+ GLuint DLid;
#endif
- struct callback_list *cbl;
- struct font_freetype_methods freetype_methods;
- struct navit *nav;
- int timeout;
- int delay;
- struct window window;
- int dirty; //display needs to be redrawn (draw on root graphics or overlay is done)
- int force_redraw; //display needs to be redrawn (draw on root graphics or overlay is done)
- time_t last_refresh_time; //last display refresh time
- struct graphics_opengl_window_system *window_system;
- struct graphics_opengl_window_system_methods *window_system_methods;
- struct graphics_opengl_platform *platform;
- struct graphics_opengl_platform_methods *platform_methods;
+ struct callback_list *cbl;
+ struct font_freetype_methods freetype_methods;
+ struct navit *nav;
+ int timeout;
+ int delay;
+ struct window window;
+ int dirty; //display needs to be redrawn (draw on root graphics or overlay is done)
+ int force_redraw; //display needs to be redrawn (draw on root graphics or overlay is done)
+ time_t last_refresh_time; //last display refresh time
+ struct graphics_opengl_window_system *window_system;
+ struct graphics_opengl_window_system_methods *window_system_methods;
+ struct graphics_opengl_platform *platform;
+ struct graphics_opengl_platform_methods *platform_methods;
};
static struct graphics_priv *graphics_priv_root;
struct graphics_image_priv {
- int w;
- int h;
- int hot_x;
- int hot_y;
- unsigned char *data;
- char *path;
+ int w;
+ int h;
+ int hot_x;
+ int hot_y;
+ unsigned char *data;
+ char *path;
} graphics_image_priv;
struct mouse_event_queue_element {
- int button;
- int state;
- int x;
- int y;
+ int button;
+ int state;
+ int x;
+ int y;
};
static const int mouse_event_queue_size = 100;
@@ -204,8 +204,8 @@ const char *getPrimitiveType(GLenum type);
#endif
static struct graphics_priv *graphics_opengl_new_helper(struct
- graphics_methods
- *meth);
+ graphics_methods
+ *meth);
static void display(void);
static void resize_callback(int w, int h);
#ifdef USE_OPENGLES
@@ -217,7 +217,7 @@ static void glut_close(void);
#ifdef USE_OPENGLES2
const char vertex_src [] =
-" \
+ " \
attribute vec2 position; \
attribute vec2 texture_position; \
uniform mat4 mvp; \
@@ -231,7 +231,7 @@ const char vertex_src [] =
";
const char fragment_src [] =
-" \
+ " \
uniform lowp vec4 avcolor; \
uniform sampler2D texture; \
uniform bool use_texture; \
@@ -247,456 +247,407 @@ const char fragment_src [] =
";
#endif
-static void
-graphics_destroy(struct graphics_priv *gr)
-{
- /*FIXME graphics_destroy is never called */
- /*TODO add destroy code for image cache(delete entries in hImageData) */
- gr->freetype_methods.destroy();
- g_free(gr);
- gr = NULL;
+static void graphics_destroy(struct graphics_priv *gr) {
+ /*FIXME graphics_destroy is never called */
+ /*TODO add destroy code for image cache(delete entries in hImageData) */
+ gr->freetype_methods.destroy();
+ g_free(gr);
+ gr = NULL;
}
-static void
-gc_destroy(struct graphics_gc_priv *gc)
-{
- g_free(gc);
- gc = NULL;
+static void gc_destroy(struct graphics_gc_priv *gc) {
+ g_free(gc);
+ gc = NULL;
}
-static void
-gc_set_linewidth(struct graphics_gc_priv *gc, int w)
-{
- gc->linewidth = w;
+static void gc_set_linewidth(struct graphics_gc_priv *gc, int w) {
+ gc->linewidth = w;
}
-static void
-gc_set_dashes(struct graphics_gc_priv *gc, int width, int offset,
- unsigned char *dash_list, int n)
-{
- int i;
- const int cOpenglMaskBits = 16;
- gc->dash_count = n;
- if (1 == n) {
- gc->dash_mask = 0;
- for (i = 0; i < cOpenglMaskBits; ++i) {
- gc->dash_mask <<= 1;
- gc->dash_mask |= (i / n) % 2;
- }
- } else if (1 < n) {
- unsigned char *curr = dash_list;
- int cnt = 0; //dot counter
- int dcnt = 0; //dash element counter
- int sum_dash = 0;
- gc->dash_mask = 0;
-
- for (i = 0; i < n; ++i) {
- sum_dash += dash_list[i];
- }
-
- //scale dashlist elements to max size
- if (sum_dash > cOpenglMaskBits) {
- int num_error[2] = { 0, 0 }; //count elements rounded to 0 for odd(drawn) and even(masked) for compensation
- double factor = (1.0 * cOpenglMaskBits) / sum_dash;
- for (i = 0; i < n; ++i) { //calculate dashlist max and largest common denomiator for scaling
- dash_list[i] *= factor;
- if (dash_list[i] == 0) {
- ++dash_list[i];
- ++num_error[i % 2];
- } else if (0 < num_error[i % 2]
- && 2 < dash_list[i]) {
- ++dash_list[i];
- --num_error[i % 2];
- }
- }
- }
- //calculate mask
- for (i = 0; i < cOpenglMaskBits; ++i) {
- gc->dash_mask <<= 1;
- gc->dash_mask |= 1 - dcnt % 2;
- ++cnt;
- if (cnt == *curr) {
- cnt = 0;
- ++curr;
- ++dcnt;
- if (dcnt == n) {
- curr = dash_list;
- }
- }
- }
- }
+static void gc_set_dashes(struct graphics_gc_priv *gc, int width, int offset, unsigned char *dash_list, int n) {
+ int i;
+ const int cOpenglMaskBits = 16;
+ gc->dash_count = n;
+ if (1 == n) {
+ gc->dash_mask = 0;
+ for (i = 0; i < cOpenglMaskBits; ++i) {
+ gc->dash_mask <<= 1;
+ gc->dash_mask |= (i / n) % 2;
+ }
+ } else if (1 < n) {
+ unsigned char *curr = dash_list;
+ int cnt = 0; //dot counter
+ int dcnt = 0; //dash element counter
+ int sum_dash = 0;
+ gc->dash_mask = 0;
+
+ for (i = 0; i < n; ++i) {
+ sum_dash += dash_list[i];
+ }
+
+ //scale dashlist elements to max size
+ if (sum_dash > cOpenglMaskBits) {
+ int num_error[2] = { 0, 0 }; //count elements rounded to 0 for odd(drawn) and even(masked) for compensation
+ double factor = (1.0 * cOpenglMaskBits) / sum_dash;
+ for (i = 0; i < n; ++i) { //calculate dashlist max and largest common denomiator for scaling
+ dash_list[i] *= factor;
+ if (dash_list[i] == 0) {
+ ++dash_list[i];
+ ++num_error[i % 2];
+ } else if (0 < num_error[i % 2]
+ && 2 < dash_list[i]) {
+ ++dash_list[i];
+ --num_error[i % 2];
+ }
+ }
+ }
+ //calculate mask
+ for (i = 0; i < cOpenglMaskBits; ++i) {
+ gc->dash_mask <<= 1;
+ gc->dash_mask |= 1 - dcnt % 2;
+ ++cnt;
+ if (cnt == *curr) {
+ cnt = 0;
+ ++curr;
+ ++dcnt;
+ if (dcnt == n) {
+ curr = dash_list;
+ }
+ }
+ }
+ }
}
-static void
-gc_set_foreground(struct graphics_gc_priv *gc, struct color *c)
-{
- gc->fr = c->r / 65535.0;
- gc->fg = c->g / 65535.0;
- gc->fb = c->b / 65535.0;
- gc->fa = c->a / 65535.0;
+static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) {
+ gc->fr = c->r / 65535.0;
+ gc->fg = c->g / 65535.0;
+ gc->fb = c->b / 65535.0;
+ gc->fa = c->a / 65535.0;
}
-static void
-gc_set_background(struct graphics_gc_priv *gc, struct color *c)
-{
- gc->br = c->r / 65535.0;
- gc->bg = c->g / 65535.0;
- gc->bb = c->b / 65535.0;
- gc->ba = c->a / 65535.0;
+static void gc_set_background(struct graphics_gc_priv *gc, struct color *c) {
+ gc->br = c->r / 65535.0;
+ gc->bg = c->g / 65535.0;
+ gc->bb = c->b / 65535.0;
+ gc->ba = c->a / 65535.0;
}
static struct graphics_gc_methods gc_methods = {
- gc_destroy,
- gc_set_linewidth,
- gc_set_dashes,
- gc_set_foreground,
- gc_set_background
+ gc_destroy,
+ gc_set_linewidth,
+ gc_set_dashes,
+ gc_set_foreground,
+ gc_set_background
};
-static struct graphics_gc_priv *
-gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth)
-{
- struct graphics_gc_priv *gc = g_new0(struct graphics_gc_priv, 1);
+static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) {
+ struct graphics_gc_priv *gc = g_new0(struct graphics_gc_priv, 1);
- *meth = gc_methods;
- gc->gr = gr;
- gc->linewidth = 1;
- return gc;
+ *meth = gc_methods;
+ gc->gr = gr;
+ gc->linewidth = 1;
+ return gc;
}
static struct graphics_image_priv image_error;
-static struct graphics_image_priv *
-image_new(struct graphics_priv *gr, struct graphics_image_methods *meth,
- char *path, int *w, int *h, struct point *hot, int rotation)
-{
-#if HAVE_FREEIMAGE
- FIBITMAP *image;
- RGBQUAD aPixel;
- unsigned char *data;
- int width, height, i, j;
- struct graphics_image_priv *gi;
- //check if image already exists in hashmap
- struct graphics_image_priv *curr_elem =
- g_hash_table_lookup(hImageData, path);
- if (curr_elem == &image_error) {
- //found but couldn't be loaded
- return NULL;
- } else if (curr_elem) {
- //found and OK -> use hastable entry
- *w = curr_elem->w;
- *h = curr_elem->h;
- hot->x = curr_elem->w / 2 - 1;
- hot->y = curr_elem->h / 2 - 1;
- return curr_elem;
- } else {
- if (strlen(path) < 4) {
- g_hash_table_insert(hImageData, g_strdup(path),
- &image_error);
- return NULL;
- }
- char *ext_str = path + strlen(path) - 3;
- if (strstr(ext_str, "png") || strstr(path, "PNG")) {
- if ((image =
- FreeImage_Load(FIF_PNG, path, 0)) == NULL) {
- g_hash_table_insert(hImageData,
- g_strdup(path),
- &image_error);
- return NULL;
- }
- } else if (strstr(ext_str, "xpm") || strstr(path, "XPM")) {
- if ((image =
- FreeImage_Load(FIF_XPM, path, 0)) == NULL) {
- g_hash_table_insert(hImageData,
- g_strdup(path),
- &image_error);
- return NULL;
- }
- } else if (strstr(ext_str, "svg") || strstr(path, "SVG")) {
- char path_new[256];
- snprintf(path_new, strlen(path) - 3, "%s", path);
- strcat(path_new, "_48_48.png");
-
- if ((image =
- FreeImage_Load(FIF_PNG, path_new,
- 0)) == NULL) {
- g_hash_table_insert(hImageData,
- g_strdup(path),
- &image_error);
- return NULL;
- }
- } else {
- g_hash_table_insert(hImageData, g_strdup(path),
- &image_error);
- return NULL;
- }
-
- if (FreeImage_GetBPP(image) == 64) {
- FIBITMAP *image2;
- image2 = FreeImage_ConvertTo32Bits(image);
- FreeImage_Unload(image);
- image = image2;
- }
+static struct graphics_image_priv *image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation) {
+#ifdef HAVE_FREEIMAGE
+ FIBITMAP *image;
+ RGBQUAD aPixel;
+ unsigned char *data;
+ int width, height, i, j;
+ struct graphics_image_priv *gi;
+ //check if image already exists in hashmap
+ struct graphics_image_priv *curr_elem =
+ g_hash_table_lookup(hImageData, path);
+ if (curr_elem == &image_error) {
+ //found but couldn't be loaded
+ return NULL;
+ } else if (curr_elem) {
+ //found and OK -> use hastable entry
+ *w = curr_elem->w;
+ *h = curr_elem->h;
+ hot->x = curr_elem->w / 2 - 1;
+ hot->y = curr_elem->h / 2 - 1;
+ return curr_elem;
+ } else {
+ if (strlen(path) < 4) {
+ g_hash_table_insert(hImageData, g_strdup(path), &image_error);
+ return NULL;
+ }
+ char *ext_str = path + strlen(path) - 3;
+ if (strstr(ext_str, "png") || strstr(path, "PNG")) {
+ if ((image =
+ FreeImage_Load(FIF_PNG, path, 0)) == NULL) {
+ g_hash_table_insert(hImageData, g_strdup(path), &image_error);
+ return NULL;
+ }
+ } else if (strstr(ext_str, "xpm") || strstr(path, "XPM")) {
+ if ((image =
+ FreeImage_Load(FIF_XPM, path, 0)) == NULL) {
+ g_hash_table_insert(hImageData, g_strdup(path), &image_error);
+ return NULL;
+ }
+ } else if (strstr(ext_str, "svg") || strstr(path, "SVG")) {
+ char path_new[256];
+ snprintf(path_new, strlen(path) - 3, "%s", path);
+ strcat(path_new, "_48_48.png");
+
+ if ((image = FreeImage_Load(FIF_PNG, path_new, 0)) == NULL) {
+ g_hash_table_insert(hImageData, g_strdup(path), &image_error);
+ return NULL;
+ }
+ } else {
+ g_hash_table_insert(hImageData, g_strdup(path), &image_error);
+ return NULL;
+ }
+
+ if (FreeImage_GetBPP(image) == 64) {
+ FIBITMAP *image2;
+ image2 = FreeImage_ConvertTo32Bits(image);
+ FreeImage_Unload(image);
+ image = image2;
+ }
#if FREEIMAGE_MAJOR_VERSION*100+FREEIMAGE_MINOR_VERSION >= 313
- if (rotation) {
- FIBITMAP *image2;
- image2 = FreeImage_Rotate(image, rotation, NULL);
- image = image2;
- }
+ if (rotation) {
+ FIBITMAP *image2;
+ image2 = FreeImage_Rotate(image, rotation, NULL);
+ image = image2;
+ }
#endif
- gi = g_new0(struct graphics_image_priv, 1);
-
- width = FreeImage_GetWidth(image);
- height = FreeImage_GetHeight(image);
-
- if ((*w != width || *h != height) && *w != IMAGE_W_H_UNSET && *h != IMAGE_W_H_UNSET) {
- FIBITMAP *image2;
- image2 = FreeImage_Rescale(image, *w, *h, FILTER_BOX);
- FreeImage_Unload(image);
- image = image2;
- width = *w;
- height = *h;
- }
-
- data = (unsigned char *) malloc(width * height * 4);
-
- RGBQUAD *palette = NULL;
- if (FreeImage_GetBPP(image) == 8) {
- palette = FreeImage_GetPalette(image);
- }
-
- for (i = 0; i < height; i++) {
- for (j = 0; j < width; j++) {
- unsigned char idx;
- if (FreeImage_GetBPP(image) == 8) {
- FreeImage_GetPixelIndex(image, j,
- height -
- i - 1,
- &idx);
- data[4 * width * i + 4 * j + 0] =
- palette[idx].rgbRed;
- data[4 * width * i + 4 * j + 1] =
- palette[idx].rgbGreen;
- data[4 * width * i + 4 * j + 2] =
- palette[idx].rgbBlue;
- data[4 * width * i + 4 * j + 3] =
- 255;
- } else if (FreeImage_GetBPP(image) == 16
- || FreeImage_GetBPP(image) == 24
- || FreeImage_GetBPP(image) ==
- 32) {
- FreeImage_GetPixelColor(image, j,
- height -
- i - 1,
- &aPixel);
- int transparent =
- (aPixel.rgbRed == 0
- && aPixel.rgbBlue == 0
- && aPixel.rgbGreen == 0);
- data[4 * width * i + 4 * j + 0] =
- transparent ? 0 : (aPixel.
- rgbRed);
- data[4 * width * i + 4 * j + 1] =
- (aPixel.rgbGreen);
- data[4 * width * i + 4 * j + 2] =
- transparent ? 0 : (aPixel.
- rgbBlue);
- data[4 * width * i + 4 * j + 3] =
- transparent ? 0 : 255;
-
- }
- }
- }
-
- FreeImage_Unload(image);
-
- *w = width;
- *h = height;
- gi->w = width;
- gi->h = height;
- gi->hot_x = width / 2 - 1;
- gi->hot_y = height / 2 - 1;
- hot->x = width / 2 - 1;
- hot->y = height / 2 - 1;
- gi->data = data;
- gi->path = path;
- //add to hashtable
- g_hash_table_insert(hImageData, g_strdup(path), gi);
- return gi;
- }
+ gi = g_new0(struct graphics_image_priv, 1);
+
+ width = FreeImage_GetWidth(image);
+ height = FreeImage_GetHeight(image);
+
+ if ((*w != width || *h != height) && *w != IMAGE_W_H_UNSET && *h != IMAGE_W_H_UNSET) {
+ FIBITMAP *image2;
+ image2 = FreeImage_Rescale(image, *w, *h, FILTER_BOX);
+ FreeImage_Unload(image);
+ image = image2;
+ width = *w;
+ height = *h;
+ }
+
+ data = (unsigned char *) malloc(width * height * 4);
+
+ RGBQUAD *palette = NULL;
+ if (FreeImage_GetBPP(image) == 8) {
+ palette = FreeImage_GetPalette(image);
+ }
+
+ for (i = 0; i < height; i++) {
+ for (j = 0; j < width; j++) {
+ unsigned char idx;
+ if (FreeImage_GetBPP(image) == 8) {
+ FreeImage_GetPixelIndex(image, j, height - i - 1, &idx);
+ data[4 * width * i + 4 * j + 0] =
+ palette[idx].rgbRed;
+ data[4 * width * i + 4 * j + 1] =
+ palette[idx].rgbGreen;
+ data[4 * width * i + 4 * j + 2] =
+ palette[idx].rgbBlue;
+ data[4 * width * i + 4 * j + 3] =
+ 255;
+ } else if (FreeImage_GetBPP(image) == 16
+ || FreeImage_GetBPP(image) == 24
+ || FreeImage_GetBPP(image) == 32) {
+ FreeImage_GetPixelColor(image, j, height - i - 1, &aPixel);
+ int transparent =
+ (aPixel.rgbRed == 0
+ && aPixel.rgbBlue == 0
+ && aPixel.rgbGreen == 0);
+ data[4 * width * i + 4 * j + 0] =
+ transparent ? 0 : (aPixel.
+ rgbRed);
+ data[4 * width * i + 4 * j + 1] =
+ (aPixel.rgbGreen);
+ data[4 * width * i + 4 * j + 2] =
+ transparent ? 0 : (aPixel.
+ rgbBlue);
+ data[4 * width * i + 4 * j + 3] =
+ transparent ? 0 : 255;
+
+ }
+ }
+ }
+
+ FreeImage_Unload(image);
+
+ *w = width;
+ *h = height;
+ gi->w = width;
+ gi->h = height;
+ gi->hot_x = width / 2 - 1;
+ gi->hot_y = height / 2 - 1;
+ hot->x = width / 2 - 1;
+ hot->y = height / 2 - 1;
+ gi->data = data;
+ gi->path = path;
+ //add to hashtable
+ g_hash_table_insert(hImageData, g_strdup(path), gi);
+ return gi;
+ }
#else
- dbg(lvl_error,"FreeImage not available - cannot load any images.\n", path);
- return NULL;
+ dbg(lvl_error,"FreeImage not available - cannot load any images.");
+ return NULL;
#endif
}
-static void
-set_color(struct graphics_priv *gr, struct graphics_gc_priv *gc)
-{
+static void set_color(struct graphics_priv *gr, struct graphics_gc_priv *gc) {
#ifdef USE_OPENGLES2
- GLfloat col[4];
- col[0]=gc->fr;
- col[1]=gc->fg;
- col[2]=gc->fb;
- col[3]=1.0;
- glUniform4fv(gr->color_location, 1, col);
+ GLfloat col[4];
+ col[0]=gc->fr;
+ col[1]=gc->fg;
+ col[2]=gc->fb;
+ col[3]=1.0;
+ glUniform4fv(gr->color_location, 1, col);
#else
- glColor4f(glF(gc->fr), glF(gc->fg), glF(gc->fb), glF(gc->fa));
+ glColor4f(glF(gc->fr), glF(gc->fg), glF(gc->fb), glF(gc->fa));
#endif
}
-static void
-draw_array(struct graphics_priv *gr, struct point *p, int count, GLenum mode)
-{
- int i;
+static void draw_array(struct graphics_priv *gr, struct point *p, int count, GLenum mode) {
+ int i;
#ifdef USE_OPENGLES
- GLf x[count*2];
+ GLf x[count*2];
#else
- glBegin(mode);
+ glBegin(mode);
#endif
- for (i = 0 ; i < count ; i++) {
+ for (i = 0 ; i < count ; i++) {
#ifdef USE_OPENGLES
- x[i*2]=glF(p[i].x);
- x[i*2+1]=glF(p[i].y);
+ x[i*2]=glF(p[i].x);
+ x[i*2+1]=glF(p[i].y);
#else
- glVertex2f(p[i].x, p[i].y);
+ glVertex2f(p[i].x, p[i].y);
#endif
- }
+ }
#ifdef USE_OPENGLES
#ifdef USE_OPENGLES2
- glVertexAttribPointer (gr->position_location, 2, GL_FLOAT, 0, 0, x );
+ glVertexAttribPointer (gr->position_location, 2, GL_FLOAT, 0, 0, x );
#else
- glVertexPointer(2, GL_F, 0, x);
+ glVertexPointer(2, GL_F, 0, x);
#endif
- glDrawArrays(mode, 0, count);
+ glDrawArrays(mode, 0, count);
#else
- glEnd();
+ glEnd();
#endif
}
-static void
-draw_rectangle_do(struct graphics_priv *gr, struct point *p, int w, int h)
-{
- struct point pa[4];
- pa[0]=pa[1]=pa[2]=pa[3]=*p;
- pa[0].x+=w;
- pa[1].x+=w;
- pa[1].y+=h;
- pa[3].y+=h;
- draw_array(gr, pa, 4, GL_TRIANGLE_STRIP);
+static void draw_rectangle_do(struct graphics_priv *gr, struct point *p, int w, int h) {
+ struct point pa[4];
+ pa[0]=pa[1]=pa[2]=pa[3]=*p;
+ pa[0].x+=w;
+ pa[1].x+=w;
+ pa[1].y+=h;
+ pa[3].y+=h;
+ draw_array(gr, pa, 4, GL_TRIANGLE_STRIP);
}
#ifdef USE_OPENGLES
-static int next_power2(int x)
-{
- int r=1;
- while (r < x)
- r*=2;
- return r;
+static int next_power2(int x) {
+ int r=1;
+ while (r < x)
+ r*=2;
+ return r;
}
-static void
-draw_image_es(struct graphics_priv *gr, struct point *p, int w, int h, unsigned char *data)
-{
- GLf x[8];
+static void draw_image_es(struct graphics_priv *gr, struct point *p, int w, int h, unsigned char *data) {
+ GLf x[8];
- memset(x, 0, sizeof(x));
+ memset(x, 0, sizeof(x));
#if REQUIRES_POWER_OF_2
- int w2=next_power2(w);
- int h2=next_power2(h);
- int y;
- if (w2 != w || h2 != h) {
- char *newpix=g_malloc0(w2*h2*4);
- for (y=0 ; y < h ; y++)
- memcpy(newpix+y*w2*4, data+y*w*4, w*4);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w2, h2, 0, GL_RGBA, GL_UNSIGNED_BYTE, newpix);
- g_free(newpix);
- w=w2;
- h=h2;
- } else
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
+ int w2=next_power2(w);
+ int h2=next_power2(h);
+ int y;
+ if (w2 != w || h2 != h) {
+ char *newpix=g_malloc0(w2*h2*4);
+ for (y=0 ; y < h ; y++)
+ memcpy(newpix+y*w2*4, data+y*w*4, w*4);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w2, h2, 0, GL_RGBA, GL_UNSIGNED_BYTE, newpix);
+ g_free(newpix);
+ w=w2;
+ h=h2;
+ } else
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
#else
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
#endif
- x[0]+=glF(1);
- x[2]+=glF(1);
- x[3]+=glF(1);
- x[7]+=glF(1);
+ x[0]+=glF(1);
+ x[2]+=glF(1);
+ x[3]+=glF(1);
+ x[7]+=glF(1);
#ifdef USE_OPENGLES2
- glUniform1i(gr->use_texture_location, 1);
- glEnableVertexAttribArray(gr->texture_position_location);
- glVertexAttribPointer (gr->texture_position_location, 2, GL_FLOAT, 0, 0, x );
+ glUniform1i(gr->use_texture_location, 1);
+ glEnableVertexAttribArray(gr->texture_position_location);
+ glVertexAttribPointer (gr->texture_position_location, 2, GL_FLOAT, 0, 0, x );
#else
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glEnable(GL_TEXTURE_2D);
- glTexCoordPointer(2, GL_F, 0, x);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glEnable(GL_TEXTURE_2D);
+ glTexCoordPointer(2, GL_F, 0, x);
#endif
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- draw_rectangle_do(gr, p, w, h);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ draw_rectangle_do(gr, p, w, h);
#ifdef USE_OPENGLES2
- glUniform1i(gr->use_texture_location, 0);
- glDisableVertexAttribArray(gr->texture_position_location);
+ glUniform1i(gr->use_texture_location, 0);
+ glDisableVertexAttribArray(gr->texture_position_location);
#else
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- glDisable(GL_TEXTURE_2D);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ glDisable(GL_TEXTURE_2D);
#endif
- glDisable(GL_BLEND);
+ glDisable(GL_BLEND);
}
#endif
-static void
-get_overlay_pos(struct graphics_priv *gr, struct point *point_out)
-{
- if (gr->parent == NULL) {
- point_out->x = 0;
- point_out->y = 0;
- return;
- }
- point_out->x = gr->p.x;
- if (point_out->x < 0) {
- point_out->x += gr->parent->width;
- }
-
- point_out->y = gr->p.y;
- if (point_out->y < 0) {
- point_out->y += gr->parent->height;
- }
+static void get_overlay_pos(struct graphics_priv *gr, struct point *point_out) {
+ if (gr->parent == NULL) {
+ point_out->x = 0;
+ point_out->y = 0;
+ return;
+ }
+ point_out->x = gr->p.x;
+ if (point_out->x < 0) {
+ point_out->x += gr->parent->width;
+ }
+
+ point_out->y = gr->p.y;
+ if (point_out->y < 0) {
+ point_out->y += gr->parent->height;
+ }
}
-static void
-draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc,
- struct point *p, int count)
-{
- if ((gr->parent && !gr->parent->overlay_enabled)
- || (gr->parent && gr->parent->overlay_enabled
- && !gr->overlay_enabled)) {
- return;
- }
+static void draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) {
+ if ((gr->parent && !gr->parent->overlay_enabled)
+ || (gr->parent && gr->parent->overlay_enabled
+ && !gr->overlay_enabled)) {
+ return;
+ }
#if !defined(USE_OPENGLES) || defined(USE_OPENGLES2)
- glLineWidth(gc->linewidth);
+ glLineWidth(gc->linewidth);
#endif
- set_color(gr, gc);
- graphics_priv_root->dirty = 1;
+ set_color(gr, gc);
+ graphics_priv_root->dirty = 1;
#ifndef USE_OPENGLES
- if (!gr->parent && 0 < gc->dash_count) {
- glLineStipple(1, gc->dash_mask);
- glEnable(GL_LINE_STIPPLE);
- }
+ if (!gr->parent && 0 < gc->dash_count) {
+ glLineStipple(1, gc->dash_mask);
+ glEnable(GL_LINE_STIPPLE);
+ }
#endif
- draw_array(gr, p, count, GL_LINE_STRIP);
+ draw_array(gr, p, count, GL_LINE_STRIP);
#ifndef USE_OPENGLES
- if (!gr->parent && 0 < gc->dash_count) {
- glDisable(GL_LINE_STIPPLE);
- }
+ if (!gr->parent && 0 < gc->dash_count) {
+ glDisable(GL_LINE_STIPPLE);
+ }
#endif
}
@@ -705,1118 +656,972 @@ static int tess_count;
static struct point tess_array[512];
static GLenum tess_type;
-const char *
-getPrimitiveType(GLenum type)
-{
- char *ret = "";
-
- switch (type) {
- case 0x0000:
- ret = "GL_POINTS";
- break;
- case 0x0001:
- ret = "GL_LINES";
- break;
- case 0x0002:
- ret = "GL_LINE_LOOP";
- break;
- case 0x0003:
- ret = "GL_LINE_STRIP";
- break;
- case 0x0004:
- ret = "GL_TRIANGLES";
- break;
- case 0x0005:
- ret = "GL_TRIANGLE_STRIP";
- break;
- case 0x0006:
- ret = "GL_TRIANGLE_FAN";
- break;
- case 0x0007:
- ret = "GL_QUADS";
- break;
- case 0x0008:
- ret = "GL_QUAD_STRIP";
- break;
- case 0x0009:
- ret = "GL_POLYGON";
- break;
- }
- return ret;
+const char *getPrimitiveType(GLenum type) {
+ char *ret = "";
+
+ switch (type) {
+ case 0x0000:
+ ret = "GL_POINTS";
+ break;
+ case 0x0001:
+ ret = "GL_LINES";
+ break;
+ case 0x0002:
+ ret = "GL_LINE_LOOP";
+ break;
+ case 0x0003:
+ ret = "GL_LINE_STRIP";
+ break;
+ case 0x0004:
+ ret = "GL_TRIANGLES";
+ break;
+ case 0x0005:
+ ret = "GL_TRIANGLE_STRIP";
+ break;
+ case 0x0006:
+ ret = "GL_TRIANGLE_FAN";
+ break;
+ case 0x0007:
+ ret = "GL_QUADS";
+ break;
+ case 0x0008:
+ ret = "GL_QUAD_STRIP";
+ break;
+ case 0x0009:
+ ret = "GL_POLYGON";
+ break;
+ }
+ return ret;
}
-void APIENTRY
-tessBeginCB(GLenum which)
-{
- dbg(lvl_debug, "glBegin( %s );\n", getPrimitiveType(which));
- tess_type=which;
- tess_count=0;
+void APIENTRY tessBeginCB(GLenum which) {
+ dbg(lvl_debug, "glBegin( %s );", getPrimitiveType(which));
+ tess_type=which;
+ tess_count=0;
}
-void APIENTRY
-tessEndCB(void)
-{
- dbg(lvl_debug, "glEnd();\n");
- draw_array(graphics_priv_root, tess_array, tess_count, tess_type);
+void APIENTRY tessEndCB(void) {
+ dbg(lvl_debug, "glEnd();");
+ draw_array(graphics_priv_root, tess_array, tess_count, tess_type);
}
-void APIENTRY
-tessVertexCB(const GLvoid * data)
-{
- // cast back to double type
- const GLdouble *ptr = (const GLdouble *) data;
- dbg(lvl_debug, " glVertex3d();\n");
+void APIENTRY tessVertexCB(const GLvoid * data) {
+ // cast back to double type
+ const GLdouble *ptr = (const GLdouble *) data;
+ dbg(lvl_debug, " glVertex3d();");
- tess_array[tess_count].x=ptr[0];
- tess_array[tess_count].y=ptr[1];
- if (tess_count < 511)
- tess_count++;
- else
- dbg(lvl_error,"overflow\n");
+ tess_array[tess_count].x=ptr[0];
+ tess_array[tess_count].y=ptr[1];
+ if (tess_count < 511)
+ tess_count++;
+ else
+ dbg(lvl_error,"overflow");
}
-void APIENTRY
-tessCombineCB(GLdouble c[3], void *d[4], GLfloat w[4], void **out)
-{
- GLdouble *nv = (GLdouble *) malloc(sizeof(GLdouble) * 3);
- nv[0] = c[0];
- nv[1] = c[1];
- nv[2] = c[2];
- *out = nv;
+void APIENTRY tessCombineCB(GLdouble c[3], void *d[4], GLfloat w[4], void **out) {
+ GLdouble *nv = (GLdouble *) malloc(sizeof(GLdouble) * 3);
+ nv[0] = c[0];
+ nv[1] = c[1];
+ nv[2] = c[2];
+ *out = nv;
}
#endif
-static void
-draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc,
- struct point *p, int count)
-{
- if ((gr->parent && !gr->parent->overlay_enabled)
- || (gr->parent && gr->parent->overlay_enabled
- && !gr->overlay_enabled)) {
- return;
- }
- set_color(gr, gc);
- graphics_priv_root->dirty = 1;
+static void draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) {
+ if ((gr->parent && !gr->parent->overlay_enabled)
+ || (gr->parent && gr->parent->overlay_enabled
+ && !gr->overlay_enabled)) {
+ return;
+ }
+ set_color(gr, gc);
+ graphics_priv_root->dirty = 1;
#if defined(USE_OPENGLES) && !defined(USE_GLUT_FOR_OPENGLES)
- draw_array(gr, p, count, GL_LINE_STRIP);
+ draw_array(gr, p, count, GL_LINE_STRIP);
#else
- GLUtesselator *tess = gluNewTess(); // create a tessellator
- if (!tess)
- return; // failed to create tessellation object, return 0
-
- GLdouble quad1[count][3];
- int i;
- for (i = 0; i < count; i++) {
- quad1[i][0] = (GLdouble) (p[i].x);
- quad1[i][1] = (GLdouble) (p[i].y);
- quad1[i][2] = 0;
- }
-
-
- // register callback functions
- gluTessCallback(tess, GLU_TESS_BEGIN, (void (APIENTRY *)(void)) tessBeginCB);
- gluTessCallback(tess, GLU_TESS_END, (void (APIENTRY *)(void)) tessEndCB);
- // gluTessCallback(tess, GLU_TESS_ERROR, (void (*)(void))tessErrorCB);
- gluTessCallback(tess, GLU_TESS_VERTEX, (void (APIENTRY *)(void)) tessVertexCB);
- gluTessCallback(tess, GLU_TESS_COMBINE, (void (APIENTRY *)(void)) tessCombineCB);
-
- // tessellate and compile a concave quad into display list
- // gluTessVertex() takes 3 params: tess object, pointer to vertex coords,
- // and pointer to vertex data to be passed to vertex callback.
- // The second param is used only to perform tessellation, and the third
- // param is the actual vertex data to draw. It is usually same as the second
- // param, but It can be more than vertex coord, for example, color, normal
- // and UV coords which are needed for actual drawing.
- // Here, we are looking at only vertex coods, so the 2nd and 3rd params are
- // pointing same address.
- gluTessBeginPolygon(tess, 0); // with NULL data
- gluTessBeginContour(tess);
- for (i = 0; i < count; i++) {
- gluTessVertex(tess, quad1[i], quad1[i]);
- }
- gluTessEndContour(tess);
- gluTessEndPolygon(tess);
-
- gluDeleteTess(tess); // delete after tessellation
+ GLUtesselator *tess = gluNewTess(); // create a tessellator
+ if (!tess)
+ return; // failed to create tessellation object, return 0
+
+ GLdouble quad1[count][3];
+ int i;
+ for (i = 0; i < count; i++) {
+ quad1[i][0] = (GLdouble) (p[i].x);
+ quad1[i][1] = (GLdouble) (p[i].y);
+ quad1[i][2] = 0;
+ }
+
+
+ // register callback functions
+ gluTessCallback(tess, GLU_TESS_BEGIN, (void (APIENTRY *)(void)) tessBeginCB);
+ gluTessCallback(tess, GLU_TESS_END, (void (APIENTRY *)(void)) tessEndCB);
+ // gluTessCallback(tess, GLU_TESS_ERROR, (void (*)(void))tessErrorCB);
+ gluTessCallback(tess, GLU_TESS_VERTEX, (void (APIENTRY *)(void)) tessVertexCB);
+ gluTessCallback(tess, GLU_TESS_COMBINE, (void (APIENTRY *)(void)) tessCombineCB);
+
+ // tessellate and compile a concave quad into display list
+ // gluTessVertex() takes 3 params: tess object, pointer to vertex coords,
+ // and pointer to vertex data to be passed to vertex callback.
+ // The second param is used only to perform tessellation, and the third
+ // param is the actual vertex data to draw. It is usually same as the second
+ // param, but It can be more than vertex coord, for example, color, normal
+ // and UV coords which are needed for actual drawing.
+ // Here, we are looking at only vertex coods, so the 2nd and 3rd params are
+ // pointing same address.
+ gluTessBeginPolygon(tess, 0); // with NULL data
+ gluTessBeginContour(tess);
+ for (i = 0; i < count; i++) {
+ gluTessVertex(tess, quad1[i], quad1[i]);
+ }
+ gluTessEndContour(tess);
+ gluTessEndPolygon(tess);
+
+ gluDeleteTess(tess); // delete after tessellation
#endif
}
-static void
-draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc,
- struct point *p, int w, int h)
-{
- if ((gr->parent && !gr->parent->overlay_enabled)
- || (gr->parent && gr->parent->overlay_enabled
- && !gr->overlay_enabled)) {
- return;
- }
- set_color(gr, gc);
- draw_rectangle_do(gr, p, w, h);
- graphics_priv_root->dirty = 1;
+static void draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h) {
+ if ((gr->parent && !gr->parent->overlay_enabled)
+ || (gr->parent && gr->parent->overlay_enabled
+ && !gr->overlay_enabled)) {
+ return;
+ }
+ set_color(gr, gc);
+ draw_rectangle_do(gr, p, w, h);
+ graphics_priv_root->dirty = 1;
}
-static void
-display_text_draw(struct font_freetype_text *text,
- struct graphics_priv *gr, struct graphics_gc_priv *fg,
- struct graphics_gc_priv *bg, int color, struct point *p)
-{
- int i, x, y, stride;
- struct font_freetype_glyph *g, **gp;
- unsigned char *shadow, *glyph;
- struct color transparent = { 0x0000, 0x0000, 0x0000, 0x0000 };
- struct color black =
- { fg->fr * 65535, fg->fg * 65535, fg->fb * 65535,
- fg->fa * 65535 };
- struct color white = { 0xffff, 0xffff, 0xffff, 0xffff };
-
- if (bg) {
- if (COLOR_IS_WHITE(black) && COLOR_IS_BLACK(white)) {
- black.r = 65535;
- black.g = 65535;
- black.b = 65535;
- black.a = 65535;
-
- white.r = 0;
- white.g = 0;
- white.b = 0;
- white.a = 65535;
- } else if (COLOR_IS_BLACK(black) && COLOR_IS_WHITE(white)) {
- white.r = 65535;
- white.g = 65535;
- white.b = 65535;
- white.a = 65535;
-
- black.r = 0;
- black.g = 0;
- black.b = 0;
- black.a = 65535;
- } else {
- white.r = bg->fr;
- white.g = bg->fg;
- white.b = bg->fb;
- white.a = bg->fa;
- }
- } else {
- white.r = 0;
- white.g = 0;
- white.b = 0;
- white.a = 0;
- }
-
- gp = text->glyph;
- i = text->glyph_count;
- x = p->x << 6;
- y = p->y << 6;
- while (i-- > 0) {
- g = *gp++;
- if (g->w && g->h && bg) {
- stride = (g->w + 2) * 4;
- if (color) {
- shadow = g_malloc(stride * (g->h + 2));
- gr->freetype_methods.get_shadow(g, shadow,
- stride,
- &white,
- &transparent);
+static void display_text_draw(struct font_freetype_text *text, struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, int color, struct point *p) {
+ int i, x, y, stride;
+ struct font_freetype_glyph *g, **gp;
+ unsigned char *shadow, *glyph;
+ struct color transparent = { 0x0000, 0x0000, 0x0000, 0x0000 };
+ struct color black = {
+ fg->fr * 65535, fg->fg * 65535, fg->fb * 65535, fg->fa * 65535
+ };
+ struct color white = { 0xffff, 0xffff, 0xffff, 0xffff };
+
+ if (bg) {
+ if (COLOR_IS_WHITE(black) && COLOR_IS_BLACK(white)) {
+ black.r = 65535;
+ black.g = 65535;
+ black.b = 65535;
+ black.a = 65535;
+
+ white.r = 0;
+ white.g = 0;
+ white.b = 0;
+ white.a = 65535;
+ } else if (COLOR_IS_BLACK(black) && COLOR_IS_WHITE(white)) {
+ white.r = 65535;
+ white.g = 65535;
+ white.b = 65535;
+ white.a = 65535;
+
+ black.r = 0;
+ black.g = 0;
+ black.b = 0;
+ black.a = 65535;
+ } else {
+ white.r = bg->fr;
+ white.g = bg->fg;
+ white.b = bg->fb;
+ white.a = bg->fa;
+ }
+ } else {
+ white.r = 0;
+ white.g = 0;
+ white.b = 0;
+ white.a = 0;
+ }
+
+ gp = text->glyph;
+ i = text->glyph_count;
+ x = p->x << 6;
+ y = p->y << 6;
+ while (i-- > 0) {
+ g = *gp++;
+ if (g->w && g->h && bg) {
+ stride = (g->w + 2) * 4;
+ if (color) {
+ shadow = g_malloc(stride * (g->h + 2));
+ gr->freetype_methods.get_shadow(g, shadow, stride, &white, &transparent);
#ifdef USE_OPENGLES
- struct point p;
- p.x=((x + g->x) >> 6)-1;
- p.y=((y + g->y) >> 6)-1;
- draw_image_es(gr, &p, g->w+2, g->h+2, shadow);
+ struct point p;
+ p.x=((x + g->x) >> 6)-1;
+ p.y=((y + g->y) >> 6)-1;
+ draw_image_es(gr, &p, g->w+2, g->h+2, shadow);
#else
#ifdef MIRRORED_VIEW
- glPixelZoom(-1.0, -1.0); //mirrored mode
+ glPixelZoom(-1.0, -1.0); //mirrored mode
#else
- glPixelZoom(1.0, -1.0);
+ glPixelZoom(1.0, -1.0);
#endif
- glRasterPos2d((x + g->x) >> 6,
- (y + g->y) >> 6);
- glDrawPixels(g->w + 2, g->h + 2, PIXEL_FORMAT,
- GL_UNSIGNED_BYTE, shadow);
+ glRasterPos2d((x + g->x) >> 6, (y + g->y) >> 6);
+ glDrawPixels(g->w + 2, g->h + 2, PIXEL_FORMAT, GL_UNSIGNED_BYTE, shadow);
#endif
- g_free(shadow);
- }
- }
- x += g->dx;
- y += g->dy;
- }
-
- x = p->x << 6;
- y = p->y << 6;
- gp = text->glyph;
- i = text->glyph_count;
- while (i-- > 0) {
- g = *gp++;
- if (g->w && g->h) {
- if (color) {
- stride = g->w;
- if (bg) {
- glyph =
- g_malloc(stride * g->h * 4);
- gr->freetype_methods.get_glyph(g,
- glyph,
- stride
- * 4,
- &black,
- &white,
- &transparent);
+ g_free(shadow);
+ }
+ }
+ x += g->dx;
+ y += g->dy;
+ }
+
+ x = p->x << 6;
+ y = p->y << 6;
+ gp = text->glyph;
+ i = text->glyph_count;
+ while (i-- > 0) {
+ g = *gp++;
+ if (g->w && g->h) {
+ if (color) {
+ stride = g->w;
+ if (bg) {
+ glyph =
+ g_malloc(stride * g->h * 4);
+ gr->freetype_methods.get_glyph(g, glyph, stride * 4, &black, &white, &transparent);
#ifdef USE_OPENGLES
- struct point p;
- p.x=(x + g->x) >> 6;
- p.y=(y + g->y) >> 6;
- draw_image_es(gr, &p, g->w, g->h, glyph);
+ struct point p;
+ p.x=(x + g->x) >> 6;
+ p.y=(y + g->y) >> 6;
+ draw_image_es(gr, &p, g->w, g->h, glyph);
#else
#ifdef MIRRORED_VIEW
- glPixelZoom(-1.0, -1.0); //mirrored mode
+ glPixelZoom(-1.0, -1.0); //mirrored mode
#else
- glPixelZoom(1.0, -1.0);
+ glPixelZoom(1.0, -1.0);
#endif
- glRasterPos2d((x + g->x) >> 6,
- (y + g->y) >> 6);
- glDrawPixels(g->w, g->h, PIXEL_FORMAT,
- GL_UNSIGNED_BYTE,
- glyph);
+ glRasterPos2d((x + g->x) >> 6, (y + g->y) >> 6);
+ glDrawPixels(g->w, g->h, PIXEL_FORMAT, GL_UNSIGNED_BYTE, glyph);
#endif
- g_free(glyph);
- }
- stride *= 4;
- glyph = g_malloc(stride * g->h);
- gr->freetype_methods.get_glyph(g, glyph,
- stride,
- &black,
- &white,
- &transparent);
+ g_free(glyph);
+ }
+ stride *= 4;
+ glyph = g_malloc(stride * g->h);
+ gr->freetype_methods.get_glyph(g, glyph, stride, &black, &white, &transparent);
#ifdef USE_OPENGLES
- struct point p;
- p.x=(x + g->x) >> 6;
- p.y=(y + g->y) >> 6;
- draw_image_es(gr, &p, g->w, g->h, glyph);
+ struct point p;
+ p.x=(x + g->x) >> 6;
+ p.y=(y + g->y) >> 6;
+ draw_image_es(gr, &p, g->w, g->h, glyph);
#else
#ifdef MIRRORED_VIEW
- glPixelZoom(-1.0, -1.0); //mirrored mode
+ glPixelZoom(-1.0, -1.0); //mirrored mode
#else
- glPixelZoom(1.0, -1.0);
+ glPixelZoom(1.0, -1.0);
#endif
- glRasterPos2d((x + g->x) >> 6,
- (y + g->y) >> 6);
- glDrawPixels(g->w, g->h, PIXEL_FORMAT,
- GL_UNSIGNED_BYTE, glyph);
+ glRasterPos2d((x + g->x) >> 6, (y + g->y) >> 6);
+ glDrawPixels(g->w, g->h, PIXEL_FORMAT, GL_UNSIGNED_BYTE, glyph);
#endif
- g_free(glyph);
- }
- }
- x += g->dx;
- y += g->dy;
- }
+ g_free(glyph);
+ }
+ }
+ x += g->dx;
+ y += g->dy;
+ }
}
-static void
-draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg,
- struct graphics_gc_priv *bg, struct graphics_font_priv *font,
- char *text, struct point *p, int dx, int dy)
-{
- if ((gr->parent && !gr->parent->overlay_enabled)
- || (gr->parent && gr->parent->overlay_enabled
- && !gr->overlay_enabled)) {
- return;
- }
-
- struct font_freetype_text *t;
- int color = 1;
-
- if (!font) {
- dbg(lvl_error, "no font, returning\n");
- return;
- }
-
- graphics_priv_root->dirty = 1;
-
- t = gr->freetype_methods.text_new(text,
- (struct font_freetype_font *)
- font, dx, dy);
-
- struct point p_eff;
- p_eff.x = p->x;
- p_eff.y = p->y;
-
- display_text_draw(t, gr, fg, bg, color, &p_eff);
- gr->freetype_methods.text_destroy(t);
+static void draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) {
+ if ((gr->parent && !gr->parent->overlay_enabled)
+ || (gr->parent && gr->parent->overlay_enabled
+ && !gr->overlay_enabled)) {
+ return;
+ }
+
+ struct font_freetype_text *t;
+ int color = 1;
+
+ if (!font) {
+ dbg(lvl_error, "no font, returning");
+ return;
+ }
+
+ graphics_priv_root->dirty = 1;
+
+ t = gr->freetype_methods.text_new(text, (struct font_freetype_font *) font, dx, dy);
+
+ struct point p_eff;
+ p_eff.x = p->x;
+ p_eff.y = p->y;
+
+ display_text_draw(t, gr, fg, bg, color, &p_eff);
+ gr->freetype_methods.text_destroy(t);
}
-static void
-draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg,
- struct point *p, struct graphics_image_priv *img)
-{
+static void draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) {
#ifdef USE_OPENGLES
- draw_image_es(gr, p, img->w, img->h, img->data);
+ draw_image_es(gr, p, img->w, img->h, img->data);
#else
- if ((gr->parent && !gr->parent->overlay_enabled)
- || (gr->parent && gr->parent->overlay_enabled
- && !gr->overlay_enabled)) {
- return;
- }
+ if ((gr->parent && !gr->parent->overlay_enabled)
+ || (gr->parent && gr->parent->overlay_enabled
+ && !gr->overlay_enabled)) {
+ return;
+ }
- if (!img || !img->data) {
- return;
- }
+ if (!img || !img->data) {
+ return;
+ }
- graphics_priv_root->dirty = 1;
+ graphics_priv_root->dirty = 1;
- struct point p_eff;
- p_eff.x = p->x + img->hot_x;
- p_eff.y = p->y + img->hot_y;
+ struct point p_eff;
+ p_eff.x = p->x + img->hot_x;
+ p_eff.y = p->y + img->hot_y;
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glRasterPos2d(p_eff.x - img->hot_x, p_eff.y - img->hot_y);
- glDrawPixels(img->w, img->h, GL_RGBA, GL_UNSIGNED_BYTE, img->data);
+ glRasterPos2d(p_eff.x - img->hot_x, p_eff.y - img->hot_y);
+ glDrawPixels(img->w, img->h, GL_RGBA, GL_UNSIGNED_BYTE, img->data);
#endif
}
-static void
-draw_drag(struct graphics_priv *gr, struct point *p)
-{
+static void draw_drag(struct graphics_priv *gr, struct point *p) {
- if (p) {
- gr->p.x = p->x;
- gr->p.y = p->y;
- }
+ if (p) {
+ gr->p.x = p->x;
+ gr->p.y = p->y;
+ }
}
-static void
-background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc)
-{
- gr->background_gc = gc;
+static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) {
+ gr->background_gc = gc;
}
-static void
-handle_mouse_queue(void)
-{
+static void handle_mouse_queue(void) {
#ifdef USE_OPENGLES
#else
- static int locked = 0;
- if (!locked) {
- locked = 1;
- } else {
- return;
- }
-
- if (mouse_event_queue_begin_idx < mouse_event_queue_end_idx) {
- if (mouse_queue[mouse_event_queue_begin_idx].button ==
- GLUT_LEFT_BUTTON
- && mouse_queue[mouse_event_queue_begin_idx].state ==
- GLUT_UP) {
- struct point p;
- p.x =
- mouse_queue[mouse_event_queue_begin_idx %
- mouse_event_queue_size].x;
- p.y =
- mouse_queue[mouse_event_queue_begin_idx %
- mouse_event_queue_size].y;
- graphics_priv_root->force_redraw = 1;
- callback_list_call_attr_3(graphics_priv_root->cbl,
- attr_button, (void *) 0,
- 1, (void *) &p);
- } else if (mouse_queue[mouse_event_queue_begin_idx].
- button == GLUT_LEFT_BUTTON
- && mouse_queue[mouse_event_queue_begin_idx].
- state == GLUT_DOWN) {
- struct point p;
- p.x =
- mouse_queue[mouse_event_queue_begin_idx %
- mouse_event_queue_size].x;
- p.y =
- mouse_queue[mouse_event_queue_begin_idx %
- mouse_event_queue_size].y;
- graphics_priv_root->force_redraw = 1;
- callback_list_call_attr_3(graphics_priv_root->cbl,
- attr_button, (void *) 1,
- 1, (void *) &p);
- }
- ++mouse_event_queue_begin_idx;
- }
- locked = 0;
+ static int locked = 0;
+ if (!locked) {
+ locked = 1;
+ } else {
+ return;
+ }
+
+ if (mouse_event_queue_begin_idx < mouse_event_queue_end_idx) {
+ if (mouse_queue[mouse_event_queue_begin_idx].button ==
+ GLUT_LEFT_BUTTON
+ && mouse_queue[mouse_event_queue_begin_idx].state ==
+ GLUT_UP) {
+ struct point p;
+ p.x =
+ mouse_queue[mouse_event_queue_begin_idx %
+ mouse_event_queue_size].x;
+ p.y =
+ mouse_queue[mouse_event_queue_begin_idx %
+ mouse_event_queue_size].y;
+ graphics_priv_root->force_redraw = 1;
+ callback_list_call_attr_3(graphics_priv_root->cbl, attr_button, (void *) 0, 1, (void *) &p);
+ } else if (mouse_queue[mouse_event_queue_begin_idx].
+ button == GLUT_LEFT_BUTTON
+ && mouse_queue[mouse_event_queue_begin_idx].
+ state == GLUT_DOWN) {
+ struct point p;
+ p.x =
+ mouse_queue[mouse_event_queue_begin_idx %
+ mouse_event_queue_size].x;
+ p.y =
+ mouse_queue[mouse_event_queue_begin_idx %
+ mouse_event_queue_size].y;
+ graphics_priv_root->force_redraw = 1;
+ callback_list_call_attr_3(graphics_priv_root->cbl, attr_button, (void *) 1, 1, (void *) &p);
+ }
+ ++mouse_event_queue_begin_idx;
+ }
+ locked = 0;
#endif
}
/*draws root graphics and its overlays*/
-static int
-redraw_screen(struct graphics_priv *gr)
-{
+static int redraw_screen(struct graphics_priv *gr) {
#ifdef USE_OPENGLES
#else
- graphics_priv_root->dirty = 0;
-
- glCallList(gr->DLid);
- //display overlays display list
- struct graphics_priv *overlay;
- overlay = gr->overlays;
- while (gr->overlay_enabled && overlay) {
- if (overlay->overlay_enabled) {
- glPushMatrix();
- struct point p_eff;
- get_overlay_pos(overlay, &p_eff);
- glTranslatef(p_eff.x, p_eff.y, 1);
- glCallList(overlay->DLid);
- glPopMatrix();
- }
- overlay = overlay->next;
- }
- glutSwapBuffers();
+ graphics_priv_root->dirty = 0;
+
+ glCallList(gr->DLid);
+ //display overlays display list
+ struct graphics_priv *overlay;
+ overlay = gr->overlays;
+ while (gr->overlay_enabled && overlay) {
+ if (overlay->overlay_enabled) {
+ glPushMatrix();
+ struct point p_eff;
+ get_overlay_pos(overlay, &p_eff);
+ glTranslatef(p_eff.x, p_eff.y, 1);
+ glCallList(overlay->DLid);
+ glPopMatrix();
+ }
+ overlay = overlay->next;
+ }
+ glutSwapBuffers();
#endif
- return TRUE;
+ return TRUE;
}
#ifndef USE_OPENGLES
/*filters call to redraw in overlay enabled(map) mode*/
-static gboolean
-redraw_filter(gpointer data)
-{
- struct graphics_priv *gr = (struct graphics_priv*) data;
- if (gr->overlay_enabled && gr->dirty) {
- redraw_screen(gr);
- }
- return 0;
+static gboolean redraw_filter(gpointer data) {
+ struct graphics_priv *gr = (struct graphics_priv*) data;
+ if (gr->overlay_enabled && gr->dirty) {
+ redraw_screen(gr);
+ }
+ return 0;
}
#endif
-static void
-draw_mode(struct graphics_priv *gr, enum draw_mode_num mode)
-{
- if (gr->parent) { //overlay
+static void draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) {
+ if (gr->parent) { //overlay
#ifdef USE_OPENGLES
#else
- if (mode == draw_mode_begin) {
- glNewList(gr->DLid, GL_COMPILE);
- }
+ if (mode == draw_mode_begin) {
+ glNewList(gr->DLid, GL_COMPILE);
+ }
- if (mode == draw_mode_end) {
- glEndList();
- }
+ if (mode == draw_mode_end) {
+ glEndList();
+ }
#endif
- } else { //root graphics
- if (mode == draw_mode_begin) {
+ } else { //root graphics
+ if (mode == draw_mode_begin) {
#ifdef USE_OPENGLES
#else
- glNewList(gr->DLid, GL_COMPILE);
+ glNewList(gr->DLid, GL_COMPILE);
#endif
- }
+ }
- if (mode == draw_mode_end) {
+ if (mode == draw_mode_end) {
#ifdef USE_OPENGLES
- gr->platform_methods->swap_buffers(gr->platform);
+ gr->platform_methods->swap_buffers(gr->platform);
#else
- glEndList();
- gr->force_redraw = 1;
- if (!gr->overlay_enabled || gr->force_redraw) {
- redraw_screen(gr);
- }
+ glEndList();
+ gr->force_redraw = 1;
+ if (!gr->overlay_enabled || gr->force_redraw) {
+ redraw_screen(gr);
+ }
#endif
- }
- }
- gr->mode = mode;
+ }
+ }
+ gr->mode = mode;
}
static struct graphics_priv *overlay_new(struct graphics_priv *gr,
- struct graphics_methods *meth,
- struct point *p, int w, int h,
- int wraparound);
-
-static int
-graphics_opengl_fullscreen(struct window *w, int on)
-{
- return 1;
+ struct graphics_methods *meth,
+ struct point *p, int w, int h,
+ int wraparound);
+
+static int graphics_opengl_fullscreen(struct window *w, int on) {
+ return 1;
}
-static void
-graphics_opengl_disable_suspend(struct window *w)
-{
+static void graphics_opengl_disable_suspend(struct window *w) {
}
#ifdef USE_OPENGLES2
-static GLuint
-load_shader(const char *shader_source, GLenum type)
-{
- GLuint shader = glCreateShader(type);
+static GLuint load_shader(const char *shader_source, GLenum type) {
+ GLuint shader = glCreateShader(type);
- glShaderSource(shader, 1, &shader_source, NULL);
- glCompileShader(shader);
+ glShaderSource(shader, 1, &shader_source, NULL);
+ glCompileShader(shader);
- return shader;
+ return shader;
}
#endif
-static void *
-get_data(struct graphics_priv *this, const char *type)
-{
- /*TODO initialize gtkglext context when type=="gtk_widget" */
- if (!strcmp(type, "gtk_widget")) {
- fprintf(stderr,
- "Currently GTK gui is not yet supported with opengl graphics driver\n");
- return NULL;
- }
- if (strcmp(type, "window") == 0) {
- struct window *win;
+static void *get_data(struct graphics_priv *this, const char *type) {
+ /*TODO initialize gtkglext context when type=="gtk_widget" */
+ if (!strcmp(type, "gtk_widget")) {
+ fprintf(stderr, "Currently GTK gui is not yet supported with opengl graphics driver\n");
+ return NULL;
+ }
+ if (strcmp(type, "window") == 0) {
+ struct window *win;
#ifdef USE_OPENGLES
- GLuint vertexShader;
- GLuint fragmentShader;
- GLuint textures;
- GLfloat matrix[16];
- int i;
-
- this->window_system=graphics_opengl_x11_new(NULL, this->width, this->height, 32, &this->window_system_methods);
- this->platform=graphics_opengl_egl_new(this->window_system_methods->get_display(this->window_system),
- this->window_system_methods->get_window(this->window_system),
- &this->platform_methods);
- this->window_system_methods->set_callbacks(this->window_system, this, resize_callback_do, click_notify_do, motion_notify_do, NULL);
- resize_callback(this->width,this->height);
+ GLuint vertexShader;
+ GLuint fragmentShader;
+ GLuint textures;
+ GLfloat matrix[16];
+ int i;
+
+ this->window_system=graphics_opengl_x11_new(NULL, this->width, this->height, 32, &this->window_system_methods);
+ this->platform=graphics_opengl_egl_new(this->window_system_methods->get_display(this->window_system),
+ this->window_system_methods->get_window(this->window_system),
+ &this->platform_methods);
+ this->window_system_methods->set_callbacks(this->window_system, this, resize_callback_do, click_notify_do, motion_notify_do, NULL);
+ resize_callback(this->width,this->height);
#if 0
- glClearColor ( 0.4 , 0.4 , 0.4 , 1);
+ glClearColor ( 0.4, 0.4, 0.4, 1);
#endif
- glClear ( GL_COLOR_BUFFER_BIT );
+ glClear ( GL_COLOR_BUFFER_BIT );
#ifdef USE_OPENGLES2
- this->program=glCreateProgram();
- vertexShader = load_shader(vertex_src, GL_VERTEX_SHADER);
- fragmentShader = load_shader(fragment_src, GL_FRAGMENT_SHADER);
- glAttachShader(this->program, vertexShader);
- glAttachShader(this->program, fragmentShader);
- glLinkProgram(this->program);
- glUseProgram(this->program);
- this->mvp_location=glGetUniformLocation(this->program, "mvp");
- this->position_location=glGetAttribLocation(this->program, "position");
- glEnableVertexAttribArray(this->position_location);
- this->texture_position_location=glGetAttribLocation(this->program, "texture_position");
- this->color_location=glGetUniformLocation(this->program, "avcolor");
- this->texture_location=glGetUniformLocation(this->program, "texture");
- this->use_texture_location=glGetUniformLocation(this->program, "use_texture");
- glUniform1i(this->use_texture_location, 0);
- glUniform1i(this->texture_location, 0);
-
- for (i = 0 ; i < 16 ; i++)
- matrix[i]=0.0;
- matrix[0]=2.0/this->width;
- matrix[5]=-2.0/this->height;
- matrix[10]=1;
- matrix[12]=-1;
- matrix[13]=1;
- matrix[15]=1;
- glUniformMatrix4fv(this->mvp_location, 1, GL_FALSE, matrix);
+ this->program=glCreateProgram();
+ vertexShader = load_shader(vertex_src, GL_VERTEX_SHADER);
+ fragmentShader = load_shader(fragment_src, GL_FRAGMENT_SHADER);
+ glAttachShader(this->program, vertexShader);
+ glAttachShader(this->program, fragmentShader);
+ glLinkProgram(this->program);
+ glUseProgram(this->program);
+ this->mvp_location=glGetUniformLocation(this->program, "mvp");
+ this->position_location=glGetAttribLocation(this->program, "position");
+ glEnableVertexAttribArray(this->position_location);
+ this->texture_position_location=glGetAttribLocation(this->program, "texture_position");
+ this->color_location=glGetUniformLocation(this->program, "avcolor");
+ this->texture_location=glGetUniformLocation(this->program, "texture");
+ this->use_texture_location=glGetUniformLocation(this->program, "use_texture");
+ glUniform1i(this->use_texture_location, 0);
+ glUniform1i(this->texture_location, 0);
+
+ for (i = 0 ; i < 16 ; i++)
+ matrix[i]=0.0;
+ matrix[0]=2.0/this->width;
+ matrix[5]=-2.0/this->height;
+ matrix[10]=1;
+ matrix[12]=-1;
+ matrix[13]=1;
+ matrix[15]=1;
+ glUniformMatrix4fv(this->mvp_location, 1, GL_FALSE, matrix);
#else
- glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_VERTEX_ARRAY);
#endif
- glGenTextures(1, &textures);
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, textures);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glGenTextures(1, &textures);
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D, textures);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
#ifndef USE_OPENGLES2
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
#endif
#endif
- win = g_new0(struct window, 1);
- win->priv = this;
- win->fullscreen = graphics_opengl_fullscreen;
- win->disable_suspend = graphics_opengl_disable_suspend;
- return win;
- } else {
+ win = g_new0(struct window, 1);
+ win->priv = this;
+ win->fullscreen = graphics_opengl_fullscreen;
+ win->disable_suspend = graphics_opengl_disable_suspend;
+ return win;
+ } else {
#ifdef USE_OPENGLES
- return NULL;
+ return NULL;
#else
- return &this->DLid;
+ return &this->DLid;
#endif
- }
+ }
}
-static void
-image_free(struct graphics_priv *gr, struct graphics_image_priv *priv)
-{
+static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) {
//TODO free image data in hashtable when graphics is destroyed
//currently graphics destroy is not called !!!
-/*
- g_free(priv->data);
- priv->data = NULL;
- g_free(priv);
- priv = NULL;
-*/
+ /*
+ g_free(priv->data);
+ priv->data = NULL;
+ g_free(priv);
+ priv = NULL;
+ */
}
-static void
-overlay_disable(struct graphics_priv *gr, int disable)
-{
- gr->overlay_enabled = !disable;
- gr->force_redraw = 1;
- draw_mode(gr, draw_mode_end);
+static void overlay_disable(struct graphics_priv *gr, int disable) {
+ gr->overlay_enabled = !disable;
+ gr->force_redraw = 1;
+ draw_mode(gr, draw_mode_end);
}
-static void
-overlay_resize(struct graphics_priv *gr, struct point *p, int w, int h,
- int wraparound)
-{
- int changed = 0;
- int w2, h2;
-
- if (w == 0) {
- w2 = 1;
- } else {
- w2 = w;
- }
-
- if (h == 0) {
- h2 = 1;
- } else {
- h2 = h;
- }
-
- gr->p = *p;
- if (gr->width != w2) {
- gr->width = w2;
- changed = 1;
- }
-
- if (gr->height != h2) {
- gr->height = h2;
- changed = 1;
- }
-
- gr->wraparound = wraparound;
-
- if (changed) {
- if ((w == 0) || (h == 0)) {
- gr->overlay_autodisabled = 1;
- } else {
- gr->overlay_autodisabled = 0;
- }
-
- callback_list_call_attr_2(gr->cbl, attr_resize,
- GINT_TO_POINTER(gr->width),
- GINT_TO_POINTER(gr->height));
- }
+static void overlay_resize(struct graphics_priv *gr, struct point *p, int w, int h, int wraparound) {
+ int changed = 0;
+ int w2, h2;
+
+ if (w == 0) {
+ w2 = 1;
+ } else {
+ w2 = w;
+ }
+
+ if (h == 0) {
+ h2 = 1;
+ } else {
+ h2 = h;
+ }
+
+ gr->p = *p;
+ if (gr->width != w2) {
+ gr->width = w2;
+ changed = 1;
+ }
+
+ if (gr->height != h2) {
+ gr->height = h2;
+ changed = 1;
+ }
+
+ gr->wraparound = wraparound;
+
+ if (changed) {
+ if ((w == 0) || (h == 0)) {
+ gr->overlay_autodisabled = 1;
+ } else {
+ gr->overlay_autodisabled = 0;
+ }
+
+ callback_list_call_attr_2(gr->cbl, attr_resize, GINT_TO_POINTER(gr->width), GINT_TO_POINTER(gr->height));
+ }
}
static struct graphics_methods graphics_methods = {
- graphics_destroy,
- draw_mode,
- draw_lines,
- draw_polygon,
- draw_rectangle,
- NULL,
- draw_text,
- draw_image,
- NULL,
- draw_drag,
- NULL,
- gc_new,
- background_gc,
- overlay_new,
- image_new,
- get_data,
- image_free,
- NULL,
- overlay_disable,
- overlay_resize,
- NULL, /* show_native_keyboard */
- NULL, /* hide_native_keyboard */
+ graphics_destroy,
+ draw_mode,
+ draw_lines,
+ draw_polygon,
+ draw_rectangle,
+ NULL,
+ draw_text,
+ draw_image,
+ NULL,
+ draw_drag,
+ NULL,
+ gc_new,
+ background_gc,
+ overlay_new,
+ image_new,
+ get_data,
+ image_free,
+ NULL,
+ overlay_disable,
+ overlay_resize,
+ NULL, /* show_native_keyboard */
+ NULL, /* hide_native_keyboard */
};
-static struct graphics_priv *
-graphics_opengl_new_helper(struct graphics_methods *meth)
-{
- struct font_priv *(*font_freetype_new) (void *meth);
- font_freetype_new = plugin_get_category_font("freetype");
-
- if (!font_freetype_new) {
- return NULL;
- }
-
- struct graphics_priv *this = g_new0(struct graphics_priv, 1);
-
- font_freetype_new(&this->freetype_methods);
- *meth = graphics_methods;
-
- meth->font_new =
- (struct graphics_font_priv *
- (*)(struct graphics_priv *, struct graphics_font_methods *,
- char *, int, int)) this->freetype_methods.font_new;
- meth->get_text_bbox =
- (void (*) (struct graphics_priv *, struct graphics_font_priv *,
- char *, int, int, struct point*, int)) this->freetype_methods.get_text_bbox;
- return this;
+static struct graphics_priv *graphics_opengl_new_helper(struct graphics_methods *meth) {
+ struct font_priv *(*font_freetype_new) (void *meth);
+ font_freetype_new = plugin_get_category_font("freetype");
+
+ if (!font_freetype_new) {
+ return NULL;
+ }
+
+ struct graphics_priv *this = g_new0(struct graphics_priv, 1);
+
+ font_freetype_new(&this->freetype_methods);
+ *meth = graphics_methods;
+
+ meth->font_new =
+ (struct graphics_font_priv *
+ (*)(struct graphics_priv *, struct graphics_font_methods *,
+ char *, int, int)) this->freetype_methods.font_new;
+ meth->get_text_bbox =
+ (void (*) (struct graphics_priv *, struct graphics_font_priv *,
+ char *, int, int, struct point*, int)) this->freetype_methods.get_text_bbox;
+ return this;
}
-static struct graphics_priv *
-overlay_new(struct graphics_priv *gr, struct graphics_methods *meth,
- struct point *p, int w, int h, int wraparound)
-{
- struct graphics_priv *this = graphics_opengl_new_helper(meth);
- this->p = *p;
- this->width = w;
- this->height = h;
- this->parent = gr;
-
- if ((w == 0) || (h == 0)) {
- this->overlay_autodisabled = 1;
- } else {
- this->overlay_autodisabled = 0;
- }
- this->overlay_enabled = 1;
- this->overlay_autodisabled = 0;
-
- this->next = gr->overlays;
- gr->overlays = this;
+static struct graphics_priv *overlay_new(struct graphics_priv *gr, struct graphics_methods *meth,
+ struct point *p, int w, int h, int wraparound) {
+ struct graphics_priv *this = graphics_opengl_new_helper(meth);
+ this->p = *p;
+ this->width = w;
+ this->height = h;
+ this->parent = gr;
+
+ if ((w == 0) || (h == 0)) {
+ this->overlay_autodisabled = 1;
+ } else {
+ this->overlay_autodisabled = 0;
+ }
+ this->overlay_enabled = 1;
+ this->overlay_autodisabled = 0;
+
+ this->next = gr->overlays;
+ gr->overlays = this;
#ifdef USE_OPENGLES
#else
- this->DLid = glGenLists(1);
+ this->DLid = glGenLists(1);
#endif
- return this;
+ return this;
}
#ifdef USE_OPENGLES
-static void
-click_notify_do(struct graphics_priv *priv, int button, int state, int x, int y)
-{
- struct point p={x,y};
- dbg(lvl_debug,"enter state %d button %d\n",state,button);
- callback_list_call_attr_3(priv->cbl, attr_button, (void *) state, (void *)button, (void *) &p);
+static void click_notify_do(struct graphics_priv *priv, int button, int state, int x, int y) {
+ struct point p= {x,y};
+ dbg(lvl_debug,"enter state %d button %d",state,button);
+ callback_list_call_attr_3(priv->cbl, attr_button, (void *) state, (void *)button, (void *) &p);
}
#endif
-static void
-click_notify(int button, int state, int x, int y)
-{
- mouse_queue[mouse_event_queue_end_idx %
- mouse_event_queue_size].button = button;
- mouse_queue[mouse_event_queue_end_idx %
- mouse_event_queue_size].state = state;
+static void click_notify(int button, int state, int x, int y) {
+ mouse_queue[mouse_event_queue_end_idx %
+ mouse_event_queue_size].button = button;
+ mouse_queue[mouse_event_queue_end_idx %
+ mouse_event_queue_size].state = state;
#ifdef MIRRORED_VIEW
- mouse_queue[mouse_event_queue_end_idx % mouse_event_queue_size].x =
- graphics_priv_root->width - x;
+ mouse_queue[mouse_event_queue_end_idx % mouse_event_queue_size].x =
+ graphics_priv_root->width - x;
#else
- mouse_queue[mouse_event_queue_end_idx % mouse_event_queue_size].x =
- x;
+ mouse_queue[mouse_event_queue_end_idx % mouse_event_queue_size].x =
+ x;
#endif
- mouse_queue[mouse_event_queue_end_idx % mouse_event_queue_size].y =
- y;
- ++mouse_event_queue_end_idx;
+ mouse_queue[mouse_event_queue_end_idx % mouse_event_queue_size].y =
+ y;
+ ++mouse_event_queue_end_idx;
}
-static void
-motion_notify_do(struct graphics_priv *priv, int x, int y)
-{
- struct point p;
+static void motion_notify_do(struct graphics_priv *priv, int x, int y) {
+ struct point p;
#ifdef MIRRORED_VIEW
- p.x = priv->width - x;
+ p.x = priv->width - x;
#else
- p.x = x;
+ p.x = x;
#endif
- p.y = y;
- callback_list_call_attr_1(priv->cbl, attr_motion,
- (void *) &p);
- return;
+ p.y = y;
+ callback_list_call_attr_1(priv->cbl, attr_motion, (void *) &p);
+ return;
}
-static void
-motion_notify(int x, int y)
-{
- motion_notify_do(graphics_priv_root, x, y);
+static void motion_notify(int x, int y) {
+ motion_notify_do(graphics_priv_root, x, y);
}
#ifndef USE_OPENGLES
-static gboolean
-graphics_opengl_idle(void *data)
-{
- static int opengl_init_ok = 0;
- if (!opengl_init_ok) {
- callback_list_call_attr_2(graphics_priv_root->cbl,
- attr_resize,
- GINT_TO_POINTER
- (graphics_priv_root->width),
- GINT_TO_POINTER
- (graphics_priv_root->height));
- opengl_init_ok = 1;
- } else {
-
+static gboolean graphics_opengl_idle(void *data) {
+ static int opengl_init_ok = 0;
+ if (!opengl_init_ok) {
+ callback_list_call_attr_2(graphics_priv_root->cbl, attr_resize, GINT_TO_POINTER (graphics_priv_root->width), GINT_TO_POINTER (graphics_priv_root->height));
+ opengl_init_ok = 1;
+ } else {
+
#ifdef FREEGLUT
- glutMainLoopEvent();
+ glutMainLoopEvent();
#endif
- handle_mouse_queue();
- }
- return TRUE;
+ handle_mouse_queue();
+ }
+ return TRUE;
}
#endif
-static void
-ProcessNormalKeys(unsigned char key_in, int x, int y)
-{
- int key = 0;
- char keybuf[2];
-
- switch (key_in) {
- case 13:
- key = NAVIT_KEY_RETURN;
- break;
- default:
- key = key_in;
- break;
- }
- keybuf[0] = key;
- keybuf[1] = '\0';
- graphics_priv_root->force_redraw = 1;
- callback_list_call_attr_1(graphics_priv_root->cbl, attr_keypress,
- (void *) keybuf);
+static void ProcessNormalKeys(unsigned char key_in, int x, int y) {
+ int key = 0;
+ char keybuf[2];
+
+ switch (key_in) {
+ case 13:
+ key = NAVIT_KEY_RETURN;
+ break;
+ default:
+ key = key_in;
+ break;
+ }
+ keybuf[0] = key;
+ keybuf[1] = '\0';
+ graphics_priv_root->force_redraw = 1;
+ callback_list_call_attr_1(graphics_priv_root->cbl, attr_keypress, (void *) keybuf);
}
-static void
-ProcessSpecialKeys(int key_in, int x, int y)
-{
- int key = 0;
- char keybuf[2];
-
- switch (key_in) {
- case 102:
- key = NAVIT_KEY_RIGHT;
- break;
- case 100:
- key = NAVIT_KEY_LEFT;
- break;
- case 103:
- key = NAVIT_KEY_DOWN;
- break;
- case 101:
- key = NAVIT_KEY_UP;
- break;
- case 104:
- key = NAVIT_KEY_ZOOM_OUT;
- break;
- case 105:
- key = NAVIT_KEY_ZOOM_IN;
- break;
- default:
- break;
- } //switch
-
- graphics_priv_root->force_redraw = 1;
- keybuf[0] = key;
- keybuf[1] = '\0';
- callback_list_call_attr_1(graphics_priv_root->cbl, attr_keypress,
- (void *) keybuf);
+static void ProcessSpecialKeys(int key_in, int x, int y) {
+ int key = 0;
+ char keybuf[2];
+
+ switch (key_in) {
+ case 102:
+ key = NAVIT_KEY_RIGHT;
+ break;
+ case 100:
+ key = NAVIT_KEY_LEFT;
+ break;
+ case 103:
+ key = NAVIT_KEY_DOWN;
+ break;
+ case 101:
+ key = NAVIT_KEY_UP;
+ break;
+ case 104:
+ key = NAVIT_KEY_ZOOM_OUT;
+ break;
+ case 105:
+ key = NAVIT_KEY_ZOOM_IN;
+ break;
+ default:
+ break;
+ } //switch
+
+ graphics_priv_root->force_redraw = 1;
+ keybuf[0] = key;
+ keybuf[1] = '\0';
+ callback_list_call_attr_1(graphics_priv_root->cbl, attr_keypress, (void *) keybuf);
}
-static void
-resize_callback_do(struct graphics_priv *priv, int w, int h)
-{
- glViewport(0, 0, w, h);
+static void resize_callback_do(struct graphics_priv *priv, int w, int h) {
+ glViewport(0, 0, w, h);
#ifndef USE_OPENGLES2
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
#ifdef MIRRORED_VIEW
- glOrthof(glF(w), glF(0), glF(h), glF(0), glF(1), glF(-1));
+ glOrthof(glF(w), glF(0), glF(h), glF(0), glF(1), glF(-1));
#else
- glOrthof(glF(0), glF(w), glF(h), glF(0), glF(1), glF(-1));
+ glOrthof(glF(0), glF(w), glF(h), glF(0), glF(1), glF(-1));
#endif
#endif
- priv->width = w;
- priv->height = h;
+ priv->width = w;
+ priv->height = h;
- callback_list_call_attr_2(priv->cbl, attr_resize,
- GINT_TO_POINTER(w), GINT_TO_POINTER(h));
+ callback_list_call_attr_2(priv->cbl, attr_resize, GINT_TO_POINTER(w), GINT_TO_POINTER(h));
}
-static void
-resize_callback(int w, int h)
-{
- resize_callback_do(graphics_priv_root, w, h);
+static void resize_callback(int w, int h) {
+ resize_callback_do(graphics_priv_root, w, h);
}
-static void
-display(void)
-{
- graphics_priv_root->force_redraw = 1;
- redraw_screen(graphics_priv_root);
- resize_callback(graphics_priv_root->width,
- graphics_priv_root->height);
+static void display(void) {
+ graphics_priv_root->force_redraw = 1;
+ redraw_screen(graphics_priv_root);
+ resize_callback(graphics_priv_root->width, graphics_priv_root->height);
}
-static void
-glut_close(void)
-{
- callback_list_call_attr_0(graphics_priv_root->cbl,
- attr_window_closed);
+static void glut_close(void) {
+ callback_list_call_attr_0(graphics_priv_root->cbl, attr_window_closed);
}
-static struct graphics_priv *
-graphics_opengl_new(struct navit *nav, struct graphics_methods *meth,
- struct attr **attrs, struct callback_list *cbl)
-{
- struct attr *attr;
-
- if (!event_request_system("glib", "graphics_opengl_new"))
- return NULL;
-
- struct graphics_priv *this = graphics_opengl_new_helper(meth);
- graphics_priv_root = this;
-
- this->nav = nav;
- this->parent = NULL;
- this->overlay_enabled = 1;
-
- this->width = SCREEN_WIDTH;
- if ((attr = attr_search(attrs, NULL, attr_w)))
- this->width = attr->u.num;
- this->height = SCREEN_HEIGHT;
- if ((attr = attr_search(attrs, NULL, attr_h)))
- this->height = attr->u.num;
- this->timeout = 100;
- if ((attr = attr_search(attrs, NULL, attr_timeout)))
- this->timeout = attr->u.num;
- this->delay = 0;
- if ((attr = attr_search(attrs, NULL, attr_delay)))
- this->delay = attr->u.num;
- this->cbl = cbl;
-
- char *cmdline = "";
- int argc = 0;
+static struct graphics_priv *graphics_opengl_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) {
+ struct attr *attr;
+
+ if (!event_request_system("glib", "graphics_opengl_new"))
+ return NULL;
+
+ struct graphics_priv *this = graphics_opengl_new_helper(meth);
+ graphics_priv_root = this;
+
+ this->nav = nav;
+ this->parent = NULL;
+ this->overlay_enabled = 1;
+
+ this->width = SCREEN_WIDTH;
+ if ((attr = attr_search(attrs, NULL, attr_w)))
+ this->width = attr->u.num;
+ this->height = SCREEN_HEIGHT;
+ if ((attr = attr_search(attrs, NULL, attr_h)))
+ this->height = attr->u.num;
+ this->timeout = 100;
+ if ((attr = attr_search(attrs, NULL, attr_timeout)))
+ this->timeout = attr->u.num;
+ this->delay = 0;
+ if ((attr = attr_search(attrs, NULL, attr_delay)))
+ this->delay = attr->u.num;
+ this->cbl = cbl;
+
+ char *cmdline = "";
+ int argc = 0;
#ifndef USE_OPENGLES
- glutInit(&argc, &cmdline);
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
+ glutInit(&argc, &cmdline);
+ glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
- glutInitWindowSize(this->width, this->height);
- glutInitWindowPosition(0, 0);
- glutCreateWindow("Navit opengl window");
+ glutInitWindowSize(this->width, this->height);
+ glutInitWindowPosition(0, 0);
+ glutCreateWindow("Navit opengl window");
- glutDisplayFunc(display);
- glutReshapeFunc(resize_callback);
- resize_callback(this->width, this->height);
+ glutDisplayFunc(display);
+ glutReshapeFunc(resize_callback);
+ resize_callback(this->width, this->height);
#endif
- graphics_priv_root->cbl = cbl;
- graphics_priv_root->width = this->width;
- graphics_priv_root->height = this->height;
+ graphics_priv_root->cbl = cbl;
+ graphics_priv_root->width = this->width;
+ graphics_priv_root->height = this->height;
#ifndef USE_OPENGLES
- glutMotionFunc(motion_notify);
- glutPassiveMotionFunc(motion_notify);
- glutMouseFunc(click_notify);
- glutKeyboardFunc(ProcessNormalKeys);
- glutSpecialFunc(ProcessSpecialKeys);
+ glutMotionFunc(motion_notify);
+ glutPassiveMotionFunc(motion_notify);
+ glutMouseFunc(click_notify);
+ glutKeyboardFunc(ProcessNormalKeys);
+ glutSpecialFunc(ProcessSpecialKeys);
#ifdef FREEGLUT
- glutCloseFunc(glut_close);
+ glutCloseFunc(glut_close);
#endif
- this->DLid = glGenLists(1);
+ this->DLid = glGenLists(1);
- g_timeout_add(G_PRIORITY_DEFAULT + 10, graphics_opengl_idle, NULL);
+ g_timeout_add(G_PRIORITY_DEFAULT + 10, graphics_opengl_idle, NULL);
- /*this will only refresh screen in map(overlay enabled) mode */
- g_timeout_add(G_PRIORITY_DEFAULT + 1000, redraw_filter, this);
+ /*this will only refresh screen in map(overlay enabled) mode */
+ g_timeout_add(G_PRIORITY_DEFAULT + 1000, redraw_filter, this);
#endif
- //create hash table for uncompressed image data
- hImageData = g_hash_table_new(g_str_hash, g_str_equal);
- return this;
+ //create hash table for uncompressed image data
+ hImageData = g_hash_table_new(g_str_hash, g_str_equal);
+ return this;
}
-static void
-event_opengl_main_loop_run(void)
-{
- dbg(lvl_info, "enter\n");
+static void event_opengl_main_loop_run(void) {
+ dbg(lvl_info, "enter");
}
-static void
-event_opengl_main_loop_quit(void)
-{
- dbg(lvl_debug, "enter\n");
+static void event_opengl_main_loop_quit(void) {
+ dbg(lvl_debug, "enter");
}
-static struct event_watch *
-event_opengl_add_watch(int fd, enum event_watch_cond cond,
- struct callback *cb)
-{
- dbg(lvl_debug, "enter\n");
- return NULL;
+static struct event_watch *event_opengl_add_watch(int fd, enum event_watch_cond cond, struct callback *cb) {
+ dbg(lvl_debug, "enter");
+ return NULL;
}
-static void
-event_opengl_remove_watch(struct event_watch *ev)
-{
- dbg(lvl_debug, "enter\n");
+static void event_opengl_remove_watch(struct event_watch *ev) {
+ dbg(lvl_debug, "enter");
}
-static struct event_timeout *
-event_opengl_add_timeout(int timeout, int multi, struct callback *cb)
-{
- dbg(lvl_debug, "enter\n");
- return NULL;
+static struct event_timeout *event_opengl_add_timeout(int timeout, int multi, struct callback *cb) {
+ dbg(lvl_debug, "enter");
+ return NULL;
}
-static void
-event_opengl_remove_timeout(struct event_timeout *to)
-{
- dbg(lvl_debug, "enter\n");
+static void event_opengl_remove_timeout(struct event_timeout *to) {
+ dbg(lvl_debug, "enter");
}
-static struct event_idle *
-event_opengl_add_idle(int priority, struct callback *cb)
-{
- dbg(lvl_debug, "enter\n");
- return NULL;
+static struct event_idle *event_opengl_add_idle(int priority, struct callback *cb) {
+ dbg(lvl_debug, "enter");
+ return NULL;
}
-static void
-event_opengl_remove_idle(struct event_idle *ev)
-{
- dbg(lvl_debug, "enter\n");
+static void event_opengl_remove_idle(struct event_idle *ev) {
+ dbg(lvl_debug, "enter");
}
-static void
-event_opengl_call_callback(struct callback_list *cb)
-{
- dbg(lvl_debug, "enter\n");
+static void event_opengl_call_callback(struct callback_list *cb) {
+ dbg(lvl_debug, "enter");
}
static struct event_methods event_opengl_methods = {
- event_opengl_main_loop_run,
- event_opengl_main_loop_quit,
- event_opengl_add_watch,
- event_opengl_remove_watch,
- event_opengl_add_timeout,
- event_opengl_remove_timeout,
- event_opengl_add_idle,
- event_opengl_remove_idle,
- event_opengl_call_callback,
+ event_opengl_main_loop_run,
+ event_opengl_main_loop_quit,
+ event_opengl_add_watch,
+ event_opengl_remove_watch,
+ event_opengl_add_timeout,
+ event_opengl_remove_timeout,
+ event_opengl_add_idle,
+ event_opengl_remove_idle,
+ event_opengl_call_callback,
};
-static struct event_priv *
-event_opengl_new(struct event_methods *meth)
-{
- *meth = event_opengl_methods;
- return NULL;
+static struct event_priv *event_opengl_new(struct event_methods *meth) {
+ *meth = event_opengl_methods;
+ return NULL;
}
-void
-plugin_init(void)
-{
- plugin_register_category_graphics("opengl", graphics_opengl_new);
- plugin_register_category_event("opengl", event_opengl_new);
+void plugin_init(void) {
+ plugin_register_category_graphics("opengl", graphics_opengl_new);
+ plugin_register_category_event("opengl", event_opengl_new);
}