struct drm_compositor *c = (struct drm_compositor *) ec;
struct gbm_bo *bo;
EGLImageKHR image;
- uint32_t *pixels;
- GLuint tex;
if (*width > 64 || *height > 64)
return EGL_NO_IMAGE_KHR;
EGL_NATIVE_PIXMAP_KHR, bo, NULL);
gbm_bo_destroy(bo);
- /* If the requested size is smaller than the allocated one, make the
- * whole image transparent. */
- if (*width != 64 || *height != 64) {
- pixels = calloc(64 * 64, sizeof *pixels);
-
- glGenTextures(1, &tex);
- glBindTexture(GL_TEXTURE_2D, tex);
- glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
- c->base.image_target_texture_2d(GL_TEXTURE_2D, image);
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 64, 64,
- GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);
-
- glDeleteTextures(1, &tex);
- free(pixels);
-
- *width = 64;
- *height = 64;
- }
+ *width = 64;
+ *height = 64;
return image;
}
create_sprite_from_png(struct wlsc_compositor *ec,
const char *filename, uint32_t usage)
{
- uint32_t *pixels;
+ uint32_t *pixels, *pad;
struct wlsc_sprite *sprite;
int32_t width, height;
- int32_t egl_img_width, egl_img_height;
uint32_t stride;
pixels = wlsc_load_image(filename, &width, &height, &stride);
sprite->height = height;
sprite->image = EGL_NO_IMAGE_KHR;
- if (usage & SPRITE_USE_CURSOR && ec->create_cursor_image != NULL) {
- egl_img_width = width;
- egl_img_height = height;
-
- sprite->image = ec->create_cursor_image(ec, &egl_img_width,
- &egl_img_height);
- }
-
glGenTextures(1, &sprite->texture);
glBindTexture(GL_TEXTURE_2D, sprite->texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- if (sprite->image != EGL_NO_IMAGE_KHR) {
+ if (usage & SPRITE_USE_CURSOR && ec->create_cursor_image != NULL) {
+ sprite->image = ec->create_cursor_image(ec, &sprite->width,
+ &sprite->height);
+
ec->image_target_texture_2d(GL_TEXTURE_2D, sprite->image);
+
+ if (sprite->width > width || sprite->height > height) {
+ pad = calloc(sprite->width * sprite->height,
+ sizeof *pad);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,
+ sprite->width, sprite->height,
+ GL_BGRA_EXT, GL_UNSIGNED_BYTE, pad);
+ free(pad);
+ }
+
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height,
GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);
- sprite->width = egl_img_width;
- sprite->height = egl_img_height;
} else {
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, width, height, 0,
GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);