A fork of rexpaintjs, a simple library to load REXPaint "XP" files as plain javascript objects.
This fork aims to improve upon rexpaintjs, by adding more checks and features, including the ability to export images.
Install the fork by running:
npm install --save adri326/rexpaintjs-forkThen, import the node module:
const rexpaintjs = require('rexpaintjs-fork');The fork works as a drop-in replacement: any code working with rexpaintjs will work with rexpaintjs-fork too.
To load a REXPaint file, you may do the following:
const fs = require("fs");
let buffer = fs.readFileSync("your_file.xp");
rexpaint(buffer, (err, data) => {
if (err) {
throw new Error(err);
}
// You can now use `data` here!
});Alternatively, you can call the rexpaint function as an async function:
const fs = require("fs");
let buffer = fs.readFileSync("your_file.xp");
async function myFunction() {
let data = await rexpaint(buffer);
// You can now use `data` here!
}The data object in these two examples will be an Image instance. It is of the form:
class Image {
version: Number,
layers: Array<Layer>,
}
class Layer {
width: Number,
height: Number,
raster: Array<Pixel>,
}
class Pixel {
fg: Color,
bg: Color,
asciiCode: Number,
}
class Color {
r: Number, // integer from 0 to 255
g: Number, // integer from 0 to 255
b: Number, // integer from 0 to 255
hex: String, // hexadecimal representation of the color
}Additionally, the different classes feature some useful methods and constants. You should refer to their in-code documentation for their full behavior:
Image::get(l, x, y) // returns the `(x, y)` pixel of the layer `l`
Image::set(l, x, y, pixel) // sets the `(x, y)` pixel of the layer `l`
Image::mergeLayers(layers) // merges different layers, with `layers` being an array of indices, a single index or "all"
Image::width // the width of the first layer, null if the image has no layer
Image::height // the height of the first layer, null if the image has no layer
Layer::verifyCoordinates(x, y) // returns true if `(x, y)` are valid pixel coordinates for that layer
Layer::get(x, y) // returns the pixel at `(x, y)`
Layer::set(x, y, pixel) // sets the pixel at `(x, y)`
Layer::fill(pixel) // fills a layer with the pixel `pixel`
Layer.from(layer) // clones a layer
new Pixel(code, foreground, background) // creates a new Pixel, foreground and background should be Color instances
Pixel.from(pixel) // clones a pixel
Pixel.from([code, foreground, background]) // faster way to create a new Pixel, as foreground and background are passed to Color.from
Pixel.TRANSPARENT // the transparent pixel, will be interpreted as transparent by Image::mergeLayers
Pixel::unicodeChar // the unicode character associated with that pixel
Pixel::ansiString // the ANSI string for that pixel: contains the ANSI escape code for the foreground and background colors and the unicode character for the pixel
Pixel::transparent // true if the background of the pixel is magenta (#ff00ff)
new Color(red, green, blue) // creates a new Color
Color.from(color) // clones a color
Color.from([red, green, blue]) // creates a new Color from the red, green and blue components
Color.from("rrggbb") // creates a new Color from a hex string, with `rr` the red channel, `gg` the green channel and `bb` the blue channelThis fork includes a function to export an Image instance as a REXPaint XP file.
To do so, simply call rexpaint.toBuffer(image [, callback]) with as argument your image:
const fs = require("fs");
let buffer = fs.readFileSync("your_file.xp");
// === Callback method ===
rexpaint(buffer, (err, data) => {
if (err) {
throw new Error(err);
}
// Modify the image a bit:
data.set(0, 1, 1, new rexpaint.Pixel(
1, // ☺
new rexpaint.Color(255, 16, 16), // Foreground: bright red
new rexpaint.Color(0, 0, 0), // Background: black
));
// Export
rexpaint.toBuffer(data, (err, exported) => {
if (err) {
throw new Error(err);
}
// Write to file
fs.writeFileSync("your_new_file.xp", exported);
});
});
// === Async method ===
async function myFunction() {
let data = await rexpaint(buffer);
// Modify the image a bit:
data.set(0, 1, 1, rexpaint.Pixel.from([1, "ff1010", "000000"])); // red on black ☺
// Export
let exported = await rexpaint.toBuffer(data);
// Write to file
fs.writeFileSync("your_new_file.xp", exported);
}This project is licensed under the ISC license. See the LICENSE file for more details!