Save_GOS(): save the palette in CPC Plus "KIT" format

This commit is contained in:
Thomas Bernard 2019-12-21 18:11:44 +01:00
parent 20a2620ffc
commit 60c3f0b4ed
No known key found for this signature in database
GPG Key ID: 0FF11B67A5C0863C

View File

@ -782,13 +782,13 @@ void Load_GOS(T_IO_Context* context)
file = Open_file_read_with_alternate_ext(context, "KIT"); file = Open_file_read_with_alternate_ext(context, "KIT");
if (file == NULL) { if (file == NULL) {
// There is no palette, but that's fine, we can still load the pixels // There is no palette, but that's fine, we can still load the pixels
// Setup a default grayscale palette // Setup a default grayscale palette
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
{ {
context->Palette[i].R = i * 0x11; context->Palette[i].R = i * 0x11;
context->Palette[i].G = i * 0x11; context->Palette[i].G = i * 0x11;
context->Palette[i].B = i * 0x11; context->Palette[i].B = i * 0x11;
} }
return; return;
} }
@ -811,7 +811,7 @@ void Load_GOS(T_IO_Context* context)
if (!Read_word_le(file, &word)) if (!Read_word_le(file, &word))
{ {
File_error = 2; File_error = 2;
return; break;
} }
context->Palette[i].R = ((word >> 4) & 0xF) * 0x11; context->Palette[i].R = ((word >> 4) & 0xF) * 0x11;
@ -829,7 +829,7 @@ void Load_GOS(T_IO_Context* context)
if (!Read_byte(file, &ink)) if (!Read_byte(file, &ink))
{ {
File_error = 2; File_error = 2;
return; break;
} }
context->Palette[i] = context->Palette[ink]; context->Palette[i] = context->Palette[ink];
} }
@ -841,46 +841,65 @@ void Load_GOS(T_IO_Context* context)
void Save_GOS(T_IO_Context* context) void Save_GOS(T_IO_Context* context)
{ {
FILE* file; FILE* file;
unsigned char* output; int i;
unsigned long outsize = 0; unsigned char* output;
unsigned char r1 = 0; unsigned long outsize = 0;
unsigned char r1 = 0;
// TODO save KIT file for color palette // TODO check picture dimensions (GOS is a fixed resolution format)
// For now, force the size
context->Width = 192;
context->Height = 168; // Convert the first half
// TODO check picture dimensions (GOS is a fixed resolution format) // convert and save page 1
// For now, force the size output = raw2crtc(context, 0, 7, &outsize, &r1, 0, 0);
context->Width = 192; file = Open_file_write(context);
context->Height = 168; // Convert the first half if (file == NULL)
return;
File_error = 0;
if (!Write_bytes(file, output, outsize))
File_error = 1;
// Pad to expected size
// TODO: pad with 0s ?
if (!Write_bytes(file, output, 16384 - outsize))
File_error = 1;
fclose(file);
if (File_error)
return;
// convert and save page 1 // convert and save page 2
output = raw2crtc(context, 0, 7, &outsize, &r1, 0, 0); // Advance context to second half of picture
file = Open_file_write(context); context->Target_address += context->Pitch * 168;
if (file == NULL) context->Height = 104;
return; output = raw2crtc(context, 0, 7, &outsize, &r1, 0, 0);
File_error = 0; file = Open_file_write_with_alternate_ext(context, "GO2");
if (!Write_bytes(file, output, outsize)) if (file == NULL)
File_error = 1; {
// Pad to expected size File_error = 1;
if (!Write_bytes(file, output, 16384 - outsize)) return;
File_error = 1; }
fclose(file); File_error = 0;
if (!Write_bytes(file, output, outsize))
File_error = 1;
// Pad to expected size
if (!Write_bytes(file, output, 16384 - outsize))
File_error = 1;
fclose(file);
if (File_error)
return;
// convert and save page 2 file = Open_file_write_with_alternate_ext(context, "KIT");
// Advance context to second half of picture for (i = 0; i < 16 && File_error == 0; i++)
context->Target_address += context->Pitch * 168; {
context->Height = 104; uint16_t word;
output = raw2crtc(context, 0, 7, &outsize, &r1, 0, 0); word = (context->Palette[i].R & 0xF0)
file = Open_file_write_with_alternate_ext(context, "GO2"); | ((context->Palette[i].G & 0xF0) << 4)
if (file == NULL) | (context->Palette[i].B >> 4);
return; if (!Write_word_le(file, word))
File_error = 0; File_error = 2;
if (!Write_bytes(file, output, outsize)) }
File_error = 1; fclose(file);
// Pad to expected size
if (!Write_bytes(file, output, 16384 - outsize))
File_error = 1;
fclose(file);
} }