private bool writeNormalTag(ref TiffDirEntry dir, TiffFieldInfo fip)
{
short wc = fip.WriteCount;
dir.tdir_tag = fip.Tag;
dir.tdir_type = fip.Type;
dir.tdir_count = wc;
switch (fip.Type)
{
case TiffType.SHORT:
case TiffType.SSHORT:
if (fip.PassCount)
{
short[] wp;
int wc2;
if (wc == TiffFieldInfo.Variable2)
{
FieldValue[] result = GetField(fip.Tag);
wc2 = result[0].ToInt();
wp = result[1].ToShortArray();
dir.tdir_count = wc2;
}
else
{
// Assume TiffFieldInfo.Variable
FieldValue[] result = GetField(fip.Tag);
wc = result[0].ToShort();
wp = result[1].ToShortArray();
dir.tdir_count = wc;
}
if (!writeShortArray(ref dir, wp))
return false;
}
else
{
if (wc == 1)
{
FieldValue[] result = GetField(fip.Tag);
short sv = result[0].ToShort();
dir.tdir_offset = insertData(dir.tdir_type, sv);
}
else
{
FieldValue[] result = GetField(fip.Tag);
short[] wp = result[0].ToShortArray();
if (!writeShortArray(ref dir, wp))
return false;
}
}
break;
case TiffType.LONG:
case TiffType.SLONG:
case TiffType.IFD:
if (fip.PassCount)
{
int[] lp;
int wc2;
if (wc == TiffFieldInfo.Variable2)
{
FieldValue[] result = GetField(fip.Tag);
wc2 = result[0].ToInt();
lp = result[1].ToIntArray();
dir.tdir_count = wc2;
}
else
{
// Assume TiffFieldInfo.Variable
FieldValue[] result = GetField(fip.Tag);
wc = result[0].ToShort();
lp = result[1].ToIntArray();
dir.tdir_count = wc;
}
if (!writeLongArray(ref dir, lp))
return false;
}
else
{
if (wc == 1)
{
// XXX handle LONG->SHORT conversion
FieldValue[] result = GetField(fip.Tag);
dir.tdir_offset = result[0].ToUInt();
}
else
{
int[] lp;
FieldValue[] result = GetField(fip.Tag);
lp = result[0].ToIntArray();
if (!writeLongArray(ref dir, lp))
return false;
}
}
break;
case TiffType.RATIONAL:
case TiffType.SRATIONAL:
if (fip.PassCount)
{
float[] fp;
int wc2;
if (wc == TiffFieldInfo.Variable2)
{
FieldValue[] result = GetField(fip.Tag);
wc2 = result[0].ToInt();
fp = result[1].ToFloatArray();
dir.tdir_count = wc2;
}
else
{
// Assume TiffFieldInfo.Variable
FieldValue[] result = GetField(fip.Tag);
wc = result[0].ToShort();
fp = result[1].ToFloatArray();
dir.tdir_count = wc;
}
if (!writeRationalArray(ref dir, fp))
return false;
}
else
{
if (wc == 1)
{
float[] fv = new float[1];
FieldValue[] result = GetField(fip.Tag);
fv[0] = result[0].ToFloat();
if (!writeRationalArray(ref dir, fv))
return false;
}
else
{
FieldValue[] result = GetField(fip.Tag);
float[] fp = result[0].ToFloatArray();
if (!writeRationalArray(ref dir, fp))
return false;
}
}
break;
case TiffType.FLOAT:
if (fip.PassCount)
{
float[] fp;
int wc2;
if (wc == TiffFieldInfo.Variable2)
{
FieldValue[] result = GetField(fip.Tag);
wc2 = result[0].ToInt();
fp = result[1].ToFloatArray();
dir.tdir_count = wc2;
}
else
{
// Assume TiffFieldInfo.Variable
FieldValue[] result = GetField(fip.Tag);
wc = result[0].ToShort();
fp = result[1].ToFloatArray();
dir.tdir_count = wc;
}
if (!writeFloatArray(ref dir, fp))
return false;
}
else
{
if (wc == 1)
{
float[] fv = new float[1];
FieldValue[] result = GetField(fip.Tag);
fv[0] = result[0].ToFloat();
if (!writeFloatArray(ref dir, fv))
return false;
}
else
{
FieldValue[] result = GetField(fip.Tag);
float[] fp = result[0].ToFloatArray();
if (!writeFloatArray(ref dir, fp))
return false;
}
}
break;
case TiffType.DOUBLE:
if (fip.PassCount)
{
double[] dp;
int wc2;
if (wc == TiffFieldInfo.Variable2)
{
FieldValue[] result = GetField(fip.Tag);
wc2 = result[0].ToInt();
dp = result[1].ToDoubleArray();
dir.tdir_count = wc2;
}
else
{
// Assume TiffFieldInfo.Variable
FieldValue[] result = GetField(fip.Tag);
wc = result[0].ToShort();
dp = result[1].ToDoubleArray();
dir.tdir_count = wc;
}
if (!writeDoubleArray(ref dir, dp))
return false;
}
else
{
if (wc == 1)
{
double[] dv = new double[1];
FieldValue[] result = GetField(fip.Tag);
dv[0] = result[0].ToDouble();
if (!writeDoubleArray(ref dir, dv))
return false;
}
else
{
FieldValue[] result = GetField(fip.Tag);
double[] dp = result[0].ToDoubleArray();
if (!writeDoubleArray(ref dir, dp))
return false;
}
}
break;
case TiffType.ASCII:
{
FieldValue[] result = GetField(fip.Tag);
string cp;
if (fip.PassCount)
cp = result[1].ToString();
else
cp = result[0].ToString();
byte[] stringBytes = Latin1Encoding.GetBytes(cp);
// If this last character is a '\0' null char
if (stringBytes.Length != 0 && stringBytes[stringBytes.Length - 1] == 0)
{
dir.tdir_count = stringBytes.Length;
if (!writeByteArray(ref dir, stringBytes))
return false;
}
else
{
// add zero ('\0') at the end of the byte array
byte[] totalBytes = new byte[stringBytes.Length + 1];
Buffer.BlockCopy(stringBytes, 0, totalBytes, 0, stringBytes.Length);
dir.tdir_count = totalBytes.Length;
if (!writeByteArray(ref dir, totalBytes))
return false;
}
}
break;
case TiffType.BYTE:
case TiffType.SBYTE:
if (fip.PassCount)
{
byte[] cp;
int wc2;
if (wc == TiffFieldInfo.Variable2)
{
FieldValue[] result = GetField(fip.Tag);
wc2 = result[0].ToInt();
cp = result[1].ToByteArray();
dir.tdir_count = wc2;
}
else
{
// Assume TiffFieldInfo.Variable
FieldValue[] result = GetField(fip.Tag);
wc = result[0].ToShort();
cp = result[1].ToByteArray();
dir.tdir_count = wc;
}
if (!writeByteArray(ref dir, cp))
return false;
}
else
{
if (wc == 1)
{
byte[] cv = new byte[1];
FieldValue[] result = GetField(fip.Tag);
cv[0] = result[0].ToByte();
if (!writeByteArray(ref dir, cv))
return false;
}
else
{
FieldValue[] result = GetField(fip.Tag);
byte[] cp = result[0].ToByteArray();
if (!writeByteArray(ref dir, cp))
return false;
}
}
break;
case TiffType.UNDEFINED:
{
byte[] cp;
int wc2;
if (wc == TiffFieldInfo.Variable)
{
FieldValue[] result = GetField(fip.Tag);
wc = result[0].ToShort();
cp = result[1].ToByteArray();
dir.tdir_count = wc;
}
else if (wc == TiffFieldInfo.Variable2)
{
FieldValue[] result = GetField(fip.Tag);
wc2 = result[0].ToInt();
cp = result[1].ToByteArray();
dir.tdir_count = wc2;
}
else
{
FieldValue[] result = GetField(fip.Tag);
cp = result[0].ToByteArray();
}
if (!writeByteArray(ref dir, cp))
return false;
}
break;
case TiffType.NOTYPE:
break;
}
return true;
}