89 #define USES_DEST(RopCode) ((((RopCode) & 0xaa) >> 1) != ((RopCode) & 0x55)) 90 #define USES_SOURCE(RopCode) ((((RopCode) & 0xcc) >> 2) != ((RopCode) & 0x33)) 91 #define USES_PATTERN(RopCode) ((((RopCode) & 0xf0) >> 4) != ((RopCode) & 0x0f)) 96 #define MARK(Out) Output((Out), "\n", \ 97 __FUNCTION__, __LINE__); 100 #define ROPCODE_BLACKNESS 0x00 101 #define ROPCODE_NOTSRCERASE 0x11 102 #define ROPCODE_NOTSRCCOPY 0x33 103 #define ROPCODE_SRCERASE 0x44 104 #define ROPCODE_DSTINVERT 0x55 105 #define ROPCODE_PATINVERT 0x5a 106 #define ROPCODE_SRCINVERT 0x66 107 #define ROPCODE_SRCAND 0x88 108 #define ROPCODE_NOOP 0xaa 109 #define ROPCODE_MERGEPAINT 0xbb 110 #define ROPCODE_MERGECOPY 0xc0 111 #define ROPCODE_SRCCOPY 0xcc 112 #define ROPCODE_SRCPAINT 0xee 113 #define ROPCODE_PATCOPY 0xf0 114 #define ROPCODE_PATPAINT 0xfb 115 #define ROPCODE_WHITENESS 0xff 117 #define ROPCODE_GENERIC 256 130 #define FLAG_PATTERNSURFACE 0x01 131 #define FLAG_TRIVIALXLATE 0x02 132 #define FLAG_BOTTOMUP 0x04 133 #define FLAG_FORCENOUSESSOURCE 0x08 134 #define FLAG_FORCERAWSOURCEAVAIL 0x10 161 for (
Index = 0;
Index <
sizeof(KnownCodes) /
sizeof(KnownCodes[0]);
Index++)
163 if (RopCode == KnownCodes[
Index].RopCode)
165 return KnownCodes +
Index;
175 static unsigned Indent = 0;
176 static int AtBOL = 1;
187 for (
n = 0;
n < Indent;
n++)
203 AtBOL =
'\n' == Fmt[
strlen(Fmt) - 1];
215 Output(
Out,
"DIB_%uBPP_BitBlt_Generic", Bpp);
223 Output(
Out,
"static unsigned Shift1Bpp[] =\n");
226 Output(
Out,
"24, 25, 26, 27, 28, 29, 30, 31, 16, 17, 18, 19, 20, 21, 22, 23,\n");
227 Output(
Out,
"8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7\n");
229 Output(
Out,
"static unsigned Shift4Bpp[] =\n");
232 Output(
Out,
"24, 28, 16, 20, 8, 12, 0, 4\n");
234 Output(
Out,
"static unsigned Shift8Bpp[] =\n");
239 Output(
Out,
"static unsigned Shift16Bpp[] =\n");
252 const char *Template;
263 Dest =
"*((PUSHORT) DestPtr)";
268 Dest =
"*((PUCHAR) DestPtr)";
273 Output(
Out,
"%sDIB_DoRop(BltInfo->Rop4, %s, Source, Pattern)",
279 while (
'\0' != *Template)
304 const char *What = (
Source ?
"Source" :
"Dest");
307 Output(
Out,
"%sBase = (char *) BltInfo->%sSurface->pvScan0 +\n", What, What);
312 Output(
Out,
" BltInfo->SourcePoint.y *\n");
316 Output(
Out,
" BltInfo->DestRect.top *\n");
323 Output(
Out,
" (BltInfo->SourcePoint.y +\n");
324 Output(
Out,
" BltInfo->DestRect.bottom -\n");
325 Output(
Out,
" BltInfo->DestRect.top - 1) *\n");
329 Output(
Out,
" (BltInfo->DestRect.bottom - 1) *\n");
332 Output(
Out,
" %sBltInfo->%sSurface->lDelta +\n",
337 16 < Bpp ?
"" :
"((");
358 Output(
Out,
"BaseSourcePixels = %u - (BltInfo->SourcePoint.x & 0x%x);\n",
359 32 / Bpp, 32 / Bpp - 1);
365 unsigned SourceBpp,
unsigned Shift)
367 const char *AssignOp;
392 Output(
Out,
"RawSource = *SourcePtr++;\n");
393 Output(
Out,
"SourcePixels = %u;\n", 32 / SourceBpp);
396 Output(
Out,
"Source %s (%s", AssignOp, Before);
399 Output(
Out,
"XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, %s",
400 16 < SourceBpp ?
"" :
"(");
406 else if (24 == SourceBpp)
408 Output(
Out,
"*(PUSHORT) SourcePtr + (*((PBYTE) SourcePtr + 2) << 16)");
412 Output(
Out,
"RawSource >> Shift%uBpp[SourcePixels]", SourceBpp);
422 Output(
Out,
") & 0x%x)", (1 << SourceBpp) - 1);
431 Output(
Out,
" & 0x%x)%s;\n", (1 << Bpp) - 1, After);
437 else if (24 == SourceBpp)
439 Output(
Out,
"SourcePtr = (PULONG)((char *) SourcePtr + 3);\n");
452 Output(
Out,
"LeftCount = ((ULONG_PTR) DestBase >> 1) & 0x01;\n");
456 Output(
Out,
"LeftCount = (ULONG_PTR) DestBase & 0x03;\n");
457 Output(
Out,
"if ((ULONG)(BltInfo->DestRect.right - BltInfo->DestRect.left) < " 460 Output(
Out,
"LeftCount = BltInfo->DestRect.right - " 461 "BltInfo->DestRect.left;\n");
464 Output(
Out,
"CenterCount = (BltInfo->DestRect.right - BltInfo->DestRect.left -\n");
465 Output(
Out,
" LeftCount) / %u;\n", 32 / Bpp);
466 Output(
Out,
"RightCount = (BltInfo->DestRect.right - BltInfo->DestRect.left -\n");
467 Output(
Out,
" LeftCount - %u * CenterCount);\n", 32 / Bpp);
471 Output(
Out,
"CenterCount = BltInfo->DestRect.right - BltInfo->DestRect.left;\n");
486 Output(
Out,
"Pattern = DIB_GetSourceIndex(BltInfo->PatternSurface, PatternX, PatternY);\n");
487 Output(
Out,
"if (BltInfo->PatternSurface->sizlBitmap.cx <= ++PatternX)\n");
489 Output(
Out,
"PatternX -= BltInfo->PatternSurface->sizlBitmap.cx;\n");
502 Output(
Out,
"DestPtr = (PULONG)((char *) DestPtr + %u);\n", Bpp / 8);
526 Output(
Out,
"PatternY = (BltInfo->DestRect.top - BltInfo->BrushOrigin.y) %%\n");
527 Output(
Out,
" BltInfo->PatternSurface->sizlBitmap.cy;\n");
531 Output(
Out,
"PatternY = (BltInfo->DestRect.bottom - 1 -\n");
532 Output(
Out,
" BltInfo->BrushOrigin.y) %%\n");
533 Output(
Out,
" BltInfo->PatternSurface->sizlBitmap.cy;\n");
539 Output(
Out,
"CenterCount = %u * (BltInfo->DestRect.right -\n", Bpp >> 3);
540 Output(
Out,
" BltInfo->DestRect.left);\n");
544 Output(
Out,
"BasePatternX = (BltInfo->DestRect.left - BltInfo->BrushOrigin.x) %%\n");
545 Output(
Out,
" BltInfo->PatternSurface->sizlBitmap.cx;\n");
548 Output(
Out,
"for (LineIndex = 0; LineIndex < LineCount; LineIndex++)\n");
555 Output(
Out,
"SourcePtr = (PULONG) SourceBase;\n");
558 Output(
Out,
"RawSource = *SourcePtr++;\n");
559 Output(
Out,
"SourcePixels = BaseSourcePixels;\n");
562 Output(
Out,
"DestPtr = (PULONG) DestBase;\n");
567 Output(
Out,
"PatternX = BasePatternX;\n");
573 Output(
Out,
"RtlMoveMemory(DestBase, SourceBase, CenterCount);\n");
587 Output(
Out,
"for (i = 0; i < LeftCount; i++)\n");
597 Output(
Out,
"for (i = 0; i < CenterCount; i++)\n");
601 for (Partial = 0; Partial < 32 / Bpp; Partial++)
611 for (Partial = 0; Partial < 32 / Bpp; Partial++)
615 Output(
Out,
"Pattern = DIB_GetSourceIndex(BltInfo->PatternSurface, PatternX, PatternY);\n");
619 Output(
Out,
"Pattern |= DIB_GetSourceIndex(BltInfo->PatternSurface, PatternX, PatternY) << %u;\n", Partial * Bpp);
621 Output(
Out,
"if (BltInfo->PatternSurface->sizlBitmap.cx <= ++PatternX)\n");
623 Output(
Out,
"PatternX -= BltInfo->PatternSurface->sizlBitmap.cx;\n");
643 Output(
Out,
"for (i = 0; i < RightCount; i++)\n");
655 Output(
Out,
"if (BltInfo->PatternSurface->sizlBitmap.cy <= ++PatternY)\n");
657 Output(
Out,
"PatternY -= BltInfo->PatternSurface->sizlBitmap.cy;\n");
664 Output(
Out,
"PatternY = BltInfo->PatternSurface->sizlBitmap.cy - 1;\n");
671 Output(
Out,
"SourceBase %c= BltInfo->SourceSurface->lDelta;\n",
674 Output(
Out,
"DestBase %c= BltInfo->DestSurface->lDelta;\n",
683 static unsigned SourceBpp[ ] =
684 { 1, 4, 8, 16, 24, 32 };
695 Output(
Out,
"switch (BltInfo->SourceSurface->iBitmapFormat)\n");
698 BppIndex <
sizeof(SourceBpp) /
sizeof(
unsigned);
701 Output(
Out,
"case BMF_%uBPP:\n", SourceBpp[BppIndex]);
703 if (Bpp == SourceBpp[BppIndex])
705 Output(
Out,
"if (NULL == BltInfo->XlateSourceToDest ||\n");
706 Output(
Out,
" 0 != (BltInfo->XlateSourceToDest->flXlate & XO_TRIVIAL))\n");
708 Output(
Out,
"if (BltInfo->DestRect.top < BltInfo->SourcePoint.y)\n");
712 SourceBpp[BppIndex]);
719 SourceBpp[BppIndex]);
725 Output(
Out,
"if (BltInfo->DestRect.top < BltInfo->SourcePoint.y)\n");
734 SourceBpp[BppIndex]);
742 SourceBpp[BppIndex]);
779 Output(
Out,
"DIB_%uBPP_ColorFill(BltInfo->DestSurface, " 780 "&BltInfo->DestRect, 0x0);\n", Bpp);
784 Output(
Out,
"DIB_%uBPP_ColorFill(BltInfo->DestSurface, " 785 "&BltInfo->DestRect, ~0);\n", Bpp);
793 Output(
Out,
"ULONG LineIndex, LineCount;\n");
797 Output(
Out,
"LONG PatternX =0, PatternY = 0, BasePatternX = 0;\n");
821 Output(
Out,
"unsigned SourcePixels, BaseSourcePixels;\n");
829 Output(
Out,
"ULONG LeftCount, CenterCount, RightCount;\n");
833 Output(
Out,
"BOOLEAN UsesSource, UsesPattern;\n");
835 Output(
Out,
"UsesSource = ROP4_USES_SOURCE(BltInfo->Rop4);\n");
836 Output(
Out,
"UsesPattern = ROP4_USES_PATTERN(BltInfo->Rop4);\n");
845 Output(
Out,
"LineCount = BltInfo->DestRect.bottom - BltInfo->DestRect.top;\n");
852 Output(
Out,
"if (UsesPattern && NULL != BltInfo->PatternSurface)\n");
856 Output(
Out,
"if (NULL != BltInfo->PatternSurface)\n");
869 for (Partial = 0; Partial < 32 / Bpp; Partial++)
879 Output(
Out,
"Pattern = BltInfo->Brush->iSolidColor");
883 Output(
Out,
" (BltInfo->Brush->iSolidColor << %d)",
886 if (32 / Bpp <= Partial + 1)
903 Output(
Out,
"DIB_%uBPP_ColorFill(BltInfo->DestSurface, " 904 "&BltInfo->DestRect, 0x0);\n", Bpp);
913 Output(
Out,
"DIB_%uBPP_ColorFill(BltInfo->DestSurface, " 914 "&BltInfo->DestRect, ~0);\n", Bpp);
942 Output(
Out,
"static void (*PrimitivesTable[256])(PBLTINFO) =\n");
944 for (RopCode = 0; RopCode < 256; RopCode++)
962 Output(
Out,
"DIB_%uBPP_BitBlt(PBLTINFO BltInfo)\n", Bpp);
964 Output(
Out,
"PrimitivesTable[BltInfo->Rop4 & 0xff](BltInfo);\n");
995 perror(
"Error opening output file");
1000 Output(
Out,
"/* This is a generated file. Please do not edit */\n");
1007 for (RopCode = 0; RopCode < 256; RopCode++)
1010 if (
NULL != RopInfo)
1025 static unsigned DestBpp[] =
1031 for (
Index = 0;
Index <
sizeof(DestBpp) /
sizeof(DestBpp[0]);
Index++)
#define ROPCODE_MERGEPAINT
int main(int argc, char *argv[])
char * strcat(char *DstString, const char *SrcString)
static void CreateOperation(FILE *Out, unsigned Bpp, PROPINFO RopInfo, unsigned SourceBpp, unsigned Bits)
ACPI_SIZE strlen(const char *String)
static void CreatePrimitive(FILE *Out, unsigned Bpp, PROPINFO RopInfo)
static void CreateBase(FILE *Out, int Source, int Flags, unsigned Bpp)
static void CreateCounts(FILE *Out, unsigned Bpp)
static void CreateBitCase(FILE *Out, unsigned Bpp, PROPINFO RopInfo, int Flags, unsigned SourceBpp)
static void CreateActionBlock(FILE *Out, unsigned Bpp, PROPINFO RopInfo, int Flags)
#define FLAG_FORCENOUSESSOURCE
#define sprintf(buf, format,...)
#define FLAG_PATTERNSURFACE
static void CreateShiftTables(FILE *Out)
static void CreateGetSource(FILE *Out, unsigned Bpp, PROPINFO RopInfo, int Flags, unsigned SourceBpp, unsigned Shift)
_CRTIMP void __cdecl perror(_In_opt_z_ const char *_ErrMsg)
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
static void Generate(char *OutputDir, unsigned Bpp)
#define ROPCODE_NOTSRCERASE
#define ROPCODE_NOTSRCCOPY
#define ROPCODE_BLACKNESS
_Check_return_opt_ _CRTIMP int __cdecl putc(_In_ int _Ch, _Inout_ FILE *_File)
_Must_inspect_result_ _In_ ULONG Flags
_In_ WDFCOLLECTION _In_ ULONG Index
static void Output(FILE *Out, const char *Fmt,...)
#define ROPCODE_MERGECOPY
#define ROPCODE_PATINVERT
static void PrintRoutineName(FILE *Out, unsigned Bpp, PROPINFO RopInfo)
#define FLAG_FORCERAWSOURCEAVAIL
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
struct _FileName FileName
#define FLAG_TRIVIALXLATE
#define ROPCODE_WHITENESS
#define ROPCODE_DSTINVERT
#define ROPCODE_SRCINVERT
char * strchr(const char *String, int ch)
static void CreateSetSinglePixel(FILE *Out, unsigned Bpp, PROPINFO RopInfo, int Flags, unsigned SourceBpp)
char * strcpy(char *DstString, const char *SrcString)
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
static PROPINFO FindRopInfo(unsigned RopCode)
static void CreateBitBlt(FILE *Out, unsigned Bpp)
static void CreateTable(FILE *Out, unsigned Bpp)
_Check_return_opt_ _CRTIMP int __cdecl vfprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format, va_list _ArgList)
struct _ROPINFO * PROPINFO