static void champlain_tile_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { ChamplainTile *self = CHAMPLAIN_TILE (object); switch (property_id) { case PROP_X: champlain_tile_set_x (self, g_value_get_uint (value)); break; case PROP_Y: champlain_tile_set_y (self, g_value_get_uint (value)); break; case PROP_ZOOM_LEVEL: champlain_tile_set_zoom_level (self, g_value_get_uint (value)); break; case PROP_SIZE: champlain_tile_set_size (self, g_value_get_uint (value)); break; case PROP_STATE: champlain_tile_set_state (self, g_value_get_enum (value)); break; case PROP_CONTENT: champlain_tile_set_content (self, g_value_get_object (value)); break; case PROP_ETAG: champlain_tile_set_etag (self, g_value_get_string (value)); break; case PROP_FADE_IN: champlain_tile_set_fade_in (self, g_value_get_boolean (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } }
static void render (ChamplainRenderer *renderer, ChamplainTile *tile) { ChamplainImageRendererPrivate *priv = GET_PRIVATE (renderer); gboolean error = TRUE; GdkPixbufLoader *loader = NULL; GError *gerror = NULL; ClutterActor *actor = NULL; GdkPixbuf *pixbuf; if (!priv->data || priv->size == 0) goto finish; loader = gdk_pixbuf_loader_new (); if (!gdk_pixbuf_loader_write (loader, (const guchar *) priv->data, priv->size, &gerror)) { if (gerror) { g_warning ("Unable to load the pixbuf: %s", gerror->message); g_error_free (gerror); } goto finish; } gdk_pixbuf_loader_close (loader, &gerror); if (gerror) { g_warning ("Unable to close the pixbuf loader: %s", gerror->message); g_error_free (gerror); goto finish; } /* Load the image into clutter */ pixbuf = gdk_pixbuf_loader_get_pixbuf (loader); actor = clutter_texture_new (); if (!clutter_texture_set_from_rgb_data (CLUTTER_TEXTURE (actor), gdk_pixbuf_get_pixels (pixbuf), gdk_pixbuf_get_has_alpha (pixbuf), gdk_pixbuf_get_width (pixbuf), gdk_pixbuf_get_height (pixbuf), gdk_pixbuf_get_rowstride (pixbuf), gdk_pixbuf_get_bits_per_sample (pixbuf) * gdk_pixbuf_get_n_channels (pixbuf) / 8, 0, &gerror)) { if (gerror) { g_warning ("Unable to transfer to clutter: %s", gerror->message); g_error_free (gerror); } g_object_unref (actor); actor = NULL; goto finish; } error = FALSE; finish: if (actor) champlain_tile_set_content (tile, actor); g_signal_emit_by_name (tile, "render-complete", priv->data, priv->size, error); if (loader) g_object_unref (loader); }
static void image_rendered_cb (GInputStream *stream, GAsyncResult *res, RendererData *data) { ChamplainTile *tile = data->tile; gboolean error = TRUE; GError *gerror = NULL; ClutterActor *actor = NULL; GdkPixbuf *pixbuf; ClutterContent *content; gfloat width, height; pixbuf = gdk_pixbuf_new_from_stream_finish (res, NULL); if (!pixbuf) { g_warning ("NULL pixbuf"); goto finish; } /* Load the image into clutter */ content = clutter_image_new (); if (!clutter_image_set_data (CLUTTER_IMAGE (content), gdk_pixbuf_get_pixels (pixbuf), gdk_pixbuf_get_has_alpha (pixbuf) ? COGL_PIXEL_FORMAT_RGBA_8888 : COGL_PIXEL_FORMAT_RGB_888, gdk_pixbuf_get_width (pixbuf), gdk_pixbuf_get_height (pixbuf), gdk_pixbuf_get_rowstride (pixbuf), &gerror)) { if (gerror) { g_warning ("Unable to transfer to clutter: %s", gerror->message); g_error_free (gerror); } g_object_unref (content); goto finish; } clutter_content_get_preferred_size (content, &width, &height); actor = clutter_actor_new (); clutter_actor_set_size (actor, width, height); clutter_actor_set_content (actor, content); g_object_unref (content); /* has to be set for proper opacity */ clutter_actor_set_offscreen_redirect (actor, CLUTTER_OFFSCREEN_REDIRECT_AUTOMATIC_FOR_OPACITY); error = FALSE; finish: if (actor) champlain_tile_set_content (tile, actor); g_signal_emit_by_name (tile, "render-complete", data->data, data->size, error); if (pixbuf) g_object_unref (pixbuf); g_object_unref (data->renderer); g_object_unref (tile); g_object_unref (stream); g_free (data->data); g_slice_free (RendererData, data); }