1 /* 2 * Copyright (C) 2007 Google (Evan Stade) 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with this library; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 17 */ 18 19 #ifndef _GDIPLUSMETAHEADER_H 20 #define _GDIPLUSMETAHEADER_H 21 22 typedef struct 23 { 24 DWORD iType; 25 DWORD nSize; 26 RECTL rclBounds; 27 RECTL rclFrame; 28 DWORD dSignature; 29 DWORD nVersion; 30 DWORD nBytes; 31 DWORD nRecords; 32 WORD nHandles; 33 WORD sReserved; 34 DWORD nDescription; 35 DWORD offDescription; 36 DWORD nPalEntries; 37 SIZEL szlDevice; 38 SIZEL szlMillimeters; 39 } ENHMETAHEADER3; 40 41 #include <pshpack2.h> 42 43 typedef struct 44 { 45 INT16 Left; 46 INT16 Top; 47 INT16 Right; 48 INT16 Bottom; 49 } PWMFRect16; 50 51 typedef struct 52 { 53 UINT32 Key; 54 INT16 Hmf; 55 PWMFRect16 BoundingBox; 56 INT16 Inch; 57 UINT32 Reserved; 58 INT16 Checksum; 59 } WmfPlaceableFileHeader; 60 61 #include <poppack.h> 62 63 #define GDIP_EMFPLUSFLAGS_DISPLAY 0x00000001 64 65 #ifdef __cplusplus 66 class MetafileHeader 67 { 68 public: 69 MetafileType Type; 70 UINT Size; 71 UINT Version; 72 UINT EmfPlusFlags; 73 REAL DpiX; 74 REAL DpiY; 75 INT X; 76 INT Y; 77 INT Width; 78 INT Height; 79 union 80 { 81 METAHEADER WmfHeader; 82 ENHMETAHEADER3 EmfHeader; 83 }; 84 INT EmfPlusHeaderSize; 85 INT LogicalDpiX; 86 INT LogicalDpiY; 87 88 public: 89 MetafileType GetType() const { return Type; } 90 91 UINT GetMetafileSize() const { return Size; } 92 93 UINT GetVersion() const { return Version; } 94 95 UINT GetEmfPlusFlags() const { return EmfPlusFlags; } 96 97 REAL GetDpiX() const { return DpiX; } 98 99 REAL GetDpiY() const { return DpiY; } 100 101 VOID GetBounds (OUT Rect *r) const 102 { 103 r->X = X; 104 r->Y = Y; 105 r->Width = Width; 106 r->Height = Height; 107 } 108 109 BOOL IsWmf() const 110 { 111 return ((Type == MetafileTypeWmf) || (Type == MetafileTypeWmfPlaceable)); 112 } 113 114 BOOL IsWmfPlaceable() const { return (Type == MetafileTypeWmfPlaceable); } 115 116 BOOL IsEmf() const { return (Type == MetafileTypeEmf); } 117 118 BOOL IsEmfOrEmfPlus() const { return (Type >= MetafileTypeEmf); } 119 120 BOOL IsEmfPlus() const { return (Type >= MetafileTypeEmfPlusOnly); } 121 122 BOOL IsEmfPlusDual() const { return (Type == MetafileTypeEmfPlusDual); } 123 124 BOOL IsEmfPlusOnly() const { return (Type == MetafileTypeEmfPlusOnly); } 125 126 BOOL IsDisplay() const 127 { 128 return IsEmfPlus() && ((EmfPlusFlags & GDIP_EMFPLUSFLAGS_DISPLAY) != 0); 129 } 130 131 const METAHEADER * GetWmfHeader() const 132 { 133 return IsWmf() ? &WmfHeader : NULL; 134 } 135 136 const ENHMETAHEADER3 * GetEmfHeader() const 137 { 138 return IsEmfOrEmfPlus() ? &EmfHeader : NULL; 139 } 140 }; 141 #else /* end of c++ typedefs */ 142 143 typedef struct MetafileHeader 144 { 145 MetafileType Type; 146 UINT Size; 147 UINT Version; 148 UINT EmfPlusFlags; 149 REAL DpiX; 150 REAL DpiY; 151 INT X; 152 INT Y; 153 INT Width; 154 INT Height; 155 union 156 { 157 METAHEADER WmfHeader; 158 ENHMETAHEADER3 EmfHeader; 159 } DUMMYUNIONNAME; 160 INT EmfPlusHeaderSize; 161 INT LogicalDpiX; 162 INT LogicalDpiY; 163 } MetafileHeader; 164 165 #endif /* end of c typedefs */ 166 167 #endif /* _GDIPLUSMETAHEADER_H */ 168