/* NB: The reason we require the width, height and format to be passed * even though they may seem redundant is because GLES 1/2 don't * provide a way to query these properties. */ CoglTexture2D * _cogl_egl_texture_2d_new_from_image (CoglContext *ctx, int width, int height, CoglPixelFormat format, EGLImageKHR image, CoglError **error) { CoglTextureLoader *loader; _COGL_RETURN_VAL_IF_FAIL (_cogl_context_get_winsys (ctx)->constraints & COGL_RENDERER_CONSTRAINT_USES_EGL, NULL); _COGL_RETURN_VAL_IF_FAIL (_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_TEXTURE_2D_FROM_EGL_IMAGE), NULL); loader = _cogl_texture_create_loader (); loader->src_type = COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE; loader->src.egl_image.image = image; loader->src.egl_image.width = width; loader->src.egl_image.height = height; loader->src.egl_image.format = format; return _cogl_texture_2d_create_base (ctx, width, height, format, loader); }
CoglTexture2D * cogl_texture_2d_gl_new_from_foreign (CoglContext *ctx, unsigned int gl_handle, int width, int height, CoglPixelFormat format) { CoglTextureLoader *loader; /* NOTE: width, height and internal format are not queriable * in GLES, hence such a function prototype. */ /* Note: We always trust the given width and height without querying * the texture object because the user may be creating a Cogl * texture for a texture_from_pixmap object where glTexImage2D may * not have been called and the texture_from_pixmap spec doesn't * clarify that it is reliable to query back the size from OpenGL. */ /* Assert it is a valid GL texture object */ _COGL_RETURN_VAL_IF_FAIL (ctx->glIsTexture (gl_handle), FALSE); /* Validate width and height */ _COGL_RETURN_VAL_IF_FAIL (width > 0 && height > 0, NULL); loader = _cogl_texture_create_loader (); loader->src_type = COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN; loader->src.gl_foreign.gl_handle = gl_handle; loader->src.gl_foreign.width = width; loader->src.gl_foreign.height = height; loader->src.gl_foreign.format = format; return _cogl_texture_2d_create_base (ctx, width, height, format, loader); }
CoglTextureRectangle * cogl_texture_rectangle_new_from_foreign (CoglContext *ctx, unsigned int gl_handle, int width, int height, CoglPixelFormat format) { CoglTextureLoader *loader; /* NOTE: width, height and internal format are not queriable in * GLES, hence such a function prototype. Also in the case of full * opengl the user may be creating a Cogl texture for a * texture_from_pixmap object where glTexImage2D may not have been * called and the texture_from_pixmap spec doesn't clarify that it * is reliable to query back the size from OpenGL. */ /* Assert that it is a valid GL texture object */ _COGL_RETURN_VAL_IF_FAIL (ctx->glIsTexture (gl_handle), NULL); /* Validate width and height */ _COGL_RETURN_VAL_IF_FAIL (width > 0 && height > 0, NULL); loader = _cogl_texture_create_loader (); loader->src_type = COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN; loader->src.gl_foreign.gl_handle = gl_handle; loader->src.gl_foreign.width = width; loader->src.gl_foreign.height = height; loader->src.gl_foreign.format = format; return _cogl_texture_rectangle_create_base (ctx, width, height, format, loader); }
CoglTextureRectangle * cogl_texture_rectangle_new_with_size (CoglContext *ctx, int width, int height) { CoglTextureLoader *loader = _cogl_texture_create_loader (); loader->src_type = COGL_TEXTURE_SOURCE_TYPE_SIZED; loader->src.sized.width = width; loader->src.sized.height = height; return _cogl_texture_rectangle_create_base (ctx, width, height, COGL_PIXEL_FORMAT_RGBA_8888_PRE, loader); }
CoglTextureRectangle * cogl_texture_rectangle_new_from_bitmap (CoglBitmap *bmp) { CoglTextureLoader *loader; _COGL_RETURN_VAL_IF_FAIL (cogl_is_bitmap (bmp), NULL); loader = _cogl_texture_create_loader (); loader->src_type = COGL_TEXTURE_SOURCE_TYPE_BITMAP; loader->src.bitmap.bitmap = cogl_object_ref (bmp); loader->src.bitmap.can_convert_in_place = FALSE; /* TODO add api for this */ return _cogl_texture_rectangle_create_base (_cogl_bitmap_get_context (bmp), cogl_bitmap_get_width (bmp), cogl_bitmap_get_height (bmp), cogl_bitmap_get_format (bmp), loader); }
static CoglTexture2D * _cogl_texture_2d_new_from_bitmap (CoglBitmap *bmp, CoglBool can_convert_in_place) { CoglTextureLoader *loader; _COGL_RETURN_VAL_IF_FAIL (bmp != NULL, NULL); loader = _cogl_texture_create_loader (); loader->src_type = COGL_TEXTURE_SOURCE_TYPE_BITMAP; loader->src.bitmap.bitmap = cogl_object_ref (bmp); loader->src.bitmap.can_convert_in_place = can_convert_in_place; return _cogl_texture_2d_create_base (_cogl_bitmap_get_context (bmp), cogl_bitmap_get_width (bmp), cogl_bitmap_get_height (bmp), cogl_bitmap_get_format (bmp), loader); }
CoglTexture3D * cogl_texture_3d_new_from_bitmap (CoglBitmap *bmp, int height, int depth) { CoglTextureLoader *loader; _COGL_RETURN_VAL_IF_FAIL (bmp, NULL); loader = _cogl_texture_create_loader (); loader->src_type = COGL_TEXTURE_SOURCE_TYPE_BITMAP; loader->src.bitmap.bitmap = cogl_object_ref (bmp); loader->src.bitmap.height = height; loader->src.bitmap.depth = depth; loader->src.bitmap.can_convert_in_place = FALSE; /* TODO add api for this */ return _cogl_texture_3d_create_base (_cogl_bitmap_get_context (bmp), cogl_bitmap_get_width (bmp), height, depth, cogl_bitmap_get_format (bmp), loader); }
CoglTexture2D * cogl_texture_2d_new_from_egl_image_external (CoglContext *ctx, int width, int height, CoglTexture2DEGLImageExternalAlloc alloc, gpointer user_data, GDestroyNotify destroy, CoglError **error) { CoglTextureLoader *loader; CoglTexture2D *tex_2d; CoglPixelFormat internal_format = COGL_PIXEL_FORMAT_ANY; _COGL_RETURN_VAL_IF_FAIL (_cogl_context_get_winsys (ctx)->constraints & COGL_RENDERER_CONSTRAINT_USES_EGL, NULL); _COGL_RETURN_VAL_IF_FAIL (cogl_has_feature (ctx, COGL_FEATURE_ID_TEXTURE_EGL_IMAGE_EXTERNAL), NULL); loader = _cogl_texture_create_loader (); loader->src_type = COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE_EXTERNAL; loader->src.egl_image_external.width = width; loader->src.egl_image_external.height = height; loader->src.egl_image_external.alloc = alloc; loader->src.egl_image_external.format = internal_format; tex_2d = _cogl_texture_2d_create_base (ctx, width, height, internal_format, loader); tex_2d->egl_image_external.user_data = user_data; tex_2d->egl_image_external.destroy = destroy; return tex_2d; }