int IComparer.Compare(object x, object y) { TiffFieldInfo ta = x as TiffFieldInfo; TiffFieldInfo tb = y as TiffFieldInfo; Debug.Assert(ta != null); Debug.Assert(tb != null); if (ta.Tag != tb.Tag) return ((int)ta.Tag - (int)tb.Tag); return (ta.Type == TiffType.ANY) ? 0 : ((int)tb.Type - (int)ta.Type); }
public void TestAppendedNulls() { // A test to see if nulls get appended to custom ascii tags // when they don't have a valid FieldInfo object registered. // Contributed by Alex J. Kennedy int freetag = 42117; int freetag2 = 42118; string value = "abc"; string value2 = "def"; byte[] expectedReadValue = new byte[] { (byte)'a', (byte)'b', (byte)'c', (byte)'\0' }; string filename = "testAppendedNulls.tif"; // Clean if (File.Exists(filename)) { File.Delete(filename); } // Create a basic tiff image CreateBasicTif(filename); // Register the new tag TagToWrite = freetag; Tiff.SetTagExtender(TagExtender); using (Tiff image = Tiff.Open(filename, "a")) { image.SetDirectory(0); // write "abc" to directory 0, tag 42117 image.SetField((TiffTag)freetag, value); // save image.CheckpointDirectory(); } // Reset TagExtender Tiff.SetTagExtender(null); // Try to read it back in using (Tiff image = Tiff.Open(filename, "r")) { image.SetDirectory(0); FieldValue[] fv = image.GetField((TiffTag)freetag); Assert.AreEqual(2, fv.Length); // Ensure that a null was appended. byte[] readValue = (byte[])(fv[1].Value); Assert.AreEqual(4, (int)fv[0].Value); Assert.AreEqual(4, readValue.Length); Assert.AreEqual('a', readValue[0]); Assert.AreEqual('b', readValue[1]); Assert.AreEqual('c', readValue[2]); Assert.AreEqual('\0', readValue[3]); } // Now write a different tag to see if it appends a null char to 42117 TagToWrite = freetag2; Tiff.SetTagExtender(TagExtender); using (Tiff image = Tiff.Open(filename, "a")) { image.SetDirectory(0); // write "def" to directory 0, tag 42118 image.SetField((TiffTag)freetag2, value2); // save image.CheckpointDirectory(); } Tiff.SetTagExtender(null); // Read in tag 42117 to make sure it doesn't have an extra null appended using (Tiff image = Tiff.Open(filename, "r")) { image.SetDirectory(0); TiffFieldInfo tfi = image.FindFieldInfo((TiffTag)freetag, TiffType.ANY); TiffFieldInfo tfi2 = image.FindFieldInfo((TiffTag)freetag2, TiffType.ANY); FieldValue[] fv = image.GetField((TiffTag)freetag); Assert.AreEqual(2, fv.Length); // Ensure that only one null was appended. byte[] readValue = (byte[])(fv[1].Value); Assert.AreEqual(4, (int)fv[0].Value); Assert.AreEqual(4, readValue.Length); Assert.AreEqual('a', readValue[0]); Assert.AreEqual('b', readValue[1]); Assert.AreEqual('c', readValue[2]); Assert.AreEqual('\0', readValue[3]); } }
public override bool SetField(Tiff tif, TiffTag tag, FieldValue[] ap) { JpegCodec sp = tif.m_currentCodec as JpegCodec; Debug.Assert(sp != null); switch (tag) { case TiffTag.JPEGTABLES: int v32 = ap[0].ToInt(); if (v32 == 0) { // XXX return(false); } sp.m_jpegtables = new byte [v32]; Buffer.BlockCopy(ap[1].ToByteArray(), 0, sp.m_jpegtables, 0, v32); sp.m_jpegtables_length = v32; tif.setFieldBit(JpegCodec.FIELD_JPEGTABLES); break; case TiffTag.JPEGQUALITY: sp.m_jpegquality = ap[0].ToInt(); return(true); // pseudo tag case TiffTag.JPEGCOLORMODE: sp.m_jpegcolormode = (JpegColorMode)ap[0].ToShort(); sp.JPEGResetUpsampled(); return(true); // pseudo tag case TiffTag.PHOTOMETRIC: bool ret_value = base.SetField(tif, tag, ap); sp.JPEGResetUpsampled(); return(ret_value); case TiffTag.JPEGTABLESMODE: sp.m_jpegtablesmode = (JpegTablesMode)ap[0].ToShort(); return(true); // pseudo tag case TiffTag.YCBCRSUBSAMPLING: // mark the fact that we have a real ycbcrsubsampling! sp.m_ycbcrsampling_fetched = true; // should we be recomputing upsampling info here? return(base.SetField(tif, tag, ap)); case TiffTag.FAXRECVPARAMS: sp.m_recvparams = ap[0].ToInt(); break; case TiffTag.FAXSUBADDRESS: Tiff.setString(out sp.m_subaddress, ap[0].ToString()); break; case TiffTag.FAXRECVTIME: sp.m_recvtime = ap[0].ToInt(); break; case TiffTag.FAXDCS: Tiff.setString(out sp.m_faxdcs, ap[0].ToString()); break; default: return(base.SetField(tif, tag, ap)); } TiffFieldInfo fip = tif.FieldWithTag(tag); if (fip != null) { tif.setFieldBit(fip.Bit); } else { return(false); } tif.m_flags |= TiffFlags.DIRTYDIRECT; return(true); }
public override bool SetField(Tiff tif, TiffTag tag, FieldValue[] ap) { const string module = "OJPEGVSetField"; OJpegCodec sp = tif.m_currentCodec as OJpegCodec; Debug.Assert(sp != null); uint ma; uint[] mb; uint n; switch (tag) { case TiffTag.JPEGIFOFFSET: sp.m_jpeg_interchange_format = ap[0].ToUInt(); break; case TiffTag.JPEGIFBYTECOUNT: sp.m_jpeg_interchange_format_length = ap[0].ToUInt(); break; case TiffTag.YCBCRSUBSAMPLING: sp.m_subsampling_tag = true; sp.m_subsampling_hor = ap[0].ToByte(); sp.m_subsampling_ver = ap[1].ToByte(); tif.m_dir.td_ycbcrsubsampling[0] = sp.m_subsampling_hor; tif.m_dir.td_ycbcrsubsampling[1] = sp.m_subsampling_ver; break; case TiffTag.JPEGQTABLES: ma = ap[0].ToUInt(); if (ma != 0) { if (ma > 3) { Tiff.ErrorExt(tif, tif.m_clientdata, module, "JpegQTables tag has incorrect count"); return(false); } sp.m_qtable_offset_count = (byte)ma; mb = ap[1].ToUIntArray(); for (n = 0; n < ma; n++) { sp.m_qtable_offset[n] = mb[n]; } } break; case TiffTag.JPEGDCTABLES: ma = ap[0].ToUInt(); if (ma != 0) { if (ma > 3) { Tiff.ErrorExt(tif, tif.m_clientdata, module, "JpegDcTables tag has incorrect count"); return(false); } sp.m_dctable_offset_count = (byte)ma; mb = ap[1].ToUIntArray(); for (n = 0; n < ma; n++) { sp.m_dctable_offset[n] = mb[n]; } } break; case TiffTag.JPEGACTABLES: ma = ap[0].ToUInt(); if (ma != 0) { if (ma > 3) { Tiff.ErrorExt(tif, tif.m_clientdata, module, "JpegAcTables tag has incorrect count"); return(false); } sp.m_actable_offset_count = (byte)ma; mb = ap[1].ToUIntArray(); for (n = 0; n < ma; n++) { sp.m_actable_offset[n] = mb[n]; } } break; case TiffTag.JPEGPROC: sp.m_jpeg_proc = ap[0].ToByte(); break; case TiffTag.JPEGRESTARTINTERVAL: sp.m_restart_interval = ap[0].ToUShort(); break; default: return(base.SetField(tif, tag, ap)); } TiffFieldInfo fip = tif.FieldWithTag(tag); if (fip != null) { tif.setFieldBit(fip.Bit); } else { return(false); } tif.m_flags |= TiffFlags.DIRTYDIRECT; return(true); }
public override bool SetField(Tiff tif, TiffTag tag, FieldValue[] ap) { CCITTCodec sp = tif.m_currentCodec as CCITTCodec; Debug.Assert(sp != null); switch (tag) { case TiffTag.FAXMODE: sp.m_mode = (FaxMode)ap[0].ToShort(); return(true); /* NB: pseudo tag */ case TiffTag.FAXFILLFUNC: sp.fill = ap[0].Value as Tiff.FaxFillFunc; return(true); /* NB: pseudo tag */ case TiffTag.GROUP3OPTIONS: /* XXX: avoid reading options if compression mismatches. */ if (tif.m_dir.td_compression == Compression.CCITTFAX3) { sp.m_groupoptions = (Group3Opt)ap[0].ToShort(); } break; case TiffTag.GROUP4OPTIONS: /* XXX: avoid reading options if compression mismatches. */ if (tif.m_dir.td_compression == Compression.CCITTFAX4) { sp.m_groupoptions = (Group3Opt)ap[0].ToShort(); } break; case TiffTag.BADFAXLINES: sp.m_badfaxlines = ap[0].ToInt(); break; case TiffTag.CLEANFAXDATA: sp.m_cleanfaxdata = (CleanFaxData)ap[0].ToByte(); break; case TiffTag.CONSECUTIVEBADFAXLINES: sp.m_badfaxrun = ap[0].ToInt(); break; case TiffTag.FAXRECVPARAMS: sp.m_recvparams = ap[0].ToInt(); break; case TiffTag.FAXSUBADDRESS: Tiff.setString(out sp.m_subaddress, ap[0].ToString()); break; case TiffTag.FAXRECVTIME: sp.m_recvtime = ap[0].ToInt(); break; case TiffTag.FAXDCS: Tiff.setString(out sp.m_faxdcs, ap[0].ToString()); break; default: return(base.SetField(tif, tag, ap)); } TiffFieldInfo fip = tif.FieldWithTag(tag); if (fip != null) { tif.setFieldBit(fip.Bit); } else { return(false); } tif.m_flags |= TiffFlags.DIRTYDIRECT; return(true); }