Commit c11f2253 authored by Antonino Daplas's avatar Antonino Daplas Committed by Linus Torvalds

[PATCH] fbdev: Clean up softcursor implementation

- use struct fb_pixmap pixmap instead of struct fb_pixmap sprite.  The
  softcursor uses fb_imageblit which also uses pixmap.

- remove/change all references to info->cursor
Signed-off-by: default avatarAntonino Daplas <adaplas@pol.net>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 64c3967a
......@@ -19,79 +19,53 @@
int soft_cursor(struct fb_info *info, struct fb_cursor *cursor)
{
unsigned int scan_align = info->sprite.scan_align - 1;
unsigned int buf_align = info->sprite.buf_align - 1;
unsigned int scan_align = info->pixmap.scan_align - 1;
unsigned int buf_align = info->pixmap.buf_align - 1;
unsigned int i, size, dsize, s_pitch, d_pitch;
struct fb_cursor *cur;
struct fb_image *image;
u8 *dst, *src;
if (cursor->set & FB_CUR_SETSIZE) {
info->cursor.image.height = cursor->image.height;
info->cursor.image.width = cursor->image.width;
}
if (cursor->set & FB_CUR_SETPOS) {
info->cursor.image.dx = cursor->image.dx;
info->cursor.image.dy = cursor->image.dy;
}
if (cursor->set & FB_CUR_SETHOT)
info->cursor.hot = cursor->hot;
if (cursor->set & FB_CUR_SETCMAP) {
if (cursor->image.depth == 1) {
info->cursor.image.bg_color = cursor->image.bg_color;
info->cursor.image.fg_color = cursor->image.fg_color;
} else {
if (cursor->image.cmap.len)
fb_copy_cmap(&cursor->image.cmap, &info->cursor.image.cmap);
}
info->cursor.image.depth = cursor->image.depth;
}
info->cursor.image.data = cursor->image.data;
if (info->state != FBINFO_STATE_RUNNING)
return 0;
src = kmalloc(64 + sizeof(struct fb_cursor), GFP_ATOMIC);
src = kmalloc(64 + sizeof(struct fb_image), GFP_ATOMIC);
if (!src)
return -ENOMEM;
cur = (struct fb_cursor *) (src + 64);
*cur = info->cursor;
s_pitch = (info->cursor.image.width + 7) >> 3;
dsize = s_pitch * info->cursor.image.height;
image = (struct fb_image *) (src + 64);
*image = cursor->image;
s_pitch = (image->width + 7) >> 3;
dsize = s_pitch * image->height;
d_pitch = (s_pitch + scan_align) & ~scan_align;
size = d_pitch * info->cursor.image.height + buf_align;
size = d_pitch * image->height + buf_align;
size &= ~buf_align;
dst = fb_get_buffer_offset(info, &info->sprite, size);
dst = fb_get_buffer_offset(info, &info->pixmap, size);
if (info->cursor.enable) {
switch (info->cursor.rop) {
if (cursor->enable) {
switch (cursor->rop) {
case ROP_XOR:
for (i = 0; i < dsize; i++)
src[i] = cursor->image.data[i] ^ info->cursor.mask[i];
src[i] = image->data[i] ^ cursor->mask[i];
break;
case ROP_COPY:
default:
for (i = 0; i < dsize; i++)
src[i] = cursor->image.data[i] & info->cursor.mask[i];
src[i] = image->data[i] & cursor->mask[i];
break;
}
} else
memcpy(src, cursor->image.data, dsize);
memcpy(src, image->data, dsize);
if (info->sprite.outbuf)
fb_iomove_buf_aligned(info, &info->sprite, dst, d_pitch, src,
s_pitch, info->cursor.image.height);
if (info->pixmap.outbuf)
fb_iomove_buf_aligned(info, &info->pixmap, dst, d_pitch, src,
s_pitch, image->height);
else
fb_sysmove_buf_aligned(info, &info->sprite, dst, d_pitch, src,
s_pitch, info->cursor.image.height);
cur->image.data = dst;
info->fbops->fb_imageblit(info, &cur->image);
fb_sysmove_buf_aligned(info, &info->pixmap, dst, d_pitch, src,
s_pitch, image->height);
image->data = dst;
info->fbops->fb_imageblit(info, image);
kfree(src);
return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment