+/* Texture setup functions */
+static void render_point(GritsMarker *marker)
+{
+ /* Draw outline */
+ cairo_set_line_join(marker->cairo, CAIRO_LINE_JOIN_ROUND);
+ cairo_set_line_width(marker->cairo, marker->outline*2);
+ cairo_set_source_rgba(marker->cairo, 0, 0, 0, 1);
+
+ cairo_arc(marker->cairo, marker->xoff, marker->yoff, marker->radius,
+ 0, 2*G_PI);
+ cairo_stroke(marker->cairo);
+
+ /* Draw filler */
+ cairo_set_source_rgba(marker->cairo, 1, 1, 1, 1);
+
+ cairo_arc(marker->cairo, marker->xoff, marker->yoff, marker->radius,
+ 0, 2*G_PI);
+ cairo_fill(marker->cairo);
+}
+
+static void render_label(GritsMarker *marker)
+{
+ g_assert(marker->label);
+
+ /* Draw outline */
+ cairo_set_line_join(marker->cairo, CAIRO_LINE_JOIN_ROUND);
+ cairo_set_line_width(marker->cairo, marker->outline*2);
+ cairo_set_source_rgba(marker->cairo, 0, 0, 0, 1);
+ cairo_select_font_face(marker->cairo, "sans-serif",
+ CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
+ cairo_set_font_size(marker->cairo, 13);
+ cairo_move_to(marker->cairo, marker->xoff + (marker->icon_width / 2),
+ marker->yoff - (marker->icon_height / 2));
+ cairo_text_path(marker->cairo, marker->label);
+ cairo_stroke(marker->cairo);
+
+ /* Draw filler */
+ cairo_set_source_rgba(marker->cairo, 1, 1, 1, 1);
+ cairo_move_to(marker->cairo, marker->xoff + (marker->icon_width / 2),
+ marker->yoff - (marker->icon_height / 2));
+ cairo_show_text(marker->cairo, marker->label);
+}
+
+static void render_icon(GritsMarker *marker)
+{
+ g_assert(marker->icon_img != NULL);
+
+ /* move to marker location */
+ cairo_translate(marker->cairo, marker->xoff, marker->yoff);
+
+ /* center image */
+ cairo_translate(marker->cairo, -marker->icon_width/2,
+ -marker->icon_height/2);
+
+ cairo_set_source_surface(marker->cairo, marker->icon_img, 0, 0);
+
+ cairo_paint(marker->cairo);
+}
+
+static void render_all(GritsMarker *marker)
+{
+ g_assert(marker);
+ if (marker->display_mask & GRITS_MARKER_DMASK_ICON)
+ render_icon(marker);
+
+ if (marker->display_mask & GRITS_MARKER_DMASK_POINT)
+ render_point(marker);
+
+ if (marker->display_mask & GRITS_MARKER_DMASK_LABEL)
+ render_label(marker);
+
+ /* Load GL texture */
+ glEnable(GL_TEXTURE_2D);
+ glGenTextures(1, &marker->tex);
+ glBindTexture(GL_TEXTURE_2D, marker->tex);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glPixelStorei(GL_PACK_ALIGNMENT, 1);
+ glTexImage2D(GL_TEXTURE_2D, 0, 4, marker->width, marker->height,
+ 0, GL_BGRA, GL_UNSIGNED_BYTE,
+ cairo_image_surface_get_data(cairo_get_target(marker->cairo)));
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+}
+
+
+/* Constructors */