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:
parent
4e755f8797
commit
c7ee2b0671
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user