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), "/* Generated by %s line %d*/\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++)
char * strcat(char *DstString, const char *SrcString)
ACPI_SIZE strlen(const char *String)
char * strcpy(char *DstString, const char *SrcString)
char * strchr(const char *String, int ch)
struct _FileName FileName
#define FLAG_FORCERAWSOURCEAVAIL
#define ROPCODE_NOTSRCCOPY
static void CreateSetSinglePixel(FILE *Out, unsigned Bpp, PROPINFO RopInfo, int Flags, unsigned SourceBpp)
static void CreateGetSource(FILE *Out, unsigned Bpp, PROPINFO RopInfo, int Flags, unsigned SourceBpp, unsigned Shift)
#define FLAG_PATTERNSURFACE
struct _ROPINFO * PROPINFO
static void CreateOperation(FILE *Out, unsigned Bpp, PROPINFO RopInfo, unsigned SourceBpp, unsigned Bits)
static void CreateCounts(FILE *Out, unsigned Bpp)
#define ROPCODE_PATINVERT
static void CreateActionBlock(FILE *Out, unsigned Bpp, PROPINFO RopInfo, int Flags)
static void CreatePrimitive(FILE *Out, unsigned Bpp, PROPINFO RopInfo)
static void CreateBase(FILE *Out, int Source, int Flags, unsigned Bpp)
#define ROPCODE_SRCINVERT
static void CreateTable(FILE *Out, unsigned Bpp)
#define FLAG_FORCENOUSESSOURCE
#define ROPCODE_MERGEPAINT
#define FLAG_TRIVIALXLATE
static PROPINFO FindRopInfo(unsigned RopCode)
#define ROPCODE_WHITENESS
static void CreateBitBlt(FILE *Out, unsigned Bpp)
static void CreateShiftTables(FILE *Out)
static void CreateBitCase(FILE *Out, unsigned Bpp, PROPINFO RopInfo, int Flags, unsigned SourceBpp)
#define ROPCODE_MERGECOPY
#define ROPCODE_DSTINVERT
static void PrintRoutineName(FILE *Out, unsigned Bpp, PROPINFO RopInfo)
#define ROPCODE_NOTSRCERASE
#define ROPCODE_BLACKNESS
_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,...)
_Check_return_opt_ _CRTIMP int __cdecl vfprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format, va_list _ArgList)
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
_Check_return_opt_ _CRTIMP int __cdecl putc(_In_ int _Ch, _Inout_ FILE *_File)
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
#define sprintf(buf, format,...)
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ ULONG Flags