home *** CD-ROM | disk | FTP | other *** search
/ Windows Graphics Programming / Feng_Yuan_Win32_GDI_DirectX.iso / Samples / Chapt_02 / HTMLDrv / Device.cpp next >
C/C++ Source or Header  |  2000-05-11  |  7KB  |  323 lines

  1. //-----------------------------------------------------------------------------------//
  2. //              Windows Graphics Programming: Win32 GDI and DirectDraw               //
  3. //                             ISBN  0-13-086985-6                                   //
  4. //                                                                                   //
  5. //  Written            by  Yuan, Feng                             www.fengyuan.com   //
  6. //  Copyright (c) 2000 by  Hewlett-Packard Company                www.hp.com         //
  7. //  Published          by  Prentice Hall PTR, Prentice-Hall, Inc. www.phptr.com      //
  8. //                                                                                   //
  9. //  FileName   : device.cpp                                                             //
  10. //  Description: KDevice class for HTML/BMP printer driver, Chapter 2                //
  11. //  Version    : 1.00.000, May 31, 2000                                              //
  12. //-----------------------------------------------------------------------------------//
  13.  
  14. #define _WIN32_WINNT 0x0500 
  15. //#define  WINVER      0x0500 
  16. #define NOCRYPT
  17.  
  18. #define UNICODE
  19. #define _UNICODE
  20. #define _X86_ 1
  21. #define WINNT 1 
  22.  
  23. #include <windows.h>
  24. #include <winddi.h>
  25.  
  26. #include "Device.h"
  27.  
  28.  
  29. const PAIR Pair_DDIFunction[] =
  30. {
  31.     INDEX_DrvEnablePDEV,       "DrvEnablePDEV",
  32.     INDEX_DrvCompletePDEV,     "DrvCompletePDEV",
  33.     INDEX_DrvResetPDEV,        "DrvResetPDEV",
  34.     INDEX_DrvDisablePDEV,      "DrvDisablePDEV",
  35.     INDEX_DrvEnableSurface,    "DrvEnableSurface",
  36.     INDEX_DrvDisableSurface,   "DrvDisableSurface",
  37.  
  38.     INDEX_DrvStartDoc,         "DrvStartDoc",
  39.     INDEX_DrvEndDoc,           "DrvEndDoc",
  40.     INDEX_DrvStartPage,        "DrvStartPage",
  41.     INDEX_DrvSendPage,         "DrvSendPage",
  42.  
  43.     INDEX_DrvStrokePath,       "DrvStrokePath",
  44.     INDEX_DrvFillPath,         "DrvFillPath",
  45.     INDEX_DrvStrokeAndFillPath,"DrvStrokeAndFillPath",
  46.     INDEX_DrvLineTo,           "DrvLineTo",
  47.     INDEX_DrvPaint,            "DrvPaint",
  48.     INDEX_DrvBitBlt,           "DrvBitBlt",
  49.     INDEX_DrvCopyBits,         "DrvCopyBits",
  50.     INDEX_DrvStretchBlt,       "DrvStretchBlt",
  51.     INDEX_DrvTextOut,          "DrvTextOut",
  52.     0,                           NULL
  53. };
  54.  
  55.  
  56. void KDevice::Write(const char * pStr)
  57. {
  58.     DWORD dwWritten;
  59.  
  60.     EngWritePrinter(hSpooler, (void *) pStr, strlen(pStr), & dwWritten);
  61. }
  62.  
  63.  
  64. void KDevice::WriteW(const WCHAR * pwStr)
  65. {
  66.     int len = wcslen(pwStr);
  67.  
  68.     if ( len )
  69.     {
  70.         char  Ansi[512];
  71.         DWORD dwLen;
  72.  
  73.         EngUnicodeToMultiByteN(Ansi, sizeof(Ansi),
  74.                                & dwLen,
  75.                                (WCHAR *) pwStr, (len + 1) * sizeof(WCHAR));
  76.  
  77.         EngWritePrinter(hSpooler, Ansi, dwLen, & dwLen);
  78.     }
  79. }
  80.  
  81.  
  82. void KDevice::Writeln(const char * pStr)
  83. {
  84.     char crlf[2] = { 0x0D, 0x0A };
  85.  
  86.     DWORD dwWritten;
  87.  
  88.     if ( pStr )
  89.         EngWritePrinter(hSpooler, (void *) pStr, strlen(pStr), & dwWritten);
  90.     
  91.     EngWritePrinter(hSpooler, crlf, 2, & dwWritten);
  92. }
  93.  
  94.  
  95. void KDevice::Write(DWORD index, const PAIR * pTable)
  96. {
  97.     while ( pTable->name )
  98.         if ( index==pTable->index )
  99.         {
  100.             Write(pTable->name);
  101.             return;
  102.         }
  103.         else
  104.             pTable ++;
  105.  
  106.     Write("Unknown index");
  107. }
  108.  
  109.  
  110. void KDevice::WriteHex(unsigned val)
  111. {
  112.     char text[8];
  113.  
  114.     int i = 8;
  115.  
  116.     do
  117.     {
  118.         i --;
  119.         text[i] = (val & 15) + '0';
  120.  
  121.         if ( text[i]>'9' )
  122.             text[i] += 'a' - '9' -1;
  123.         
  124.         val /= 16;
  125.     }
  126.     while ( val!=0 );
  127.  
  128.     DWORD dwWritten;
  129.  
  130.     EngWritePrinter(hSpooler, text+i, 8-i, & dwWritten);
  131. }
  132.  
  133.  
  134. BOOL KDevice::StartDoc(LPCWSTR pwszDocName, const void * firstpara, int parano)
  135. {
  136.     if ( (this!=NULL) && (nNesting==0) )
  137.     {
  138.         nNesting = 1;
  139.  
  140.         Writeln("<html>");
  141.         
  142.         Writeln("<head>");
  143.         Write("<title>");
  144.         WriteW(pwszDocName);
  145.         Writeln("</title>");
  146.         Writeln("</head>");
  147.  
  148.         Writeln("<body bgcolor=""""#80B090""""><font size=1>");
  149.         Writeln("<ol>");
  150.  
  151.         LogCall(INDEX_DrvStartDoc, firstpara, parano);
  152.         
  153.         return TRUE;
  154.     }
  155.     else
  156.         return FALSE;
  157. }
  158.  
  159.  
  160. BOOL KDevice::EndDoc(const void * firstpara, int parano)
  161. {
  162.     if ( (this!=NULL) && (nNesting==1) )
  163.     {
  164.         nNesting = 0;
  165.  
  166.         LogCall(INDEX_DrvEndDoc, firstpara, parano);
  167.         Writeln("</ol>");
  168.         Writeln("</body>");
  169.         Writeln("</html>");
  170.  
  171.         return TRUE;
  172.     }
  173.     else
  174.         return FALSE;
  175. }
  176.  
  177.  
  178. BOOL KDevice::StartPage(const void * firstpara, int parano)
  179. {
  180.     LogCall(INDEX_DrvStartPage, firstpara, parano);
  181.  
  182.     if ( nNesting==1 )
  183.     {
  184.         nNesting ++;
  185.         return TRUE;
  186.     }
  187.     else
  188.         return FALSE;
  189. }
  190.  
  191.  
  192. BOOL KDevice::SendPage(const void * firstpara, int parano)
  193. {
  194.     if ( CallEngine(INDEX_DrvSendPage, firstpara, parano) )
  195.     {
  196.         nPages ++;
  197.         nNesting = 1;
  198.         
  199.         return TRUE;
  200.     }
  201.     else
  202.         return FALSE;
  203. }
  204.  
  205.  
  206. void KDevice::LogCall(int index, const void * firstpara, int parano)
  207. {
  208.     Write("<li>");
  209.     Write(index, Pair_DDIFunction);
  210.     Write("(");
  211.  
  212.     const unsigned * pDWORD = (const unsigned *) firstpara;
  213.  
  214.     for (int i=0; i<parano; i++)
  215.     {
  216.         WriteHex(pDWORD[i]);
  217.         
  218.         if ( i!=(parano-1) )
  219.             Write(", ");
  220.     }
  221.     Writeln(")</li>");
  222. }
  223.  
  224.  
  225. BOOL KDevice::CallEngine(int index, const void * firstpara, int parano)
  226. {
  227.     if ( this==NULL )
  228.     {
  229.         EngSetLastError(ERROR_INVALID_PARAMETER);
  230.         return FALSE;
  231.     }
  232.  
  233.     LogCall(index, firstpara, parano);
  234.  
  235.     return nNesting==2;
  236. }
  237.  
  238.  
  239. void KDevice::DumpSurface(const SURFOBJ * pso)
  240. {
  241.     WCHAR szFileName[32] = L"\\??\\c:\\htmd_000.bmp"; // fully qualified name
  242.     
  243.     szFileName[12] = '0' + (nImage / 100);
  244.     szFileName[13] = '0' + ((nImage / 10) % 10);
  245.     szFileName[14] = '0' + (nImage % 10);
  246.     nImage ++;
  247.  
  248.     ULONG_PTR   giFile = NULL;
  249.  
  250.     char * pFile = (char *) EngMapFile(szFileName, 
  251.         sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + pso->cjBits,
  252.         & giFile);
  253.  
  254.     if ( pFile )
  255.     {
  256.         CopySurface(pFile, pso);
  257.         EngUnmapFile(giFile);
  258.     }
  259.     else
  260.         wcscpy(szFileName, L"failed.bmp");
  261.  
  262.     Write("<p><img src=\"");
  263.     WriteW(szFileName+4);    // remove "\??\"
  264.     Writeln("\"></p>");
  265. }
  266.  
  267.  
  268. char * KDevice::CopyBlock(char * pDest, void * pData, int size)
  269. {
  270.     if ( pDest )
  271.     {
  272.         memcpy(pDest, pData, size);
  273.         return pDest + size;
  274.     }
  275.     else
  276.     {
  277.         DWORD dwWritten;
  278.         
  279.         EngWritePrinter(hSpooler, pData, size, &dwWritten);
  280.         return NULL;
  281.     }
  282. }
  283.  
  284.  
  285. void KDevice::CopySurface(char * pDest, const SURFOBJ * pso)
  286. {
  287.     // Write BITMAPFILEHEADER data.
  288.     {
  289.         BITMAPFILEHEADER bmfhead;
  290.  
  291.         bmfhead.bfType        = 0x4D42;
  292.         bmfhead.bfOffBits   = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); 
  293.         bmfhead.bfSize        = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + pso->cjBits;
  294.         bmfhead.bfReserved1 = 0;
  295.         bmfhead.bfReserved2 = 0;
  296.  
  297.         pDest = CopyBlock(pDest, & bmfhead, sizeof(BITMAPFILEHEADER));
  298.     }
  299.  
  300.     // Write BITMAPHEADER
  301.     {
  302.         BITMAPINFOHEADER bmihead;
  303.  
  304.         bmihead.biSize          = sizeof(BITMAPINFOHEADER);
  305.         bmihead.biWidth         = pso->sizlBitmap.cx;
  306.         bmihead.biHeight        = (pso->fjBitmap & BMF_TOPDOWN) ? - pso->sizlBitmap.cy 
  307.                                                                 :   pso->sizlBitmap.cy;
  308.         bmihead.biPlanes        = 1;
  309.         bmihead.biBitCount      = 24;
  310.         bmihead.biCompression   = BI_RGB;
  311.         bmihead.biSizeImage     = 0;
  312.         bmihead.biXPelsPerMeter = 0;
  313.         bmihead.biYPelsPerMeter = 0;
  314.         bmihead.biClrUsed       = 0;
  315.         bmihead.biClrImportant  = 0;
  316.  
  317.         pDest = CopyBlock(pDest, &bmihead, sizeof(BITMAPINFOHEADER));
  318.     }
  319.     
  320.     CopyBlock(pDest, pso->pvBits, pso->cjBits);
  321. }
  322.  
  323.