static inline unsigned long copy_to_user16(void *to, const void *from, unsigned long n) { u16 *dst = (u16 *) to; u16 *src = (u16 *) from; while (n > 1) { u16 v = fb_readw(src); if (__put_user(v, dst)) return n; src++, dst++; n -= 2; } if (n) { u8 v = fb_readb(src); if (__put_user(v, ((u8 *) dst))) return n; } return 0; }
void FBLinear8::RevRect(int x1,int y1,int x2,int y2) { assert( x1 >= 0 && x1 < Width() && y1 >=0 && y1 < Height()); assert( x2 >= 0 && x2 < Width() && y2 >=0 && y2 < Height()); assert(x1 <= x2 && y1 <= y2); __u8* dest = (__u8*)mpBuf + mNextLine * y1 + x1; int height = y2 - y1 + 1; int width = x2 - x1 + 1; int cnt; __u8* dest8; __u16* dest16; __u32 *dest32; for(; height--; dest += mNextLine) { dest32 = (__u32*)dest; for (cnt = width/4; cnt--;) { fb_writel(fb_readl(dest32) ^ 0x0f0f0f0f, dest32++); } if (width & 2) { dest16 = (__u16*)dest32; fb_writew(fb_readw(dest16) ^ 0x0f0f, dest16++); dest32 = (__u32*)dest16; } if (width & 1) { dest8 = (__u8*)dest32; fb_writeb(fb_readb(dest8) ^ 0x0f, dest8); } } }