]> Pileus Git - grits/blobdiff - src/objects/grits-marker.c
Convert to GtkAllocation
[grits] / src / objects / grits-marker.c
index 162e4bbdbac445fd7acf2a918dbc634399339c0a..40d45f4e57fa8ee2363085f276090f993f3b146a 100644 (file)
@@ -39,8 +39,9 @@
 static void render_point(GritsMarker *marker)
 {
        /* Draw outline */
-       cairo_set_source_rgba(marker->cairo, 0, 0, 0, 1);
+       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);
@@ -58,6 +59,9 @@ 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);
@@ -129,6 +133,8 @@ GritsMarker *grits_marker_new(const gchar *label)
 {
        GritsMarker *marker = g_object_new(GRITS_TYPE_MARKER, NULL);
 
+       GRITS_OBJECT(marker)->skip = GRITS_SKIP_CENTER;
+
        marker->display_mask = GRITS_MARKER_DMASK_POINT |
                               GRITS_MARKER_DMASK_LABEL;
 
@@ -148,8 +154,6 @@ GritsMarker *grits_marker_new(const gchar *label)
 
        marker->label = g_strdup(label);
 
-       render_all(marker);
-
        return marker;
 }
 
@@ -207,6 +211,7 @@ GritsMarker *grits_marker_icon_new(const gchar *label, const gchar *filename,
 
        marker->outline =   2;
        marker->radius  =   3;
+
        /* this is the surface size, a guess really */
        marker->width   = marker->icon_width  + 128;
        marker->height  = marker->icon_height + 64;
@@ -215,6 +220,7 @@ GritsMarker *grits_marker_icon_new(const gchar *label, const gchar *filename,
        marker->yoff  = marker->height/2;
        marker->cairo = cairo_create(cairo_image_surface_create(
                        CAIRO_FORMAT_ARGB32, marker->width, marker->height));
+
        /* clear the surface just in case */
        cairo_set_operator(marker->cairo, CAIRO_OPERATOR_SOURCE);
        //cairo_set_source_rgba(marker->cairo, 1.0, 0.0, 0.0, 0.3); // debug
@@ -241,21 +247,21 @@ static void grits_marker_draw(GritsObject *_marker, GritsOpenGL *opengl)
        gdouble width  = cairo_image_surface_get_width(surface);
        gdouble height = cairo_image_surface_get_height(surface);
 
+       if (!marker->tex)
+               render_all(marker);
+
        if (marker->ortho) {
                gdouble px, py, pz;
                grits_viewer_project(GRITS_VIEWER(opengl),
                                point->lat, point->lon, point->elev,
                                &px, &py, &pz);
 
-               gint win_width  = GTK_WIDGET(opengl)->allocation.width;
-               gint win_height = GTK_WIDGET(opengl)->allocation.height;
                if (pz > 1)
                        return;
 
-               glMatrixMode(GL_PROJECTION); glLoadIdentity();
-               glMatrixMode(GL_MODELVIEW);  glLoadIdentity();
-               glOrtho(0, win_width, win_height, 0, 1, -1);
-               glTranslated(px, win_height-py, 0);
+               GtkAllocation alloc;
+               gtk_widget_get_allocation(GTK_WIDGET(opengl), &alloc);
+               glTranslated(px, alloc.height-py, 0);
                glRotatef(marker->angle, 0, 0, -1);
                glTranslated(-marker->xoff, -marker->yoff, 0);
        } else {
@@ -303,12 +309,14 @@ static void grits_marker_finalize(GObject *_marker)
 {
        //g_debug("GritsMarker: finalize - %s", marker->label);
        GritsMarker *marker = GRITS_MARKER(_marker);
-       glDeleteTextures(1, &marker->tex);
-       cairo_surface_t *surface = cairo_get_target(marker->cairo);
-       cairo_surface_destroy(surface);
-       cairo_destroy(marker->cairo);
+       if (marker->tex)
+               glDeleteTextures(1, &marker->tex);
+       if (marker->cairo) {
+               cairo_surface_t *surface = cairo_get_target(marker->cairo);
+               cairo_surface_destroy(surface);
+               cairo_destroy(marker->cairo);
+       }
        g_free(marker->label);
-       glDeleteTextures(1, &marker->tex);
 }
 
 static void grits_marker_class_init(GritsMarkerClass *klass)