Exemple #1
0
        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);
        }
Exemple #2
0
        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]);
            }
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }