Add support for Graphos (Amstrad Plus) files.
This commit is contained in:
parent
64b2761f14
commit
f6d6e8c5dd
@ -147,7 +147,8 @@ enum FILE_FORMATS
|
||||
FORMAT_GPL, ///< Gimp palette
|
||||
FORMAT_SCR, ///< Amstrad CPC
|
||||
FORMAT_CM5, ///< Amstrad CPC Mode 5
|
||||
FORMAT_PPH, ///< Amastad CPC Perfect Pix
|
||||
FORMAT_PPH, ///< Amstrad CPC Perfect Pix
|
||||
FORMAT_GOS, ///< Amstrad Plus Graphos
|
||||
FORMAT_XPM, ///< X PixMap
|
||||
FORMAT_ICO, ///< Windows icons
|
||||
FORMAT_INFO, ///< Amiga OS icons
|
||||
|
||||
@ -130,6 +130,10 @@ void Test_PPH(T_IO_Context *, FILE *);
|
||||
void Load_PPH(T_IO_Context *);
|
||||
void Save_PPH(T_IO_Context *);
|
||||
|
||||
// -- Graphos (Amstrad CPC)
|
||||
void Test_GOS(T_IO_Context *, FILE *);
|
||||
void Load_GOS(T_IO_Context *);
|
||||
|
||||
// -- XPM (X PixMap)
|
||||
// Loading is done through SDL_Image
|
||||
void Save_XPM(T_IO_Context*);
|
||||
|
||||
@ -118,10 +118,10 @@ const T_Format File_formats[] = {
|
||||
"pi1;pc1;pi2;pc2;pi3;pc3;neo;"
|
||||
"c64;p64;a64;pi;rp;aas;art;dd;iph;ipt;hpc;ocp;koa;koala;fli;bml;cdu;prg;pmg;rpm;"
|
||||
"gpx;"
|
||||
"cpc;scr;win;"
|
||||
"cpc;scr;win;pph,cm5;go1;"
|
||||
"hgr;dhgr;"
|
||||
"grb;grob;"
|
||||
"tga;pnm;xpm;xcf;jpg;jpeg;tif;tiff;ico;ic2;cur;cm5;pph;info;flc;bin;map"},
|
||||
"tga;pnm;xpm;xcf;jpg;jpeg;tif;tiff;ico;ic2;cur;info;flc;bin;map"},
|
||||
{FORMAT_ALL_PALETTES, "(pal)", NULL, NULL, NULL, 1, 0, 0, "", "kcf;pal;gpl"},
|
||||
{FORMAT_ALL_FILES, "(*.*)", NULL, NULL, NULL, 0, 0, 0, "", "*"},
|
||||
{FORMAT_GIF, " gif", Test_GIF, Load_GIF, Save_GIF, 0, 1, 1, "gif", "gif"},
|
||||
@ -149,6 +149,7 @@ const T_Format File_formats[] = {
|
||||
{FORMAT_SCR, " cpc", Test_SCR, Load_SCR, Save_SCR, 0, 0, 0, "scr", "cpc;scr;win"},
|
||||
{FORMAT_CM5, " cm5", Test_CM5, Load_CM5, Save_CM5, 0, 0, 1, "cm5", "cm5"},
|
||||
{FORMAT_PPH, " pph", Test_PPH, Load_PPH, Save_PPH, 0, 0, 1, "pph", "pph"},
|
||||
{FORMAT_GOS, " go1", Test_GOS, Load_GOS, NULL , 0, 0, 0, "go1", "go1"},
|
||||
{FORMAT_XPM, " xpm", NULL, NULL, Save_XPM, 0, 0, 0, "xpm", "xpm"},
|
||||
{FORMAT_ICO, " ico", Test_ICO, Load_ICO, Save_ICO, 0, 0, 0, "ico", "ico;ic2;cur"},
|
||||
{FORMAT_INFO," info",Test_INFO,Load_INFO,NULL, 0, 0, 0, "info", "info"},
|
||||
|
||||
@ -4683,6 +4683,154 @@ void Save_SCR(T_IO_Context * context)
|
||||
free (output);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for GO1/GO2/KIT - Amstrad Plus Graphos
|
||||
*
|
||||
* This format is made of 3 files
|
||||
* .KIT hold the palette in "Kit4096" format. There are 16 colors each stored
|
||||
* as 12 bit RGB in RB0G order.
|
||||
* .GO1 and GO2 hold each half of the picture (top and bottom)
|
||||
* The file always cover the whole display of the Plus (196*272 or so)
|
||||
*/
|
||||
void Test_GOS(T_IO_Context * context, FILE * file)
|
||||
{
|
||||
FILE *file_oddeve;
|
||||
unsigned long file_size;
|
||||
file_size = File_length_file(file);
|
||||
if (file_size != 16512) {
|
||||
File_error = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
file_oddeve = Open_file_read_with_alternate_ext(context, "GO2");
|
||||
if (file_oddeve == NULL) {
|
||||
File_error = 2;
|
||||
return;
|
||||
}
|
||||
file_size = File_length_file(file_oddeve);
|
||||
fclose(file_oddeve);
|
||||
if (file_size != 16512) {
|
||||
File_error = 3;
|
||||
return;
|
||||
}
|
||||
|
||||
file_oddeve = Open_file_read_with_alternate_ext(context, "KIT");
|
||||
if (file_oddeve == NULL) {
|
||||
File_error = 4;
|
||||
return;
|
||||
}
|
||||
file_size = File_length_file(file_oddeve);
|
||||
fclose(file_oddeve);
|
||||
if (file_size != 160) {
|
||||
File_error = 5;
|
||||
return;
|
||||
}
|
||||
|
||||
File_error = 0;
|
||||
}
|
||||
|
||||
|
||||
void Load_GOS(T_IO_Context* context)
|
||||
{
|
||||
FILE *file;
|
||||
long file_size;
|
||||
int i;
|
||||
int x, y;
|
||||
byte * pixel_data;
|
||||
|
||||
if (!(file = Open_file_read(context)))
|
||||
{
|
||||
File_error = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
file_size=File_length_file(file);
|
||||
|
||||
if (CPC_check_AMSDOS(file, NULL, NULL)) {
|
||||
fseek(file, 128, SEEK_SET); // right after AMSDOS header
|
||||
}
|
||||
|
||||
context->Ratio = PIXEL_WIDE;
|
||||
Pre_load(context, 192, 272, file_size, FORMAT_GOS, context->Ratio, 0);
|
||||
context->Width = 192;
|
||||
context->Height = 272;
|
||||
|
||||
// load pixels
|
||||
pixel_data = GFX2_malloc(16384);
|
||||
memset(pixel_data, 0, 16384);
|
||||
Read_bytes(file, pixel_data, file_size);
|
||||
|
||||
i = 0;
|
||||
for (y = 0; y < 168; y++) {
|
||||
x = 0;
|
||||
while (x < 192) {
|
||||
byte pixels = pixel_data[i];
|
||||
Set_pixel(context, x++, y, (pixels & 0x80) >> 7 | (pixels & 0x08) >> 2 | (pixels & 0x20) >> 3 | (pixels & 0x02) << 2);
|
||||
Set_pixel(context, x++, y, (pixels & 0x40) >> 6 | (pixels & 0x04) >> 1 | (pixels & 0x10) >> 2 | (pixels & 0x01) << 3);
|
||||
i++;
|
||||
}
|
||||
|
||||
i += 0x800;
|
||||
if (i > 0x3FFF) {
|
||||
i -= 0x4000;
|
||||
} else {
|
||||
i -= 192 / 2;
|
||||
}
|
||||
}
|
||||
|
||||
fclose(file);
|
||||
|
||||
// load pixels from GO2
|
||||
file = Open_file_read_with_alternate_ext(context, "GO2");
|
||||
if (CPC_check_AMSDOS(file, NULL, NULL)) {
|
||||
fseek(file, 128, SEEK_SET); // right after AMSDOS header
|
||||
}
|
||||
Read_bytes(file, pixel_data, file_size);
|
||||
i = 0;
|
||||
for (y = 168; y < 272; y++) {
|
||||
x = 0;
|
||||
while (x < 192) {
|
||||
byte pixels = pixel_data[i];
|
||||
Set_pixel(context, x++, y, (pixels & 0x80) >> 7 | (pixels & 0x08) >> 2 | (pixels & 0x20) >> 3 | (pixels & 0x02) << 2);
|
||||
Set_pixel(context, x++, y, (pixels & 0x40) >> 6 | (pixels & 0x04) >> 1 | (pixels & 0x10) >> 2 | (pixels & 0x01) << 3);
|
||||
i++;
|
||||
}
|
||||
|
||||
i += 0x800;
|
||||
if (i > 0x3FFF) {
|
||||
i -= 0x4000;
|
||||
} else {
|
||||
i -= 192 / 2;
|
||||
}
|
||||
}
|
||||
|
||||
fclose(file);
|
||||
|
||||
file = Open_file_read_with_alternate_ext(context, "KIT");
|
||||
if (CPC_check_AMSDOS(file, NULL, NULL)) {
|
||||
fseek(file, 128, SEEK_SET); // right after AMSDOS header
|
||||
}
|
||||
|
||||
if (Config.Clear_palette)
|
||||
memset(context->Palette,0,sizeof(T_Palette));
|
||||
|
||||
for (i = 0; i < 16; i++) {
|
||||
uint16_t word;
|
||||
if (!Read_word_be(file, &word)) {
|
||||
fclose(file);
|
||||
File_error = 2;
|
||||
return;
|
||||
}
|
||||
|
||||
context->Palette[i].R = ((word >> 8) & 0xF) * 0x11;
|
||||
context->Palette[i].G = ((word >> 0) & 0xF) * 0x11;
|
||||
context->Palette[i].B = ((word >> 12) & 0xF) * 0x11;
|
||||
}
|
||||
|
||||
fclose(file);
|
||||
File_error = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for CM5 - Amstrad CPC "Mode 5" picture
|
||||
*
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user