+ outb(0x3D4, 14);
+ outb(0x3D5, pos >> 8);
+ outb(0x3D4, 15);
+ outb(0x3D5, pos);
+}
+
+void VGA_2D_Fill(void *Ent, Uint16 X, Uint16 Y, Uint16 W, Uint16 H, Uint32 Colour)
+{
+ tVT_Char ch;
+ Uint16 word, *buf;
+
+ X /= giVT_CharWidth;
+ W /= giVT_CharWidth;
+ Y /= giVT_CharHeight;
+ H /= giVT_CharHeight;
+
+ ch.Ch = 0x20;
+ ch.BGCol = (Colour & 0x0F0000) >> (16-8);
+ ch.BGCol |= (Colour & 0x000F00) >> (8-4);
+ ch.BGCol |= (Colour & 0x00000F);
+ word = VGA_int_GetWord(&ch);
+
+ Log("Fill (%i,%i) %ix%i with 0x%x", X, Y, W, H, word);
+
+ if( X > VGA_WIDTH || Y > VGA_HEIGHT ) return ;
+ if( X + W > VGA_WIDTH ) W = VGA_WIDTH - X;
+ if( Y + H > VGA_HEIGHT ) H = VGA_HEIGHT - Y;
+
+ buf = gVGA_Framebuffer + Y*VGA_WIDTH + X;
+
+
+ while( H -- ) {
+ int i;
+ for( i = 0; i < W; i ++ )
+ *buf++ = word;
+ buf += VGA_WIDTH - W;
+ }
+}
+
+void VGA_2D_Blit(void *Ent, Uint16 DstX, Uint16 DstY, Uint16 SrcX, Uint16 SrcY, Uint16 W, Uint16 H)
+{
+ Uint16 *src, *dst;
+
+ DstX /= giVT_CharWidth;
+ SrcX /= giVT_CharWidth;
+ W /= giVT_CharWidth;
+
+ DstY /= giVT_CharHeight;
+ SrcY /= giVT_CharHeight;
+ H /= giVT_CharHeight;
+
+// Log("(%i,%i) from (%i,%i) %ix%i", DstX, DstY, SrcX, SrcY, W, H);
+
+ if( SrcX > VGA_WIDTH || SrcY > VGA_HEIGHT ) return ;
+ if( SrcX + W > VGA_WIDTH ) W = VGA_WIDTH - SrcX;
+ if( SrcY + H > VGA_HEIGHT ) H = VGA_HEIGHT - SrcY;
+ if( DstX > VGA_WIDTH || DstY > VGA_HEIGHT ) return ;
+ if( DstX + W > VGA_WIDTH ) W = VGA_WIDTH - DstX;
+ if( DstY + H > VGA_HEIGHT ) H = VGA_HEIGHT - DstY;
+
+
+ src = gVGA_Framebuffer + SrcY*VGA_WIDTH + SrcX;
+ dst = gVGA_Framebuffer + DstY*VGA_WIDTH + DstX;
+
+ if( src > dst )
+ {
+ // Simple copy
+ while( H-- ) {
+ memcpy(dst, src, W*2);
+ dst += VGA_WIDTH;
+ src += VGA_WIDTH;
+ }
+ }
+ else
+ {
+ dst += H*VGA_WIDTH;
+ src += H*VGA_WIDTH;
+ while( H -- ) {
+ int i;
+ dst -= VGA_WIDTH-W;
+ src -= VGA_WIDTH-W;
+ for( i = W; i --; ) *--dst = *--src;
+ }
+ }