private static bool ReadTGAInfo(byte[] WorkPtr, out STargaHeader TargaHeader) { TargaHeader.PostHeaderSkip = WorkPtr[0]; TargaHeader.ColorMapType = WorkPtr[1]; TargaHeader.ImageType = WorkPtr[2]; TargaHeader.ColorMapStart = BitConverter.ToUInt16(WorkPtr, 3); TargaHeader.ColorMapLength = BitConverter.ToUInt16(WorkPtr, 5); TargaHeader.ColorMapBits = WorkPtr[7]; TargaHeader.XStart = BitConverter.ToUInt16(WorkPtr, 8); TargaHeader.YStart = BitConverter.ToUInt16(WorkPtr, 10); TargaHeader.Width = BitConverter.ToUInt16(WorkPtr, 12); TargaHeader.Height = BitConverter.ToUInt16(WorkPtr, 14); TargaHeader.BPP = WorkPtr[16]; TargaHeader.Descriptor = WorkPtr[17]; // check the header if (TargaHeader.ColorMapType != 0 || // 0 = RGB, 1 = Palette // 1 = Palette, 2 = RGB, 3 = mono, 9 = RLE Palette, 10 = RLE RGB, 11 RLE mono (TargaHeader.ImageType != 2 && TargaHeader.ImageType != 10 && TargaHeader.ImageType != 9) || (TargaHeader.BPP != 24 && TargaHeader.BPP != 32)) { #if DEBUG throw new NotImplementedException("Unsupported TGA mode"); #endif #if ASSERTS_ENABLED if (((byte *)pTargaHeader)[0] == 'B' && ((byte *)pTargaHeader)[1] == 'M') { assert(!"This TGA's header looks like a BMP!"); // look at the first two bytes and see if they are 'BM' // if so it's a BMP not a TGA } else { byte *pColorMapType = NULL; switch (TargaHeader.ColorMapType) { case 0: pColorMapType = "RGB Color Map"; break; case 1: pColorMapType = "Palette Color Map"; break; default: pColorMapType = "<Illegal Color Map>"; break; } byte *pImageType = NULL; switch (TargaHeader.ImageType) { case 1: pImageType = "Palette Image Type"; break; case 2: pImageType = "RGB Image Type"; break; case 3: pImageType = "mono Image Type"; break; case 9: pImageType = "RLE Palette Image Type"; break; case 10: pImageType = "RLE RGB Image Type"; break; case 11: pImageType = "RLE mono Image Type"; break; default: pImageType = "<Illegal Image Type>"; break; } int ColorDepth = TargaHeader.BPP; CJString ErrorString; ErrorString.Format("Image type %s %s (%u bpp) not supported!", pColorMapType, pImageType, ColorDepth); ShowSystemMessage("TGA File IO Error", ErrorString.GetBytePtr(), "TGA Error"); } #endif // ASSERTS_ENABLED return(false); } return(true); }
//********************************************************************************************************************* static unsafe bool ReadTGAInfo(Byte *WorkPtr, out STargaHeader TargaHeader) { TargaHeader.PostHeaderSkip = WorkPtr[0]; TargaHeader.ColorMapType = WorkPtr[1]; TargaHeader.ImageType = WorkPtr[2]; TargaHeader.ColorMapStart = *((ushort *)(&WorkPtr[3])); TargaHeader.ColorMapLength = *((ushort *)(&WorkPtr[5])); TargaHeader.ColorMapBits = WorkPtr[7]; TargaHeader.XStart = *((ushort *)(&WorkPtr[8])); TargaHeader.YStart = *((ushort *)(&WorkPtr[10])); TargaHeader.Width = *((ushort *)(&WorkPtr[12])); TargaHeader.Height = *((ushort *)(&WorkPtr[14])); TargaHeader.BPP = WorkPtr[16]; TargaHeader.Descriptor = WorkPtr[17]; // check the header if (TargaHeader.ColorMapType != 0 || // 0 = RGB, 1 = Palette // 1 = Palette, 2 = RGB, 3 = mono, 9 = RLE Palette, 10 = RLE RGB, 11 RLE mono (TargaHeader.ImageType != 2 && TargaHeader.ImageType != 10 && TargaHeader.ImageType != 9) || (TargaHeader.BPP != 24 && TargaHeader.BPP != 32)) { #if ASSERTS_ENABLED if (((Byte *)pTargaHeader)[0] == 'B' && ((Byte *)pTargaHeader)[1] == 'M') { assert(!"This TGA's header looks like a BMP!"); // look at the first two bytes and see if they are 'BM' // if so it's a BMP not a TGA } else { Byte *pColorMapType = NULL; switch (TargaHeader.ColorMapType) { case 0: pColorMapType = "RGB Color Map"; break; case 1: pColorMapType = "Palette Color Map"; break; default: pColorMapType = "<Illegal Color Map>"; break; } Byte *pImageType = NULL; switch (TargaHeader.ImageType) { case 1: pImageType = "Palette Image Type"; break; case 2: pImageType = "RGB Image Type"; break; case 3: pImageType = "mono Image Type"; break; case 9: pImageType = "RLE Palette Image Type"; break; case 10: pImageType = "RLE RGB Image Type"; break; case 11: pImageType = "RLE mono Image Type"; break; default: pImageType = "<Illegal Image Type>"; break; } int ColorDepth = TargaHeader.BPP; CJString ErrorString; ErrorString.Format("Image type %s %s (%u bpp) not supported!", pColorMapType, pImageType, ColorDepth); ShowSystemMessage("TGA File IO Error", ErrorString.GetBytePtr()); } #endif // ASSERTS_ENABLED return(false); } return(true); }