From: Tony <ad...@ho...> - 2003-09-21 12:44:49
|
> > Hi Again > > Being puzzled by the fact that my software cursor did not work when > everything else worked with my accelerated routines I tried > to investigate > where the problem was located. This being when scan_align!=1 which > my accel routines need. > Oops, sorry, try this instead. Tony int soft_cursor(struct fb_info *info, struct fb_cursor *cursor) { struct fb_image image; unsigned int scan_align = info->pixmap.scan_align - 1; unsigned int buf_align = info->pixmap.buf_align - 1; u8 *dst = (u8 *) info->cursor.image.data; u8 *s, *d; unsigned int i, size, p, pitch; /* p is the source pitch which is always byte aligned */ p = (info->cursor.image.width + 7) >> 3; /* pitch is the destination data pitch, which is padded to hardware requirements */ pitch = p + scan_align; pitch &= ~scan_align; size = pitch * info->cursor.image.height + buf_align; size &= ~buf_align; 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, 0); } info->cursor.image.depth = cursor->image.depth; } if (cursor->set & FB_CUR_SETSHAPE) { switch (info->cursor.rop) { case ROP_XOR: for (i = 0; i < size; i++) dst[i] ^= info->cursor.mask[i]; break; case ROP_COPY: default: for (i = 0; i < size; i++) dst[i] &= info->cursor.mask[i]; break; } } if (!info->cursor.enable) { for (i = 0; i < size; i++) dst[i] ^= info->cursor.mask[i]; } /* Once cursor image processing is finished, start transferring data to pixmap */ /* First, get a chunk from scratch memory... */ image = info->cursor.image; image.data = d = fb_get_buffer_offset(info, &info->pixmap, size); s = dst; /* ... then move data to scratch memory ... */ if (info->cursor.image.data) { for (i = info->cursor.image.height; i--; ) { info->pixmap.outbuf(info, d, s, p) d += pitch; s += p; } } /* ... draw the cursor ... */ info->fbops->fb_imageblit(info, &image); /* ... tell fb we're done. */ atomic_dec(info->pixmap.count); smb_mb__after_atomic_dec(); return 0; } |