Add generation of 8bpp DIB code
Modified: trunk/reactos/subsys/win32k/dib/dib8bpp.c
Modified: trunk/reactos/subsys/win32k/win32k.xml
Modified: trunk/reactos/tools/gendib/gendib.c
Modified: trunk/reactos/tools/gendib/gendib.mak
_____
Modified: trunk/reactos/subsys/win32k/dib/dib8bpp.c
--- trunk/reactos/subsys/win32k/dib/dib8bpp.c 2005-08-19 19:05:59 UTC
(rev 17440)
+++ trunk/reactos/subsys/win32k/dib/dib8bpp.c 2005-08-19 20:56:01 UTC
(rev 17441)
@@ -252,114 +252,17 @@
return TRUE;
}
-BOOLEAN
-DIB_8BPP_BitBlt(PBLTINFO BltInfo)
-{
- ULONG DestX, DestY;
- ULONG SourceX, SourceY;
- ULONG PatternY = 0;
- ULONG Dest, Source = 0, Pattern = 0;
- BOOL UsesSource;
- BOOL UsesPattern;
- PULONG DestBits;
- LONG RoundedRight;
-
- UsesSource = ROP4_USES_SOURCE(BltInfo->Rop4);
- UsesPattern = ROP4_USES_PATTERN(BltInfo->Rop4);
-
- SourceY = BltInfo->SourcePoint.y;
- RoundedRight = BltInfo->DestRect.right -
- ((BltInfo->DestRect.right - BltInfo->DestRect.left) &
0x7);
-
- if (UsesPattern)
- {
- if (BltInfo->PatternSurface)
- {
- PatternY = (BltInfo->DestRect.top + BltInfo->BrushOrigin.y) %
- BltInfo->PatternSurface->sizlBitmap.cy;
- }
- else
- {
- Pattern = BltInfo->Brush->iSolidColor |
- (BltInfo->Brush->iSolidColor << 8) |
- (BltInfo->Brush->iSolidColor << 16) |
- (BltInfo->Brush->iSolidColor << 24);
- }
- }
-
- for (DestY = BltInfo->DestRect.top; DestY <
BltInfo->DestRect.bottom; DestY++)
- {
- SourceX = BltInfo->SourcePoint.x;
- DestBits = (PULONG)(
- (PBYTE)BltInfo->DestSurface->pvScan0 +
- BltInfo->DestRect.left +
- DestY * BltInfo->DestSurface->lDelta);
-
- for (DestX = BltInfo->DestRect.left; DestX < RoundedRight; DestX
+= 4, DestBits++)
- {
- Dest = *DestBits;
-
- if (UsesSource)
- {
- Source = DIB_GetSource(BltInfo->SourceSurface, SourceX +
(DestX - BltInfo->DestRect.left), SourceY, BltInfo->XlateSourceToDest);
- Source |= DIB_GetSource(BltInfo->SourceSurface, SourceX +
(DestX - BltInfo->DestRect.left) + 1, SourceY,
BltInfo->XlateSourceToDest) << 8;
- Source |= DIB_GetSource(BltInfo->SourceSurface, SourceX +
(DestX - BltInfo->DestRect.left) + 2, SourceY,
BltInfo->XlateSourceToDest) << 16;
- Source |= DIB_GetSource(BltInfo->SourceSurface, SourceX +
(DestX - BltInfo->DestRect.left) + 3, SourceY,
BltInfo->XlateSourceToDest) << 24;
- }
-
- if (BltInfo->PatternSurface)
- {
- Pattern = DIB_GetSource(BltInfo->PatternSurface, (DestX +
BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx,
PatternY, BltInfo->XlatePatternToDest);
- Pattern |= DIB_GetSource(BltInfo->PatternSurface, (DestX +
BltInfo->BrushOrigin.x + 1) % BltInfo->PatternSurface->sizlBitmap.cx,
PatternY, BltInfo->XlatePatternToDest) << 8;
- Pattern |= DIB_GetSource(BltInfo->PatternSurface, (DestX +
BltInfo->BrushOrigin.x + 2) % BltInfo->PatternSurface->sizlBitmap.cx,
PatternY, BltInfo->XlatePatternToDest) << 16;
- Pattern |= DIB_GetSource(BltInfo->PatternSurface, (DestX +
BltInfo->BrushOrigin.x + 3) % BltInfo->PatternSurface->sizlBitmap.cx,
PatternY, BltInfo->XlatePatternToDest) << 24;
- }
-
- *DestBits = DIB_DoRop(BltInfo->Rop4, Dest, Source, Pattern);
- }
-
- if (DestX < BltInfo->DestRect.right)
- {
- for (; DestX < BltInfo->DestRect.right; DestX++)
- {
- Dest = DIB_8BPP_GetPixel(BltInfo->DestSurface, DestX,
DestY);
-
- if (UsesSource)
- {
- Source = DIB_GetSource(BltInfo->SourceSurface, SourceX +
(DestX - BltInfo->DestRect.left), SourceY, BltInfo->XlateSourceToDest);
- }
-
- if (BltInfo->PatternSurface)
- {
- Pattern = DIB_GetSource(BltInfo->PatternSurface, (DestX
+ BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx,
PatternY, BltInfo->XlatePatternToDest);
- }
-
- DIB_8BPP_PutPixel(BltInfo->DestSurface, DestX, DestY,
DIB_DoRop(BltInfo->Rop4, Dest, Source, Pattern) & 0xFFFF);
- }
- }
-
- SourceY++;
- if (BltInfo->PatternSurface)
- {
- PatternY++;
- PatternY %= BltInfo->PatternSurface->sizlBitmap.cy;
- }
- }
-
- return TRUE;
-}
-
/* BitBlt Optimize */
BOOLEAN
DIB_8BPP_ColorFill(SURFOBJ* DestSurface, RECTL* DestRect, ULONG color)
{
ULONG DestY;
- for (DestY = DestRect->top; DestY< DestRect->bottom; DestY++)
- {
- DIB_8BPP_HLine (DestSurface, DestRect->left, DestRect->right,
DestY, color);
- }
+ for (DestY = DestRect->top; DestY< DestRect->bottom; DestY++)
+ {
+ DIB_8BPP_HLine(DestSurface, DestRect->left, DestRect->right,
DestY, color);
+ }
- return TRUE;
+ return TRUE;
}
/*
=======================================
_____
Modified: trunk/reactos/subsys/win32k/win32k.xml
--- trunk/reactos/subsys/win32k/win32k.xml 2005-08-19 19:05:59 UTC
(rev 17440)
+++ trunk/reactos/subsys/win32k/win32k.xml 2005-08-19 20:56:01 UTC
(rev 17441)
@@ -14,6 +14,7 @@
<file>dib1bpp.c</file>
<file>dib4bpp.c</file>
<file>dib8bpp.c</file>
+ <file>dib8gen.c</file>
<file>dib16bpp.c</file>
<file>dib16gen.c</file>
<file>dib24bpp.c</file>
_____
Modified: trunk/reactos/tools/gendib/gendib.c
--- trunk/reactos/tools/gendib/gendib.c 2005-08-19 19:05:59 UTC (rev
17440)
+++ trunk/reactos/tools/gendib/gendib.c 2005-08-19 20:56:01 UTC (rev
17441)
@@ -263,11 +263,16 @@
Cast = "";
Dest = "*DestPtr";
}
- else
+ else if (16 == Bpp)
{
Cast = "(USHORT) ";
Dest = "*((PUSHORT) DestPtr)";
}
+ else
+ {
+ Cast = "(UCHAR) ";
+ Dest = "*((PUCHAR) DestPtr)";
+ }
Output(Out, "%s = ", Dest);
if (ROPCODE_GENERIC == RopInfo->RopCode)
{
@@ -448,11 +453,24 @@
MARK(Out);
if (32 != Bpp)
{
- Output(Out, "LeftCount = ((ULONG_PTR) DestBase >> 1) &
0x01;\n");
+ if (8 < Bpp)
+ {
+ Output(Out, "LeftCount = ((ULONG_PTR) DestBase >> 1) &
0x01;\n");
+ }
+ else
+ {
+ Output(Out, "LeftCount = (ULONG_PTR) DestBase & 0x03;\n");
+ Output(Out, "if (BltInfo->DestRect.right -
BltInfo->DestRect.left < "
+ "LeftCount)\n");
+ Output(Out, "{\n");
+ Output(Out, "LeftCount = BltInfo->DestRect.right - "
+ "BltInfo->DestRect.left;\n");
+ Output(Out, "}\n");
+ }
Output(Out, "CenterCount = (BltInfo->DestRect.right -
BltInfo->DestRect.left -\n");
- Output(Out, " LeftCount) / 2;\n");
+ Output(Out, " LeftCount) / %u;\n", 32 / Bpp);
Output(Out, "RightCount = (BltInfo->DestRect.right -
BltInfo->DestRect.left -\n");
- Output(Out, " LeftCount - 2 * CenterCount);\n");
+ Output(Out, " LeftCount - %u * CenterCount);\n", 32
/ Bpp);
}
else
{
@@ -461,6 +479,36 @@
}
static void
+CreateSetSinglePixel(FILE *Out, unsigned Bpp, PROPINFO RopInfo, int
Flags,
+ unsigned SourceBpp)
+{
+ if (RopInfo->UsesSource && 0 == (Flags & FLAG_FORCENOUSESSOURCE))
+ {
+ CreateGetSource(Out, Bpp, RopInfo, Flags, SourceBpp, 0);
+ MARK(Out);
+ }
+ if (RopInfo->UsesPattern && 0 != (Flags & FLAG_PATTERNSURFACE))
+ {
+ Output(Out, "Pattern = DIB_GetSource(BltInfo->PatternSurface,
PatternX, PatternY, BltInfo->XlatePatternToDest);\n");
+ Output(Out, "if (BltInfo->PatternSurface->sizlBitmap.cx <=
++PatternX)\n");
+ Output(Out, "{\n");
+ Output(Out, "PatternX -=
BltInfo->PatternSurface->sizlBitmap.cx;\n");
+ Output(Out, "}\n");
+ }
+ if ((RopInfo->UsesSource && 0 == (Flags & FLAG_FORCENOUSESSOURCE)
&&
+ Bpp != SourceBpp) ||
+ (RopInfo->UsesPattern && 0 != (Flags & FLAG_PATTERNSURFACE)))
+ {
+ Output(Out, "\n");
+ }
+ CreateOperation(Out, Bpp, RopInfo, SourceBpp, 16);
+ Output(Out, ";\n");
+ MARK(Out);
+ Output(Out, "\n");
+ Output(Out, "DestPtr = (PULONG)((char *) DestPtr + %u);\n", Bpp / 8);
+}
+
+static void
CreateBitCase(FILE *Out, unsigned Bpp, PROPINFO RopInfo, int Flags,
unsigned SourceBpp)
{
@@ -536,33 +584,19 @@
Output(Out, "\n");
if (32 != Bpp)
{
- Output(Out, "if (0 != LeftCount)\n");
- Output(Out, "{\n");
- if (RopInfo->UsesSource && 0 == (Flags &
FLAG_FORCENOUSESSOURCE))
+ if (16 == Bpp)
{
- CreateGetSource(Out, Bpp, RopInfo, Flags |
FLAG_FORCERAWSOURCEAVAIL,
- SourceBpp, 0);
- MARK(Out);
+ Output(Out, "if (0 != LeftCount)\n");
}
- if (RopInfo->UsesPattern && 0 != (Flags &
FLAG_PATTERNSURFACE))
+ else
{
- Output(Out, "Pattern =
DIB_GetSource(BltInfo->PatternSurface, PatternX, PatternY,
BltInfo->XlatePatternToDest);\n");
- Output(Out, "if (BltInfo->PatternSurface->sizlBitmap.cx
<= ++PatternX)\n");
- Output(Out, "{\n");
- Output(Out, "PatternX -=
BltInfo->PatternSurface->sizlBitmap.cx;\n");
- Output(Out, "}\n");
+ Output(Out, "for (i = 0; i < LeftCount; i++)\n");
}
- if ((RopInfo->UsesSource && 0 == (Flags &
FLAG_FORCENOUSESSOURCE) &&
- Bpp != SourceBpp) ||
- (RopInfo->UsesPattern && 0 != (Flags &
FLAG_PATTERNSURFACE)))
- {
- Output(Out, "\n");
- }
- CreateOperation(Out, Bpp, RopInfo, SourceBpp, 16);
- Output(Out, ";\n");
+ Output(Out, "{\n");
+ CreateSetSinglePixel(Out, Bpp, RopInfo,
+ (16 == Bpp ? Flags |
FLAG_FORCERAWSOURCEAVAIL :
+ Flags), SourceBpp);
MARK(Out);
- Output(Out, "\n");
- Output(Out, "DestPtr = (PULONG)((char *) DestPtr + 2);\n");
Output(Out, "}\n");
Output(Out, "\n");
}
@@ -606,24 +640,16 @@
Output(Out, "\n");
if (32 != Bpp)
{
- Output(Out, "if (0 != RightCount)\n");
- Output(Out, "{\n");
- if (RopInfo->UsesSource && 0 == (Flags &
FLAG_FORCENOUSESSOURCE))
+ if (16 == Bpp)
{
- CreateGetSource(Out, Bpp, RopInfo, Flags, SourceBpp, 0);
- MARK(Out);
+ Output(Out, "if (0 != RightCount)\n");
}
- if (RopInfo->UsesPattern && 0 != (Flags &
FLAG_PATTERNSURFACE))
+ else
{
- Output(Out, "Pattern =
DIB_GetSource(BltInfo->PatternSurface, PatternX, PatternY,
BltInfo->XlatePatternToDest);\n");
+ Output(Out, "for (i = 0; i < RightCount; i++)\n");
}
- if ((RopInfo->UsesSource && 0 == (Flags &
FLAG_FORCENOUSESSOURCE)) ||
- (RopInfo->UsesPattern && 0 != (Flags &
FLAG_PATTERNSURFACE)))
- {
- Output(Out, "\n");
- }
- CreateOperation(Out, Bpp, RopInfo, SourceBpp, 16);
- Output(Out, ";\n");
+ Output(Out, "{\n");
+ CreateSetSinglePixel(Out, Bpp, RopInfo, Flags, SourceBpp);
MARK(Out);
Output(Out, "}\n");
Output(Out, "\n");
@@ -998,7 +1024,7 @@
{
unsigned Index;
static unsigned DestBpp[] =
- { 16, 32 };
+ { 8, 16, 32 };
for (Index = 0; Index < sizeof(DestBpp) / sizeof(DestBpp[0]);
Index++)
{
_____
Modified: trunk/reactos/tools/gendib/gendib.mak
--- trunk/reactos/tools/gendib/gendib.mak 2005-08-19 19:05:59 UTC
(rev 17440)
+++ trunk/reactos/tools/gendib/gendib.mak 2005-08-19 20:56:01 UTC
(rev 17441)
@@ -44,8 +44,9 @@
GENDIB_DIB_DIR = subsys$(SEP)win32k$(SEP)dib
GENDIB_DIB_FILES = \
+ $(GENDIB_DIB_DIR)$(SEP)dib32gen.c \
$(GENDIB_DIB_DIR)$(SEP)dib16gen.c \
- $(GENDIB_DIB_DIR)$(SEP)dib32gen.c
+ $(GENDIB_DIB_DIR)$(SEP)dib8gen.c
$(GENDIB_DIB_FILES): $(GENDIB_TARGET)
$(ECHO_GENDIB)