2
0
mirror of https://github.com/dpethes/rerogue.git synced 2025-06-07 18:58:32 +02:00

hmt parser: read pixel data

This commit is contained in:
dpethes 2014-10-20 07:44:36 +02:00
parent 4e755f8797
commit c7ee2b0671
2 changed files with 35 additions and 82 deletions

View File

@ -50,6 +50,15 @@ end;
procedure ReadTexture(var tex: THmtTexture; var f: TMemoryStream); procedure ReadTexture(var tex: THmtTexture; var f: TMemoryStream);
const
ImageDescription: array[0..5] of TImageDescription = (
(palette_entries: 16; sample_bits: 4),
(palette_entries: 256; sample_bits: 8),
(palette_entries: 0; sample_bits: 16),
(palette_entries: 0; sample_bits: 32),
(palette_entries: 0; sample_bits: 4),
(palette_entries: 0; sample_bits: 16)
);
var var
image: TRSImage; image: TRSImage;
buf: array[0..27] of byte; buf: array[0..27] of byte;
@ -79,13 +88,27 @@ begin
description := ImageDescription[image.type_]; description := ImageDescription[image.type_];
image.sampleBits := description.sample_bits; image.sampleBits := description.sample_bits;
image.paletteEntries := description.palette_entries; image.paletteEntries := description.palette_entries;
if image.type_ = 4 then image.width := tex.width;
image.sampleBits := bpp * 4 + 4; image.height := tex.height;
writeln(NameToString(tex.name)); writeln(NameToString(tex.name));
writeln('size: ', tex.width, 'x', tex.height); writeln('size: ', tex.width, 'x', tex.height);
writeln('subtype: ', image.type_); writeln('subtype: ', image.type_, ' bpp: ', bpp);
writeln('sample bits: ', image.sampleBits); writeln('sample bits: ', image.sampleBits);
writeln('palette offset: ', tex.palette_offset);
writeln('data offset: ', tex.data_offset);
if tex.palette_offset > 0 then begin
writeln('palette entries: ', image.paletteEntries);
f.Seek(tex.palette_offset, TSeekOrigin.soBeginning);
LoadPalette(image, f);
end;
f.Seek(tex.data_offset, TSeekOrigin.soBeginning);
LoadSamples(image, f);
DecodePixels(image);
f.Seek(pos, TSeekOrigin.soBeginning);
writeln;
end; end;

View File

@ -1,5 +1,4 @@
unit rs_image; unit rs_image;
{$mode objfpc}{$H+} {$mode objfpc}{$H+}
interface interface
@ -10,7 +9,7 @@ uses
type type
TRGB = array[0..2] of byte; TRGB = array[0..2] of byte;
PRGB = ^TRGB; PRGB = ^TRGB;
TPalette = array[0..256] of TRGB; TPalette = array[0..255] of TRGB;
TRSImage = record TRSImage = record
data_size: integer; data_size: integer;
@ -30,18 +29,9 @@ type
//alpha: byte; //alpha: byte;
end; end;
const procedure LoadPalette(var image: TRSImage; var f: TMemoryStream);
ImageDescription: array[0..5] of TImageDescription = ( procedure LoadSamples(var image: TRSImage; var f: TMemoryStream);
(palette_entries: 16; sample_bits: 4), procedure DecodePixels(var img: TRSImage);
(palette_entries: 256; sample_bits: 8),
(palette_entries: 0; sample_bits: 16),
(palette_entries: 0; sample_bits: 32),
(palette_entries: 0; sample_bits: 4),
(palette_entries: 0; sample_bits: 16)
);
function LoadImageFromPack(var f: file): TRSImage;
//************************************************************************************************** //**************************************************************************************************
implementation implementation
@ -149,19 +139,18 @@ begin
end; end;
procedure LoadPalette(var f: file; var image: TRSImage); procedure LoadPalette(var image: TRSImage; var f: TMemoryStream);
var var
entries: integer; entries: integer;
begin begin
entries := image.paletteEntries; entries := image.paletteEntries;
case entries of case entries of
16: Blockread(f, image.palette, entries * 3); //RGB 16, 256: f.ReadBuffer(image.palette, entries * 3); //RGB
256: Blockread(f, image.palette, entries * 3); //RGB
end; end;
end; end;
procedure LoadSamples(var f: file; var image: TRSImage); procedure LoadSamples(var image: TRSImage; var f: TMemoryStream);
var var
sample_bits: integer; sample_bits: integer;
size: integer; size: integer;
@ -169,70 +158,11 @@ begin
sample_bits := image.sampleBits; sample_bits := image.sampleBits;
size := image.width * image.height * sample_bits div 8; size := image.width * image.height * sample_bits div 8;
image.samples := getmem(size); image.samples := getmem(size);
Blockread(f, image.samples^, size); f.ReadBuffer(image.samples^, size);
if image.type_ = 2 then if image.type_ = 2 then
Blockread(f, image.samples^, size div 4); f.ReadBuffer(image.samples^, size div 4);
end; end;
procedure LoadImageHeader(var f: file; var image: TRSImage);
var
h: word;
w: word;
buffer: array[0..15] of byte;
description: TImageDescription;
bpp: byte;
begin
blockread(f, w, 2);
blockread(f, h, 2);
blockread(f, buffer, 4);
blockread(f, buffer[8], 4); //zero padding
w := w + (w and 1); //make width even
image.width := w;
image.height := h;
bpp := buffer[1];
image.type_ := buffer[2]; //image type
description := ImageDescription[image.type_];
image.sampleBits := description.sample_bits;
image.paletteEntries := description.palette_entries;
if image.type_ = 4 then
image.sampleBits := bpp * 4 + 4;
writeln('data size: ', image.data_size);
writeln('size: ', image.width, 'x', image.height);
writeln('subtype: ', image.type_);
writeln('sample bits: ', image.sampleBits);
writeln('attrs: ', buffer[0], ', ', buffer[1], ', ', buffer[3]);
end;
procedure LoadName(var f: file; const data_size: integer);
var
i: integer;
buffer: array[0..15] of byte;
s: string;
begin
s := '';
blockread(f, buffer, data_size);
for i := 0 to data_size - 1 do
s += char(buffer[i]);
s := Trim(s);
writeln('name: ', s);
end;
function LoadImageFromPack(var f: file): TRSImage;
var
offset, string_offset: integer;
buffer: array[0..31] of byte;
begin
LoadPalette(f, result);
LoadSamples(f, result);
DecodePixels(result);
LoadName(f, result.data_size - string_offset);
end;
end. end.