Skip to content

Instantly share code, notes, and snippets.

@subzey
Created May 20, 2013 20:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save subzey/e29406374b2cafc591eb to your computer and use it in GitHub Desktop.
Save subzey/e29406374b2cafc591eb to your computer and use it in GitHub Desktop.
fancygradient.js
#!/usr/bin/env node
var writeStream = require('fs').createWriteStream('grad.pcx');
function write(){
byteArray = Array.prototype.slice.call(arguments);
writeStream.write(new Buffer(byteArray));
}
// Производитель. Всегда 0x0A
write(0x0A);
// Версия
// 0 - 16 стандартных цветов EGA
// 2 - 16 произвольных цветов
// 3 - без палитры
// 5 - с расширенной палитрой
write(0x02);
// Сжатие. Одно возможное значение - 1 (RLE)
write(0x01);
// Бит на пиксель.
// 4 цвета - 2 бита
write(0x02);
// Координаты левого верхнего угла.
// Без второй пары координат уже смысла не имеет, пишем для удобства (0, 0)
write(0x00, 0x00, 0x00, 0x00);
// Координаты правого нижнего угла.
// (16, 7), 4 x Uint, little-endian
write(0x10, 0x00, 0x07, 0x00);
// Разрешение по вертикали и горизонтали.
// Имеет смысл при печати и факсимильной связи. Пишем 72 dpi, 72 dpi
write(0x48, 0x00, 0x48, 0x00);
// 16-цветовая палитра. По одному байту на R, G и B.
write(0x00, 0x00, 0x0); // (0)
write(0x80, 0x80, 0x80); // (1)
write(0x40, 0x40, 0x40); // (2)
// добиваем палитру пустыми значениями до длины 16
write(0x00, 0x00, 0x00); // (3)
write(0x00, 0x00, 0x00); // (4)
write(0x00, 0x00, 0x00); // (5)
write(0x00, 0x00, 0x00); // (6)
write(0x00, 0x00, 0x00); // (7)
write(0x00, 0x00, 0x00); // (8)
write(0x00, 0x00, 0x00); // (9)
write(0x00, 0x00, 0x00); // (10)
write(0x00, 0x00, 0x00); // (11)
write(0x00, 0x00, 0x00); // (12)
write(0x00, 0x00, 0x00); // (13)
write(0x00, 0x00, 0x00); // (14)
write(0x00, 0x00, 0x00); // (15)
// Зарезеривировано
write(0x0);
// Количество битовых плоскостей. R, G и B определяются палитрой, так что одна.
write(0x1);
// Байтов на сканлайн.
// В случае нескольких плоскостей в сканлайне — байтов на плоскость.
// Должно быть четным.
// 17 значений по 2 бита плюс выравнивание - шесть байт
write(0x06, 0x00);
// Тип палитры CGA. Мы ее не используем, так что забиваем нулями.
write(0x00, 0x00);
// Разрешение экрана. Еще одна мета-информация, которую все игнорируют.
// Пусть будет, 640x480
write(0x80, 0x02, 0xe0, 0x01);
// Добиваем нулями заголовок до 128 байт
for (var i=0; i<54; i++){
write(0x00);
}
// Растр
write(0xC6, 0x00);
write(0x15, 0xC3, 0x55, 0x00, 0x00);
write(0x19, 0xC3, 0x99, 0x00, 0x00);
write(0x26, 0xC3, 0x66, 0x00, 0x00);
write(0x2A, 0xC3, 0xAA, 0x00, 0x00);
write(0xC6, 0x22);
write(0x08, 0xC3, 0x88, 0x00, 0x00);
write(0xC6, 0x00);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment