Skip to content

JASC PAL

JASC Paint Shop Pro palettes (.pal) store decimal RGB components. Only the JASC variant is supported; other formats sharing the .pal extension are not inferred.

Details about the format can be found in the GIMP palette format reference.

API

Class Description
JascFormat Singleton format for reading and writing palettes.
JascFile Palette file with typed components.
JascHeader Byte-backed header and format metadata.
JascColourEntry Byte-backed colour entry.

Reading and Writing

using var input = File.OpenRead("palette.pal");
JascFile file = JascFormat.Instance.Read(input);

using var output = File.Create("output.pal");
file.Write(output);

Loading and saving preserves the original UTF-8 bytes, optional BOM, line endings and whitespace. Comments, ordering and duplicate colours are retained. Invalid UTF-8 and palettes without colour entries are rejected. The format also supports asynchronous I/O and compression; see Reading, Writing and Converting.

Components

JASC files contain a byte-backed Header and ordered body Lines. The header exposes Signature, Version and ColourCount. The required signature is JASC-PAL, and the supported version is 0100.

The positive colour count must match the actual entries. Each colour entry contains exactly three decimal byte components and exposes Colour; names and alpha are not supported. Blank body lines are retained. Invalid signatures, counts and entries throw InvalidDataException; unsupported versions throw NotSupportedException.

Entries exposes colour entries in palette order. Body lines expose their original Data, decoded Text and LineEnding. Palette derives a shared PaletteData view from the entries rather than storing an independent copy.

Creating Palettes

var palette = new PaletteData([new Colour(255, 0, 0), new Colour(0, 255, 0)]);
var file = new JascFile(palette);
byte[] bytes = file.ToByteArray();

Constructors produce canonical UTF-8 without a BOM, using LF line endings. Non-opaque colours are rejected with ArgumentException.

Conversions

GplFile gpl = IOFileConversion.Convert<GplFile>(file);
PaintNetFile paintNet = IOFileConversion.Convert<PaintNetFile>(file);

Conversions preserve colour values, order and duplicates without quantization. Comments and source-format metadata are not transferred; GPL output uses its constructor defaults. Conversion to Paint.NET produces opaque entries. See Reading, Writing and Converting for the conversion API.