+\r
+// ------------------------\r
+// --- 2D Accelleration ---\r
+// ------------------------\r
+void Vesa_2D_Fill(void *Ent, Uint16 X, Uint16 Y, Uint16 W, Uint16 H, Uint32 Colour)\r
+{\r
+ int scrnwidth = gVesa_Modes[giVesaCurrentMode].width;\r
+ Uint32 *buf = (Uint32*)gpVesa_Framebuffer + Y*scrnwidth + X;\r
+ while( H -- ) {\r
+ memsetd(buf, Colour, W);\r
+ buf += scrnwidth;\r
+ }\r
+}\r
+\r
+void Vesa_2D_Blit(void *Ent, Uint16 DstX, Uint16 DstY, Uint16 SrcX, Uint16 SrcY, Uint16 W, Uint16 H)\r
+{\r
+ int scrnwidth = gVesa_Modes[giVesaCurrentMode].width;\r
+ int dst = DstY*scrnwidth + DstX;\r
+ int src = SrcY*scrnwidth + SrcX;\r
+ int tmp;\r
+ \r
+ //Log("Vesa_2D_Blit: (Ent=%p, DstX=%i, DstY=%i, SrcX=%i, SrcY=%i, W=%i, H=%i)",\r
+ // Ent, DstX, DstY, SrcX, SrcY, W, H);\r
+ \r
+ if(SrcX + W > scrnwidth)\r
+ W = scrnwidth - SrcX;\r
+ if(DstX + W > scrnwidth)\r
+ W = scrnwidth - DstX;\r
+ if(SrcY + H > gVesa_Modes[giVesaCurrentMode].height)\r
+ H = gVesa_Modes[giVesaCurrentMode].height - SrcY;\r
+ if(DstY + H > gVesa_Modes[giVesaCurrentMode].height)\r
+ H = gVesa_Modes[giVesaCurrentMode].height - DstY;\r
+ \r
+ if( dst > src ) {\r
+ // Reverse copy\r
+ dst += H*scrnwidth;\r
+ src += H*scrnwidth;\r
+ while( H -- ) {\r
+ dst -= scrnwidth;\r
+ src -= scrnwidth;\r
+ tmp = W;\r
+ for( tmp = W; tmp --; ) {\r
+ *((Uint32*)gpVesa_Framebuffer + dst + tmp) = *((Uint32*)gpVesa_Framebuffer + src + tmp);\r
+ }\r
+ }\r
+ }\r
+ else {\r
+ // Normal copy is OK\r
+ while( H -- ) {\r
+ memcpyd((Uint32*)gpVesa_Framebuffer + dst, (Uint32*)gpVesa_Framebuffer + src, W);\r
+ dst += scrnwidth;\r
+ src += scrnwidth;\r
+ }\r
+ }\r
+}\r