static void georef_layer_draw ( VikGeorefLayer *vgl, VikViewport *vp ) { if ( vik_viewport_get_drawmode(vp) != VIK_VIEWPORT_DRAWMODE_UTM ) return; if ( vgl->pixbuf ) { struct UTM utm_middle; gdouble xmpp = vik_viewport_get_xmpp(vp), ympp = vik_viewport_get_ympp(vp); GdkPixbuf *pixbuf = vgl->pixbuf; guint layer_width = vgl->width; guint layer_height = vgl->height; vik_coord_to_utm ( vik_viewport_get_center ( vp ), &utm_middle ); /* scale the pixbuf if it doesn't match our dimensions */ if ( xmpp != vgl->mpp_easting || ympp != vgl->mpp_northing ) { layer_width = round(vgl->width * vgl->mpp_easting / xmpp); layer_height = round(vgl->height * vgl->mpp_northing / ympp); /* rescale if necessary */ if (layer_width == vgl->scaled_width && layer_height == vgl->scaled_height && vgl->scaled != NULL) pixbuf = vgl->scaled; else { pixbuf = gdk_pixbuf_scale_simple( vgl->pixbuf, layer_width, layer_height, GDK_INTERP_BILINEAR ); if (vgl->scaled != NULL) g_object_unref(vgl->scaled); vgl->scaled = pixbuf; vgl->scaled_width = layer_width; vgl->scaled_height = layer_height; } } guint width = vik_viewport_get_width(vp), height = vik_viewport_get_height(vp); gint32 x, y; vgl->corner.zone = utm_middle.zone; vgl->corner.letter = utm_middle.letter; VikCoord corner_coord; vik_coord_load_from_utm ( &corner_coord, vik_viewport_get_coord_mode(vp), &(vgl->corner) ); vik_viewport_coord_to_screen ( vp, &corner_coord, &x, &y ); if ( (x < 0 || x < width) && (y < 0 || y < height) && x+layer_width > 0 && y+layer_height > 0 ) vik_viewport_draw_pixbuf ( vp, pixbuf, 0, 0, x, y, layer_width, layer_height ); /* todo: draw only what we need to. */ } }
static void georef_layer_draw ( VikGeorefLayer *vgl, VikViewport *vp ) { if ( vgl->pixbuf ) { gdouble xmpp = vik_viewport_get_xmpp(vp), ympp = vik_viewport_get_ympp(vp); GdkPixbuf *pixbuf = vgl->pixbuf; guint layer_width = vgl->width; guint layer_height = vgl->height; guint width = vik_viewport_get_width(vp), height = vik_viewport_get_height(vp); gint32 x, y; VikCoord corner_coord; vik_coord_load_from_utm ( &corner_coord, vik_viewport_get_coord_mode(vp), &(vgl->corner) ); vik_viewport_coord_to_screen ( vp, &corner_coord, &x, &y ); /* mark to scale the pixbuf if it doesn't match our dimensions */ gboolean scale = FALSE; if ( xmpp != vgl->mpp_easting || ympp != vgl->mpp_northing ) { scale = TRUE; layer_width = round(vgl->width * vgl->mpp_easting / xmpp); layer_height = round(vgl->height * vgl->mpp_northing / ympp); } // If image not in viewport bounds - no need to draw it (or bother with any scaling) if ( (x < 0 || x < width) && (y < 0 || y < height) && x+layer_width > 0 && y+layer_height > 0 ) { if ( scale ) { /* rescale if necessary */ if (layer_width == vgl->scaled_width && layer_height == vgl->scaled_height && vgl->scaled != NULL) pixbuf = vgl->scaled; else { pixbuf = gdk_pixbuf_scale_simple( vgl->pixbuf, layer_width, layer_height, GDK_INTERP_BILINEAR ); if (vgl->scaled != NULL) g_object_unref(vgl->scaled); vgl->scaled = pixbuf; vgl->scaled_width = layer_width; vgl->scaled_height = layer_height; } } vik_viewport_draw_pixbuf ( vp, pixbuf, 0, 0, x, y, layer_width, layer_height ); /* todo: draw only what we need to. */ } } }
void vik_viewport_draw_logo ( VikViewport *vvp ) { g_return_if_fail ( vvp != NULL ); guint len = g_slist_length ( vvp->logos ); gint x = vvp->width - PAD; gint y = PAD; int i; for (i = 0 ; i < len ; i++) { GdkPixbuf *logo = g_slist_nth_data ( vvp->logos, i ); gint width = gdk_pixbuf_get_width ( logo ); gint height = gdk_pixbuf_get_height ( logo ); vik_viewport_draw_pixbuf ( vvp, logo, 0, 0, x - width, y, width, height ); x = x - width - PAD; } }
/* shouldn't use this -- slow -- change the alpha channel instead. */ void vik_viewport_draw_pixbuf_with_alpha ( VikViewport *vvp, GdkPixbuf *pixbuf, gint alpha, gint src_x, gint src_y, gint dest_x, gint dest_y, gint w, gint h ) { gint real_dest_x = MAX(dest_x,0); gint real_dest_y = MAX(dest_y,0); if ( alpha == 0 ) return; /* don't waste your time */ if ( w > vvp->alpha_pixbuf_width || h > vvp->alpha_pixbuf_height ) { if ( vvp->alpha_pixbuf ) g_object_unref ( G_OBJECT ( vvp->alpha_pixbuf ) ); vvp->alpha_pixbuf_width = MAX(w,vvp->alpha_pixbuf_width); vvp->alpha_pixbuf_height = MAX(h,vvp->alpha_pixbuf_height); vvp->alpha_pixbuf = gdk_pixbuf_new ( GDK_COLORSPACE_RGB, FALSE, 8, vvp->alpha_pixbuf_width, vvp->alpha_pixbuf_height ); } w = MIN(w,vvp->width - dest_x); h = MIN(h,vvp->height - dest_y); /* check that we are drawing within boundaries. */ src_x += (real_dest_x - dest_x); src_y += (real_dest_y - dest_y); w -= (real_dest_x - dest_x); h -= (real_dest_y - dest_y); gdk_pixbuf_get_from_drawable ( vvp->alpha_pixbuf, vvp->scr_buffer, NULL, real_dest_x, real_dest_y, 0, 0, w, h ); /* do a composite */ gdk_pixbuf_composite ( pixbuf, vvp->alpha_pixbuf, 0, 0, w, h, -src_x, -src_y, 1, 1, 0, alpha ); /* draw pixbuf_tmp */ vik_viewport_draw_pixbuf ( vvp, vvp->alpha_pixbuf, 0, 0, real_dest_x, real_dest_y, w, h ); }