mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 17:44:45 +00:00
Add generation of 32bpp DIB code
svn path=/trunk/; revision=17429
This commit is contained in:
parent
106794e0ab
commit
a6b62e7c0d
5 changed files with 158 additions and 461 deletions
|
@ -129,12 +129,6 @@ BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIP
|
||||||
BOOLEAN DIB_32BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG);
|
BOOLEAN DIB_32BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULONG);
|
||||||
BOOLEAN DIB_32BPP_ColorFill(SURFOBJ*, RECTL*, ULONG);
|
BOOLEAN DIB_32BPP_ColorFill(SURFOBJ*, RECTL*, ULONG);
|
||||||
|
|
||||||
BOOLEAN FASTCALL DIB_32DstInvert(PBLTINFO);
|
|
||||||
|
|
||||||
BOOLEAN FASTCALL DIB32_SrcPaint(PBLTINFO);
|
|
||||||
BOOLEAN FASTCALL DIB32_NotSrcErase(PBLTINFO);
|
|
||||||
BOOLEAN FASTCALL DIB32_SrcErase(PBLTINFO);
|
|
||||||
|
|
||||||
extern unsigned char notmask[2];
|
extern unsigned char notmask[2];
|
||||||
extern unsigned char altnotmask[2];
|
extern unsigned char altnotmask[2];
|
||||||
#define MASK1BPP(x) (1<<(7-((x)&7)))
|
#define MASK1BPP(x) (1<<(7-((x)&7)))
|
||||||
|
|
|
@ -325,381 +325,6 @@ DIB_32BPP_BitBltSrcCopy(PBLTINFO BltInfo)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOLEAN
|
|
||||||
DIB_32BPP_BitBlt(PBLTINFO BltInfo)
|
|
||||||
{
|
|
||||||
ULONG DestX, DestY;
|
|
||||||
ULONG SourceX, SourceY;
|
|
||||||
ULONG PatternY = 0, PatternX = 0, orgPatternX = 0;
|
|
||||||
ULONG Source = 0, Pattern = 0;
|
|
||||||
BOOL UsesSource;
|
|
||||||
BOOL UsesPattern;
|
|
||||||
PULONG DestBits;
|
|
||||||
ULONG Delta;
|
|
||||||
|
|
||||||
switch (BltInfo->Rop4)
|
|
||||||
{
|
|
||||||
case ROP4_DSTINVERT:
|
|
||||||
return DIB_32DstInvert(BltInfo);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ROP4_SRCPAINT:
|
|
||||||
return DIB32_SrcPaint(BltInfo);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ROP4_NOTSRCERASE:
|
|
||||||
return DIB32_NotSrcErase(BltInfo);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ROP4_SRCERASE:
|
|
||||||
return DIB32_SrcErase(BltInfo);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
UsesSource = ROP4_USES_SOURCE(BltInfo->Rop4);
|
|
||||||
UsesPattern = ROP4_USES_PATTERN(BltInfo->Rop4);
|
|
||||||
|
|
||||||
SourceY = BltInfo->SourcePoint.y;
|
|
||||||
DestBits = (PULONG)((PBYTE)BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.left << 2) +
|
|
||||||
BltInfo->DestRect.top * BltInfo->DestSurface->lDelta);
|
|
||||||
|
|
||||||
Delta = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) << 2);
|
|
||||||
|
|
||||||
if ((UsesSource) && (BltInfo->PatternSurface))
|
|
||||||
{
|
|
||||||
if (UsesPattern)
|
|
||||||
{
|
|
||||||
PatternY = (BltInfo->DestRect.top + BltInfo->BrushOrigin.y) %
|
|
||||||
BltInfo->PatternSurface->sizlBitmap.cy;
|
|
||||||
}
|
|
||||||
|
|
||||||
orgPatternX = (BltInfo->DestRect.left + BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx;
|
|
||||||
|
|
||||||
|
|
||||||
for (DestY = BltInfo->DestRect.top; DestY < BltInfo->DestRect.bottom; DestY++)
|
|
||||||
{
|
|
||||||
SourceX = BltInfo->SourcePoint.x;
|
|
||||||
|
|
||||||
PatternX = orgPatternX;
|
|
||||||
|
|
||||||
for (DestX = BltInfo->DestRect.left; DestX < BltInfo->DestRect.right; DestX++, DestBits++, SourceX++)
|
|
||||||
{
|
|
||||||
|
|
||||||
Source = DIB_GetSource(BltInfo->SourceSurface, SourceX, SourceY, BltInfo->XlateSourceToDest);
|
|
||||||
|
|
||||||
Pattern = DIB_GetSource(BltInfo->PatternSurface, PatternX, PatternY, BltInfo->XlatePatternToDest);
|
|
||||||
|
|
||||||
*DestBits = DIB_DoRop(BltInfo->Rop4, *DestBits, Source, Pattern);
|
|
||||||
|
|
||||||
PatternX++;
|
|
||||||
PatternX %= BltInfo->PatternSurface->sizlBitmap.cx;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
SourceY++;
|
|
||||||
|
|
||||||
PatternY++;
|
|
||||||
PatternY %= BltInfo->PatternSurface->sizlBitmap.cy;
|
|
||||||
|
|
||||||
DestBits = (PULONG)((ULONG_PTR)DestBits + Delta);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else if ((UsesSource) && (!BltInfo->PatternSurface))
|
|
||||||
{
|
|
||||||
if (UsesPattern)
|
|
||||||
{
|
|
||||||
Pattern = BltInfo->Brush->iSolidColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (DestY = BltInfo->DestRect.top; DestY < BltInfo->DestRect.bottom; DestY++)
|
|
||||||
{
|
|
||||||
SourceX = BltInfo->SourcePoint.x;
|
|
||||||
|
|
||||||
for (DestX = BltInfo->DestRect.left; DestX < BltInfo->DestRect.right; DestX++, DestBits++, SourceX++)
|
|
||||||
{
|
|
||||||
Source = DIB_GetSource(BltInfo->SourceSurface, SourceX, SourceY, BltInfo->XlateSourceToDest);
|
|
||||||
|
|
||||||
*DestBits = DIB_DoRop(BltInfo->Rop4, *DestBits, Source, Pattern);
|
|
||||||
}
|
|
||||||
|
|
||||||
SourceY++;
|
|
||||||
DestBits = (PULONG)((ULONG_PTR)DestBits + Delta);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else if ((!UsesSource) && (BltInfo->PatternSurface))
|
|
||||||
{
|
|
||||||
if (UsesPattern)
|
|
||||||
{
|
|
||||||
PatternY = (BltInfo->DestRect.top + BltInfo->BrushOrigin.y) %
|
|
||||||
BltInfo->PatternSurface->sizlBitmap.cy;
|
|
||||||
}
|
|
||||||
|
|
||||||
orgPatternX = (BltInfo->DestRect.left + BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx;
|
|
||||||
|
|
||||||
for (DestY = BltInfo->DestRect.top; DestY < BltInfo->DestRect.bottom; DestY++)
|
|
||||||
{
|
|
||||||
|
|
||||||
PatternX = orgPatternX;
|
|
||||||
|
|
||||||
for (DestX = BltInfo->DestRect.left; DestX < BltInfo->DestRect.right; DestX++, DestBits++)
|
|
||||||
{
|
|
||||||
|
|
||||||
Pattern = DIB_GetSource(BltInfo->PatternSurface, PatternX, PatternY, BltInfo->XlatePatternToDest);
|
|
||||||
*DestBits = DIB_DoRop(BltInfo->Rop4, *DestBits, 0, Pattern);
|
|
||||||
|
|
||||||
PatternX++;
|
|
||||||
PatternX %= BltInfo->PatternSurface->sizlBitmap.cx;
|
|
||||||
}
|
|
||||||
|
|
||||||
PatternY++;
|
|
||||||
PatternY %= BltInfo->PatternSurface->sizlBitmap.cy;
|
|
||||||
|
|
||||||
DestBits = (PULONG)((ULONG_PTR)DestBits + Delta);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((!UsesSource) && (!BltInfo->PatternSurface))
|
|
||||||
{
|
|
||||||
|
|
||||||
if (UsesPattern)
|
|
||||||
{
|
|
||||||
Pattern = BltInfo->Brush->iSolidColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (DestY = BltInfo->DestRect.top; DestY < BltInfo->DestRect.bottom; DestY++)
|
|
||||||
{
|
|
||||||
|
|
||||||
for (DestX = BltInfo->DestRect.left; DestX < BltInfo->DestRect.right; DestX++, DestBits++)
|
|
||||||
{
|
|
||||||
*DestBits = DIB_DoRop(BltInfo->Rop4, *DestBits, 0, Pattern);
|
|
||||||
}
|
|
||||||
|
|
||||||
DestBits = (PULONG)((ULONG_PTR)DestBits + Delta);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Optimize functions for bitblt */
|
|
||||||
|
|
||||||
BOOLEAN
|
|
||||||
FASTCALL
|
|
||||||
DIB_32DstInvert(PBLTINFO BltInfo)
|
|
||||||
{
|
|
||||||
ULONG DestX, DestY;
|
|
||||||
PULONG DestBits;
|
|
||||||
|
|
||||||
ULONG bottom = BltInfo->DestRect.bottom;
|
|
||||||
ULONG right = BltInfo->DestRect.right;
|
|
||||||
ULONG delta = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) <<2) ;
|
|
||||||
|
|
||||||
DestBits = (PULONG)((PBYTE)BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.left << 2) +
|
|
||||||
BltInfo->DestRect.top * BltInfo->DestSurface->lDelta);
|
|
||||||
|
|
||||||
for (DestY = BltInfo->DestRect.top; DestY < bottom; DestY++)
|
|
||||||
{
|
|
||||||
for (DestX = BltInfo->DestRect.left; DestX < right; DestX++, DestBits++)
|
|
||||||
{
|
|
||||||
*DestBits = ~*DestBits ;
|
|
||||||
}
|
|
||||||
|
|
||||||
DestBits = (PULONG)((ULONG_PTR)DestBits + delta);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Return TRUE */
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOLEAN
|
|
||||||
FASTCALL
|
|
||||||
DIB32_SrcErase(PBLTINFO BltInfo)
|
|
||||||
{
|
|
||||||
BOOLEAN status = FALSE;
|
|
||||||
|
|
||||||
switch (BltInfo->SourceSurface->iBitmapFormat)
|
|
||||||
{
|
|
||||||
case BMF_1BPP:
|
|
||||||
case BMF_4BPP:
|
|
||||||
case BMF_16BPP:
|
|
||||||
case BMF_24BPP:
|
|
||||||
case BMF_32BPP:
|
|
||||||
{
|
|
||||||
ULONG DestX, DestY;
|
|
||||||
ULONG SourceX, SourceY;
|
|
||||||
PULONG DestBits;
|
|
||||||
|
|
||||||
ULONG bottom = BltInfo->DestRect.bottom;
|
|
||||||
ULONG right = BltInfo->DestRect.right;
|
|
||||||
ULONG delta = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) <<2) ;
|
|
||||||
|
|
||||||
DestBits = (PULONG)((PBYTE)BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.left << 2) +
|
|
||||||
BltInfo->DestRect.top * BltInfo->DestSurface->lDelta);
|
|
||||||
|
|
||||||
SourceY = BltInfo->SourcePoint.y;
|
|
||||||
|
|
||||||
for (DestY = BltInfo->DestRect.top; DestY < bottom; DestY++)
|
|
||||||
{
|
|
||||||
SourceX = BltInfo->SourcePoint.x;
|
|
||||||
for (DestX = BltInfo->DestRect.left; DestX < right; DestX++, DestBits++, SourceX++)
|
|
||||||
{
|
|
||||||
*DestBits = ~(*DestBits & DIB_GetSource(BltInfo->SourceSurface, SourceX,
|
|
||||||
SourceY, BltInfo->XlateSourceToDest));
|
|
||||||
}
|
|
||||||
|
|
||||||
DestBits = (PULONG)((ULONG_PTR)DestBits + delta);
|
|
||||||
SourceY++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
status = TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOLEAN
|
|
||||||
FASTCALL
|
|
||||||
DIB32_NotSrcErase(PBLTINFO BltInfo)
|
|
||||||
{
|
|
||||||
BOOLEAN status = FALSE;
|
|
||||||
|
|
||||||
switch (BltInfo->SourceSurface->iBitmapFormat)
|
|
||||||
{
|
|
||||||
case BMF_1BPP:
|
|
||||||
case BMF_4BPP:
|
|
||||||
case BMF_16BPP:
|
|
||||||
case BMF_24BPP:
|
|
||||||
case BMF_32BPP:
|
|
||||||
{
|
|
||||||
ULONG DestX, DestY;
|
|
||||||
ULONG SourceX, SourceY;
|
|
||||||
PULONG DestBits;
|
|
||||||
|
|
||||||
ULONG bottom = BltInfo->DestRect.bottom;
|
|
||||||
ULONG right = BltInfo->DestRect.right;
|
|
||||||
ULONG delta = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) <<2);
|
|
||||||
|
|
||||||
DestBits = (PULONG)((PBYTE)BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.left << 2) +
|
|
||||||
BltInfo->DestRect.top * BltInfo->DestSurface->lDelta);
|
|
||||||
|
|
||||||
SourceY = BltInfo->SourcePoint.y;
|
|
||||||
|
|
||||||
for (DestY = BltInfo->DestRect.top; DestY < bottom; DestY++)
|
|
||||||
{
|
|
||||||
SourceX = BltInfo->SourcePoint.x;
|
|
||||||
for (DestX = BltInfo->DestRect.left; DestX < right; DestX++, DestBits++, SourceX++)
|
|
||||||
{
|
|
||||||
*DestBits = ~(*DestBits | DIB_GetSource(BltInfo->SourceSurface, SourceX,
|
|
||||||
SourceY, BltInfo->XlateSourceToDest));
|
|
||||||
}
|
|
||||||
|
|
||||||
DestBits = (PULONG)((ULONG_PTR)DestBits + delta);
|
|
||||||
SourceY++;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
status = TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOLEAN
|
|
||||||
FASTCALL
|
|
||||||
DIB32_SrcPaint(PBLTINFO BltInfo)
|
|
||||||
{
|
|
||||||
BOOLEAN status = FALSE;
|
|
||||||
|
|
||||||
switch (BltInfo->SourceSurface->iBitmapFormat)
|
|
||||||
{
|
|
||||||
case BMF_1BPP:
|
|
||||||
case BMF_4BPP:
|
|
||||||
case BMF_16BPP:
|
|
||||||
case BMF_24BPP:
|
|
||||||
{
|
|
||||||
ULONG DestX, DestY;
|
|
||||||
ULONG SourceX, SourceY;
|
|
||||||
PULONG DestBits;
|
|
||||||
|
|
||||||
ULONG bottom = BltInfo->DestRect.bottom;
|
|
||||||
ULONG right = BltInfo->DestRect.right;
|
|
||||||
ULONG delta = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) <<2) ;
|
|
||||||
|
|
||||||
DestBits = (PULONG)((PBYTE)BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.left << 2) +
|
|
||||||
BltInfo->DestRect.top * BltInfo->DestSurface->lDelta);
|
|
||||||
|
|
||||||
SourceY = BltInfo->SourcePoint.y;
|
|
||||||
|
|
||||||
for (DestY = BltInfo->DestRect.top; DestY < bottom; DestY++)
|
|
||||||
{
|
|
||||||
SourceX = BltInfo->SourcePoint.x;
|
|
||||||
for (DestX = BltInfo->DestRect.left; DestX < right; DestX++, DestBits++, SourceX++)
|
|
||||||
{
|
|
||||||
*DestBits = (*DestBits | DIB_GetSource(BltInfo->SourceSurface, SourceX,
|
|
||||||
SourceY, BltInfo->XlateSourceToDest));
|
|
||||||
}
|
|
||||||
|
|
||||||
DestBits = (PULONG)((ULONG_PTR)DestBits + delta);
|
|
||||||
SourceY++;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
status = TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BMF_32BPP:
|
|
||||||
{
|
|
||||||
ULONG DestX, DestY;
|
|
||||||
ULONG SourceX, SourceY;
|
|
||||||
PULONG DestBits;
|
|
||||||
|
|
||||||
ULONG bottom = BltInfo->DestRect.bottom;
|
|
||||||
ULONG right = BltInfo->DestRect.right;
|
|
||||||
ULONG delta = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) <<2) ;
|
|
||||||
|
|
||||||
DestBits = (PULONG)((PBYTE)BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.left << 2) +
|
|
||||||
BltInfo->DestRect.top * BltInfo->DestSurface->lDelta);
|
|
||||||
|
|
||||||
SourceY = BltInfo->SourcePoint.y;
|
|
||||||
|
|
||||||
for (DestY = BltInfo->DestRect.top; DestY < bottom; DestY++)
|
|
||||||
{
|
|
||||||
SourceX = BltInfo->SourcePoint.x;
|
|
||||||
for (DestX = BltInfo->DestRect.left; DestX < right; DestX++, DestBits++, SourceX++)
|
|
||||||
{
|
|
||||||
*DestBits = (*DestBits | DIB_32BPP_GetPixel(BltInfo->SourceSurface, SourceX, SourceY));
|
|
||||||
}
|
|
||||||
|
|
||||||
DestBits = (PULONG)((ULONG_PTR)DestBits + delta);
|
|
||||||
SourceY++;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
status = TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
DIB_32BPP_ColorFill(SURFOBJ* DestSurface, RECTL* DestRect, ULONG color)
|
DIB_32BPP_ColorFill(SURFOBJ* DestSurface, RECTL* DestRect, ULONG color)
|
||||||
{
|
{
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
<file>dib16gen.c</file>
|
<file>dib16gen.c</file>
|
||||||
<file>dib24bpp.c</file>
|
<file>dib24bpp.c</file>
|
||||||
<file>dib32bpp.c</file>
|
<file>dib32bpp.c</file>
|
||||||
|
<file>dib32gen.c</file>
|
||||||
<file>dib.c</file>
|
<file>dib.c</file>
|
||||||
</directory>
|
</directory>
|
||||||
<directory name="eng">
|
<directory name="eng">
|
||||||
|
|
|
@ -423,7 +423,14 @@ CreateGetSource(FILE *Out, unsigned Bpp, PROPINFO RopInfo, int Flags,
|
||||||
Output(Out, ") & 0x%x)", (1 << SourceBpp) - 1);
|
Output(Out, ") & 0x%x)", (1 << SourceBpp) - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Output(Out, " & 0xffff)%s;\n", After);
|
if (32 == Bpp)
|
||||||
|
{
|
||||||
|
Output(Out, ")%s;\n", After);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Output(Out, " & 0x%x)%s;\n", (1 << Bpp) - 1, After);
|
||||||
|
}
|
||||||
if (SourceBpp <= 16)
|
if (SourceBpp <= 16)
|
||||||
{
|
{
|
||||||
Output(Out, "SourcePixels--;\n");
|
Output(Out, "SourcePixels--;\n");
|
||||||
|
@ -436,20 +443,29 @@ CreateGetSource(FILE *Out, unsigned Bpp, PROPINFO RopInfo, int Flags,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
CreateCounts(FILE *Out)
|
CreateCounts(FILE *Out, unsigned Bpp)
|
||||||
{
|
{
|
||||||
MARK(Out);
|
MARK(Out);
|
||||||
Output(Out, "LeftCount = ((ULONG_PTR) DestBase >> 1) & 0x01;\n");
|
if (32 != Bpp)
|
||||||
Output(Out, "CenterCount = (BltInfo->DestRect.right - BltInfo->DestRect.left -\n");
|
{
|
||||||
Output(Out, " LeftCount) / 2;\n");
|
Output(Out, "LeftCount = ((ULONG_PTR) DestBase >> 1) & 0x01;\n");
|
||||||
Output(Out, "RightCount = (BltInfo->DestRect.right - BltInfo->DestRect.left -\n");
|
Output(Out, "CenterCount = (BltInfo->DestRect.right - BltInfo->DestRect.left -\n");
|
||||||
Output(Out, " LeftCount - 2 * CenterCount);\n");
|
Output(Out, " LeftCount) / 2;\n");
|
||||||
|
Output(Out, "RightCount = (BltInfo->DestRect.right - BltInfo->DestRect.left -\n");
|
||||||
|
Output(Out, " LeftCount - 2 * CenterCount);\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Output(Out, "CenterCount = BltInfo->DestRect.right - BltInfo->DestRect.left;\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
unsigned Partial;
|
||||||
|
|
||||||
MARK(Out);
|
MARK(Out);
|
||||||
if (RopInfo->UsesSource)
|
if (RopInfo->UsesSource)
|
||||||
{
|
{
|
||||||
|
@ -458,7 +474,7 @@ CreateBitCase(FILE *Out, unsigned Bpp, PROPINFO RopInfo, int Flags,
|
||||||
CreateBase(Out, 1, Flags, SourceBpp);
|
CreateBase(Out, 1, Flags, SourceBpp);
|
||||||
}
|
}
|
||||||
CreateBase(Out, 0, Flags, Bpp);
|
CreateBase(Out, 0, Flags, Bpp);
|
||||||
CreateCounts(Out);
|
CreateCounts(Out, Bpp);
|
||||||
MARK(Out);
|
MARK(Out);
|
||||||
}
|
}
|
||||||
if (RopInfo->UsesPattern && 0 != (Flags & FLAG_PATTERNSURFACE))
|
if (RopInfo->UsesPattern && 0 != (Flags & FLAG_PATTERNSURFACE))
|
||||||
|
@ -518,56 +534,67 @@ CreateBitCase(FILE *Out, unsigned Bpp, PROPINFO RopInfo, int Flags,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Output(Out, "\n");
|
Output(Out, "\n");
|
||||||
Output(Out, "if (0 != LeftCount)\n");
|
if (32 != Bpp)
|
||||||
Output(Out, "{\n");
|
|
||||||
if (RopInfo->UsesSource && 0 == (Flags & FLAG_FORCENOUSESSOURCE))
|
|
||||||
{
|
{
|
||||||
CreateGetSource(Out, Bpp, RopInfo, Flags | FLAG_FORCERAWSOURCEAVAIL,
|
Output(Out, "if (0 != LeftCount)\n");
|
||||||
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, "{\n");
|
||||||
Output(Out, "PatternX -= BltInfo->PatternSurface->sizlBitmap.cx;\n");
|
if (RopInfo->UsesSource && 0 == (Flags & FLAG_FORCENOUSESSOURCE))
|
||||||
|
{
|
||||||
|
CreateGetSource(Out, Bpp, RopInfo, Flags | FLAG_FORCERAWSOURCEAVAIL,
|
||||||
|
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 + 2);\n");
|
||||||
Output(Out, "}\n");
|
Output(Out, "}\n");
|
||||||
}
|
|
||||||
if ((RopInfo->UsesSource && 0 == (Flags & FLAG_FORCENOUSESSOURCE) &&
|
|
||||||
Bpp != SourceBpp) ||
|
|
||||||
(RopInfo->UsesPattern && 0 != (Flags & FLAG_PATTERNSURFACE)))
|
|
||||||
{
|
|
||||||
Output(Out, "\n");
|
Output(Out, "\n");
|
||||||
}
|
}
|
||||||
CreateOperation(Out, Bpp, RopInfo, SourceBpp, 16);
|
|
||||||
Output(Out, ";\n");
|
|
||||||
MARK(Out);
|
|
||||||
Output(Out, "\n");
|
|
||||||
Output(Out, "DestPtr = (PULONG)((char *) DestPtr + 2);\n");
|
|
||||||
Output(Out, "}\n");
|
|
||||||
Output(Out, "\n");
|
|
||||||
Output(Out, "for (i = 0; i < CenterCount; i++)\n");
|
Output(Out, "for (i = 0; i < CenterCount; i++)\n");
|
||||||
Output(Out, "{\n");
|
Output(Out, "{\n");
|
||||||
if (RopInfo->UsesSource && 0 == (Flags & FLAG_FORCENOUSESSOURCE))
|
if (RopInfo->UsesSource && 0 == (Flags & FLAG_FORCENOUSESSOURCE))
|
||||||
{
|
{
|
||||||
CreateGetSource(Out, Bpp, RopInfo, Flags, SourceBpp, 0);
|
for (Partial = 0; Partial < 32 / Bpp; Partial++)
|
||||||
CreateGetSource(Out, Bpp, RopInfo, Flags, SourceBpp, 16);
|
{
|
||||||
MARK(Out);
|
CreateGetSource(Out, Bpp, RopInfo, Flags, SourceBpp,
|
||||||
|
Partial * Bpp);
|
||||||
|
MARK(Out);
|
||||||
|
}
|
||||||
Output(Out, "\n");
|
Output(Out, "\n");
|
||||||
}
|
}
|
||||||
if (RopInfo->UsesPattern && 0 != (Flags & FLAG_PATTERNSURFACE))
|
if (RopInfo->UsesPattern && 0 != (Flags & FLAG_PATTERNSURFACE))
|
||||||
{
|
{
|
||||||
Output(Out, "Pattern = DIB_GetSource(BltInfo->PatternSurface, PatternX, PatternY, BltInfo->XlatePatternToDest);\n");
|
for (Partial = 0; Partial < 32 / Bpp; Partial++)
|
||||||
Output(Out, "if (BltInfo->PatternSurface->sizlBitmap.cx <= ++PatternX)\n");
|
{
|
||||||
Output(Out, "{\n");
|
if (0 == Partial)
|
||||||
Output(Out, "PatternX -= BltInfo->PatternSurface->sizlBitmap.cx;\n");
|
{
|
||||||
Output(Out, "}\n");
|
Output(Out, "Pattern = DIB_GetSource(BltInfo->PatternSurface, PatternX, PatternY, BltInfo->XlatePatternToDest);\n");
|
||||||
Output(Out, "Pattern |= DIB_GetSource(BltInfo->PatternSurface, PatternX, PatternY, BltInfo->XlatePatternToDest) << 16;\n");
|
}
|
||||||
Output(Out, "if (BltInfo->PatternSurface->sizlBitmap.cx <= ++PatternX)\n");
|
else
|
||||||
Output(Out, "{\n");
|
{
|
||||||
Output(Out, "PatternX -= BltInfo->PatternSurface->sizlBitmap.cx;\n");
|
Output(Out, "Pattern |= DIB_GetSource(BltInfo->PatternSurface, PatternX, PatternY, BltInfo->XlatePatternToDest) << %u;\n", Partial * Bpp);
|
||||||
Output(Out, "}\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, "\n");
|
Output(Out, "\n");
|
||||||
}
|
}
|
||||||
CreateOperation(Out, Bpp, RopInfo, SourceBpp, 32);
|
CreateOperation(Out, Bpp, RopInfo, SourceBpp, 32);
|
||||||
|
@ -577,27 +604,30 @@ CreateBitCase(FILE *Out, unsigned Bpp, PROPINFO RopInfo, int Flags,
|
||||||
Output(Out, "DestPtr++;\n");
|
Output(Out, "DestPtr++;\n");
|
||||||
Output(Out, "}\n");
|
Output(Out, "}\n");
|
||||||
Output(Out, "\n");
|
Output(Out, "\n");
|
||||||
Output(Out, "if (0 != RightCount)\n");
|
if (32 != Bpp)
|
||||||
Output(Out, "{\n");
|
|
||||||
if (RopInfo->UsesSource && 0 == (Flags & FLAG_FORCENOUSESSOURCE))
|
|
||||||
{
|
{
|
||||||
CreateGetSource(Out, Bpp, RopInfo, Flags, SourceBpp, 0);
|
Output(Out, "if (0 != RightCount)\n");
|
||||||
|
Output(Out, "{\n");
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
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");
|
||||||
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");
|
Output(Out, "\n");
|
||||||
}
|
}
|
||||||
CreateOperation(Out, Bpp, RopInfo, SourceBpp, 16);
|
|
||||||
Output(Out, ";\n");
|
|
||||||
MARK(Out);
|
|
||||||
Output(Out, "}\n");
|
|
||||||
Output(Out, "\n");
|
|
||||||
if (RopInfo->UsesPattern && 0 != (Flags & FLAG_PATTERNSURFACE))
|
if (RopInfo->UsesPattern && 0 != (Flags & FLAG_PATTERNSURFACE))
|
||||||
{
|
{
|
||||||
if (0 == (Flags & FLAG_BOTTOMUP))
|
if (0 == (Flags & FLAG_BOTTOMUP))
|
||||||
|
@ -716,6 +746,7 @@ static void
|
||||||
CreatePrimitive(FILE *Out, unsigned Bpp, PROPINFO RopInfo)
|
CreatePrimitive(FILE *Out, unsigned Bpp, PROPINFO RopInfo)
|
||||||
{
|
{
|
||||||
int First;
|
int First;
|
||||||
|
unsigned Partial;
|
||||||
|
|
||||||
MARK(Out);
|
MARK(Out);
|
||||||
Output(Out, "\n");
|
Output(Out, "\n");
|
||||||
|
@ -741,12 +772,6 @@ CreatePrimitive(FILE *Out, unsigned Bpp, PROPINFO RopInfo)
|
||||||
{
|
{
|
||||||
Output(Out, "ULONG LineIndex, LineCount;\n");
|
Output(Out, "ULONG LineIndex, LineCount;\n");
|
||||||
Output(Out, "ULONG i;\n");
|
Output(Out, "ULONG i;\n");
|
||||||
#ifdef TODO
|
|
||||||
if (RopInfo->UsesSource)
|
|
||||||
{
|
|
||||||
Output(Out, "ULONG SourceX, SourceY;\n");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (RopInfo->UsesPattern)
|
if (RopInfo->UsesPattern)
|
||||||
{
|
{
|
||||||
Output(Out, "ULONG PatternX =0, PatternY = 0, BasePatternX = 0;\n");
|
Output(Out, "ULONG PatternX =0, PatternY = 0, BasePatternX = 0;\n");
|
||||||
|
@ -775,7 +800,14 @@ CreatePrimitive(FILE *Out, unsigned Bpp, PROPINFO RopInfo)
|
||||||
Output(Out, "ULONG RawSource;\n");
|
Output(Out, "ULONG RawSource;\n");
|
||||||
Output(Out, "unsigned SourcePixels, BaseSourcePixels;\n");
|
Output(Out, "unsigned SourcePixels, BaseSourcePixels;\n");
|
||||||
}
|
}
|
||||||
Output(Out, "ULONG LeftCount, CenterCount, RightCount;\n");
|
if (32 == Bpp)
|
||||||
|
{
|
||||||
|
Output(Out, "ULONG CenterCount;\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Output(Out, "ULONG LeftCount, CenterCount, RightCount;\n");
|
||||||
|
}
|
||||||
if (ROPCODE_GENERIC == RopInfo->RopCode)
|
if (ROPCODE_GENERIC == RopInfo->RopCode)
|
||||||
{
|
{
|
||||||
Output(Out, "BOOLEAN UsesDest, UsesSource, UsesPattern;\n");
|
Output(Out, "BOOLEAN UsesDest, UsesSource, UsesPattern;\n");
|
||||||
|
@ -788,7 +820,7 @@ CreatePrimitive(FILE *Out, unsigned Bpp, PROPINFO RopInfo)
|
||||||
if (! RopInfo->UsesSource)
|
if (! RopInfo->UsesSource)
|
||||||
{
|
{
|
||||||
CreateBase(Out, 0, 0, Bpp);
|
CreateBase(Out, 0, 0, Bpp);
|
||||||
CreateCounts(Out);
|
CreateCounts(Out, Bpp);
|
||||||
MARK(Out);
|
MARK(Out);
|
||||||
}
|
}
|
||||||
Output(Out, "LineCount = BltInfo->DestRect.bottom - BltInfo->DestRect.top;\n");
|
Output(Out, "LineCount = BltInfo->DestRect.bottom - BltInfo->DestRect.top;\n");
|
||||||
|
@ -815,8 +847,26 @@ CreatePrimitive(FILE *Out, unsigned Bpp, PROPINFO RopInfo)
|
||||||
Output(Out, "if (UsesPattern)\n");
|
Output(Out, "if (UsesPattern)\n");
|
||||||
Output(Out, "{\n");
|
Output(Out, "{\n");
|
||||||
}
|
}
|
||||||
Output(Out, "Pattern = BltInfo->Brush->iSolidColor |\n");
|
for (Partial = 0; Partial < 32 / Bpp; Partial++)
|
||||||
Output(Out, " (BltInfo->Brush->iSolidColor << 16);\n");
|
{
|
||||||
|
if (0 == Partial)
|
||||||
|
{
|
||||||
|
Output(Out, "Pattern = BltInfo->Brush->iSolidColor");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Output(Out, " (BltInfo->Brush->iSolidColor << %d)",
|
||||||
|
Partial * Bpp);
|
||||||
|
}
|
||||||
|
if (32 / Bpp <= Partial + 1)
|
||||||
|
{
|
||||||
|
Output(Out, ";\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Output(Out, " |\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
if (ROPCODE_PATINVERT == RopInfo->RopCode ||
|
if (ROPCODE_PATINVERT == RopInfo->RopCode ||
|
||||||
ROPCODE_MERGECOPY == RopInfo->RopCode)
|
ROPCODE_MERGECOPY == RopInfo->RopCode)
|
||||||
{
|
{
|
||||||
|
@ -892,16 +942,29 @@ CreateBitBlt(FILE *Out, unsigned Bpp)
|
||||||
Output(Out, "}\n");
|
Output(Out, "}\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
static void
|
||||||
main(int argc, char *argv[])
|
Generate(char *OutputDir, unsigned Bpp)
|
||||||
{
|
{
|
||||||
FILE *Out;
|
FILE *Out;
|
||||||
unsigned RopCode;
|
unsigned RopCode;
|
||||||
unsigned Bpp;
|
|
||||||
PROPINFO RopInfo;
|
PROPINFO RopInfo;
|
||||||
|
char *FileName;
|
||||||
|
|
||||||
Bpp = 16;
|
FileName = malloc(strlen(OutputDir) + 12);
|
||||||
Out = fopen(argv[1], "w");
|
if (NULL == FileName)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Out of memory\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
strcpy(FileName, OutputDir);
|
||||||
|
if ('/' != FileName[strlen(FileName) - 1])
|
||||||
|
{
|
||||||
|
strcat(FileName, "/");
|
||||||
|
}
|
||||||
|
sprintf(FileName + strlen(FileName), "dib%ugen.c", Bpp);
|
||||||
|
|
||||||
|
Out = fopen(FileName, "w");
|
||||||
|
free(FileName);
|
||||||
if (NULL == Out)
|
if (NULL == Out)
|
||||||
{
|
{
|
||||||
perror("Error opening output file");
|
perror("Error opening output file");
|
||||||
|
@ -928,6 +991,19 @@ main(int argc, char *argv[])
|
||||||
CreateBitBlt(Out, Bpp);
|
CreateBitBlt(Out, Bpp);
|
||||||
|
|
||||||
fclose(Out);
|
fclose(Out);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
unsigned Index;
|
||||||
|
static unsigned DestBpp[] =
|
||||||
|
{ 16, 32 };
|
||||||
|
|
||||||
|
for (Index = 0; Index < sizeof(DestBpp) / sizeof(DestBpp[0]); Index++)
|
||||||
|
{
|
||||||
|
Generate(argv[1], DestBpp[Index]);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,11 +41,12 @@ gendib_clean:
|
||||||
-@$(rm) $(GENDIB_TARGET) $(GENDIB_OBJECTS) 2>$(NUL)
|
-@$(rm) $(GENDIB_TARGET) $(GENDIB_OBJECTS) 2>$(NUL)
|
||||||
clean: gendib_clean
|
clean: gendib_clean
|
||||||
|
|
||||||
GENDIB_16BPP_FILE = subsys$(SEP)win32k$(SEP)dib$(SEP)dib16gen.c
|
GENDIB_DIB_DIR = subsys$(SEP)win32k$(SEP)dib
|
||||||
|
|
||||||
GENDIB_DIB_FILES = \
|
GENDIB_DIB_FILES = \
|
||||||
$(GENDIB_16BPP_FILE)
|
$(GENDIB_DIB_DIR)$(SEP)dib16gen.c \
|
||||||
|
$(GENDIB_DIB_DIR)$(SEP)dib32gen.c
|
||||||
|
|
||||||
$(GENDIB_DIB_FILES): $(GENDIB_TARGET)
|
$(GENDIB_DIB_FILES): $(GENDIB_TARGET)
|
||||||
$(ECHO_GENDIB)
|
$(ECHO_GENDIB)
|
||||||
$(Q)$(GENDIB_TARGET) $(GENDIB_DIB_FILES)
|
$(Q)$(GENDIB_TARGET) $(GENDIB_DIB_DIR)
|
||||||
|
|
Loading…
Reference in a new issue