void FTGATexture::MakeTexture () { BYTE PaletteMap[256]; FWadLump lump = Wads.OpenLumpNum (SourceLump); TGAHeader hdr; WORD w; BYTE r,g,b,a; BYTE * buffer; Pixels = new BYTE[Width*Height]; lump.Read(&hdr, sizeof(hdr)); lump.Seek(hdr.id_len, SEEK_CUR); hdr.width = LittleShort(hdr.width); hdr.height = LittleShort(hdr.height); hdr.cm_first = LittleShort(hdr.cm_first); hdr.cm_length = LittleShort(hdr.cm_length); if (hdr.has_cm) { memset(PaletteMap, 0, 256); for (int i = hdr.cm_first; i < hdr.cm_first + hdr.cm_length && i < 256; i++) { switch (hdr.cm_size) { case 15: case 16: lump >> w; r = (w & 0x001F) << 3; g = (w & 0x03E0) >> 2; b = (w & 0x7C00) >> 7; a = 255; break; case 24: lump >> b >> g >> r; a=255; break; case 32: lump >> b >> g >> r >> a; if ((hdr.img_desc&15)!=8) a=255; break; default: // should never happen r=g=b=a=0; break; } PaletteMap[i] = a>=128? ColorMatcher.Pick(r, g, b) : 0; } }
void FFontChar2::MakeTexture () { FWadLump lump = Wads.OpenLumpNum (SourceLump); int destSize = Width * Height; BYTE max = 255; // This is to "fix" bad fonts { BYTE buff[8]; lump.Read (buff, 4); if (buff[3] == '2') { lump.Read (buff, 7); max = buff[6]; lump.Seek (SourcePos - 11, SEEK_CUR); } else { lump.Seek (SourcePos - 4, SEEK_CUR); } } Pixels = new BYTE[destSize]; int runlen = 0, setlen = 0; BYTE setval = 0; // Shut up, GCC! BYTE *dest_p = Pixels; int dest_adv = Height; int dest_rew = destSize - 1; for (int y = Height; y != 0; --y) { for (int x = Width; x != 0; ) { if (runlen != 0) { BYTE color; lump >> color; *dest_p = MIN (color, max); if (SourceRemap != NULL) { *dest_p = SourceRemap[*dest_p]; } dest_p += dest_adv; x--; runlen--; } else if (setlen != 0) { *dest_p = setval; dest_p += dest_adv; x--; setlen--; } else { SBYTE code; lump >> code; if (code >= 0) { runlen = code + 1; } else if (code != -128) { BYTE color; lump >> color; setlen = (-code) + 1; setval = MIN (color, max); if (SourceRemap != NULL) { setval = SourceRemap[setval]; } } }