Ejemplo n.º 1
0
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);
}