mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 17:44:45 +00:00
Add generation of 8bpp DIB code
svn path=/trunk/; revision=17441
This commit is contained in:
parent
ceb380247b
commit
927cbf4440
4 changed files with 81 additions and 150 deletions
|
@ -252,114 +252,17 @@ DIB_8BPP_BitBltSrcCopy(PBLTINFO BltInfo)
|
||||||
return TRUE;
|
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 */
|
/* BitBlt Optimize */
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
DIB_8BPP_ColorFill(SURFOBJ* DestSurface, RECTL* DestRect, ULONG color)
|
DIB_8BPP_ColorFill(SURFOBJ* DestSurface, RECTL* DestRect, ULONG color)
|
||||||
{
|
{
|
||||||
ULONG DestY;
|
ULONG DestY;
|
||||||
for (DestY = DestRect->top; DestY< DestRect->bottom; DestY++)
|
for (DestY = DestRect->top; DestY< DestRect->bottom; DestY++)
|
||||||
{
|
{
|
||||||
DIB_8BPP_HLine (DestSurface, DestRect->left, DestRect->right, DestY, color);
|
DIB_8BPP_HLine(DestSurface, DestRect->left, DestRect->right, DestY, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
=======================================
|
=======================================
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
<file>dib1bpp.c</file>
|
<file>dib1bpp.c</file>
|
||||||
<file>dib4bpp.c</file>
|
<file>dib4bpp.c</file>
|
||||||
<file>dib8bpp.c</file>
|
<file>dib8bpp.c</file>
|
||||||
|
<file>dib8gen.c</file>
|
||||||
<file>dib16bpp.c</file>
|
<file>dib16bpp.c</file>
|
||||||
<file>dib16gen.c</file>
|
<file>dib16gen.c</file>
|
||||||
<file>dib24bpp.c</file>
|
<file>dib24bpp.c</file>
|
||||||
|
|
|
@ -263,11 +263,16 @@ CreateOperation(FILE *Out, unsigned Bpp, PROPINFO RopInfo, unsigned SourceBpp,
|
||||||
Cast = "";
|
Cast = "";
|
||||||
Dest = "*DestPtr";
|
Dest = "*DestPtr";
|
||||||
}
|
}
|
||||||
else
|
else if (16 == Bpp)
|
||||||
{
|
{
|
||||||
Cast = "(USHORT) ";
|
Cast = "(USHORT) ";
|
||||||
Dest = "*((PUSHORT) DestPtr)";
|
Dest = "*((PUSHORT) DestPtr)";
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Cast = "(UCHAR) ";
|
||||||
|
Dest = "*((PUCHAR) DestPtr)";
|
||||||
|
}
|
||||||
Output(Out, "%s = ", Dest);
|
Output(Out, "%s = ", Dest);
|
||||||
if (ROPCODE_GENERIC == RopInfo->RopCode)
|
if (ROPCODE_GENERIC == RopInfo->RopCode)
|
||||||
{
|
{
|
||||||
|
@ -448,11 +453,24 @@ CreateCounts(FILE *Out, unsigned Bpp)
|
||||||
MARK(Out);
|
MARK(Out);
|
||||||
if (32 != Bpp)
|
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, "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, "RightCount = (BltInfo->DestRect.right - BltInfo->DestRect.left -\n");
|
||||||
Output(Out, " LeftCount - 2 * CenterCount);\n");
|
Output(Out, " LeftCount - %u * CenterCount);\n", 32 / Bpp);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -460,6 +478,36 @@ CreateCounts(FILE *Out, unsigned Bpp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
static void
|
||||||
CreateBitCase(FILE *Out, unsigned Bpp, PROPINFO RopInfo, int Flags,
|
CreateBitCase(FILE *Out, unsigned Bpp, PROPINFO RopInfo, int Flags,
|
||||||
unsigned SourceBpp)
|
unsigned SourceBpp)
|
||||||
|
@ -536,33 +584,19 @@ CreateBitCase(FILE *Out, unsigned Bpp, PROPINFO RopInfo, int Flags,
|
||||||
Output(Out, "\n");
|
Output(Out, "\n");
|
||||||
if (32 != Bpp)
|
if (32 != Bpp)
|
||||||
{
|
{
|
||||||
Output(Out, "if (0 != LeftCount)\n");
|
if (16 == Bpp)
|
||||||
|
{
|
||||||
|
Output(Out, "if (0 != LeftCount)\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Output(Out, "for (i = 0; i < LeftCount; i++)\n");
|
||||||
|
}
|
||||||
Output(Out, "{\n");
|
Output(Out, "{\n");
|
||||||
if (RopInfo->UsesSource && 0 == (Flags & FLAG_FORCENOUSESSOURCE))
|
CreateSetSinglePixel(Out, Bpp, RopInfo,
|
||||||
{
|
(16 == Bpp ? Flags | FLAG_FORCERAWSOURCEAVAIL :
|
||||||
CreateGetSource(Out, Bpp, RopInfo, Flags | FLAG_FORCERAWSOURCEAVAIL,
|
Flags), SourceBpp);
|
||||||
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);
|
MARK(Out);
|
||||||
Output(Out, "\n");
|
|
||||||
Output(Out, "DestPtr = (PULONG)((char *) DestPtr + 2);\n");
|
|
||||||
Output(Out, "}\n");
|
Output(Out, "}\n");
|
||||||
Output(Out, "\n");
|
Output(Out, "\n");
|
||||||
}
|
}
|
||||||
|
@ -606,24 +640,16 @@ CreateBitCase(FILE *Out, unsigned Bpp, PROPINFO RopInfo, int Flags,
|
||||||
Output(Out, "\n");
|
Output(Out, "\n");
|
||||||
if (32 != Bpp)
|
if (32 != Bpp)
|
||||||
{
|
{
|
||||||
Output(Out, "if (0 != RightCount)\n");
|
if (16 == Bpp)
|
||||||
|
{
|
||||||
|
Output(Out, "if (0 != RightCount)\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Output(Out, "for (i = 0; i < RightCount; i++)\n");
|
||||||
|
}
|
||||||
Output(Out, "{\n");
|
Output(Out, "{\n");
|
||||||
if (RopInfo->UsesSource && 0 == (Flags & FLAG_FORCENOUSESSOURCE))
|
CreateSetSinglePixel(Out, Bpp, RopInfo, Flags, SourceBpp);
|
||||||
{
|
|
||||||
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");
|
|
||||||
}
|
|
||||||
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");
|
|
||||||
MARK(Out);
|
MARK(Out);
|
||||||
Output(Out, "}\n");
|
Output(Out, "}\n");
|
||||||
Output(Out, "\n");
|
Output(Out, "\n");
|
||||||
|
@ -998,7 +1024,7 @@ main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
unsigned Index;
|
unsigned Index;
|
||||||
static unsigned DestBpp[] =
|
static unsigned DestBpp[] =
|
||||||
{ 16, 32 };
|
{ 8, 16, 32 };
|
||||||
|
|
||||||
for (Index = 0; Index < sizeof(DestBpp) / sizeof(DestBpp[0]); Index++)
|
for (Index = 0; Index < sizeof(DestBpp) / sizeof(DestBpp[0]); Index++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -44,8 +44,9 @@ clean: gendib_clean
|
||||||
GENDIB_DIB_DIR = subsys$(SEP)win32k$(SEP)dib
|
GENDIB_DIB_DIR = subsys$(SEP)win32k$(SEP)dib
|
||||||
|
|
||||||
GENDIB_DIB_FILES = \
|
GENDIB_DIB_FILES = \
|
||||||
|
$(GENDIB_DIB_DIR)$(SEP)dib32gen.c \
|
||||||
$(GENDIB_DIB_DIR)$(SEP)dib16gen.c \
|
$(GENDIB_DIB_DIR)$(SEP)dib16gen.c \
|
||||||
$(GENDIB_DIB_DIR)$(SEP)dib32gen.c
|
$(GENDIB_DIB_DIR)$(SEP)dib8gen.c
|
||||||
|
|
||||||
$(GENDIB_DIB_FILES): $(GENDIB_TARGET)
|
$(GENDIB_DIB_FILES): $(GENDIB_TARGET)
|
||||||
$(ECHO_GENDIB)
|
$(ECHO_GENDIB)
|
||||||
|
|
Loading…
Reference in a new issue