compositor-drm: Make unused parts of the cursor image transparent

The bo for the cursor image is always created with size 64x64 even if
the actual cursor image is smaller than that. If this memory is not
initialized, random data can create artifacts near the cursor.

Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
dev
Ander Conselvan de Oliveira 13 years ago committed by Kristian Høgsberg
parent c224748665
commit c483917512
  1. 22
      compositor/compositor-drm.c

@ -681,6 +681,8 @@ drm_compositor_create_cursor_image(struct wlsc_compositor *ec,
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;
@ -694,6 +696,26 @@ drm_compositor_create_cursor_image(struct wlsc_compositor *ec,
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);
glTexSubImage(GL_TEXTURE_2D, 0, 0, 0, 64, 64,
GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);
glDeleteTextures(1, &tex);
free(pixels);
}
return image;
}

Loading…
Cancel
Save