github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/image/jxr/jxrlib/jxrgluelib/JXRMeta.h (about)

     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  #include <windowsmediaphoto.h>
    31  #ifndef WIN32
    32  #include <wmspecstring.h>
    33  #endif
    34  
    35  #ifndef UNREFERENCED_PARAMETER
    36  #define UNREFERENCED_PARAMETER(P) { (P) = (P); }
    37  #endif UNREFERENCED_PARAMETER
    38  
    39  //================================================================
    40  // Container
    41  //================================================================
    42  
    43  // Keep these in sort order so that we can easily confirm we are outputting tags in ascending order
    44  #define WMP_tagNull 0
    45  
    46  #define WMP_tagDocumentName         0x010d  // Descriptive metadata tag
    47  #define WMP_tagImageDescription     0x010e  // Descriptive metadata tag
    48  #define WMP_tagCameraMake           0x010f  // Descriptive metadata tag
    49  #define WMP_tagCameraModel          0x0110  // Descriptive metadata tag
    50  #define WMP_tagPageName             0x011d  // Descriptive metadata tag
    51  #define WMP_tagPageNumber           0x0129  // Descriptive metadata tag
    52  #define WMP_tagSoftware             0x0131  // Descriptive metadata tag
    53  #define WMP_tagDateTime             0x0132  // Descriptive metadata tag
    54  #define WMP_tagArtist               0x013b  // Descriptive metadata tag
    55  #define WMP_tagHostComputer         0x013c  // Descriptive metadata tag
    56  
    57  #define WMP_tagXMPMetadata 0x02bc
    58  
    59  #define WMP_tagRatingStars          0x4746  // Descriptive metadata tag
    60  #define WMP_tagRatingValue          0x4749  // Descriptive metadata tag
    61  #define WMP_tagCopyright            0x8298  // Descriptive metadata tag
    62  
    63  #define WMP_tagEXIFMetadata 0x8769
    64  #define WMP_tagGPSInfoMetadata 0x8825
    65  #define WMP_tagIPTCNAAMetadata 0x83bb
    66  #define WMP_tagPhotoshopMetadata 0x8649
    67  #define WMP_tagInteroperabilityIFD 0xa005
    68  #define WMP_tagIccProfile 0x8773 // Need to use same tag as TIFF!!
    69  
    70  #define WMP_tagCaption              0x9c9b  // Descriptive metadata tag
    71  
    72  #define WMP_tagPixelFormat 0xbc01
    73  #define WMP_tagTransformation 0xbc02
    74  #define WMP_tagCompression 0xbc03
    75  #define WMP_tagImageType 0xbc04
    76  
    77  #define WMP_tagImageWidth 0xbc80
    78  #define WMP_tagImageHeight 0xbc81
    79  
    80  #define WMP_tagWidthResolution 0xbc82
    81  #define WMP_tagHeightResolution 0xbc83
    82  
    83  #define WMP_tagImageOffset 0xbcc0
    84  #define WMP_tagImageByteCount 0xbcc1
    85  #define WMP_tagAlphaOffset 0xbcc2
    86  #define WMP_tagAlphaByteCount 0xbcc3
    87  #define WMP_tagImageDataDiscard 0xbcc4
    88  #define WMP_tagAlphaDataDiscard 0xbcc5
    89  
    90  
    91  #define WMP_typBYTE 1
    92  #define WMP_typASCII 2
    93  #define WMP_typSHORT 3
    94  #define WMP_typLONG 4
    95  #define WMP_typRATIONAL 5
    96  #define WMP_typSBYTE 6
    97  #define WMP_typUNDEFINED 7
    98  #define WMP_typSSHORT 8
    99  #define WMP_typSLONG 9
   100  #define WMP_typSRATIONAL 10
   101  #define WMP_typFLOAT 11
   102  #define WMP_typDOUBLE 12
   103  
   104  
   105  #define WMP_valCompression 0xbc
   106  #define WMP_valWMPhotoID WMP_valCompression
   107  
   108  
   109  #ifdef WIN32
   110  #define __in_win    __in
   111  #define __out_win   __out
   112  #endif
   113  
   114  
   115  //================================================================
   116  
   117  typedef enum
   118  {
   119      DPKVT_EMPTY = 0,
   120      DPKVT_UI1 = 17,
   121      DPKVT_UI2 = 18,
   122      DPKVT_UI4 = 19,
   123      DPKVT_LPSTR = 30,
   124      DPKVT_LPWSTR = 31,
   125      DPKVT_BYREF = 0x4000,
   126  } DPKVARTYPE;
   127  
   128  typedef struct DPKPROPVARIANT
   129  {
   130      DPKVARTYPE  vt;
   131      union
   132      {
   133          U8 bVal;        // DPKVT_UI1
   134          U16 uiVal;      // DPKVT_UI2
   135          U32 ulVal;      // DPKVT_UI4
   136          char *pszVal;   // DPKVT_LPSTR
   137          U16 *pwszVal;   // DPKVT_LPWSTR
   138          U8 *pbVal;      // DPKVT_BYREF | DPKVT_UI1
   139      } VT;
   140  } DPKPROPVARIANT;
   141  
   142  typedef struct DESCRIPTIVEMETADATA
   143  {
   144      DPKPROPVARIANT  pvarImageDescription;   // WMP_tagImageDescription
   145      DPKPROPVARIANT  pvarCameraMake;         // WMP_tagCameraMake
   146      DPKPROPVARIANT  pvarCameraModel;        // WMP_tagCameraModel
   147      DPKPROPVARIANT  pvarSoftware;           // WMP_tagSoftware
   148      DPKPROPVARIANT  pvarDateTime;           // WMP_tagDateTime
   149      DPKPROPVARIANT  pvarArtist;             // WMP_tagArtist
   150      DPKPROPVARIANT  pvarCopyright;          // WMP_tagCopyright
   151      DPKPROPVARIANT  pvarRatingStars;        // WMP_tagRatingStars
   152      DPKPROPVARIANT  pvarRatingValue;        // WMP_tagRatingValue
   153      DPKPROPVARIANT  pvarCaption;            // WMP_tagCaption
   154      DPKPROPVARIANT  pvarDocumentName;       // WMP_tagDocumentName
   155      DPKPROPVARIANT  pvarPageName;           // WMP_tagPageName
   156      DPKPROPVARIANT  pvarPageNumber;         // WMP_tagPageNumber
   157      DPKPROPVARIANT  pvarHostComputer;       // WMP_tagHostComputer
   158  } DESCRIPTIVEMETADATA;
   159  
   160  typedef struct tagWmpDE
   161  {
   162      U16 uTag;
   163      U16 uType;
   164      U32 uCount;
   165      U32 uValueOrOffset;
   166  } WmpDE;
   167  
   168  typedef struct tagWmpDEMisc
   169  {
   170      U32 uImageOffset;
   171      U32 uImageByteCount;
   172      U32 uAlphaOffset;
   173      U32 uAlphaByteCount;
   174  
   175      U32 uOffPixelFormat;
   176      U32 uOffImageByteCount;
   177      U32 uOffAlphaOffset;
   178      U32 uOffAlphaByteCount;
   179      U32 uColorProfileOffset;
   180      U32 uColorProfileByteCount;
   181      U32 uXMPMetadataOffset;
   182      U32 uXMPMetadataByteCount;
   183      U32 uEXIFMetadataOffset;
   184      U32 uEXIFMetadataByteCount;
   185      U32 uGPSInfoMetadataOffset;
   186      U32 uGPSInfoMetadataByteCount;
   187      U32 uIPTCNAAMetadataOffset;
   188      U32 uIPTCNAAMetadataByteCount;
   189      U32 uPhotoshopMetadataOffset;
   190      U32 uPhotoshopMetadataByteCount;
   191      U32 uDescMetadataOffset;
   192      U32 uDescMetadataByteCount;
   193  } WmpDEMisc;
   194  
   195  
   196  //================================================================
   197  EXTERN_C ERR GetUShort(
   198      __in_ecount(1) struct WMPStream* pWS,
   199      size_t offPos,
   200      __out_ecount(1) U16* puValue
   201  );
   202  
   203  EXTERN_C ERR PutUShort(
   204      __in_ecount(1) struct WMPStream* pWS,
   205      size_t offPos,
   206      U16 uValue
   207  );
   208  
   209  EXTERN_C ERR GetULong(
   210      __in_ecount(1) struct WMPStream* pWS,
   211      size_t offPos,
   212      __out_ecount(1) U32* puValue
   213  );
   214  
   215  EXTERN_C ERR PutULong(
   216      __in_ecount(1) struct WMPStream* pWS,
   217      size_t offPos,
   218      U32 uValue
   219  );
   220  
   221  EXTERN_C ERR WriteWmpDE(
   222      __in_ecount(1) struct WMPStream* pWS,
   223      size_t *pOffPos,
   224      const __in_ecount(1) WmpDE* pDE,
   225      const U8 *pbData,
   226      U32 *pcbDataWrittenToOffset
   227  );
   228  
   229  
   230  EXTERN_C ERR ReadPropvar(__in_ecount(1) struct WMPStream* pWS,
   231                           const __in_win U16 uType,
   232                           const __in_win U32 uCount,
   233                           const __in_win U32 uValue,
   234                           __out_win DPKPROPVARIANT *pvar);
   235  
   236  
   237  
   238  // read and write little endian words/dwords from a buffer on both big and little endian cpu's
   239  // with full buffer overflow checking
   240  
   241  #define WMP_INTEL_ENDIAN    ('I')
   242  
   243  EXTERN_C ERR getbfcpy(U8* pbdest, const U8* pb, size_t cb, size_t ofs, U32 n);
   244  EXTERN_C ERR getbfw(const U8* pb, size_t cb, size_t ofs, U16* pw);
   245  EXTERN_C ERR getbfdw(const U8* pb, size_t cb, size_t ofs, U32* pdw);
   246  EXTERN_C ERR getbfwbig(const U8* pb, size_t cb, size_t ofs, U16* pw);
   247  EXTERN_C ERR getbfdwbig(const U8* pb, size_t cb, size_t ofs, U32* pdw);
   248  EXTERN_C ERR getbfwe(const U8* pb, size_t cb, size_t ofs, U16* pw, U8 endian);
   249  EXTERN_C ERR getbfdwe(const U8* pb, size_t cb, size_t ofs, U32* pdw, U8 endian);
   250  EXTERN_C ERR setbfcpy(U8* pb, size_t cb, size_t ofs, const U8* pbset, size_t cbset);
   251  EXTERN_C ERR setbfw(U8* pb, size_t cb, size_t ofs, U16 dw);
   252  EXTERN_C ERR setbfdw(U8* pb, size_t cb, size_t ofs, U32 dw);
   253  EXTERN_C ERR setbfwbig(U8* pb, size_t cb, size_t ofs, U16 dw);
   254  EXTERN_C ERR setbfdwbig(U8* pb, size_t cb, size_t ofs, U32 dw);
   255  EXTERN_C ERR BufferCalcIFDSize(const U8* pb, size_t cb, U32 uIFDOfs, U8 endian, U32 *pcbifd);
   256  EXTERN_C ERR StreamCalcIFDSize(struct WMPStream* pWS, U32 uIFDOfs, U32 *pcbifd);
   257  EXTERN_C ERR BufferCopyIFD(const U8* pbsrc, U32 cbsrc, U32 ofssrc, U8 endian, U8* pbdest, U32 cbdest, U32* pofsdest);
   258  EXTERN_C ERR StreamCopyIFD(struct WMPStream* pWS, U32 ofssrc, U8* pbdest, U32 cbdest, U32* pofsdest);