Save and load Image mode in GIF file.

Add the extension GFX2MODE
This commit is contained in:
Thomas Bernard 2018-12-10 23:40:33 +01:00
parent c81ffb0d6e
commit c5a52242be
No known key found for this signature in database
GPG Key ID: 0FF11B67A5C0863C
3 changed files with 95 additions and 1 deletions

View File

@ -89,6 +89,7 @@
#include "pages.h"
#include "windows.h" // Best_color()
#include "fileformats.h"
#include "oldies.h"
#ifndef __no_pnglib__
static void Load_PNG_Sub(T_IO_Context * context, FILE * file);
@ -4011,6 +4012,7 @@ void GIF_new_pixel(T_IO_Context * context, T_GIF_IDB *idb, int is_transparent, b
void Load_GIF(T_IO_Context * context)
{
int image_mode = -1;
char signature[6];
word * alphabet_stack; // Pile de décodage d'une chaîne
@ -4174,6 +4176,7 @@ void Load_GIF(T_IO_Context * context)
{
char aeb[0x0B];
Read_bytes(GIF_file,aeb, 0x0B);
GFX2_Log(GFX2_DEBUG, "GIF extension \"%.11s\"\n", aeb);
if (File_error)
;
else if (!memcmp(aeb,"NETSCAPE2.0",0x0B))
@ -4259,6 +4262,20 @@ void Load_GIF(T_IO_Context * context)
if (size_to_read!=0)
File_error=1;
}
else if (0 == memcmp(aeb, "GFX2MODE", 8))
{
Read_byte(GIF_file,&size_to_read);
if (size_to_read > 0)
{ // read the image mode. We'll set it after having loaded all layers.
char * label = malloc((size_t)size_to_read + 1);
Read_bytes(GIF_file, label, size_to_read);
label[size_to_read] = '\0';
image_mode = Constraint_mode_from_label(label);
GFX2_Log(GFX2_DEBUG, " mode = %s (%d)\n", label, image_mode);
Read_byte(GIF_file,&size_to_read);
free(label);
}
}
else
{
// Unknown extension, skip.
@ -4482,6 +4499,10 @@ void Load_GIF(T_IO_Context * context)
if (!Read_byte(GIF_file,&block_identifier))
File_error=2;
}
// set the mode that have been read previously.
if (image_mode > 0)
Set_image_mode(context, image_mode);
} // Le fichier contenait un LSDB
else
File_error=1;
@ -4691,9 +4712,24 @@ void Save_GIF(T_IO_Context * context)
// LL : 01 to loop
// SSSS : number of loops
if (context->Type == CONTEXT_MAIN_IMAGE && Main.backups->Pages->Image_mode == IMAGE_MODE_ANIMATION)
{
if (context->Nb_layers>1)
Write_bytes(GIF_file,"\x21\xFF\x0BNETSCAPE2.0\x03\x01\x00\x00\x00",19);
}
else if (context->Type == CONTEXT_MAIN_IMAGE && Main.backups->Pages->Image_mode > IMAGE_MODE_ANIMATION)
{
const char * label = Constraint_mode_label(Main.backups->Pages->Image_mode);
size_t len = strlen(label);
// Write extension for storing IMAGE_MODE
Write_byte(GIF_file,0x21); // Extension Introducer
Write_byte(GIF_file,0xff); // Extension Label
Write_byte(GIF_file, 11); // Block size
Write_bytes(GIF_file, "GFX2MODE2.6", 11); // Application Identifier + Appl. Authentication Code
Write_byte(GIF_file, (byte)len); // Block size
Write_bytes(GIF_file, label, len); // Data
Write_byte(GIF_file, 0); // Block terminator
}
// Ecriture du commentaire
if (context->Comment[0])
{

View File

@ -82,6 +82,50 @@ static int count_trailing_zeros(unsigned int value)
}
#endif
static const struct {
enum IMAGE_MODES mode;
const char * label;
} image_modes_labels[] = {
{ IMAGE_MODE_LAYERED, "LAYERED" },
{ IMAGE_MODE_ANIMATION, "ANIMATION" },
{ IMAGE_MODE_ZX, "ZX_SPECTRUM" },
{ IMAGE_MODE_GBC, "GAMEBOYCOLOR" },
{ IMAGE_MODE_THOMSON, "THOMSON40COL" },
{ IMAGE_MODE_EGX, "CPC_EGX" },
{ IMAGE_MODE_EGX2, "CPC_EGX2" },
{ IMAGE_MODE_MODE5, "CPC_MODE5" },
{ IMAGE_MODE_RASTER, "CPC_RASTER" },
{ IMAGE_MODE_C64HIRES, "C64_HIRES" },
{ IMAGE_MODE_C64MULTI, "C64_MULTICOLOR" },
{ IMAGE_MODE_C64FLI, "C64_FLI" },
{ IMAGE_MODE_HGR, "APPLE2_HGR" },
{ IMAGE_MODE_DHGR, "APPLE2_DHGR" }
};
const char * Constraint_mode_label(enum IMAGE_MODES mode)
{
unsigned int i;
for (i = 0; i < sizeof(image_modes_labels)/sizeof(image_modes_labels[0]); i++)
{
if (image_modes_labels[i].mode == mode)
return image_modes_labels[i].label;
}
return NULL;
}
int Constraint_mode_from_label(const char * label)
{
unsigned int i;
for (i = 0; i < sizeof(image_modes_labels)/sizeof(image_modes_labels[0]); i++)
{
if (0 == strcmp(image_modes_labels[i].label, label))
return (int)image_modes_labels[i].mode;
}
return -1;
}
#if 0
static void Set_Pixel_in_layer(word x,word y, byte layer, byte color)
{

View File

@ -24,6 +24,20 @@
#include "loadsave.h"
/**
* identifier for each Image mode
*
* @return an ASCII label for the mode
*/
const char * Constraint_mode_label(enum IMAGE_MODES mode);
/**
* Search constraint mode for a label
*
* @return -1 for unknown mode or one of ::IMAGE_MODES value
*/
int Constraint_mode_from_label(const char * label);
/** @defgroup c64 Commodore 64
* Some C64 video mode related functions
* @{