private bool fetchNormalTag(TiffDirEntry dir)
{
bool ok = false;
TiffFieldInfo fip = FieldWithTag(dir.tdir_tag);
if (dir.tdir_count > 1)
{
switch (dir.tdir_type)
{
case TiffType.BYTE:
case TiffType.SBYTE:
byte[] bytes = new byte [dir.tdir_count];
ok = fetchByteArray(dir, bytes);
if (ok)
{
if (fip.PassCount)
ok = SetField(dir.tdir_tag, dir.tdir_count, bytes);
else
ok = SetField(dir.tdir_tag, bytes);
}
break;
case TiffType.SHORT:
case TiffType.SSHORT:
short[] shorts = new short [dir.tdir_count];
ok = fetchShortArray(dir, shorts);
if (ok)
{
if (fip.PassCount)
ok = SetField(dir.tdir_tag, dir.tdir_count, shorts);
else
ok = SetField(dir.tdir_tag, shorts);
}
break;
case TiffType.LONG:
case TiffType.SLONG:
int[] ints = new int [dir.tdir_count];
ok = fetchLongArray(dir, ints);
if (ok)
{
if (fip.PassCount)
ok = SetField(dir.tdir_tag, dir.tdir_count, ints);
else
ok = SetField(dir.tdir_tag, ints);
}
break;
case TiffType.RATIONAL:
case TiffType.SRATIONAL:
float[] rs = new float [dir.tdir_count];
ok = fetchRationalArray(dir, rs);
if (ok)
{
if (fip.PassCount)
ok = SetField(dir.tdir_tag, dir.tdir_count, rs);
else
ok = SetField(dir.tdir_tag, rs);
}
break;
case TiffType.FLOAT:
float[] fs = new float [dir.tdir_count];
ok = fetchFloatArray(dir, fs);
if (ok)
{
if (fip.PassCount)
ok = SetField(dir.tdir_tag, dir.tdir_count, fs);
else
ok = SetField(dir.tdir_tag, fs);
}
break;
case TiffType.DOUBLE:
double[] ds = new double [dir.tdir_count];
ok = fetchDoubleArray(dir, ds);
if (ok)
{
if (fip.PassCount)
ok = SetField(dir.tdir_tag, dir.tdir_count, ds);
else
ok = SetField(dir.tdir_tag, ds);
}
break;
case TiffType.ASCII:
case TiffType.UNDEFINED:
// bit of a cheat...
// Some vendors write strings w/o the trailing null
// byte, so always append one just in case.
string cp;
ok = fetchString(dir, out cp) != 0;
if (ok)
{
if (fip.PassCount)
ok = SetField(dir.tdir_tag, dir.tdir_count, cp);
else
ok = SetField(dir.tdir_tag, cp);
}
break;
}
}
else if (checkDirCount(dir, 1))
{
int v32 = 0;
// singleton value
switch (dir.tdir_type)
{
case TiffType.BYTE:
case TiffType.SBYTE:
case TiffType.SHORT:
case TiffType.SSHORT:
// If the tag is also acceptable as a LONG or SLONG
// then SetField will expect an int parameter
// passed to it.
//
// NB: We use FieldWithTag here knowing that
// it returns us the first entry in the table
// for the tag and that that entry is for the
// widest potential data type the tag may have.
TiffType type = fip.Type;
if (type != TiffType.LONG && type != TiffType.SLONG)
{
short v = (short)extractData(dir);
if (fip.PassCount)
{
short[] a = new short[1];
a[0] = v;
ok = SetField(dir.tdir_tag, 1, a);
}
else
ok = SetField(dir.tdir_tag, v);
break;
}
v32 = extractData(dir);
if (fip.PassCount)
{
int[] a = new int[1];
a[0] = (int)v32;
ok = SetField(dir.tdir_tag, 1, a);
}
else
ok = SetField(dir.tdir_tag, v32);
break;
case TiffType.LONG:
case TiffType.SLONG:
case TiffType.IFD:
v32 = extractData(dir);
if (fip.PassCount)
{
int[] a = new int[1];
a[0] = (int)v32;
ok = SetField(dir.tdir_tag, 1, a);
}
else
ok = SetField(dir.tdir_tag, v32);
break;
case TiffType.RATIONAL:
case TiffType.SRATIONAL:
case TiffType.FLOAT:
float f = (dir.tdir_type == TiffType.FLOAT ? fetchFloat(dir): fetchRational(dir));
if (fip.PassCount)
{
float[] a = new float[1];
a[0] = f;
ok = SetField(dir.tdir_tag, 1, a);
}
else
ok = SetField(dir.tdir_tag, f);
break;
case TiffType.DOUBLE:
double[] ds = new double[1];
ok = fetchDoubleArray(dir, ds);
if (ok)
{
if (fip.PassCount)
ok = SetField(dir.tdir_tag, 1, ds);
else
ok = SetField(dir.tdir_tag, ds[0]);
}
break;
case TiffType.ASCII:
case TiffType.UNDEFINED:
// bit of a cheat...
string c;
ok = fetchString(dir, out c) != 0;
if (ok)
{
if (fip.PassCount)
ok = SetField(dir.tdir_tag, 1, c);
else
ok = SetField(dir.tdir_tag, c);
}
break;
}
}
return ok;
}