< prev index next >

src/java.desktop/share/native/liblcms/cmstypes.c

Print this page
*** 120,11 ***
      ctx ->TagTypes = pt;
  
      return TRUE;
  }
  
! // Return handler for a given type or NULL if not found. Shared between normal types and MPE. It first tries the additons
  // made by plug-ins and then the built-in defaults.
  static
  cmsTagTypeHandler* GetHandler(cmsTagTypeSignature sig, _cmsTagTypeLinkedList* PluginLinkedList, _cmsTagTypeLinkedList* DefaultLinkedList)
  {
      _cmsTagTypeLinkedList* pt;
--- 120,11 ---
      ctx ->TagTypes = pt;
  
      return TRUE;
  }
  
! // Return handler for a given type or NULL if not found. Shared between normal types and MPE. It first tries the additions
  // made by plug-ins and then the built-in defaults.
  static
  cmsTagTypeHandler* GetHandler(cmsTagTypeSignature sig, _cmsTagTypeLinkedList* PluginLinkedList, _cmsTagTypeLinkedList* DefaultLinkedList)
  {
      _cmsTagTypeLinkedList* pt;

*** 952,10 ***
--- 952,11 ---
  
  static
  void *Type_Text_Description_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
  {
      char* Text = NULL;
+     wchar_t* UnicodeString = NULL;
      cmsMLU* mlu = NULL;
      cmsUInt32Number  AsciiCount;
      cmsUInt32Number  i, UnicodeCode, UnicodeCount;
      cmsUInt16Number  ScriptCodeCode, Dummy;
      cmsUInt8Number   ScriptCodeCount;

*** 971,11 ***
  
      // Check for size
      if (SizeOfTag < AsciiCount) return NULL;
  
      // All seems Ok, allocate the container
!     mlu = cmsMLUalloc(self ->ContextID, 1);
      if (mlu == NULL) return NULL;
  
      // As many memory as size of tag
      Text = (char*) _cmsMalloc(self ->ContextID, AsciiCount + 1);
      if (Text == NULL) goto Error;
--- 972,11 ---
  
      // Check for size
      if (SizeOfTag < AsciiCount) return NULL;
  
      // All seems Ok, allocate the container
!     mlu = cmsMLUalloc(self ->ContextID, 2);
      if (mlu == NULL) return NULL;
  
      // As many memory as size of tag
      Text = (char*) _cmsMalloc(self ->ContextID, AsciiCount + 1);
      if (Text == NULL) goto Error;

*** 996,19 ***
      if (SizeOfTag < 2* sizeof(cmsUInt32Number)) goto Done;
      if (!_cmsReadUInt32Number(io, &UnicodeCode)) goto Done;
      if (!_cmsReadUInt32Number(io, &UnicodeCount)) goto Done;
      SizeOfTag -= 2* sizeof(cmsUInt32Number);
  
!     if (SizeOfTag < UnicodeCount*sizeof(cmsUInt16Number)) goto Done;
  
!     for (i=0; i < UnicodeCount; i++) {
!         if (!io ->Read(io, &Dummy, sizeof(cmsUInt16Number), 1)) goto Done;
      }
      SizeOfTag -= UnicodeCount*sizeof(cmsUInt16Number);
  
      // Skip ScriptCode code if present. Some buggy profiles does have less
!     // data that stricttly required. We need to skip it as this type may come
      // embedded in other types.
  
      if (SizeOfTag >= sizeof(cmsUInt16Number) + sizeof(cmsUInt8Number) + 67) {
  
          if (!_cmsReadUInt16Number(io, &ScriptCodeCode)) goto Done;
--- 997,34 ---
      if (SizeOfTag < 2* sizeof(cmsUInt32Number)) goto Done;
      if (!_cmsReadUInt32Number(io, &UnicodeCode)) goto Done;
      if (!_cmsReadUInt32Number(io, &UnicodeCount)) goto Done;
      SizeOfTag -= 2* sizeof(cmsUInt32Number);
  
!     if (UnicodeCount == 0 || SizeOfTag < UnicodeCount*sizeof(cmsUInt16Number)) goto Done;
+ 
+     UnicodeString = (wchar_t*)_cmsMallocZero(self->ContextID, (UnicodeCount + 1) * sizeof(wchar_t));
+     if (UnicodeString == NULL) goto Done;
+ 
+     if (!_cmsReadWCharArray(io, UnicodeCount, UnicodeString)) {
+         _cmsFree(self->ContextID, (void*)UnicodeString);
+         goto Done;
+     }
+ 
+     UnicodeString[UnicodeCount] = 0;
  
!     if (!cmsMLUsetWide(mlu, cmsV2Unicode, cmsV2Unicode, UnicodeString)) {
!         _cmsFree(self->ContextID, (void*)UnicodeString);
+         goto Done;
      }
+ 
+     _cmsFree(self->ContextID, (void*)UnicodeString);
+     UnicodeString = NULL;
+ 
      SizeOfTag -= UnicodeCount*sizeof(cmsUInt16Number);
  
      // Skip ScriptCode code if present. Some buggy profiles does have less
!     // data that strictly required. We need to skip it as this type may come
      // embedded in other types.
  
      if (SizeOfTag >= sizeof(cmsUInt16Number) + sizeof(cmsUInt8Number) + 67) {
  
          if (!_cmsReadUInt16Number(io, &ScriptCodeCode)) goto Done;

*** 1024,10 ***
--- 1040,11 ---
  
      *nItems = 1;
      return mlu;
  
  Error:
+     if (UnicodeString)  _cmsFree(self->ContextID, (void*)UnicodeString);
      if (Text) _cmsFree(self ->ContextID, (void*) Text);
      if (mlu) cmsMLUfree(mlu);
      return NULL;
  }
  

*** 1076,11 ***
          Wide = (wchar_t*) _cmsCalloc(self ->ContextID, len, sizeof(wchar_t));
          if (Wide == NULL) goto Error;
  
          // Get both representations.
          cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry,  Text, len * sizeof(char));
!         cmsMLUgetWide(mlu,  cmsNoLanguage, cmsNoCountry,  Wide, len * sizeof(wchar_t));
      }
  
      // Tell the real text len including the null terminator and padding
      len_text = (cmsUInt32Number) strlen(Text) + 1;
      // Compute an total tag size requirement
--- 1093,11 ---
          Wide = (wchar_t*) _cmsCalloc(self ->ContextID, len, sizeof(wchar_t));
          if (Wide == NULL) goto Error;
  
          // Get both representations.
          cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry,  Text, len * sizeof(char));
!         cmsMLUgetWide(mlu,  cmsV2Unicode,  cmsV2Unicode,  Wide, len * sizeof(wchar_t));
      }
  
      // Tell the real text len including the null terminator and padding
      len_text = (cmsUInt32Number) strlen(Text) + 1;
      // Compute an total tag size requirement

*** 1575,12 ***
      // Now read the remaining of tag and fill all strings. Subtract the directory
      SizeOfTag   = (LargestPosition * sizeof(wchar_t)) / sizeof(cmsUInt16Number);
      if (SizeOfTag == 0)
      {
          Block = NULL;
-         NumOfWchar = 0;
- 
      }
      else
      {
          // Make sure this is an even utf16 size.
          if (SizeOfTag & 1) goto Error;
--- 1592,10 ---

*** 1938,11 ***
      cmsUNUSED_PARAMETER(SizeOfTag);
  }
  
  // We only allow a specific MPE structure: Matrix plus prelin, plus clut, plus post-lin.
  static
! cmsBool  Type_LUT8_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
  {
      cmsUInt32Number j, nTabSize, i;
      cmsUInt8Number  val;
      cmsPipeline* NewLUT = (cmsPipeline*) Ptr;
      cmsStage* mpe;
--- 1953,11 ---
      cmsUNUSED_PARAMETER(SizeOfTag);
  }
  
  // We only allow a specific MPE structure: Matrix plus prelin, plus clut, plus post-lin.
  static
! cmsBool Type_LUT8_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
  {
      cmsUInt32Number j, nTabSize, i;
      cmsUInt8Number  val;
      cmsPipeline* NewLUT = (cmsPipeline*) Ptr;
      cmsStage* mpe;

*** 1951,10 ***
--- 1966,16 ---
      _cmsStageCLutData* clut = NULL;
      cmsUInt32Number clutPoints;
  
      // Disassemble the LUT into components.
      mpe = NewLUT -> Elements;
+ 
+     if (mpe == NULL) {  // Should never be empty. Corrupted?
+         cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "empty LUT8 is not supported");
+         return FALSE;
+     }
+ 
      if (mpe ->Type == cmsSigMatrixElemType) {
  
          if (mpe->InputChannels != 3 || mpe->OutputChannels != 3) return FALSE;
          MatMPE = (_cmsStageMatrixData*) mpe ->Data;
          mpe = mpe -> Next;

*** 2692,12 ***
      for (i=0; i < n; i++) {
  
          // If this is a table-based curve, use curve type even on V4
          CurrentType = Type;
  
!         if ((Curves[i] ->nSegments == 0)||
!             ((Curves[i]->nSegments == 2) && (Curves[i] ->Segments[1].Type == 0)) )
              CurrentType = cmsSigCurveType;
          else
          if (Curves[i] ->Segments[0].Type < 0)
              CurrentType = cmsSigCurveType;
  
--- 2713,12 ---
      for (i=0; i < n; i++) {
  
          // If this is a table-based curve, use curve type even on V4
          CurrentType = Type;
  
!         if ((Curves[i] ->nSegments == 0) ||                                         // 16 bits tabulated
!             ((Curves[i]->nSegments == 3) && (Curves[i] ->Segments[1].Type == 0)) )  // Floating-point tabulated
              CurrentType = cmsSigCurveType;
          else
          if (Curves[i] ->Segments[0].Type < 0)
              CurrentType = cmsSigCurveType;
  

*** 4457,12 ***
      _cmsStageCLutData* clut;
  
      if (!_cmsReadUInt16Number(io, &InputChans)) return NULL;
      if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL;
  
!     if (InputChans == 0) goto Error;
!     if (OutputChans == 0) goto Error;
  
      if (io ->Read(io, Dimensions8, sizeof(cmsUInt8Number), 16) != 16)
          goto Error;
  
      // Copy MAX_INPUT_DIMENSIONS at most. Expand to cmsUInt32Number
--- 4478,12 ---
      _cmsStageCLutData* clut;
  
      if (!_cmsReadUInt16Number(io, &InputChans)) return NULL;
      if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL;
  
!     if (InputChans == 0 || InputChans >= cmsMAXCHANNELS) goto Error;
!     if (OutputChans == 0 || OutputChans >= cmsMAXCHANNELS) goto Error;
  
      if (io ->Read(io, Dimensions8, sizeof(cmsUInt8Number), 16) != 16)
          goto Error;
  
      // Copy MAX_INPUT_DIMENSIONS at most. Expand to cmsUInt32Number

*** 5248,15 ***
          e ->Offsets[i] = 0;
          return TRUE;
      }
  
      Before = io ->Tell(io);
!     e ->Offsets[i] = Before - BaseOffset;
  
      if (!Type_MLU_Write(self, io, (void*) mlu, 1)) return FALSE;
  
!     e ->Sizes[i] = io ->Tell(io) - Before;
      return TRUE;
  }
  
  
  static
--- 5269,17 ---
          e ->Offsets[i] = 0;
          return TRUE;
      }
  
      Before = io ->Tell(io);
!     if (e->Offsets != NULL)
+         e ->Offsets[i] = Before - BaseOffset;
  
      if (!Type_MLU_Write(self, io, (void*) mlu, 1)) return FALSE;
  
!     if (e->Sizes != NULL)
+         e ->Sizes[i] = io ->Tell(io) - Before;
      return TRUE;
  }
  
  
  static

*** 5497,10 ***
--- 5520,220 ---
  void Type_VideoSignal_Free(struct _cms_typehandler_struct* self, void* Ptr)
  {
      _cmsFree(self->ContextID, Ptr);
  }
  
+ 
+ // ********************************************************************************
+ // Microsoft's MHC2 Type support
+ // ********************************************************************************
+ 
+ static
+ void SetIdentity(cmsFloat64Number XYZ2XYZmatrix[3][4])
+ {
+     XYZ2XYZmatrix[0][0] = 1.0; XYZ2XYZmatrix[0][1] = 0.0; XYZ2XYZmatrix[0][2] = 0.0; XYZ2XYZmatrix[0][3] = 0.0;
+     XYZ2XYZmatrix[1][0] = 0.0; XYZ2XYZmatrix[1][1] = 1.0; XYZ2XYZmatrix[1][2] = 0.0; XYZ2XYZmatrix[1][3] = 0.0;
+     XYZ2XYZmatrix[2][0] = 0.0; XYZ2XYZmatrix[2][1] = 0.0; XYZ2XYZmatrix[2][2] = 1.0; XYZ2XYZmatrix[2][3] = 0.0;
+ }
+ 
+ static
+ cmsBool CloseEnough(cmsFloat64Number a, cmsFloat64Number b)
+ {
+     return fabs(b - a) < (1.0 / 65535.0);
+ }
+ 
+ cmsBool IsIdentity(cmsFloat64Number XYZ2XYZmatrix[3][4])
+ {
+     cmsFloat64Number Identity[3][4];
+     int i, j;
+ 
+     SetIdentity(Identity);
+ 
+     for (i = 0; i < 3; i++)
+         for (j = 0; j < 4; j++)
+             if (!CloseEnough(XYZ2XYZmatrix[i][j], Identity[i][j])) return FALSE;
+ 
+     return TRUE;
+ }
+ 
+ static
+ void Type_MHC2_Free(struct _cms_typehandler_struct* self, void* Ptr)
+ {
+     cmsMHC2Type* mhc2 = (cmsMHC2Type*)Ptr;
+ 
+     if (mhc2->RedCurve != NULL) _cmsFree(self->ContextID, mhc2->RedCurve);
+     if (mhc2->GreenCurve != NULL) _cmsFree(self->ContextID, mhc2->GreenCurve);
+     if (mhc2->BlueCurve != NULL) _cmsFree(self->ContextID, mhc2->BlueCurve);
+ 
+     _cmsFree(self->ContextID, Ptr);
+ }
+ 
+ void* Type_MHC2_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n)
+ {
+     cmsMHC2Type* mhc2 = _cmsDupMem(self->ContextID, Ptr, sizeof(cmsMHC2Type));
+ 
+     mhc2->RedCurve = _cmsDupMem(self->ContextID,   mhc2->RedCurve, mhc2->CurveEntries*sizeof(cmsFloat64Number));
+     mhc2->GreenCurve = _cmsDupMem(self->ContextID, mhc2->GreenCurve, mhc2->CurveEntries * sizeof(cmsFloat64Number));
+     mhc2->BlueCurve = _cmsDupMem(self->ContextID,  mhc2->BlueCurve, mhc2->CurveEntries * sizeof(cmsFloat64Number));
+ 
+     if (mhc2->RedCurve == NULL ||
+         mhc2->GreenCurve == NULL ||
+         mhc2->BlueCurve == NULL) {
+ 
+         Type_MHC2_Free(self, mhc2);
+         return NULL;
+     }
+ 
+     return mhc2;
+ 
+     cmsUNUSED_PARAMETER(n);
+ }
+ 
+ 
+ static
+ cmsBool WriteDoubles(cmsIOHANDLER* io, cmsUInt32Number n, cmsFloat64Number* Values)
+ {
+     cmsUInt32Number i;
+ 
+     for (i = 0; i < n; i++) {
+ 
+         if (!_cmsWrite15Fixed16Number(io, *Values++)) return FALSE;
+     }
+ 
+     return TRUE;
+ }
+ 
+ static
+ cmsBool Type_MHC2_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+ {
+     cmsMHC2Type* mhc2 = (cmsMHC2Type*)Ptr;
+     cmsUInt32Number BaseOffset = io->Tell(io) - sizeof(_cmsTagBase);
+     cmsUInt32Number TablesOffsetPos;
+     cmsUInt32Number MatrixOffset;
+     cmsUInt32Number OffsetRedTable, OffsetGreenTable, OffsetBlueTable;
+ 
+     if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+     if (!_cmsWriteUInt32Number(io, mhc2->CurveEntries)) return FALSE;
+ 
+     if (!_cmsWrite15Fixed16Number(io, mhc2->MinLuminance)) return FALSE;
+     if (!_cmsWrite15Fixed16Number(io, mhc2->PeakLuminance)) return FALSE;
+ 
+     TablesOffsetPos = io->Tell(io);
+ 
+     if (!_cmsWriteUInt32Number(io, 0)) return FALSE;    // Matrix
+     if (!_cmsWriteUInt32Number(io, 0)) return FALSE;    // Curve R
+     if (!_cmsWriteUInt32Number(io, 0)) return FALSE;    // Curve G
+     if (!_cmsWriteUInt32Number(io, 0)) return FALSE;    // Curve B
+ 
+ 
+     if (IsIdentity(mhc2->XYZ2XYZmatrix))
+     {
+         MatrixOffset = 0;
+     }
+     else
+     {
+         MatrixOffset = io->Tell(io) - BaseOffset;
+         if (!WriteDoubles(io, 3 * 4, &mhc2->XYZ2XYZmatrix[0][0])) return FALSE;
+     }
+ 
+     OffsetRedTable = io->Tell(io) - BaseOffset;
+     if (!WriteDoubles(io, mhc2->CurveEntries, mhc2->RedCurve)) return FALSE;
+     OffsetGreenTable = io->Tell(io) - BaseOffset;
+     if (!WriteDoubles(io, mhc2->CurveEntries, mhc2->GreenCurve)) return FALSE;
+     OffsetBlueTable = io->Tell(io) - BaseOffset;
+     if (!WriteDoubles(io, mhc2->CurveEntries, mhc2->BlueCurve)) return FALSE;
+ 
+     if (!io->Seek(io, TablesOffsetPos)) return FALSE;
+ 
+     if (!_cmsWriteUInt32Number(io, MatrixOffset)) return FALSE;
+     if (!_cmsWriteUInt32Number(io, OffsetRedTable)) return FALSE;
+     if (!_cmsWriteUInt32Number(io, OffsetGreenTable)) return FALSE;
+     if (!_cmsWriteUInt32Number(io, OffsetBlueTable)) return FALSE;
+ 
+     return TRUE;
+ 
+     cmsUNUSED_PARAMETER(self);
+     cmsUNUSED_PARAMETER(nItems);
+ }
+ 
+ 
+ static
+ cmsBool ReadDoublesAt(cmsIOHANDLER* io, cmsUInt32Number At, cmsUInt32Number n, cmsFloat64Number* Values)
+ {
+     cmsUInt32Number CurrentPos = io->Tell(io);
+     cmsUInt32Number i;
+ 
+     if (!io->Seek(io, At)) return FALSE;
+ 
+     for (i = 0; i < n; i++) {
+ 
+         if (!_cmsRead15Fixed16Number(io, Values++)) return FALSE;
+     }
+ 
+     if (!io->Seek(io, CurrentPos)) return FALSE;
+ 
+     return TRUE;
+ }
+ 
+ static
+ void* Type_MHC2_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+ {
+     cmsMHC2Type* mhc2 = NULL;
+ 
+     cmsUInt32Number BaseOffset = io->Tell(io) - sizeof(_cmsTagBase);
+     cmsUInt32Number MatrixOffset;
+     cmsUInt32Number OffsetRedTable, OffsetGreenTable, OffsetBlueTable;
+ 
+     if (!_cmsReadUInt32Number(io, NULL)) return NULL;
+ 
+     mhc2 = (cmsMHC2Type*)_cmsCalloc(self->ContextID, 1, sizeof(cmsMHC2Type));
+     if (mhc2 == NULL) return NULL;
+ 
+     if (!_cmsReadUInt32Number(io,    &mhc2->CurveEntries)) goto Error;
+ 
+     if (mhc2->CurveEntries > 4096) goto Error;
+ 
+     mhc2->RedCurve = (cmsFloat64Number*)_cmsCalloc(self->ContextID, mhc2->CurveEntries, sizeof(cmsFloat64Number));
+     mhc2->GreenCurve = (cmsFloat64Number*)_cmsCalloc(self->ContextID, mhc2->CurveEntries, sizeof(cmsFloat64Number));
+     mhc2->BlueCurve = (cmsFloat64Number*)_cmsCalloc(self->ContextID, mhc2->CurveEntries, sizeof(cmsFloat64Number));
+ 
+     if (mhc2->RedCurve == NULL ||
+         mhc2->GreenCurve == NULL ||
+         mhc2->BlueCurve == NULL)  goto Error;
+ 
+     if (!_cmsRead15Fixed16Number(io, &mhc2->MinLuminance)) goto Error;
+     if (!_cmsRead15Fixed16Number(io, &mhc2->PeakLuminance)) goto Error;
+ 
+     if (!_cmsReadUInt32Number(io, &MatrixOffset)) goto Error;
+     if (!_cmsReadUInt32Number(io, &OffsetRedTable)) goto Error;
+     if (!_cmsReadUInt32Number(io, &OffsetGreenTable)) goto Error;
+     if (!_cmsReadUInt32Number(io, &OffsetBlueTable)) goto Error;
+ 
+     if (MatrixOffset == 0)
+         SetIdentity(mhc2->XYZ2XYZmatrix);
+     else
+     {
+         if (!ReadDoublesAt(io, BaseOffset + MatrixOffset, 3*4, &mhc2->XYZ2XYZmatrix[0][0])) goto Error;
+     }
+ 
+     if (!ReadDoublesAt(io, BaseOffset + OffsetRedTable, mhc2->CurveEntries, mhc2->RedCurve)) goto Error;
+     if (!ReadDoublesAt(io, BaseOffset + OffsetGreenTable, mhc2->CurveEntries, mhc2->GreenCurve)) goto Error;
+     if (!ReadDoublesAt(io, BaseOffset + OffsetBlueTable, mhc2->CurveEntries, mhc2->BlueCurve)) goto Error;
+ 
+     // Success
+     *nItems = 1;
+     return mhc2;
+ 
+ Error:
+     Type_MHC2_Free(self, mhc2);
+     return NULL;
+ 
+     cmsUNUSED_PARAMETER(SizeOfTag);
+ }
+ 
+ 
+ 
  // ********************************************************************************
  // Type support main routines
  // ********************************************************************************
  
  

*** 5536,11 ***
  {TYPE_HANDLER(cmsCorbisBrokenXYZtype,          XYZ),                (_cmsTagTypeLinkedList*) &SupportedTagTypes[27] },
  {TYPE_HANDLER(cmsMonacoBrokenCurveType,        Curve),              (_cmsTagTypeLinkedList*) &SupportedTagTypes[28] },
  {TYPE_HANDLER(cmsSigProfileSequenceIdType,     ProfileSequenceId),  (_cmsTagTypeLinkedList*) &SupportedTagTypes[29] },
  {TYPE_HANDLER(cmsSigDictType,                  Dictionary),         (_cmsTagTypeLinkedList*) &SupportedTagTypes[30] },
  {TYPE_HANDLER(cmsSigcicpType,                  VideoSignal),        (_cmsTagTypeLinkedList*) &SupportedTagTypes[31] },
! {TYPE_HANDLER(cmsSigVcgtType,                  vcgt),                NULL }
  };
  
  
  _cmsTagTypePluginChunkType _cmsTagTypePluginChunk = { NULL };
  
--- 5769,12 ---
  {TYPE_HANDLER(cmsCorbisBrokenXYZtype,          XYZ),                (_cmsTagTypeLinkedList*) &SupportedTagTypes[27] },
  {TYPE_HANDLER(cmsMonacoBrokenCurveType,        Curve),              (_cmsTagTypeLinkedList*) &SupportedTagTypes[28] },
  {TYPE_HANDLER(cmsSigProfileSequenceIdType,     ProfileSequenceId),  (_cmsTagTypeLinkedList*) &SupportedTagTypes[29] },
  {TYPE_HANDLER(cmsSigDictType,                  Dictionary),         (_cmsTagTypeLinkedList*) &SupportedTagTypes[30] },
  {TYPE_HANDLER(cmsSigcicpType,                  VideoSignal),        (_cmsTagTypeLinkedList*) &SupportedTagTypes[31] },
! {TYPE_HANDLER(cmsSigVcgtType,                  vcgt),               (_cmsTagTypeLinkedList*) &SupportedTagTypes[32] },
+ {TYPE_HANDLER(cmsSigMHC2Type,                  MHC2),                NULL }
  };
  
  
  _cmsTagTypePluginChunkType _cmsTagTypePluginChunk = { NULL };
  

*** 5732,11 ***
      { cmsSigProfileSequenceIdTag,   { 1, 1, { cmsSigProfileSequenceIdType},  NULL }, &SupportedTags[62]},
  
      { cmsSigProfileDescriptionMLTag,{ 1, 1, { cmsSigMultiLocalizedUnicodeType}, NULL}, &SupportedTags[63]},
      { cmsSigcicpTag,                { 1, 1, { cmsSigcicpType},               NULL },   &SupportedTags[64]},
  
!     { cmsSigArgyllArtsTag,          { 9, 1, { cmsSigS15Fixed16ArrayType},    NULL}, NULL}
  
  };
  
  /*
      Not supported                 Why
--- 5966,12 ---
      { cmsSigProfileSequenceIdTag,   { 1, 1, { cmsSigProfileSequenceIdType},  NULL }, &SupportedTags[62]},
  
      { cmsSigProfileDescriptionMLTag,{ 1, 1, { cmsSigMultiLocalizedUnicodeType}, NULL}, &SupportedTags[63]},
      { cmsSigcicpTag,                { 1, 1, { cmsSigcicpType},               NULL },   &SupportedTags[64]},
  
!     { cmsSigArgyllArtsTag,          { 9, 1, { cmsSigS15Fixed16ArrayType},    NULL}, &SupportedTags[65]},
+     { cmsSigMHC2Tag,                { 1, 1, { cmsSigMHC2Type },              NULL}, NULL}
  
  };
  
  /*
      Not supported                 Why
< prev index next >