vserver 1.9.5.x5
[linux-2.6.git] / drivers / video / softcursor.c
index 7637dc8..13a4511 100644 (file)
 
 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);
+       s_pitch = (cursor->image.width + 7) >> 3;
+       dsize = s_pitch * cursor->image.height;
+
+       src = kmalloc(dsize + 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 + dsize);
+       *image = cursor->image;
        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;