bitmap.h
上传用户:looem2003
上传日期:2014-07-20
资源大小:13733k
文件大小:13k
源码类别:

打印编程

开发平台:

Visual C++

  1. //  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  2. //  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  3. //  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  4. //  PARTICULAR PURPOSE.
  5. //
  6. //  Copyright  1997 - 2003  Microsoft Corporation.  All Rights Reserved.
  7. //
  8. //  FILE:   BITMAP.H
  9. //    
  10. //
  11. //  PURPOSE:    Define the COemPDEV class which stores the private
  12. //          PDEV for the driver.
  13. //
  14. //
  15. //  Functions:
  16. //          COemPDEV constructor and destructor
  17. //          COemPDEV::InitializeDDITable
  18. //          COemPDEV::_SavePFN
  19. //          COemPDEV::_ResetPointers
  20. //
  21. //
  22. //  PLATFORMS:
  23. //
  24. //    Windows XP, Windows Server 2003, Windows codenamed Longhorn
  25. //
  26. //
  27. //  History: 
  28. //          06/24/03    xxx created.
  29. //
  30. //
  31. #ifndef _BITMAP_H
  32. #define _BITMAP_H
  33. #include "ddihook.h"
  34. #include "debug.h"
  35. #define OEM_SIGNATURE   'MSFT'
  36. #define OEM_VERSION     0x00000001L
  37. #define RGB_BLACK   RGB(0, 0, 0)
  38. #define RGB_WHITE   RGB(255, 255, 255)
  39. class COemPDEV
  40. {
  41. public:
  42.     __stdcall COemPDEV(void)
  43.     {
  44.         // Note that since our parent has AddRef'd the UNIDRV interface,
  45.         // we don't do so here since our scope is identical to our
  46.         // parent.
  47.         //
  48.         OEMDBG(DBG_VERBOSE, L"In COemPDEV constructor...");
  49.         _ResetPointers();
  50.     }
  51.     __stdcall ~COemPDEV(void)
  52.     {
  53.         OEMDBG(DBG_VERBOSE, L"In COemPDEV destructor...");
  54.     }
  55.     void __stdcall InitializeDDITable(DRVENABLEDATA* pded)
  56.     {
  57.         OEMDBG(DBG_VERBOSE, L"COemPDEV::InitializeDDITable entry.");
  58.     #if defined(DDIS_HAVE_BEEN_IMPL)
  59.         UINT   iDrvFn;
  60.         UINT   cDrvFn = pded->c;
  61.         PDRVFN pDrvFn = pded->pdrvfn;
  62.         for (iDrvFn = 0; iDrvFn < cDrvFn; ++iDrvFn, ++pDrvFn)
  63.         {
  64.             _SavePFN(pDrvFn->iFunc, pDrvFn->pfn);
  65.         }
  66.     #else
  67.         VERBOSE(DLLTEXT(L"No DDIs have been implemented!rn"));    
  68.     #endif // any hooked DDI
  69.     }
  70. private:
  71. #if defined(DDIS_HAVE_BEEN_IMPL)
  72.     void __stdcall _SavePFN(ULONG uFunc, PFN pfn)
  73.     {
  74.         // Note: if a "pass-through" driver is being constructed, then
  75.         // there is nothing for this method to do. So, to keep the 
  76.         // compiler from complaining about a switch with no case
  77.         // statements, but which has a default statement, we surround
  78.         // the entire construct with preprocessor controls.
  79.         //
  80.         switch(uFunc)
  81.         {
  82.         // The following are the drawing related DDI hooks.
  83.         //
  84.     #if defined(IMPL_ALPHABLEND)
  85.         // 71
  86.         case INDEX_DrvAlphaBlend:
  87.             m_pfnDrvAlphaBlend  = (PFN_DrvAlphaBlend)pfn;
  88.             break;
  89.     #endif
  90.     #if defined(IMPL_BITBLT)
  91.         // 18
  92.         case INDEX_DrvBitBlt:
  93.             m_pfnDrvBitBlt  = (PFN_DrvBitBlt)pfn;
  94.             break;
  95.     #endif
  96.     #if defined(IMPL_COPYBITS)
  97.         // 19
  98.         case INDEX_DrvCopyBits:
  99.             m_pfnDrvCopyBits = (PFN_DrvCopyBits)pfn;
  100.             break;
  101.     #endif
  102.     #if defined(IMPL_DITHERCOLOR)
  103.         // 13
  104.         case INDEX_DrvDitherColor:
  105.             m_pfnDrvDitherColor = (PFN_DrvDitherColor)pfn;
  106.             break;
  107.     #endif
  108.     #if defined(IMPL_FILLPATH)
  109.         // 15
  110.         case INDEX_DrvFillPath:
  111.             m_pfnDrvFillPath = (PFN_DrvFillPath)pfn;
  112.             break;
  113.     #endif
  114.     #if defined(IMPL_FONTMANAGEMENT)
  115.         // 47
  116.         case INDEX_DrvFontManagement:
  117.             m_pfnDrvFontManagement = (PFN_DrvFontManagement)pfn;
  118.             break;
  119.     #endif
  120.     #if defined(IMPL_GETGLYPHMODE)
  121.         // 37
  122.         case INDEX_DrvGetGlyphMode:
  123.             m_pfnDrvGetGlyphMode = (PFN_DrvGetGlyphMode)pfn;
  124.             break;
  125.     #endif
  126.     #if defined(IMPL_GRADIENTFILL)
  127.         // 68
  128.         case INDEX_DrvGradientFill:
  129.             m_pfnDrvGradientFill = (PFN_DrvGradientFill)pfn;
  130.             break;
  131.     #endif
  132.     #if defined(IMPL_LINETO)
  133.         // 31
  134.         case INDEX_DrvLineTo:
  135.             m_pfnDrvLineTo = (PFN_DrvLineTo)pfn;
  136.             break;
  137.     #endif
  138.     #if defined(IMPL_PAINT)
  139.         // 70
  140.         case INDEX_DrvPaint:
  141.             m_pfnDrvPaint = (PFN_DrvPaint)pfn;
  142.             break;
  143.     #endif
  144.     #if defined(IMPL_PLGBLT)
  145.         // 70
  146.         case INDEX_DrvPlgBlt:
  147.             m_pfnDrvPlgBlt = (PFN_DrvPlgBlt)pfn;
  148.             break;
  149.     #endif
  150.     #if defined(IMPL_QUERYADVANCEWIDTHS)
  151.         // 53
  152.         case INDEX_DrvQueryAdvanceWidths:
  153.             m_pfnDrvQueryAdvanceWidths = (PFN_DrvQueryAdvanceWidths)pfn;
  154.             break;
  155.     #endif
  156.     #if defined(IMPL_QUERYFONT)
  157.         // 26
  158.         case INDEX_DrvQueryFont:
  159.             m_pfnDrvQueryFont = (PFN_DrvQueryFont)pfn;
  160.             break;
  161.     #endif
  162.     #if defined(IMPL_QUERYFONTDATA)
  163.         // 28
  164.         case INDEX_DrvQueryFontData:
  165.             m_pfnDrvQueryFontData = (PFN_DrvQueryFontData)pfn;
  166.             break;
  167.     #endif
  168.     #if defined(IMPL_QUERYFONTTREE)
  169.         // 27
  170.         case INDEX_DrvQueryFontTree:
  171.             m_pfnDrvQueryFontTree = (PFN_DrvQueryFontTree)pfn;
  172.             break;
  173.     #endif
  174.     #if defined(IMPL_REALIZEBRUSH)
  175.         // 12
  176.         case INDEX_DrvRealizeBrush:
  177.             m_pfnDrvRealizeBrush = (PFN_DrvRealizeBrush)pfn;
  178.             break;
  179.     #endif
  180.     #if defined(IMPL_STRETCHBLT)
  181.         // 20
  182.         case INDEX_DrvStretchBlt:
  183.             m_pfnDrvStretchBlt = (PFN_DrvStretchBlt)pfn;
  184.             break;
  185.     #endif
  186.     #if defined(IMPL_STRETCHBLTROP)
  187.         // 69
  188.         case INDEX_DrvStretchBltROP:
  189.             m_pfnDrvStretchBltROP = (PFN_DrvStretchBltROP)pfn;
  190.             break;
  191.     #endif
  192.     #if defined(IMPL_STROKEANDFILLPATH)
  193.         // 16
  194.         case INDEX_DrvStrokeAndFillPath:
  195.             m_pfnDrvStrokeAndFillPath = (PFN_DrvStrokeAndFillPath)pfn;
  196.             break;
  197.     #endif
  198.     #if defined(IMPL_STROKEPATH)
  199.         // 14
  200.         case INDEX_DrvStrokePath:
  201.             m_pfnDrvStrokePath = (PFN_DrvStrokePath)pfn;
  202.             break;
  203.     #endif
  204.     #if defined(IMPL_TEXTOUT)
  205.         // 23
  206.         case INDEX_DrvTextOut:
  207.             m_pfnDrvTextOut = (PFN_DrvTextOut)pfn;
  208.             break;
  209.     #endif
  210.     #if defined(IMPL_TRANSPARENTBLT)
  211.         // 74
  212.         case INDEX_DrvTransparentBlt:
  213.             m_pfnDrvTransparentBlt = (PFN_DrvTransparentBlt)pfn;
  214.             break;
  215.     #endif
  216.     // The following are the page/band related DDI hooks.
  217.     //
  218.     #if defined(IMPL_STARTDOC)
  219.         // 35
  220.         case INDEX_DrvStartDoc:
  221.             m_pfnDrvStartDoc = (PFN_DrvStartDoc)pfn;
  222.             break;
  223.     #endif
  224.     
  225.     #if defined(IMPL_ENDDOC)
  226.         // 34
  227.         case INDEX_DrvEndDoc:
  228.             m_pfnDrvEndDoc = (PFN_DrvEndDoc)pfn;
  229.             break;
  230.     #endif
  231.     #if defined(IMPL_STARTPAGE)
  232.         // 33
  233.         case INDEX_DrvStartPage:
  234.             m_pfnDrvStartPage = (PFN_DrvStartPage)pfn;
  235.             break;
  236.     #endif
  237.     #if defined(IMPL_SENDPAGE)
  238.         // 32
  239.         case INDEX_DrvSendPage:
  240.             m_pfnDrvSendPage = (PFN_DrvSendPage)pfn;
  241.             break;
  242.     #endif
  243.     #if defined(IMPL_STARTBANDING)
  244.         // 57
  245.         case INDEX_DrvStartBanding:
  246.             m_pfnDrvStartBanding = (PFN_DrvStartBanding)pfn;
  247.             break;
  248.     #endif
  249.     #if defined(IMPL_NEXTBAND)
  250.         // 58
  251.         case INDEX_DrvNextBand:
  252.             m_pfnDrvNextBand = (PFN_DrvNextBand)pfn;
  253.             break;
  254.     #endif
  255.     #if defined(IMPL_ESCAPE)
  256.         // 24
  257.         case INDEX_DrvEscape:
  258.             m_pfnDrvEscape = (PFN_DrvEscape)pfn;
  259.             break;
  260.     #endif
  261.     #if defined(_DEBUG)
  262.         // ----------------------------------------------------------
  263.         default:
  264.             // For development convenience, decode the requests that are 
  265.             // not hooked. In this version of UNIDRV, at most 28 of the 
  266.             // following could appear. The remainder are listed for 
  267.             // diagnostic purposes.
  268.             //
  269.             // This section was mainly for diagnostic purposes. So it has
  270.             // been stripped out for the time being. Will revisit when
  271.             // examining the debug mechanism. 
  272.             //
  273.             break;
  274.     #endif
  275.         } // switch(uFunc)
  276.     }
  277. #endif
  278.     void __stdcall _ResetPointers(void)
  279.     {
  280.         m_pfnDrvAlphaBlend          = NULL;
  281.         m_pfnDrvBitBlt              = NULL;
  282.         m_pfnDrvCopyBits                = NULL;
  283.         m_pfnDrvDitherColor         = NULL;
  284.         m_pfnDrvEndDoc              = NULL;
  285.         m_pfnDrvEscape              = NULL;
  286.         m_pfnDrvFillPath                = NULL;
  287.         m_pfnDrvFontManagement      = NULL;
  288.         m_pfnDrvGetGlyphMode        = NULL;
  289.         m_pfnDrvGradientFill            = NULL;
  290.         m_pfnDrvLineTo              = NULL;
  291.         m_pfnDrvNextBand            = NULL;
  292.         m_pfnDrvPaint               = NULL;
  293.         m_pfnDrvPlgBlt              = NULL;
  294.         m_pfnDrvQueryAdvanceWidths  = NULL;
  295.         m_pfnDrvQueryFont           = NULL;
  296.         m_pfnDrvQueryFontData       = NULL;
  297.         m_pfnDrvQueryFontTree       = NULL;
  298.         m_pfnDrvRealizeBrush            = NULL;
  299.         m_pfnDrvSendPage            = NULL;
  300.         m_pfnDrvStartBanding            = NULL;
  301.         m_pfnDrvStartDoc                = NULL;
  302.         m_pfnDrvStartPage           = NULL;
  303.         m_pfnDrvStretchBlt          = NULL;
  304.         m_pfnDrvStretchBltROP           = NULL;
  305.         m_pfnDrvStrokeAndFillPath       = NULL;
  306.         m_pfnDrvStrokePath          = NULL;
  307.         m_pfnDrvTextOut             = NULL;
  308.         m_pfnDrvTransparentBlt      = NULL;
  309.     }
  310. public:
  311.     // Unidrv function pointers so that we can punt
  312.     // back from the DDI hooks
  313.     //
  314.     PFN_DrvAlphaBlend           m_pfnDrvAlphaBlend;
  315.     PFN_DrvBitBlt                   m_pfnDrvBitBlt;
  316.     PFN_DrvCopyBits             m_pfnDrvCopyBits;
  317.     PFN_DrvDitherColor          m_pfnDrvDitherColor;
  318.     PFN_DrvEndDoc               m_pfnDrvEndDoc;
  319.     PFN_DrvEscape               m_pfnDrvEscape;
  320.     PFN_DrvFillPath             m_pfnDrvFillPath;
  321.     PFN_DrvFontManagement       m_pfnDrvFontManagement;
  322.     PFN_DrvGetGlyphMode         m_pfnDrvGetGlyphMode;
  323.     PFN_DrvGradientFill         m_pfnDrvGradientFill;
  324.     PFN_DrvLineTo               m_pfnDrvLineTo;
  325.     PFN_DrvNextBand             m_pfnDrvNextBand;
  326.     PFN_DrvPaint                    m_pfnDrvPaint;
  327.     PFN_DrvPlgBlt                   m_pfnDrvPlgBlt;
  328.     PFN_DrvQueryAdvanceWidths   m_pfnDrvQueryAdvanceWidths;
  329.     PFN_DrvQueryFont                m_pfnDrvQueryFont;
  330.     PFN_DrvQueryFontData            m_pfnDrvQueryFontData;
  331.     PFN_DrvQueryFontTree            m_pfnDrvQueryFontTree;
  332.     PFN_DrvRealizeBrush         m_pfnDrvRealizeBrush;
  333.     PFN_DrvSendPage             m_pfnDrvSendPage;
  334.     PFN_DrvStartBanding         m_pfnDrvStartBanding;
  335.     PFN_DrvStartDoc             m_pfnDrvStartDoc;
  336.     PFN_DrvStartPage                m_pfnDrvStartPage;
  337.     PFN_DrvStretchBlt               m_pfnDrvStretchBlt;
  338.     PFN_DrvStretchBltROP            m_pfnDrvStretchBltROP;
  339.     PFN_DrvStrokeAndFillPath        m_pfnDrvStrokeAndFillPath;
  340.     PFN_DrvStrokePath           m_pfnDrvStrokePath;
  341.     PFN_DrvTextOut              m_pfnDrvTextOut;
  342.     PFN_DrvTransparentBlt           m_pfnDrvTransparentBlt;
  343.     /*******************************************/
  344.     /*                                           */
  345.     /*      Add any custom PDEV members here         */
  346.     /*                                           */
  347.     /*******************************************/
  348.     PBYTE               pBufStart;          // Pointer to start of buffer to hold the bitmap data
  349.     DWORD               dwBufSize;          // Buffer size
  350.     BITMAPFILEHEADER    bmFileHeader;       // BitmapFileHeader for each dump
  351.     BITMAPINFOHEADER    bmInfoHeader;       // BitmapInfoHeader for each dump
  352.     int                 cPalColors;         // Count of colors in palette.
  353.     HPALETTE            hpalDefault;            // Default palette to pass to GDI.
  354.     __field_ecount(cPalColors) RGBQUAD *           prgbq;              // Color table
  355.     INT                 cbHeaderOffBits;        // Offset to bits in the file
  356.     BOOL                bHeadersFilled;     // Flag to indicate if the header stuff has been filled
  357.     BOOL                bColorTable;            // Flag to indicate if color table needs to be dumped
  358.     long                pages;
  359. };
  360. typedef COemPDEV* POEMPDEV;
  361. BOOL bGrowBuffer(POEMPDEV, DWORD);      // Function to enlarge the buffer for holding the bitmap data
  362. VOID vFreeBuffer(POEMPDEV);             // Function to free the buffer for holding the bitmap data
  363. BOOL bFillColorTable(POEMPDEV);         // Function to fill the color table for the bitmap data
  364. extern long ipage;
  365. extern TCHAR pageFileName[4*MAX_PATH];
  366. class CStr
  367. {
  368. public:
  369. CStr();
  370. CStr( size_t size );
  371. ~CStr(  );
  372. BOOL add_str( LPCTSTR initStr );
  373. LPCTSTR get_str();
  374.         size_t get_size();
  375. private:
  376. TCHAR* str;
  377. size_t strSize;
  378. };
  379. extern CStr fContent;
  380. #endif