static CoglTexture * st_texture_cache_load_uri_sync_to_cogl_texture (StTextureCache *cache, StTextureCachePolicy policy, const gchar *uri, int available_width, int available_height, GError **error) { CoglTexture *texdata; GdkPixbuf *pixbuf; char *key; int width = available_width == -1 ? -1 : available_width * cache->priv->scale; int height = available_height == -1 ? -1 : available_height * cache->priv->scale; key = g_strconcat (CACHE_PREFIX_URI, uri, NULL); texdata = g_hash_table_lookup (cache->priv->keyed_cache, key); if (texdata == NULL) { pixbuf = impl_load_pixbuf_file (uri, width, height, error); if (!pixbuf) goto out; texdata = pixbuf_to_cogl_texture (pixbuf); g_object_unref (pixbuf); if (!texdata) goto out; if (policy == ST_TEXTURE_CACHE_POLICY_FOREVER) { cogl_object_ref (texdata); g_hash_table_insert (cache->priv->keyed_cache, g_strdup (key), texdata); } } else cogl_object_ref (texdata); ensure_monitor_for_uri (cache, uri); out: free (key); return texdata; }
static void finish_texture_load (AsyncTextureLoadData *data, GdkPixbuf *pixbuf) { GSList *iter; StTextureCache *cache; CoglTexture *texdata = NULL; cache = data->cache; g_hash_table_remove (cache->priv->outstanding_requests, data->key); if (pixbuf == NULL) goto out; texdata = pixbuf_to_cogl_texture (pixbuf); if (!texdata) goto out; if (data->policy != ST_TEXTURE_CACHE_POLICY_NONE) { gpointer orig_key, value; if (!g_hash_table_lookup_extended (cache->priv->keyed_cache, data->key, &orig_key, &value)) { cogl_object_ref (texdata); g_hash_table_insert (cache->priv->keyed_cache, g_strdup (data->key), texdata); } } for (iter = data->textures; iter; iter = iter->next) { ClutterTexture *texture = iter->data; set_texture_cogl_texture (texture, texdata); } out: if (texdata) cogl_object_unref (texdata); texture_load_data_free (data); }
static ClutterActor * load_from_pixbuf (GdkPixbuf *pixbuf) { ClutterTexture *texture; CoglTexture *texdata; int width = gdk_pixbuf_get_width (pixbuf); int height = gdk_pixbuf_get_height (pixbuf); texture = create_default_texture (); clutter_actor_set_size (CLUTTER_ACTOR (texture), width, height); texdata = pixbuf_to_cogl_texture (pixbuf); set_texture_cogl_texture (texture, texdata); cogl_object_unref (texdata); return CLUTTER_ACTOR (texture); }
static CoglTexture * st_texture_cache_load_file_sync_to_cogl_texture (StTextureCache *cache, StTextureCachePolicy policy, GFile *file, int available_width, int available_height, int scale, GError **error) { CoglTexture *texdata; GdkPixbuf *pixbuf; char *key; key = g_strdup_printf (CACHE_PREFIX_FILE "%u", g_file_hash (file)); texdata = g_hash_table_lookup (cache->priv->keyed_cache, key); if (texdata == NULL) { pixbuf = impl_load_pixbuf_file (file, available_width, available_height, scale, error); if (!pixbuf) goto out; texdata = pixbuf_to_cogl_texture (pixbuf); g_object_unref (pixbuf); if (policy == ST_TEXTURE_CACHE_POLICY_FOREVER) { cogl_object_ref (texdata); g_hash_table_insert (cache->priv->keyed_cache, g_strdup (key), texdata); } } else cogl_object_ref (texdata); ensure_monitor_for_file (cache, file); out: g_free (key); return texdata; }
/** * st_texture_cache_load_from_pixbuf: * @pixbuf: A #GdkPixbuf * @size: int * * Converts a #GdkPixbuf into a #ClutterTexture. * * Return value: (transfer none): A new #ClutterActor */ ClutterActor * st_texture_cache_load_from_pixbuf (GdkPixbuf *pixbuf, int size) { ClutterTexture *texture; CoglTexture *texdata; ClutterActor *actor; texture = create_default_texture (); actor = CLUTTER_ACTOR (texture); clutter_actor_set_size (actor, size, size); texdata = pixbuf_to_cogl_texture (pixbuf); set_texture_cogl_texture (texture, texdata); cogl_object_unref (texdata); return actor; }
static void st_texture_cache_reset_texture (StTextureCachePropertyBind *bind, const char *propname) { GdkPixbuf *pixbuf; CoglTexture *texdata; g_object_get (bind->source, propname, &pixbuf, NULL); g_return_if_fail (pixbuf == NULL || GDK_IS_PIXBUF (pixbuf)); if (pixbuf != NULL) { texdata = pixbuf_to_cogl_texture (pixbuf); g_object_unref (pixbuf); clutter_texture_set_cogl_texture (bind->texture, texdata); cogl_object_unref (texdata); clutter_actor_set_opacity (CLUTTER_ACTOR (bind->texture), 255); } else clutter_actor_set_opacity (CLUTTER_ACTOR (bind->texture), 0); }