texture-rectangle: update _new_with_size in line with master

This updates the cogl_texture_rectangle_new_with_size() api in line with
master to be consistent with other texture constructors. This removes
the internal_format and error arguments and allows the texture to be
allocated lazily which means the texture can be configured with apis
like cogl_texture_set_components() and cogl_texture_set_premultiplied()
before it is allocated.

Reviewed-by: Neil Roberts <neil@linux.intel.com>
This commit is contained in:
Robert Bragg 2014-01-13 17:16:09 +00:00
parent 8cedb43249
commit a77dc1319c
4 changed files with 21 additions and 59 deletions

View File

@ -193,46 +193,16 @@ _cogl_texture_rectangle_create_base (CoglContext *ctx,
CoglTextureRectangle *
cogl_texture_rectangle_new_with_size (CoglContext *ctx,
int width,
int height,
CoglPixelFormat internal_format,
CoglError **error)
int height)
{
CoglTextureLoader *loader;
CoglTextureRectangle *tex_rect;
/* Since no data, we need some internal format */
if (internal_format == COGL_PIXEL_FORMAT_ANY)
internal_format = COGL_PIXEL_FORMAT_RGBA_8888_PRE;
loader = _cogl_texture_create_loader ();
CoglTextureLoader *loader = _cogl_texture_create_loader ();
loader->src_type = COGL_TEXTURE_SOURCE_TYPE_SIZED;
loader->src.sized.width = width;
loader->src.sized.height = height;
tex_rect = _cogl_texture_rectangle_create_base (ctx, width, height,
internal_format, loader);
/* XXX: This api has been changed for Cogl 2.0 on the master branch
* to not take a CoglError to allow the storage to be allocated
* lazily but since Mutter uses this api we are currently
* maintaining the semantics of immediately allocating the storage
*/
/* By default tex->premultiplied is set to TRUE and tex->components
* get initialized according to a given source-format in
* _cogl_texture_init(). Since this api has an internal-format
* argument for compatibility we need to make sure the
* ->premultiplied and ->components state are initialized according
* to the users given @internal_format. */
_cogl_texture_set_internal_format (COGL_TEXTURE (tex_rect), internal_format);
if (!cogl_texture_allocate (COGL_TEXTURE (tex_rect), error))
{
cogl_object_unref (tex_rect);
return NULL;
}
return tex_rect;
return _cogl_texture_rectangle_create_base (ctx, width, height,
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
loader);
}
static CoglBool

View File

@ -81,13 +81,11 @@ cogl_is_texture_rectangle (void *object);
* @ctx: A #CoglContext pointer
* @width: The texture width to allocate
* @height: The texture height to allocate
* @internal_format: The desired internal texture format
* @error: An optional CoglError pointer for reporting exceptions
*
* Allocates a new #CoglTextureRectangle texture with a given @width,
* @height and @internal_format. This texture is a low-level texture
* that the GPU can sample from directly unlike high-level textures
* such as #CoglTexture2DSliced and #CoglAtlasTexture.
* Creates a new #CoglTextureRectangle texture with a given @width,
* and @height. This texture is a low-level texture that the GPU can
* sample from directly unlike high-level textures such as
* #CoglTexture2DSliced and #CoglAtlasTexture.
*
* <note>Unlike for #CoglTexture2D textures, coordinates for
* #CoglTextureRectangle textures should not be normalized. So instead
@ -102,15 +100,15 @@ cogl_is_texture_rectangle (void *object);
* first check for the %COGL_FEATURE_ID_TEXTURE_RECTANGLE feature
* using cogl_has_feature().</note>
*
* <note>For compatibility, unlike other texture constructors, this
* api allocates texture storage synchronously and returns %NULL on
* failure so it is not possible to configure rectangle textures
* created with this api before allocation.</note>
* The storage for the texture is not allocated before this function
* returns. You can call cogl_texture_allocate() to explicitly
* allocate the underlying storage or preferably let Cogl
* automatically allocate storage lazily when it may know more about
* how the texture is going to be used and can optimize how it is
* allocated.
*
* Return value: (transfer full): A pointer to a newly allocated
* #CoglTextureRectangle texture or if the size was too large
* or there wasn't enough memory %NULL is returned and @error
* set.
* Returns value: (transfer full): A pointer to a new #CoglTextureRectangle
* object with no storage allocated yet.
*
* Since: 1.10
* Stability: unstable
@ -118,9 +116,7 @@ cogl_is_texture_rectangle (void *object);
CoglTextureRectangle *
cogl_texture_rectangle_new_with_size (CoglContext *ctx,
int width,
int height,
CoglPixelFormat internal_format,
CoglError **error);
int height);
/**
* cogl_texture_rectangle_new_from_bitmap:

View File

@ -2504,13 +2504,11 @@ _cogl_winsys_texture_pixmap_x11_update (CoglTexturePixmapX11 *tex_pixmap,
glx_tex_pixmap->glx_tex = COGL_TEXTURE (
cogl_texture_rectangle_new_with_size (ctx,
tex->width,
tex->height,
texture_format,
&error));
tex->height));
_cogl_texture_set_internal_format (tex, texture_format);
if (glx_tex_pixmap->glx_tex)
if (cogl_texture_allocate (glx_tex_pixmap->glx_tex, &error))
COGL_NOTE (TEXTURE_PIXMAP, "Created a texture rectangle for %p",
tex_pixmap);
else

View File

@ -74,9 +74,7 @@ test_texture_no_allocate (void)
{
CoglTextureRectangle *texture_rect =
cogl_texture_rectangle_new_with_size (test_ctx,
64, 64,
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
NULL /* error */);
64, 64);
cogl_object_unref (texture_rect);
}
}