1 //*@@@+++@@@@****************************************************************** 2 // 3 // Copyright � Microsoft Corp. 4 // All rights reserved. 5 // 6 // Redistribution and use in source and binary forms, with or without 7 // modification, are permitted provided that the following conditions are met: 8 // 9 // � Redistributions of source code must retain the above copyright notice, 10 // this list of conditions and the following disclaimer. 11 // � Redistributions in binary form must reproduce the above copyright notice, 12 // this list of conditions and the following disclaimer in the documentation 13 // and/or other materials provided with the distribution. 14 // 15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 19 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 // POSSIBILITY OF SUCH DAMAGE. 26 // 27 //*@@@---@@@@****************************************************************** 28 #pragma once 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 34 #include <JXRMeta.h> 35 #include <guiddef.h> 36 37 //================================================================ 38 #define WMP_SDK_VERSION 0x0101 39 #define PK_SDK_VERSION 0x0101 40 41 #define sizeof2(array) (sizeof(array)/sizeof(*(array))) 42 #ifndef max 43 #define max(a,b) ((a) > (b) ? (a) : (b)) 44 #endif 45 #ifndef min 46 #define min(b,a) ((a) < (b) ? (a) : (b)) 47 #endif 48 #if defined(__ANSI__) || defined(__MINGW32__) 49 #define STRCPY_SAFE(pszDest, cbDest, pszSrc) (strncpy((pszDest), (pszSrc), (cbDest)) == (pszDest) ? 0 : 1) 50 #else 51 #define STRCPY_SAFE(pszDest, cbDest, pszSrc) (strcpy_s((pszDest), (cbDest), (pszSrc))) 52 #endif // __ANSI__ 53 54 //================================================================ 55 typedef struct tagPKRect 56 { 57 I32 X; 58 I32 Y; 59 I32 Width; 60 I32 Height; 61 } PKRect; 62 63 //================================================================ 64 typedef U32 PKIID; 65 66 EXTERN_C const PKIID IID_PKImageScanEncode; 67 EXTERN_C const PKIID IID_PKImageFrameEncode; 68 69 EXTERN_C const PKIID IID_PKImageWmpEncode; 70 71 EXTERN_C const PKIID IID_PKImageWmpDecode; 72 73 struct IFDEntry 74 { 75 U16 uTag; 76 U16 uType; 77 U32 uCount; 78 U32 uValue; 79 }; 80 EXTERN_C const U32 IFDEntryTypeSizes[13]; 81 EXTERN_C const U32 SizeofIFDEntry; 82 83 //================================================================ 84 typedef float Float; 85 86 typedef enum tagPKStreamFlags 87 { 88 PKStreamOpenRead = 0x00000000UL, 89 PKStreamOpenWrite = 0x00000001UL, 90 PKStreamOpenReadWrite = 0x00000002UL, 91 PKStreamNoLock = 0x00010000UL, 92 PKStreamNoSeek = 0x00020000UL, 93 PKStreamCompress = 0x00040000UL, 94 } PKStreamFlags; 95 96 /* Undefined formats */ 97 #define GUID_PKPixelFormatUndefined GUID_PKPixelFormatDontCare 98 99 DEFINE_GUID(GUID_PKPixelFormatDontCare, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x00); 100 101 /* Indexed formats */ 102 //DEFINE_GUID(GUID_PKPixelFormat1bppIndexed, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x01); 103 //DEFINE_GUID(GUID_PKPixelFormat2bppIndexed, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x02); 104 //DEFINE_GUID(GUID_PKPixelFormat4bppIndexed, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x03); 105 //DEFINE_GUID(GUID_PKPixelFormat8bppIndexed, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x04); 106 107 DEFINE_GUID(GUID_PKPixelFormatBlackWhite, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x05); 108 //DEFINE_GUID(GUID_PKPixelFormat2bppGray, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x06); 109 //DEFINE_GUID(GUID_PKPixelFormat4bppGray, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x07); 110 DEFINE_GUID(GUID_PKPixelFormat8bppGray, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x08); 111 112 /* sRGB formats (gamma is approx. 2.2) */ 113 /* For a full definition, see the sRGB spec */ 114 115 /* 16bpp formats */ 116 DEFINE_GUID(GUID_PKPixelFormat16bppRGB555, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x09); 117 DEFINE_GUID(GUID_PKPixelFormat16bppRGB565, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0a); 118 DEFINE_GUID(GUID_PKPixelFormat16bppGray, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0b); 119 120 /* 24bpp formats */ 121 DEFINE_GUID(GUID_PKPixelFormat24bppBGR, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0c); 122 DEFINE_GUID(GUID_PKPixelFormat24bppRGB, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0d); 123 124 /* 32bpp format */ 125 DEFINE_GUID(GUID_PKPixelFormat32bppBGR, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0e); 126 DEFINE_GUID(GUID_PKPixelFormat32bppBGRA, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0f); 127 DEFINE_GUID(GUID_PKPixelFormat32bppPBGRA, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x10); 128 DEFINE_GUID(GUID_PKPixelFormat32bppGrayFloat, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x11); 129 DEFINE_GUID(GUID_PKPixelFormat32bppRGB, 0xd98c6b95, 0x3efe, 0x47d6, 0xbb, 0x25, 0xeb, 0x17, 0x48, 0xab, 0x0c, 0xf1); 130 DEFINE_GUID(GUID_PKPixelFormat32bppRGBA, 0xf5c7ad2d, 0x6a8d, 0x43dd, 0xa7, 0xa8, 0xa2, 0x99, 0x35, 0x26, 0x1a, 0xe9); 131 DEFINE_GUID(GUID_PKPixelFormat32bppPRGBA, 0x3cc4a650, 0xa527, 0x4d37, 0xa9, 0x16, 0x31, 0x42, 0xc7, 0xeb, 0xed, 0xba); 132 133 /* 48bpp format */ 134 DEFINE_GUID(GUID_PKPixelFormat48bppRGBFixedPoint, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x12); 135 136 /* scRGB formats. Gamma is 1.0 */ 137 /* For a full definition, see the scRGB spec */ 138 139 /* 16bpp format */ 140 DEFINE_GUID(GUID_PKPixelFormat16bppGrayFixedPoint, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x13); 141 142 /* 32bpp format */ 143 DEFINE_GUID(GUID_PKPixelFormat32bppRGB101010, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x14); 144 145 /* 48bpp format */ 146 DEFINE_GUID(GUID_PKPixelFormat48bppRGB, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x15); 147 148 /* 64bpp format */ 149 DEFINE_GUID(GUID_PKPixelFormat64bppRGBA, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x16); 150 DEFINE_GUID(GUID_PKPixelFormat64bppPRGBA, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x17); 151 152 /* 96bpp format */ 153 DEFINE_GUID(GUID_PKPixelFormat96bppRGBFixedPoint, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x18); 154 DEFINE_GUID(GUID_PKPixelFormat96bppRGBFloat, 0xe3fed78f, 0xe8db, 0x4acf, 0x84, 0xc1, 0xe9, 0x7f, 0x61, 0x36, 0xb3, 0x27); 155 156 /* Floating point scRGB formats */ 157 DEFINE_GUID(GUID_PKPixelFormat128bppRGBAFloat, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x19); 158 DEFINE_GUID(GUID_PKPixelFormat128bppPRGBAFloat, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x1a); 159 DEFINE_GUID(GUID_PKPixelFormat128bppRGBFloat, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x1b); 160 161 /* CMYK formats. */ 162 DEFINE_GUID(GUID_PKPixelFormat32bppCMYK, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x1c); 163 164 /* Photon formats */ 165 DEFINE_GUID(GUID_PKPixelFormat64bppRGBAFixedPoint, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x1d); 166 DEFINE_GUID(GUID_PKPixelFormat64bppRGBFixedPoint, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x40); 167 DEFINE_GUID(GUID_PKPixelFormat128bppRGBAFixedPoint, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x1e); 168 DEFINE_GUID(GUID_PKPixelFormat128bppRGBFixedPoint, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x41); 169 170 DEFINE_GUID(GUID_PKPixelFormat64bppRGBAHalf, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x3a); 171 DEFINE_GUID(GUID_PKPixelFormat64bppRGBHalf, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x42); 172 DEFINE_GUID(GUID_PKPixelFormat48bppRGBHalf, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x3b); 173 174 DEFINE_GUID(GUID_PKPixelFormat32bppRGBE, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x3d); 175 176 DEFINE_GUID(GUID_PKPixelFormat16bppGrayHalf, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x3e); 177 DEFINE_GUID(GUID_PKPixelFormat32bppGrayFixedPoint, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x3f); 178 179 180 /* More CMYK formats and n-Channel formats */ 181 DEFINE_GUID(GUID_PKPixelFormat64bppCMYK, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x1f); 182 183 DEFINE_GUID(GUID_PKPixelFormat24bpp3Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x20); 184 DEFINE_GUID(GUID_PKPixelFormat32bpp4Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x21); 185 DEFINE_GUID(GUID_PKPixelFormat40bpp5Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x22); 186 DEFINE_GUID(GUID_PKPixelFormat48bpp6Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x23); 187 DEFINE_GUID(GUID_PKPixelFormat56bpp7Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x24); 188 DEFINE_GUID(GUID_PKPixelFormat64bpp8Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x25); 189 190 DEFINE_GUID(GUID_PKPixelFormat48bpp3Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x26); 191 DEFINE_GUID(GUID_PKPixelFormat64bpp4Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x27); 192 DEFINE_GUID(GUID_PKPixelFormat80bpp5Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x28); 193 DEFINE_GUID(GUID_PKPixelFormat96bpp6Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x29); 194 DEFINE_GUID(GUID_PKPixelFormat112bpp7Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x2a); 195 DEFINE_GUID(GUID_PKPixelFormat128bpp8Channels, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x2b); 196 197 DEFINE_GUID(GUID_PKPixelFormat40bppCMYKAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x2c); 198 DEFINE_GUID(GUID_PKPixelFormat80bppCMYKAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x2d); 199 200 DEFINE_GUID(GUID_PKPixelFormat32bpp3ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x2e); 201 DEFINE_GUID(GUID_PKPixelFormat40bpp4ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x2f); 202 DEFINE_GUID(GUID_PKPixelFormat48bpp5ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x30); 203 DEFINE_GUID(GUID_PKPixelFormat56bpp6ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x31); 204 DEFINE_GUID(GUID_PKPixelFormat64bpp7ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x32); 205 DEFINE_GUID(GUID_PKPixelFormat72bpp8ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x33); 206 207 DEFINE_GUID(GUID_PKPixelFormat64bpp3ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x34); 208 DEFINE_GUID(GUID_PKPixelFormat80bpp4ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x35); 209 DEFINE_GUID(GUID_PKPixelFormat96bpp5ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x36); 210 DEFINE_GUID(GUID_PKPixelFormat112bpp6ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x37); 211 DEFINE_GUID(GUID_PKPixelFormat128bpp7ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x38); 212 DEFINE_GUID(GUID_PKPixelFormat144bpp8ChannelsAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x39); 213 214 /* YCrCb from Advanced Profile */ 215 DEFINE_GUID(GUID_PKPixelFormat12bppYCC420, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x44); 216 DEFINE_GUID(GUID_PKPixelFormat16bppYCC422, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x45); 217 DEFINE_GUID(GUID_PKPixelFormat20bppYCC422, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x46); 218 DEFINE_GUID(GUID_PKPixelFormat32bppYCC422, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x47); 219 DEFINE_GUID(GUID_PKPixelFormat24bppYCC444, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x48); 220 DEFINE_GUID(GUID_PKPixelFormat30bppYCC444, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x49); 221 DEFINE_GUID(GUID_PKPixelFormat48bppYCC444, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x4a); 222 DEFINE_GUID(GUID_PKPixelFormat16bpp48bppYCC444FixedPoint, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x4b); 223 DEFINE_GUID(GUID_PKPixelFormat20bppYCC420Alpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x4c); 224 DEFINE_GUID(GUID_PKPixelFormat24bppYCC422Alpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x4d); 225 DEFINE_GUID(GUID_PKPixelFormat30bppYCC422Alpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x4e); 226 DEFINE_GUID(GUID_PKPixelFormat48bppYCC422Alpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x4f); 227 DEFINE_GUID(GUID_PKPixelFormat32bppYCC444Alpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x50); 228 DEFINE_GUID(GUID_PKPixelFormat40bppYCC444Alpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x51); 229 DEFINE_GUID(GUID_PKPixelFormat64bppYCC444Alpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x52); 230 DEFINE_GUID(GUID_PKPixelFormat64bppYCC444AlphaFixedPoint, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x53); 231 232 //YUV 233 #define GUID_PKPixelFormat12bppYUV420 GUID_PKPixelFormat12bppYCC420 234 #define GUID_PKPixelFormat16bppYUV422 GUID_PKPixelFormat16bppYCC422 235 #define GUID_PKPixelFormat24bppYUV444 GUID_PKPixelFormat24bppYCC444 236 237 /* CMYKDIRECT from Advanced Profile */ 238 DEFINE_GUID(GUID_PKPixelFormat32bppCMYKDIRECT, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x54); 239 DEFINE_GUID(GUID_PKPixelFormat64bppCMYKDIRECT, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x55); 240 DEFINE_GUID(GUID_PKPixelFormat40bppCMYKDIRECTAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x56); 241 DEFINE_GUID(GUID_PKPixelFormat80bppCMYKDIRECTAlpha, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x43); 242 243 // PhotometricInterpretation 244 #define PK_PI_W0 0 // WhiteIsZero 245 #define PK_PI_B0 1 // BlackIsZero 246 #define PK_PI_RGB 2 247 #define PK_PI_RGBPalette 3 248 #define PK_PI_TransparencyMask 4 249 #define PK_PI_CMYK 5 250 #define PK_PI_YCbCr 6 251 #define PK_PI_CIELab 8 252 253 #define PK_PI_NCH 100 254 #define PK_PI_RGBE 101 255 256 #define PK_pixfmtNul 0x00000000 257 #define PK_pixfmtHasAlpha 0x00000010 258 #define PK_pixfmtPreMul 0x00000020 259 #define PK_pixfmtBGR 0x00000040 260 #define PK_pixfmtNeedConvert 0x80000000 261 262 #define LOOKUP_FORWARD 0 263 #define LOOKUP_BACKWARD_TIF 1 264 265 typedef unsigned long WMP_GRBIT; 266 typedef GUID PKPixelFormatGUID; 267 268 typedef struct tagPKPixelInfo 269 { 270 const PKPixelFormatGUID* pGUIDPixFmt; 271 272 size_t cChannel; 273 COLORFORMAT cfColorFormat; 274 BITDEPTH_BITS bdBitDepth; 275 U32 cbitUnit; 276 277 WMP_GRBIT grBit; 278 279 // TIFF 280 U32 uInterpretation; 281 U32 uSamplePerPixel; 282 U32 uBitsPerSample; 283 U32 uSampleFormat; 284 } PKPixelInfo; 285 286 //================================================================ 287 ERR PKAlloc(void** ppv, size_t cb); 288 ERR PKFree(void** ppv); 289 290 //---------------------------------------------------------------- 291 //ERR GetPixelInfo(PKPixelFormatGUID enPixelFormat, const PKPixelInfo** ppPI); 292 ERR PixelFormatLookup(PKPixelInfo* pPI, U8 uLookupType); 293 const PKPixelFormatGUID* GetPixelFormatFromHash(const U8 uPFHash); 294 295 ERR GetImageEncodeIID(const char* szExt, const PKIID** ppIID); 296 ERR GetImageDecodeIID(const char* szExt, const PKIID** ppIID); 297 298 299 //================================================================ 300 #ifdef __ANSI__ 301 struct tagPKFactory; 302 struct tagPKCodecFactory; 303 struct tagPKImageDecode; 304 struct tagPKImageEncode; 305 struct tagPKFormatConverter; 306 #define PKFactory struct tagPKFactory 307 #define PKCodecFactory struct tagPKCodecFactory 308 #define PKImageDecode struct tagPKImageDecode 309 #define PKImageEncode struct tagPKImageEncode 310 #define PKFormatConverter struct tagPKFormatConverter 311 #else // __ANSI__ 312 typedef struct tagPKFactory PKFactory; 313 typedef struct tagPKCodecFactory PKCodecFactory; 314 typedef struct tagPKImageDecode PKImageDecode; 315 typedef struct tagPKImageEncode PKImageEncode; 316 typedef struct tagPKFormatConverter PKFormatConverter; 317 #endif // __ANSI__ 318 //================================================================ 319 typedef struct tagPKStream 320 { 321 ERR (*InitializeFromFilename)(const char*, ULong); 322 323 ERR (*Release)(void); 324 325 FILE* fp; 326 } PKStream; 327 328 329 //================================================================ 330 typedef struct tagPKFactory 331 { 332 ERR (*CreateStream)(PKStream**); 333 334 ERR (*CreateStreamFromFilename)(struct WMPStream**, const char*, const char*); 335 ERR (*CreateStreamFromMemory)(struct WMPStream**, void*, size_t); 336 337 ERR (*Release)(PKFactory**); 338 #ifdef __ANSI__ 339 #undef PKFactory 340 #endif // __ANSI__ 341 } PKFactory; 342 343 //---------------------------------------------------------------- 344 ERR PKCreateFactory_CreateStream(PKStream** ppStream); 345 ERR PKCreateFactory_Release(PKFactory** ppFactory); 346 347 EXTERN_C ERR PKCreateFactory(PKFactory**, U32); 348 349 350 //================================================================ 351 typedef struct tagPKCodecFactory 352 { 353 ERR (*CreateCodec)(const PKIID*, void**); 354 ERR (*CreateDecoderFromFile)(const char*, PKImageDecode**); 355 ERR (*CreateFormatConverter)(PKFormatConverter**); 356 357 ERR (*Release)(PKCodecFactory**); 358 #ifdef __ANSI__ 359 #undef PKCodecFactory 360 #endif // __ANSI__ 361 } PKCodecFactory; 362 363 //---------------------------------------------------------------- 364 ERR PKCodecFactory_CreateCodec(const PKIID* iid, void** ppv); 365 ERR PKCreateCodecFactory_Release(PKCodecFactory** ppCFactory); 366 367 EXTERN_C ERR PKCreateCodecFactory(PKCodecFactory**, U32); 368 369 //================================================================ 370 371 typedef enum BANDEDENCSTATE 372 { 373 BANDEDENCSTATE_UNINITIALIZED = 0, 374 BANDEDENCSTATE_INIT, 375 BANDEDENCSTATE_ENCODING, 376 BANDEDENCSTATE_TERMINATED, 377 BANDEDENCSTATE_NONBANDEDENCODE, 378 } BANDEDENCSTATE; 379 380 typedef struct tagPKImageEncode 381 { 382 //ERR (*GetPixelFormat)(MILPixelFormat*)); 383 ERR (*Initialize)(PKImageEncode*, struct WMPStream*, void*, size_t); 384 ERR (*Terminate)(PKImageEncode*); 385 386 ERR (*SetPixelFormat)(PKImageEncode*, PKPixelFormatGUID); 387 ERR (*SetSize)(PKImageEncode*, I32, I32); 388 ERR (*SetResolution)(PKImageEncode*, Float, Float); 389 ERR (*SetColorContext)(PKImageEncode *pIE, const U8 *pbColorContext, 390 U32 cbColorContext); 391 ERR (*SetDescriptiveMetadata)(PKImageEncode *pIE, 392 const DESCRIPTIVEMETADATA *pDescMetadata); 393 394 ERR (*WritePixels)(PKImageEncode*, U32, U8*, U32); 395 ERR (*WriteSource)(PKImageEncode*, PKFormatConverter*, PKRect*); 396 397 // Banded encode API - currently only implemented for WMP encoder 398 ERR (*WritePixelsBandedBegin)(PKImageEncode* pEncoder, struct WMPStream *pPlanarAlphaTempFile); 399 ERR (*WritePixelsBanded)(PKImageEncode* pEncoder, U32 cLines, U8* pbPixels, U32 cbStride, Bool fLastCall); 400 ERR (*WritePixelsBandedEnd)(PKImageEncode* pEncoder); 401 #define TEMPFILE_COPYBUF_SIZE 8192 // Means when using tempfile for planar alpha banded encode, copy this many bytes at a time 402 403 ERR (*Transcode)(PKImageEncode*, PKImageDecode*, CWMTranscodingParam*); 404 405 ERR (*CreateNewFrame)(PKImageEncode*, void*, size_t); 406 407 ERR (*Release)(PKImageEncode**); 408 409 struct WMPStream* pStream; 410 size_t offStart; 411 412 PKPixelFormatGUID guidPixFormat; 413 414 U32 uWidth; 415 U32 uHeight; 416 U32 idxCurrentLine; 417 418 Float fResX; 419 Float fResY; 420 421 U32 cFrame; 422 423 Bool fHeaderDone; 424 size_t offPixel; 425 size_t cbPixel; 426 U8 *pbColorContext; 427 U32 cbColorContext; 428 U8 *pbEXIFMetadata; 429 U32 cbEXIFMetadataByteCount; 430 U8 *pbGPSInfoMetadata; 431 U32 cbGPSInfoMetadataByteCount; 432 U8 *pbIPTCNAAMetadata; 433 U32 cbIPTCNAAMetadataByteCount; 434 U8 *pbXMPMetadata; 435 U32 cbXMPMetadataByteCount; 436 U8 *pbPhotoshopMetadata; 437 U32 cbPhotoshopMetadataByteCount; 438 DESCRIPTIVEMETADATA sDescMetadata; 439 440 Bool bWMP;//for the encoder in decoding 441 442 struct 443 { 444 WmpDEMisc wmiDEMisc; 445 CWMImageInfo wmiI; 446 CWMIStrCodecParam wmiSCP; 447 CTXSTRCODEC ctxSC; 448 CWMImageInfo wmiI_Alpha; 449 CWMIStrCodecParam wmiSCP_Alpha; 450 CTXSTRCODEC ctxSC_Alpha; 451 452 Bool bHasAlpha; 453 Long nOffImage; 454 Long nCbImage; 455 Long nOffAlpha; 456 Long nCbAlpha; 457 458 ORIENTATION oOrientation; 459 460 // Banded encode state variables 461 BANDEDENCSTATE eBandedEncState; 462 struct WMPStream *pPATempFile; 463 } WMP; 464 465 #ifdef __ANSI__ 466 #undef PKImageEncode 467 #endif // __ANSI__ 468 } PKImageEncode; 469 470 //---------------------------------------------------------------- 471 ERR PKImageEncode_Create_WMP(PKImageEncode** ppIE); 472 473 ERR PKImageEncode_Initialize(PKImageEncode* pIE, struct WMPStream* pStream, void* pvParam, size_t cbParam); 474 ERR PKImageEncode_Terminate(PKImageEncode* pIE); 475 ERR PKImageEncode_SetPixelFormat(PKImageEncode* pIE, PKPixelFormatGUID enPixelFormat); 476 ERR PKImageEncode_SetSize(PKImageEncode* pIE, I32 iWidth, I32 iHeight); 477 ERR PKImageEncode_SetResolution(PKImageEncode* pIE, Float rX, Float rY); 478 ERR PKImageEncode_SetColorContext(PKImageEncode *pIE, const U8 *pbColorContext, U32 cbColorContext); 479 ERR PKImageEncode_SetDescriptiveMetadata(PKImageEncode *pIE, const DESCRIPTIVEMETADATA *pDescMetadata); 480 ERR PKImageEncode_WritePixels(PKImageEncode* pIE, U32 cLine, U8* pbPixel, U32 cbStride); 481 ERR PKImageEncode_CreateNewFrame(PKImageEncode* pIE, void* pvParam, size_t cbParam); 482 ERR PKImageEncode_Release(PKImageEncode** ppIE); 483 484 ERR PKImageEncode_SetXMPMetadata_WMP(PKImageEncode *pIE, const U8 *pbXMPMetadata, U32 cbXMPMetadata); 485 ERR PKImageEncode_SetEXIFMetadata_WMP(PKImageEncode *pIE, const U8 *pbEXIFMetadata, U32 cbEXIFMetadata); 486 ERR PKImageEncode_SetGPSInfoMetadata_WMP(PKImageEncode *pIE, const U8 *pbGPSInfoMetadata, U32 cbGPSInfoMetadata); 487 ERR PKImageEncode_SetIPTCNAAMetadata_WMP(PKImageEncode *pIE, const U8 *pbIPTCNAAMetadata, U32 cbIPTCNAAMetadata); 488 ERR PKImageEncode_SetPhotoshopMetadata_WMP(PKImageEncode *pIE, const U8 *pbPhotoshopMetadata, U32 cbPhotoshopMetadata); 489 490 void FreeDescMetadata(DPKPROPVARIANT *pvar); 491 492 ERR PKImageEncode_Create(PKImageEncode** ppIE); 493 494 //================================================================ 495 typedef struct tagPKImageDecode 496 { 497 ERR (*Initialize)(PKImageDecode*, struct WMPStream* pStream); 498 499 ERR (*GetPixelFormat)(PKImageDecode*, PKPixelFormatGUID*); 500 ERR (*GetSize)(PKImageDecode*, I32*, I32*); 501 ERR (*GetResolution)(PKImageDecode*, Float*, Float*); 502 ERR (*GetColorContext)(PKImageDecode *pID, U8 *pbColorContext, 503 U32 *pcbColorContext); 504 ERR (*GetDescriptiveMetadata)(PKImageDecode *pIE, 505 DESCRIPTIVEMETADATA *pDescMetadata); 506 507 ERR (*GetRawStream)(PKImageDecode*, struct WMPStream**); 508 509 ERR (*Copy)(PKImageDecode*, const PKRect*, U8*, U32); 510 511 ERR (*GetFrameCount)(PKImageDecode*, U32*); 512 ERR (*SelectFrame)(PKImageDecode*, U32); 513 514 ERR (*Release)(PKImageDecode**); 515 516 struct WMPStream* pStream; 517 Bool fStreamOwner; 518 size_t offStart; 519 520 PKPixelFormatGUID guidPixFormat; 521 522 U32 uWidth; 523 U32 uHeight; 524 U32 idxCurrentLine; 525 526 Float fResX; 527 Float fResY; 528 529 U32 cFrame; 530 531 struct 532 { 533 WmpDEMisc wmiDEMisc; 534 CWMImageInfo wmiI; 535 CWMIStrCodecParam wmiSCP; 536 CTXSTRCODEC ctxSC; 537 CWMImageInfo wmiI_Alpha; 538 CWMIStrCodecParam wmiSCP_Alpha; 539 CTXSTRCODEC ctxSC_Alpha; 540 541 Bool bHasAlpha; 542 Long nOffImage; 543 Long nCbImage; 544 Long nOffAlpha; 545 Long nCbAlpha; 546 Bool bIgnoreOverlap; 547 size_t DecoderCurrMBRow; 548 size_t DecoderCurrAlphaMBRow; 549 size_t cMarker; 550 size_t cLinesDecoded; 551 size_t cLinesCropped; // Lines may be cropped from the top - buffer for subsequent decodes must be adjusted 552 Bool fFirstNonZeroDecode; 553 554 Bool fOrientationFromContainer; 555 ORIENTATION oOrientationFromContainer; // Tag 0xBC02 in HD Photo container 556 557 DESCRIPTIVEMETADATA sDescMetadata; 558 } WMP; 559 560 #ifdef __ANSI__ 561 #undef PKImageDecode 562 #endif // __ANSI__ 563 } PKImageDecode; 564 565 //---------------------------------------------------------------- 566 ERR PKImageDecode_Create_WMP(PKImageDecode** ppID); 567 568 ERR PKImageDecode_Initialize(PKImageDecode* pID, struct WMPStream* pStream); 569 ERR PKImageDecode_GetPixelFormat(PKImageDecode* pID, PKPixelFormatGUID* pPF); 570 ERR PKImageDecode_GetSize(PKImageDecode* pID, I32* piWidth, I32* piHeight); 571 ERR PKImageDecode_GetResolution(PKImageDecode* pID, Float* pfrX, Float* pfrY); 572 ERR PKImageDecode_GetColorContext(PKImageDecode *pID, U8 *pbColorContext, U32 *pcbColorContext); 573 ERR PKImageDecode_GetDescriptiveMetadata(PKImageDecode *pID, DESCRIPTIVEMETADATA *pDescMetadata); 574 ERR PKImageDecode_Copy(PKImageDecode* pID, const PKRect* pRect, U8* pb, U32 cbStride); 575 ERR PKImageDecode_GetFrameCount(PKImageDecode* pID, U32* puCount); 576 ERR PKImageDecode_SelectFrame(PKImageDecode* pID, U32 uFrame); 577 ERR PKImageDecode_Release(PKImageDecode** ppID); 578 579 ERR PKImageDecode_Create(PKImageDecode** ppID); 580 ERR PKCodecFactory_CreateDecoderFromFile(const char* szFilename, PKImageDecode** ppDecoder); 581 582 //================================================================ 583 typedef struct tagPKFormatConverter 584 { 585 ERR (*Initialize)(PKFormatConverter*, PKImageDecode*, char *pExt, PKPixelFormatGUID); 586 ERR (*InitializeConvert)(PKFormatConverter* pFC, const PKPixelFormatGUID enPFFrom, 587 char *pExt, PKPixelFormatGUID enPFTTo); 588 589 ERR (*GetPixelFormat)(PKFormatConverter*, PKPixelFormatGUID*); 590 ERR (*GetSourcePixelFormat)(PKFormatConverter*, PKPixelFormatGUID*); 591 ERR (*GetSize)(PKFormatConverter*, I32*, I32*); 592 ERR (*GetResolution)(PKFormatConverter*, Float*, Float*); 593 594 ERR (*Copy)(PKFormatConverter*, const PKRect*, U8*, U32); 595 ERR (*Convert)(PKFormatConverter*, const PKRect*, U8*, U32); 596 597 ERR (*Release)(PKFormatConverter**); 598 599 PKImageDecode* pDecoder; 600 PKPixelFormatGUID enPixelFormat; 601 #ifdef __ANSI__ 602 #undef PKFormatConverter 603 #endif // __ANSI__ 604 } PKFormatConverter; 605 606 //---------------------------------------------------------------- 607 ERR PKImageEncode_Transcode(PKImageEncode* pIE, PKFormatConverter* pFC, PKRect* pRect); 608 ERR PKImageEncode_WriteSource(PKImageEncode* pIE, PKFormatConverter* pFC, PKRect* pRect); 609 ERR PKFormatConverter_Initialize(PKFormatConverter* pFC, PKImageDecode* pID, char *pExt, PKPixelFormatGUID enPF); 610 ERR PKFormatConverter_InitializeConvert(PKFormatConverter* pFC, const PKPixelFormatGUID enPFFrom, 611 char *pExt, PKPixelFormatGUID enPFTo); 612 ERR PKFormatConverter_GetPixelFormat(PKFormatConverter* pFC, PKPixelFormatGUID* pPF); 613 ERR PKFormatConverter_GetSourcePixelFormat(PKFormatConverter* pFC, PKPixelFormatGUID* pPF); 614 ERR PKFormatConverter_GetSize(PKFormatConverter* pFC, I32* piWidth, I32* piHeight); 615 ERR PKFormatConverter_GetResolution(PKFormatConverter* pFC, Float* pfrX, Float* pfrY); 616 ERR PKFormatConverter_Copy(PKFormatConverter* pFC, const PKRect* pRect, U8* pb, U32 cbStride); 617 ERR PKFormatConverter_Convert(PKFormatConverter* pFC, const PKRect* pRect, U8* pb, U32 cbStride); 618 ERR PKFormatConverter_Release(PKFormatConverter** ppFC); 619 620 // Think of this as static member of PKFormatConverter "class" 621 ERR PKFormatConverter_EnumConversions(const PKPixelFormatGUID *pguidSourcePF, 622 const U32 iIndex, 623 const PKPixelFormatGUID **ppguidTargetPF); 624 625 ERR PKCodecFactory_CreateFormatConverter(PKFormatConverter** ppFConverter); 626 627 //---------------------------------------------------------------- 628 ERR PKAlloc(void** ppv, size_t cb); 629 ERR PKFree(void** ppv); 630 ERR PKAllocAligned(void** ppv, size_t cb, size_t iAlign); 631 ERR PKFreeAligned(void** ppv); 632 633 #ifdef __cplusplus 634 } // extern "C" 635 #endif 636 637