home *** CD-ROM | disk | FTP | other *** search
/ Windows Graphics Programming / Feng_Yuan_Win32_GDI_DirectX.iso / Samples / Chapt_16 / EMFScope / EXAMEMF.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  2000-05-12  |  3.2 KB  |  115 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   : examemf.cpp                                                         //
  10. //  Description: Check EMF data format                                               //
  11. //  Version    : 1.00.000, May 31, 2000                                              //
  12. //-----------------------------------------------------------------------------------//
  13.  
  14. #define STRICT
  15. #include <windows.h>
  16. #include <assert.h>
  17.  
  18. #include "Stream.h"
  19. #include "Examemf.h"
  20.  
  21. const int MaxEmrField = 16384;         // 16K*sizeof(DWORD), maximum 64 Kb
  22.  
  23. typedef struct 
  24. {
  25.     DWORD   iType;                // Enhanced metafile record type
  26.     DWORD   nSize;                // Length of the record in bytes.
  27.                                       // This must be a multiple of 4.
  28.     DWORD   Para[MaxEmrField-2];  // Parameter
  29. } EmrRecord;
  30.  
  31.  
  32. // check if input file is a valid NT spooler emf file
  33. BOOL CheckNTSpoolEmfFile(KInputFile *emf, ENHMETAHEADER *header)
  34. {
  35.     EmrRecord rec;
  36.  
  37.     emf->Reset();
  38.  
  39.     // 0x00010000 len 
  40.     emf->read((char *) & rec, 8);
  41.  
  42.     if (rec.iType!=0x10000) return FALSE;
  43.  
  44.     // appname document name port
  45.     emf->read((char *) & rec.Para, rec.nSize-8);
  46.  
  47.     while (true)
  48.     {
  49.         // 0x000000001 EMF_Stream_len
  50.         emf->read((char *) & rec, 8);
  51.     
  52.         if ( (rec.iType==1) || (rec.iType==12) ) break;
  53.  
  54.         if (rec.iType < 0xFFFF)
  55.         {
  56.             if ( rec.iType==2 )
  57.                 emf->read(NULL, rec.nSize);  // embedded font
  58.             else
  59.                 emf->read(NULL, rec.nSize-8);
  60.         }
  61.     }
  62.     
  63.     emf->read((char *)header, sizeof(ENHMETAHEADER));
  64.  
  65.     return header->iType==1;
  66. }
  67.  
  68.  
  69. BOOL PlayNTEnhMetaFile(HDC hDC, KInputFile *emf, RECT *rect)
  70. {
  71.     EmrRecord rec;
  72.     
  73.     emf->Reset();
  74.     // 0x00010000 len 
  75.     emf->read((char *) & rec, 8);
  76.  
  77.     if (rec.iType!=0x10000) return FALSE;
  78.  
  79.     // appname document name port
  80.     emf->read((char *) & rec.Para, rec.nSize-8);
  81.  
  82.     while (true)
  83.     {
  84.         // 0x000000001 EMF_Stream_len
  85.         emf->read((char *) & rec, 8);
  86.     
  87.         if ( (rec.iType==1) || (rec.iType==12) ) break;
  88.  
  89.         if (rec.iType < 0xFFFF)
  90.             if ( rec.iType==2 )
  91.                 emf->read(NULL, rec.nSize);  // embedded font
  92.             else
  93.                 emf->read(NULL, rec.nSize-8);
  94.     }
  95.     
  96.  
  97. //    // 0x000000001 EMF_Stream_len
  98. //    emf->read((char *) & rec, 8);
  99. //    if (rec.iType!=1) return FALSE;
  100.  
  101.     if (hDC==NULL)
  102.         return TRUE;
  103.  
  104.     byte * bits = (byte *) malloc(rec.nSize);
  105.     if ( bits == NULL )
  106.         return FALSE;
  107.  
  108.     emf->read((char *) bits, rec.nSize);
  109.     HENHMETAFILE hEmf = SetEnhMetaFileBits(rec.nSize, bits);
  110.     PlayEnhMetaFile(hDC, hEmf, rect);
  111.     DeleteEnhMetaFile(hEmf);
  112.     free(bits);
  113.  
  114.     return TRUE;
  115. }