mirror of
https://github.com/reactos/reactos.git
synced 2024-09-11 05:12:43 +00:00
Improved bitblt and painting performance
Initial mouse pointer code svn path=/trunk/; revision=1405
This commit is contained in:
parent
06bf88e073
commit
76ba7eadb1
|
@ -2,113 +2,65 @@
|
||||||
#include "../vgavideo/vgavideo.h"
|
#include "../vgavideo/vgavideo.h"
|
||||||
#include "brush.h"
|
#include "brush.h"
|
||||||
|
|
||||||
|
#include "../../../../ntoskrnl/include/internal/i386/io.h"
|
||||||
|
|
||||||
BOOL VGADDIFillSolid(SURFOBJ *Surface, RECTL Dimensions, ULONG iColor)
|
BOOL VGADDIFillSolid(SURFOBJ *Surface, RECTL Dimensions, ULONG iColor)
|
||||||
{
|
{
|
||||||
unsigned char a, b, mask;
|
int x = Dimensions.left;
|
||||||
unsigned int pre1, i, j, newx;
|
int y = Dimensions.top;
|
||||||
unsigned int orgpre1, orgx, midpre1;
|
int w = Dimensions.right - Dimensions.left;
|
||||||
unsigned long leftpixs, midpixs, rightpixs, temp, len;
|
int h = Dimensions.bottom - Dimensions.top;
|
||||||
long calc;
|
unsigned char *vp, *vpX;
|
||||||
|
volatile unsigned char dummy;
|
||||||
|
int byte_per_line;
|
||||||
|
int i;
|
||||||
|
|
||||||
orgx=Dimensions.left;
|
ASSIGNVP4(x, y, vpX)
|
||||||
len=Dimensions.right - Dimensions.left;
|
get_masks(x, w);
|
||||||
Dimensions.bottom++;
|
byte_per_line = SCREEN_X >> 3;
|
||||||
|
outb(GRA_I, 0x05); /* write mode 2 */
|
||||||
if(len<8)
|
saved_GC_mode = inb(GRA_D);
|
||||||
{
|
outb(GRA_D, 0x02);
|
||||||
for (i=Dimensions.left; i<Dimensions.left+len; i++)
|
outb(GRA_I, 0x03); /* replace */
|
||||||
vgaPutPixel(i, Dimensions.top, iColor);
|
saved_GC_fun = inb(GRA_D);
|
||||||
} else {
|
outb(GRA_D, 0x00);
|
||||||
|
outb(GRA_I, 0x08); /* bit mask */
|
||||||
leftpixs=Dimensions.left;
|
saved_GC_mask = inb(GRA_D);
|
||||||
while(leftpixs>8) leftpixs-=8;
|
if (leftMask) {
|
||||||
temp = len;
|
outb(GRA_D, leftMask); /* bit mask */
|
||||||
midpixs = 0;
|
/* write to video */
|
||||||
|
vp = vpX;
|
||||||
while(temp>7)
|
for (i=h; i>0; i--) {
|
||||||
{
|
dummy = *vp; *vp = iColor;
|
||||||
temp-=8;
|
vp += byte_per_line;
|
||||||
midpixs++;
|
|
||||||
}
|
}
|
||||||
if((temp>=0) && (midpixs>0)) midpixs--;
|
vpX++;
|
||||||
|
|
||||||
pre1=xconv[Dimensions.left]+y80[Dimensions.top];
|
|
||||||
orgpre1=pre1;
|
|
||||||
|
|
||||||
// Left
|
|
||||||
if(leftpixs==8) {
|
|
||||||
// Left edge should be an entire middle bar
|
|
||||||
Dimensions.left=orgx;
|
|
||||||
leftpixs=0;
|
|
||||||
}
|
}
|
||||||
else if(leftpixs>0)
|
if (byteCounter) {
|
||||||
{
|
outb(GRA_D, 0xff); /* bit mask */
|
||||||
WRITE_PORT_UCHAR((PUCHAR)0x3ce,0x08); // Set
|
/* write to video */
|
||||||
WRITE_PORT_UCHAR((PUCHAR)0x3cf,startmasks[leftpixs]); // the MASK
|
vp = vpX;
|
||||||
|
for (i=h; i>0; i--) {
|
||||||
for(j=Dimensions.top; j<Dimensions.bottom; j++)
|
memset(vp, iColor, byteCounter);
|
||||||
{
|
vp += byte_per_line;
|
||||||
a = READ_REGISTER_UCHAR(vidmem + pre1);
|
|
||||||
WRITE_REGISTER_UCHAR(vidmem + pre1, iColor);
|
|
||||||
|
|
||||||
pre1+=80;
|
|
||||||
}
|
}
|
||||||
|
vpX += byteCounter;
|
||||||
// Middle
|
|
||||||
Dimensions.left=orgx+(8-leftpixs)+leftpixs;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
// leftpixs == 0
|
|
||||||
midpixs+=1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(midpixs>0)
|
|
||||||
{
|
|
||||||
midpre1=xconv[Dimensions.left]+y80[Dimensions.top];
|
|
||||||
|
|
||||||
// Set mask to all pixels in byte
|
|
||||||
WRITE_PORT_UCHAR((PUCHAR)0x3ce, 0x08);
|
|
||||||
WRITE_PORT_UCHAR((PUCHAR)0x3cf, 0xff);
|
|
||||||
for(j=Dimensions.top; j<Dimensions.bottom; j++)
|
|
||||||
{
|
|
||||||
memset(vidmem+midpre1, iColor, midpixs);
|
|
||||||
midpre1+=80;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rightpixs = len - ((midpixs*8) + leftpixs);
|
|
||||||
|
|
||||||
if((rightpixs>0))
|
|
||||||
{
|
|
||||||
Dimensions.left=(orgx+len)-rightpixs;
|
|
||||||
|
|
||||||
// Go backwards till we reach the 8-byte boundary
|
|
||||||
while(mod(Dimensions.left, 8)!=0) { Dimensions.left--; rightpixs++; }
|
|
||||||
|
|
||||||
while(rightpixs>7)
|
|
||||||
{
|
|
||||||
// This is a BAD case as this should have been a midpixs
|
|
||||||
|
|
||||||
for(j=Dimensions.top; j<Dimensions.bottom; j++)
|
|
||||||
vgaPutByte(Dimensions.left, j, iColor);
|
|
||||||
|
|
||||||
rightpixs-=8;
|
|
||||||
Dimensions.left+=8;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre1=xconv[Dimensions.left]+y80[Dimensions.top];
|
|
||||||
WRITE_PORT_UCHAR((PUCHAR)0x3ce,0x08); // Set
|
|
||||||
WRITE_PORT_UCHAR((PUCHAR)0x3cf,endmasks[rightpixs]); // the MASK
|
|
||||||
|
|
||||||
for(j=Dimensions.top; j<Dimensions.bottom; j++)
|
|
||||||
{
|
|
||||||
a = READ_REGISTER_UCHAR(vidmem + pre1);
|
|
||||||
WRITE_REGISTER_UCHAR(vidmem + pre1, iColor);
|
|
||||||
|
|
||||||
pre1+=80;
|
|
||||||
}
|
}
|
||||||
|
if (rightMask) {
|
||||||
|
outb(GRA_D, rightMask); /* bit mask */
|
||||||
|
/* write to video */
|
||||||
|
vp = vpX;
|
||||||
|
for (i=h; i>0; i--) {
|
||||||
|
dummy = *vp; *vp = iColor;
|
||||||
|
vp += byte_per_line;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* reset GC register */
|
||||||
|
outb(GRA_D, saved_GC_mask);
|
||||||
|
outb(GRA_I, 0x03);
|
||||||
|
outb(GRA_D, saved_GC_fun);
|
||||||
|
outb(GRA_I, 0x05);
|
||||||
|
outb(GRA_D, saved_GC_mode);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue