1. fixed crash in 1bpp blt code that was caused by an uninitialized variable.

2. speed improvements for patterned brushes

svn path=/trunk/; revision=9000
This commit is contained in:
Thomas Bluemel 2004-04-07 10:19:34 +00:00
parent bfde26a3f6
commit 9b45df9243
6 changed files with 136 additions and 117 deletions

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: dib16bpp.c,v 1.25 2004/04/06 23:05:36 weiden Exp $ */ /* $Id: dib16bpp.c,v 1.26 2004/04/07 10:19:34 weiden Exp $ */
#undef WIN32_LEAN_AND_MEAN #undef WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
#include <stdlib.h> #include <stdlib.h>
@ -283,11 +283,11 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
{ {
ULONG X, Y; ULONG X, Y;
ULONG SourceX, SourceY; ULONG SourceX, SourceY;
ULONG wd, Dest, Source, Pattern = 0; ULONG wd, Dest, Source, Pattern = 0, PatternY;
PULONG DestBits; PULONG DestBits;
BOOL UsesSource; BOOL UsesSource;
BOOL UsesPattern; BOOL UsesPattern, CalcPattern;
LONG RoundedRight; ULONG RoundedRight;
/* Pattern brushes */ /* Pattern brushes */
PGDIBRUSHOBJ GdiBrush; PGDIBRUSHOBJ GdiBrush;
HBITMAP PatternSurface = NULL; HBITMAP PatternSurface = NULL;
@ -309,11 +309,11 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000);
UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000);
if (UsesPattern) if ((CalcPattern = UsesPattern))
{ {
if (Brush == NULL) if (Brush == NULL)
{ {
UsesPattern = FALSE; UsesPattern = CalcPattern = FALSE;
} else } else
if (Brush->iSolidColor == 0xFFFFFFFF) if (Brush->iSolidColor == 0xFFFFFFFF)
{ {
@ -331,6 +331,13 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface);
PatternWidth = PatternObj->sizlBitmap.cx; PatternWidth = PatternObj->sizlBitmap.cx;
PatternHeight = PatternObj->sizlBitmap.cy; PatternHeight = PatternObj->sizlBitmap.cy;
CalcPattern = TRUE;
}
else
{
CalcPattern = FALSE;
Pattern = (Brush->iSolidColor & 0xFFFF) |
((Brush->iSolidColor & 0xFFFF) << 16);
} }
} }
@ -345,6 +352,10 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
for (Y = DestRect->top; Y < DestRect->bottom; Y++) for (Y = DestRect->top; Y < DestRect->bottom; Y++)
{ {
SourceX = SourcePoint->x; SourceX = SourcePoint->x;
if(CalcPattern)
PatternY = Y % PatternHeight;
for (X = DestRect->left; X < RoundedRight; X += 2, DestBits++, SourceX += 2) for (X = DestRect->left; X < RoundedRight; X += 2, DestBits++, SourceX += 2)
{ {
Dest = *DestBits; Dest = *DestBits;
@ -355,18 +366,10 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
Source |= DIB_GetSource(SourceSurf, SourceGDI, SourceX + 1, SourceY, ColorTranslation) << 16; Source |= DIB_GetSource(SourceSurf, SourceGDI, SourceX + 1, SourceY, ColorTranslation) << 16;
} }
if (UsesPattern) if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF))
{ {
if (Brush->iSolidColor == 0xFFFFFFFF) Pattern = (DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack);
{ Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + 1) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 16;
Pattern = (DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, Y % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack);
Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + 1) % PatternWidth, Y % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 16;
}
else
{
Pattern = (Brush->iSolidColor & 0xFFFF) |
((Brush->iSolidColor & 0xFFFF) << 16);
}
} }
*DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern);
@ -384,7 +387,7 @@ DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
if (UsesPattern) if (UsesPattern)
{ {
if (Brush->iSolidColor == 0xFFFFFFFF) if (Brush->iSolidColor == 0xFFFFFFFF)
Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, Y % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack;
else else
Pattern = Brush->iSolidColor & 0xFFFF; Pattern = Brush->iSolidColor & 0xFFFF;
} }

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: dib1bpp.c,v 1.19 2004/04/06 21:19:44 navaraf Exp $ */ /* $Id: dib1bpp.c,v 1.20 2004/04/07 10:19:34 weiden Exp $ */
#undef WIN32_LEAN_AND_MEAN #undef WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
@ -354,11 +354,11 @@ DIB_1BPP_BitBlt(
XLATEOBJ *ColorTranslation, ULONG Rop4) XLATEOBJ *ColorTranslation, ULONG Rop4)
{ {
ULONG X, Y, SourceX, SourceY, k; ULONG X, Y, SourceX, SourceY, k;
ULONG Dest, Source, Pattern; ULONG Dest, Source, Pattern = 0;
PULONG DestBits; PULONG DestBits;
BOOL UsesSource; BOOL UsesSource;
BOOL UsesPattern; BOOL UsesPattern, CalcPattern;
LONG RoundedRight; ULONG RoundedRight;
BYTE NoBits; BYTE NoBits;
/* Pattern brushes */ /* Pattern brushes */
PGDIBRUSHOBJ GdiBrush; PGDIBRUSHOBJ GdiBrush;
@ -378,11 +378,14 @@ DIB_1BPP_BitBlt(
ColorTranslation); ColorTranslation);
} }
if (UsesPattern) UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000);
UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000);
if ((CalcPattern = UsesPattern))
{ {
if (Brush == NULL) if (Brush == NULL)
{ {
UsesPattern = FALSE; UsesPattern = CalcPattern = FALSE;
} else } else
if (Brush->iSolidColor == 0xFFFFFFFF) if (Brush->iSolidColor == 0xFFFFFFFF)
{ {
@ -400,22 +403,32 @@ DIB_1BPP_BitBlt(
PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface);
PatternWidth = PatternObj->sizlBitmap.cx; PatternWidth = PatternObj->sizlBitmap.cx;
PatternHeight = PatternObj->sizlBitmap.cy; PatternHeight = PatternObj->sizlBitmap.cy;
CalcPattern = TRUE;
}
else
{
CalcPattern = FALSE;
Pattern = Brush->iSolidColor;
} }
} }
UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000);
UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000);
RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x31); RoundedRight = DestRect->right - ((DestRect->right - DestRect->left) & 0x31);
SourceY = SourcePoint->y; SourceY = SourcePoint->y;
for (Y = DestRect->top; Y < DestRect->bottom; Y++) for (Y = DestRect->top; Y < DestRect->bottom; Y++)
{ {
ULONG PatternY;
SourceX = SourcePoint->x; SourceX = SourcePoint->x;
DestBits = (PULONG)( DestBits = (PULONG)(
DestSurf->pvScan0 + DestSurf->pvScan0 +
(DestRect->left >> 3) + (DestRect->left >> 3) +
Y * DestSurf->lDelta); Y * DestSurf->lDelta);
if(CalcPattern)
PatternY = Y % PatternHeight;
X = DestRect->left; X = DestRect->left;
if (X & 31) if (X & 31)
{ {
@ -431,18 +444,11 @@ DIB_1BPP_BitBlt(
Source |= (DIB_GetSource(SourceSurf, SourceGDI, SourceX + k, SourceY, ColorTranslation) << (31 - k)); Source |= (DIB_GetSource(SourceSurf, SourceGDI, SourceX + k, SourceY, ColorTranslation) << (31 - k));
} }
if (UsesPattern) if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF))
{ {
if (Brush->iSolidColor == 0xFFFFFFFF) Pattern = 0;
{ for (k = 31 - NoBits; k < NoBits; k++)
Pattern = 0; Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k) % PatternWidth, PatternY) << (31 - k));
for (k = 31 - NoBits; k < NoBits; k++)
Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k) % PatternWidth, Y % PatternHeight) << (31 - k));
}
else
{
Pattern = Brush->iSolidColor ? 0xFFFFFFFF : 0x00000000;
}
} }
Dest = DIB_DoRop(Rop4, Dest, Source, Pattern); Dest = DIB_DoRop(Rop4, Dest, Source, Pattern);
@ -484,10 +490,6 @@ DIB_1BPP_BitBlt(
Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 24) % PatternWidth, Y % PatternHeight) << (24 + (7 - k))); Pattern |= (DIB_1BPP_GetPixel(PatternObj, (X + k + 24) % PatternWidth, Y % PatternHeight) << (24 + (7 - k)));
} }
} }
else
{
Pattern = Brush->iSolidColor ? 0xFFFFFFFF : 0x00000000;
}
} }
*DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern);
@ -506,12 +508,9 @@ DIB_1BPP_BitBlt(
Source = DIB_GetSource(SourceSurf, SourceGDI, SourceX, SourceY, ColorTranslation); Source = DIB_GetSource(SourceSurf, SourceGDI, SourceX, SourceY, ColorTranslation);
} }
if (UsesPattern) if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF))
{ {
if (Brush->iSolidColor == 0xFFFFFFFF) Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, Y % PatternHeight);
Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, Y % PatternHeight);
else
Pattern = Brush->iSolidColor ? 0xFFFFFFFF : 0x00000000;
} }
DIB_1BPP_PutPixel(DestSurf, X, Y, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); DIB_1BPP_PutPixel(DestSurf, X, Y, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF);

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: dib24bpp.c,v 1.21 2004/04/06 23:05:36 weiden Exp $ */ /* $Id: dib24bpp.c,v 1.22 2004/04/07 10:19:34 weiden Exp $ */
#undef WIN32_LEAN_AND_MEAN #undef WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
#include <stdlib.h> #include <stdlib.h>
@ -255,10 +255,10 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
{ {
ULONG X, Y; ULONG X, Y;
ULONG SourceX, SourceY; ULONG SourceX, SourceY;
ULONG Dest, Source, Pattern; ULONG Dest, Source, Pattern = 0, PatternY;
PBYTE DestBits; PBYTE DestBits;
BOOL UsesSource; BOOL UsesSource;
BOOL UsesPattern; BOOL UsesPattern, CalcPattern;
/* Pattern brushes */ /* Pattern brushes */
PGDIBRUSHOBJ GdiBrush; PGDIBRUSHOBJ GdiBrush;
HBITMAP PatternSurface = NULL; HBITMAP PatternSurface = NULL;
@ -280,11 +280,11 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000);
UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000);
if (UsesPattern) if ((CalcPattern = UsesPattern))
{ {
if (Brush == NULL) if (Brush == NULL)
{ {
UsesPattern = FALSE; UsesPattern = CalcPattern = FALSE;
} else } else
if (Brush->iSolidColor == 0xFFFFFFFF) if (Brush->iSolidColor == 0xFFFFFFFF)
{ {
@ -302,6 +302,13 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface);
PatternWidth = PatternObj->sizlBitmap.cx; PatternWidth = PatternObj->sizlBitmap.cx;
PatternHeight = PatternObj->sizlBitmap.cy; PatternHeight = PatternObj->sizlBitmap.cy;
CalcPattern = TRUE;
}
else
{
CalcPattern = FALSE;
Pattern = Brush->iSolidColor;
} }
} }
@ -314,6 +321,10 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
for (Y = DestRect->top; Y < DestRect->bottom; Y++) for (Y = DestRect->top; Y < DestRect->bottom; Y++)
{ {
SourceX = SourcePoint->x; SourceX = SourcePoint->x;
if(CalcPattern)
PatternY = Y % PatternHeight;
for (X = DestRect->left; X < DestRect->right; X++, DestBits += 3, SourceX++) for (X = DestRect->left; X < DestRect->right; X++, DestBits += 3, SourceX++)
{ {
Dest = *((PUSHORT)DestBits) + (*(DestBits + 2) << 16); Dest = *((PUSHORT)DestBits) + (*(DestBits + 2) << 16);
@ -327,11 +338,7 @@ DIB_24BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
{ {
if (Brush->iSolidColor == 0xFFFFFFFF) if (Brush->iSolidColor == 0xFFFFFFFF)
{ {
Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, Y % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack;
}
else
{
Pattern = Brush->iSolidColor;
} }
} }

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: dib32bpp.c,v 1.21 2004/04/06 23:05:36 weiden Exp $ */ /* $Id: dib32bpp.c,v 1.22 2004/04/07 10:19:34 weiden Exp $ */
#undef WIN32_LEAN_AND_MEAN #undef WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
#include <stdlib.h> #include <stdlib.h>
@ -304,10 +304,10 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
{ {
ULONG X, Y; ULONG X, Y;
ULONG SourceX, SourceY; ULONG SourceX, SourceY;
ULONG Dest, Source, Pattern, wd; ULONG Dest, Source, Pattern = 0, wd;
PULONG DestBits; PULONG DestBits;
BOOL UsesSource; BOOL UsesSource;
BOOL UsesPattern; BOOL UsesPattern, CalcPattern;
/* Pattern brushes */ /* Pattern brushes */
PGDIBRUSHOBJ GdiBrush; PGDIBRUSHOBJ GdiBrush;
HBITMAP PatternSurface = NULL; HBITMAP PatternSurface = NULL;
@ -329,11 +329,11 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000);
UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000);
if (UsesPattern) if ((CalcPattern = UsesPattern))
{ {
if (Brush == NULL) if (Brush == NULL)
{ {
UsesPattern = FALSE; UsesPattern = CalcPattern = FALSE;
} else } else
if (Brush->iSolidColor == 0xFFFFFFFF) if (Brush->iSolidColor == 0xFFFFFFFF)
{ {
@ -351,6 +351,13 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface);
PatternWidth = PatternObj->sizlBitmap.cx; PatternWidth = PatternObj->sizlBitmap.cx;
PatternHeight = PatternObj->sizlBitmap.cy; PatternHeight = PatternObj->sizlBitmap.cy;
CalcPattern = TRUE;
}
else
{
CalcPattern = FALSE;
Pattern = Brush->iSolidColor;
} }
} }
@ -363,8 +370,12 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
for (Y = DestRect->top; Y < DestRect->bottom; Y++) for (Y = DestRect->top; Y < DestRect->bottom; Y++)
{ {
ULONG PatternY;
SourceX = SourcePoint->x; SourceX = SourcePoint->x;
if(CalcPattern)
PatternY = Y % PatternHeight;
for (X = DestRect->left; X < DestRect->right; X++, DestBits++, SourceX++) for (X = DestRect->left; X < DestRect->right; X++, DestBits++, SourceX++)
{ {
Dest = *DestBits; Dest = *DestBits;
@ -374,16 +385,9 @@ DIB_32BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
Source = DIB_GetSource(SourceSurf, SourceGDI, SourceX, SourceY, ColorTranslation); Source = DIB_GetSource(SourceSurf, SourceGDI, SourceX, SourceY, ColorTranslation);
} }
if (UsesPattern) if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF))
{ {
if (Brush->iSolidColor == 0xFFFFFFFF) Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack;
{
Pattern = DIB_1BPP_GetPixel(PatternObj, X % PatternWidth, Y % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack;
}
else
{
Pattern = Brush->iSolidColor;
}
} }
*DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern);

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: dib4bpp.c,v 1.25 2004/04/06 17:54:32 weiden Exp $ */ /* $Id: dib4bpp.c,v 1.26 2004/04/07 10:19:34 weiden Exp $ */
#undef WIN32_LEAN_AND_MEAN #undef WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
#include <stdlib.h> #include <stdlib.h>
@ -239,10 +239,10 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
XLATEOBJ *ColorTranslation, ULONG Rop4) XLATEOBJ *ColorTranslation, ULONG Rop4)
{ {
LONG i, j, sx, sy; LONG i, j, sx, sy;
ULONG Dest, Source, Pattern; ULONG Dest, Source, Pattern = 0, PatternY;
PULONG DestBits; PULONG DestBits;
BOOL UsesSource; BOOL UsesSource;
BOOL UsesPattern; BOOL UsesPattern, CalcPattern;
LONG RoundedRight; LONG RoundedRight;
/* Pattern brushes */ /* Pattern brushes */
PGDIBRUSHOBJ GdiBrush; PGDIBRUSHOBJ GdiBrush;
@ -284,11 +284,11 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000);
UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000);
if (UsesPattern) if ((CalcPattern = UsesPattern))
{ {
if (Brush == NULL) if (Brush == NULL)
{ {
UsesPattern = FALSE; UsesPattern = CalcPattern = FALSE;
} else } else
if (Brush->iSolidColor == 0xFFFFFFFF) if (Brush->iSolidColor == 0xFFFFFFFF)
{ {
@ -306,6 +306,12 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface);
PatternWidth = PatternObj->sizlBitmap.cx; PatternWidth = PatternObj->sizlBitmap.cx;
PatternHeight = PatternObj->sizlBitmap.cy; PatternHeight = PatternObj->sizlBitmap.cy;
CalcPattern = TRUE;
}
else
{
CalcPattern = FALSE;
Pattern = Brush->iSolidColor & 0xF;
} }
} }
@ -318,6 +324,9 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
sx = SourcePoint->x; sx = SourcePoint->x;
i = DestRect->left; i = DestRect->left;
if(CalcPattern)
PatternY = j % PatternHeight;
if (i & 0x1) if (i & 0x1)
{ {
Dest = DIB_4BPP_GetPixel(DestSurf, i, j); Dest = DIB_4BPP_GetPixel(DestSurf, i, j);
@ -327,12 +336,9 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
Source = DIB_GetSource(SourceSurf, SourceGDI, sx, sy, ColorTranslation); Source = DIB_GetSource(SourceSurf, SourceGDI, sx, sy, ColorTranslation);
} }
if (UsesPattern) if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF))
{ {
if (Brush->iSolidColor == 0xFFFFFFFF) Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack;
Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack;
else
Pattern = Brush->iSolidColor & 0xF;
} }
DIB_4BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); DIB_4BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF);
@ -361,18 +367,19 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
{ {
if (Brush->iSolidColor == 0xFFFFFFFF) if (Brush->iSolidColor == 0xFFFFFFFF)
{ {
Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack;
Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 1) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 4; Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 1) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 4;
Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 2) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 8; Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 2) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 8;
Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 3) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 12; Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 3) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 12;
Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 4) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 16; Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 4) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 16;
Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 5) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 20; Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 5) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 20;
Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 6) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 24; Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 6) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 24;
Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 7) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 28; Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 7) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 28;
} }
else else
{ {
Pattern = ExpandSolidColor[Brush->iSolidColor & 0xF]; *DestBits = DIB_DoRop(Rop4, Dest, Source, ExpandSolidColor[Brush->iSolidColor & 0xF]);
continue;
} }
} }
*DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern);
@ -386,12 +393,9 @@ DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
{ {
Source = DIB_GetSource(SourceSurf, SourceGDI, sx, sy, ColorTranslation); Source = DIB_GetSource(SourceSurf, SourceGDI, sx, sy, ColorTranslation);
} }
if (UsesPattern) if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF))
{ {
if (Brush->iSolidColor == 0xFFFFFFFF) Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack;
Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack;
else
Pattern = Brush->iSolidColor & 0xF;
} }
DIB_4BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF); DIB_4BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF);
} }

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: dib8bpp.c,v 1.19 2004/04/06 23:05:36 weiden Exp $ */ /* $Id: dib8bpp.c,v 1.20 2004/04/07 10:19:34 weiden Exp $ */
#undef WIN32_LEAN_AND_MEAN #undef WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
#include <stdlib.h> #include <stdlib.h>
@ -277,10 +277,10 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
XLATEOBJ *ColorTranslation, ULONG Rop4) XLATEOBJ *ColorTranslation, ULONG Rop4)
{ {
LONG i, j, k, sx, sy; LONG i, j, k, sx, sy;
ULONG Dest, Source, Pattern; ULONG Dest, Source, Pattern = 0, PatternY;
PULONG DestBits; PULONG DestBits;
BOOL UsesSource; BOOL UsesSource;
BOOL UsesPattern; BOOL UsesPattern, CalcPattern;
LONG RoundedRight; LONG RoundedRight;
/* Pattern brushes */ /* Pattern brushes */
PGDIBRUSHOBJ GdiBrush; PGDIBRUSHOBJ GdiBrush;
@ -303,11 +303,11 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000); UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000);
UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000); UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000);
if (UsesPattern) if ((CalcPattern = UsesPattern))
{ {
if (Brush == NULL) if (Brush == NULL)
{ {
UsesPattern = FALSE; UsesPattern = CalcPattern = FALSE;
} else } else
if (Brush->iSolidColor == 0xFFFFFFFF) if (Brush->iSolidColor == 0xFFFFFFFF)
{ {
@ -325,6 +325,15 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface); PatternObj = (PSURFOBJ)AccessUserObject((ULONG)PatternSurface);
PatternWidth = PatternObj->sizlBitmap.cx; PatternWidth = PatternObj->sizlBitmap.cx;
PatternHeight = PatternObj->sizlBitmap.cy; PatternHeight = PatternObj->sizlBitmap.cy;
CalcPattern = TRUE;
}
else
{
CalcPattern = FALSE;
Pattern = (Brush->iSolidColor & 0xFF) |
((Brush->iSolidColor & 0xFF) << 8) |
((Brush->iSolidColor & 0xFF) << 16) |
((Brush->iSolidColor & 0xFF) << 24);
} }
} }
@ -336,6 +345,9 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
sx = SourcePoint->x; sx = SourcePoint->x;
DestBits = (PULONG)(DestSurf->pvScan0 + DestRect->left + j * DestSurf->lDelta); DestBits = (PULONG)(DestSurf->pvScan0 + DestRect->left + j * DestSurf->lDelta);
if(CalcPattern)
PatternY = j % PatternHeight;
for (i = DestRect->left; i < RoundedRight; i += 4, DestBits++) for (i = DestRect->left; i < RoundedRight; i += 4, DestBits++)
{ {
Dest = *DestBits; Dest = *DestBits;
@ -347,22 +359,12 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
Source |= (DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left) + k, sy, ColorTranslation) << (k * 8)); Source |= (DIB_GetSource(SourceSurf, SourceGDI, sx + (i - DestRect->left) + k, sy, ColorTranslation) << (k * 8));
} }
if (UsesPattern) if (UsesPattern && (Brush->iSolidColor == 0xFFFFFFFF))
{ {
if (Brush->iSolidColor == 0xFFFFFFFF) Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack;
{ Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 1) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 8;
Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 2) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 16;
Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 1) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 8; Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 3) % PatternWidth, PatternY) ? GdiBrush->crFore : GdiBrush->crBack) << 24;
Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 2) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 16;
Pattern |= (DIB_1BPP_GetPixel(PatternObj, (i + 3) % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack) << 24;
}
else
{
Pattern = (Brush->iSolidColor & 0xFF) |
((Brush->iSolidColor & 0xFF) << 8) |
((Brush->iSolidColor & 0xFF) << 16) |
((Brush->iSolidColor & 0xFF) << 24);
}
} }
*DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern); *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern);
} }
@ -380,7 +382,7 @@ DIB_8BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
if (UsesPattern) if (UsesPattern)
{ {
if (Brush->iSolidColor == 0xFFFFFFFF) if (Brush->iSolidColor == 0xFFFFFFFF)
Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth, j % PatternHeight) ? GdiBrush->crFore : GdiBrush->crBack; Pattern = DIB_1BPP_GetPixel(PatternObj, i % PatternWidth,PatternY) ? GdiBrush->crFore : GdiBrush->crBack;
else else
Pattern = Brush->iSolidColor & 0xFF; Pattern = Brush->iSolidColor & 0xFF;
} }