blob: f3176573dae35f5270c992769c1339e6cc739b3e [file] [log] [blame]
import '../animation.dart';
import '../color.dart';
import '../image.dart';
import '../util/input_buffer.dart';
import 'decoder.dart';
import 'decode_info.dart';
import 'tga/tga_info.dart';
/// Decode a TGA image. This only supports the 24-bit uncompressed format.
class TgaDecoder extends Decoder {
TgaInfo info;
InputBuffer input;
/// Is the given file a valid TGA image?
bool isValidFile(List<int> data) {
InputBuffer input = InputBuffer(data, bigEndian: true);
InputBuffer header = input.readBytes(18);
if (header[2] != 2) {
return false;
}
if (header[16] != 24 && header[16] != 32) {
return false;
}
return true;
}
DecodeInfo startDecode(List<int> data) {
info = TgaInfo();
input = InputBuffer(data, bigEndian: true);
InputBuffer header = input.readBytes(18);
if (header[2] != 2) {
return null;
}
if (header[16] != 24 && header[16] != 32) {
return null;
}
info.width = (header[12] & 0xff) | ((header[13] & 0xff) << 8);
info.height = (header[14] & 0xff) | ((header[15] & 0xff) << 8);
info.imageOffset = input.offset;
info.bpp = header[16];
return info;
}
int numFrames() => info != null ? 1 : 0;
Image decodeFrame(int frame) {
if (info == null) {
return null;
}
input.offset = info.imageOffset;
Image image = Image(info.width, info.height, Image.RGB);
for (int y = image.height - 1; y >= 0; --y) {
for (int x = 0; x < image.width; ++x) {
int b = input.readByte();
int g = input.readByte();
int r = input.readByte();
int a = info.bpp == 32 ? input.readByte() : 255;
image.setPixel(x, y, getColor(r, g, b, a));
}
}
return image;
}
Image decodeImage(List<int> data, {int frame = 0}) {
if (startDecode(data) == null) {
return null;
}
return decodeFrame(frame);
}
Animation decodeAnimation(List<int> data) {
Image image = decodeImage(data);
if (image == null) {
return null;
}
Animation anim = Animation();
anim.width = image.width;
anim.height = image.height;
anim.addFrame(image);
return anim;
}
}