Add Loading of files produced by TGA2TEO for the Thomson TO8
This commit is contained in:
		
							parent
							
								
									ffd2c7e8ce
								
							
						
					
					
						commit
						77262deadc
					
				@ -147,6 +147,7 @@ enum FILE_FORMATS
 | 
			
		||||
  FORMAT_ICO,  ///< Windows icons
 | 
			
		||||
  FORMAT_INFO, ///< Amiga OS icons
 | 
			
		||||
  FORMAT_FLI,  ///< Autodesk Animator FLI/FLC
 | 
			
		||||
  FORMAT_MOTO, ///< Thomson MO/TO computers pictures
 | 
			
		||||
  FORMAT_MISC, ///< Must be last of enum: others formats recognized by SDL_image
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -141,4 +141,8 @@ void Load_INFO(T_IO_Context *);
 | 
			
		||||
void Test_FLI(T_IO_Context *, FILE *);
 | 
			
		||||
void Load_FLI(T_IO_Context *);
 | 
			
		||||
 | 
			
		||||
// -- Thomson MO/TO computer series pictures --------------------------------
 | 
			
		||||
void Test_MOTO(T_IO_Context *, FILE *);
 | 
			
		||||
void Load_MOTO(T_IO_Context *);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -90,7 +90,7 @@ const T_Format File_formats[] = {
 | 
			
		||||
  {FORMAT_ALL_IMAGES, "(all)", NULL, NULL, NULL, 0, 0, 0, "",
 | 
			
		||||
    "gif;png;bmp;2bp;pcx;pkm;iff;lbm;ilbm;sham;ham;ham6;ham8;acbm;pic;anim;img;sci;scq;scf;scn;sco;pi1;pc1;cel;neo;"
 | 
			
		||||
    "c64;p64;a64;pi;rp;aas;art;dd;iph;ipt;hpc;ocp;koa;koala;fli;"
 | 
			
		||||
    "bml;cdu;prg;tga;pnm;xpm;xcf;jpg;jpeg;tif;tiff;ico;ic2;cur;cm5;pph;info;flc"},
 | 
			
		||||
    "bml;cdu;prg;tga;pnm;xpm;xcf;jpg;jpeg;tif;tiff;ico;ic2;cur;cm5;pph;info;flc;bin"},
 | 
			
		||||
  {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"},
 | 
			
		||||
@ -120,6 +120,7 @@ const T_Format File_formats[] = {
 | 
			
		||||
  {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"},
 | 
			
		||||
  {FORMAT_FLI, " flc", Test_FLI, Load_FLI, NULL,     0, 0, 0, "flc", "flc;fli;dat"},
 | 
			
		||||
  {FORMAT_MOTO," moto",Test_MOTO,Load_MOTO,NULL,     0, 0, 0, "bin", "bin"},
 | 
			
		||||
  {FORMAT_MISC,"misc.",NULL,     NULL,     NULL,     0, 0, 0, "",    "tga;pnm;xpm;xcf;jpg;jpeg;tif;tiff"},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -4858,3 +4858,201 @@ void Load_FLI(T_IO_Context * context)
 | 
			
		||||
  }
 | 
			
		||||
  fclose(file);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/////////////////////////////// Thomson Files ///////////////////////////////
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Test for Thomson file
 | 
			
		||||
 */
 | 
			
		||||
void Test_MOTO(T_IO_Context * context, FILE * file)
 | 
			
		||||
{
 | 
			
		||||
  long file_size;
 | 
			
		||||
 | 
			
		||||
  (void)context;
 | 
			
		||||
  file_size = File_length_file(file);
 | 
			
		||||
 | 
			
		||||
  switch (file_size)
 | 
			
		||||
  {
 | 
			
		||||
    case 8004:  // 2 colors palette
 | 
			
		||||
    case 8008:  // 4 colors palette
 | 
			
		||||
    case 8032:  // 16 colors palette
 | 
			
		||||
      File_error = 0;
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      File_error = 1;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Load a picture for Thomson TO8/TO8D/TO9/TO9+/MO6
 | 
			
		||||
 *
 | 
			
		||||
 * The format used is the one produced by TGA2Teo :
 | 
			
		||||
 * - Picture data is splitted into 2 files, one for each VRAM bank :
 | 
			
		||||
 *   - The first VRAM bank is called "forme" (shape).
 | 
			
		||||
 *     In 40col mode it stores pixels.
 | 
			
		||||
 *   - The second VRAM bank is called "couleur" (color).
 | 
			
		||||
 *     In 40col mode it store color indexes for foreground and background.
 | 
			
		||||
 * - File extension is .BIN, character before extension is "P" for the first
 | 
			
		||||
 *   file, and "C" for the second.
 | 
			
		||||
 * - The color palette is stored in both files after the data.
 | 
			
		||||
 *
 | 
			
		||||
 * The mode is detected thanks to the number of color in the palette :
 | 
			
		||||
 * - 2 colors is 80col (640x200)
 | 
			
		||||
 * - 4 colors is bitmap4 (320x200 4 colors)
 | 
			
		||||
 * - 16 colors is either bitmap16 (160x200 16colors)
 | 
			
		||||
 *   or 40col (320x200 16 colors with 2 unique colors in each 8x1 pixels
 | 
			
		||||
 *   block).
 | 
			
		||||
 *
 | 
			
		||||
 * As it is not possible to disriminate bitmap16 and 40col, opening the "P"
 | 
			
		||||
 * file sets bitmap16, opening the "C" file sets 40col.
 | 
			
		||||
 */
 | 
			
		||||
void Load_MOTO(T_IO_Context * context)
 | 
			
		||||
{
 | 
			
		||||
  // FORME / COULEUR
 | 
			
		||||
  FILE * file_forme;
 | 
			
		||||
  FILE * file_couleur = NULL;
 | 
			
		||||
  long file_size;
 | 
			
		||||
  int n_colors;
 | 
			
		||||
  int bx, x, y;
 | 
			
		||||
  char filename[MAX_PATH_CHARACTERS];
 | 
			
		||||
  char path[MAX_PATH_CHARACTERS];
 | 
			
		||||
  byte bpp;
 | 
			
		||||
  char * ext;
 | 
			
		||||
  enum MOTO_mode { F_40col, F_80col, F_bm4, F_bm16 } mode = F_40col;
 | 
			
		||||
  enum PIXEL_RATIO ratio = PIXEL_SIMPLE;
 | 
			
		||||
  int width = 320;
 | 
			
		||||
  static const int gamma[16] = {  // Gamma values for MO6/TO8 palette
 | 
			
		||||
    0  , 100, 127, 147,
 | 
			
		||||
    163, 179, 191, 203,
 | 
			
		||||
    215, 223, 231, 239,
 | 
			
		||||
    243, 247, 251, 255
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  File_error = 1;
 | 
			
		||||
  file_forme = Open_file_read(context);
 | 
			
		||||
  if (file_forme == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
  file_size = File_length_file(file_forme);
 | 
			
		||||
  n_colors = (file_size - 8000) / 2;
 | 
			
		||||
  switch(n_colors)
 | 
			
		||||
  {
 | 
			
		||||
    case 16:
 | 
			
		||||
      bpp = 4;
 | 
			
		||||
      // 16 colors : either 40col or bm16 mode !
 | 
			
		||||
      // select later
 | 
			
		||||
      break;
 | 
			
		||||
    case 4:
 | 
			
		||||
      bpp = 2;
 | 
			
		||||
      mode = F_bm4;
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      bpp = 1;
 | 
			
		||||
      mode = F_80col;
 | 
			
		||||
      width = 640;
 | 
			
		||||
      ratio = PIXEL_TALL;
 | 
			
		||||
  }
 | 
			
		||||
  strncpy(filename, context->File_name, sizeof(filename));
 | 
			
		||||
  filename[sizeof(filename)-1] = '\0';
 | 
			
		||||
  ext = strrchr(filename, '.');
 | 
			
		||||
  if (ext == NULL || ext == context->File_name)
 | 
			
		||||
  {
 | 
			
		||||
    fclose(file_forme);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  if ((ext[-1] | 32) == 'c')
 | 
			
		||||
  {
 | 
			
		||||
    file_couleur = file_forme;
 | 
			
		||||
    ext[-1] = (ext[-1] & 32) | 'P';
 | 
			
		||||
    Get_full_filename(path, filename, context->File_directory);
 | 
			
		||||
    file_forme = fopen(path, "rb");
 | 
			
		||||
  }
 | 
			
		||||
  else if ((ext[-1] | 32) == 'p')
 | 
			
		||||
  {
 | 
			
		||||
    ext[-1] = (ext[-1] & 32) | 'C';
 | 
			
		||||
    Get_full_filename(path, filename, context->File_directory);
 | 
			
		||||
    file_couleur = fopen(path, "rb");
 | 
			
		||||
    if (n_colors == 16)
 | 
			
		||||
    {
 | 
			
		||||
      mode = F_bm16;
 | 
			
		||||
      width = 160;
 | 
			
		||||
      ratio = PIXEL_WIDE;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if (file_couleur == NULL)
 | 
			
		||||
  {
 | 
			
		||||
    fclose(file_forme);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  GFX2_Log(GFX2_DEBUG, "MO/TO: %s,%s file_size=%ld n_colors=%d\n", context->File_name, filename, file_size, n_colors);
 | 
			
		||||
  Pre_load(context, width, 200, file_size, FORMAT_MOTO, ratio, bpp);
 | 
			
		||||
  File_error = 0;
 | 
			
		||||
  for (y = 0; y < 200; y++)
 | 
			
		||||
  {
 | 
			
		||||
    for (bx = 0; bx < 40; bx++)
 | 
			
		||||
    {
 | 
			
		||||
      byte couleur_forme;
 | 
			
		||||
      byte couleur_fond;
 | 
			
		||||
      byte forme, couleurs;
 | 
			
		||||
 | 
			
		||||
      if (!(Read_byte(file_forme,&forme) && Read_byte(file_couleur,&couleurs)))
 | 
			
		||||
        File_error = 1;
 | 
			
		||||
      switch(mode)
 | 
			
		||||
      {
 | 
			
		||||
        case F_bm4:
 | 
			
		||||
          for (x = bx*8; x < bx*8+8; x++)
 | 
			
		||||
          {
 | 
			
		||||
            Set_pixel(context, x, y, ((forme & 0x80) >> 6) | ((couleurs & 0x80) >> 7));
 | 
			
		||||
            forme <<= 1;
 | 
			
		||||
            couleurs <<= 1;
 | 
			
		||||
          }
 | 
			
		||||
#if 0
 | 
			
		||||
          for (x = bx*8; x < bx*8+4; x++)
 | 
			
		||||
          {
 | 
			
		||||
            Set_pixel(context, x, y, couleurs >> 6);
 | 
			
		||||
            couleurs <<= 2;
 | 
			
		||||
          }
 | 
			
		||||
          for (x = bx*8 + 4; x < bx*8+8; x++)
 | 
			
		||||
          {
 | 
			
		||||
            Set_pixel(context, x, y, forme >> 6);
 | 
			
		||||
            forme <<= 2;
 | 
			
		||||
          }
 | 
			
		||||
#endif
 | 
			
		||||
          break;
 | 
			
		||||
        case F_bm16:
 | 
			
		||||
          Set_pixel(context, bx*4, y, forme >> 4);
 | 
			
		||||
          Set_pixel(context, bx*4+1, y, forme & 0x0F);
 | 
			
		||||
          Set_pixel(context, bx*4+2, y, couleurs >> 4);
 | 
			
		||||
          Set_pixel(context, bx*4+3, y, couleurs & 0x0F);
 | 
			
		||||
          break;
 | 
			
		||||
        case F_40col:
 | 
			
		||||
        default:
 | 
			
		||||
          // the color plane byte is bfFFFBBB
 | 
			
		||||
          // with the upper bits of both foreground (forme) and
 | 
			
		||||
          // background (fond) inverted.
 | 
			
		||||
          couleur_forme = ((couleurs & 0x78) >> 3) ^ 0x08;
 | 
			
		||||
          couleur_fond = ((couleurs & 7) | ((couleurs & 0x80) >> 4)) ^ 0x08;
 | 
			
		||||
          for (x = bx*8; x < bx*8+8; x++)
 | 
			
		||||
          {
 | 
			
		||||
            Set_pixel(context, x, y, (forme & 0x80)?couleur_forme:couleur_fond);
 | 
			
		||||
            forme <<= 1;
 | 
			
		||||
          }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  for (x = 0; x < n_colors; x++)
 | 
			
		||||
  {
 | 
			
		||||
    byte value;
 | 
			
		||||
    // 1 byte Blue (4 lower bits)
 | 
			
		||||
    // 1 byte Green (4 upper bits) / Red (4 lower bits)
 | 
			
		||||
    if (!Read_byte(file_forme,&value))
 | 
			
		||||
      File_error = 1;
 | 
			
		||||
    context->Palette[x].B = gamma[value & 0x0F];
 | 
			
		||||
    if (!Read_byte(file_forme,&value))
 | 
			
		||||
      File_error = 1;
 | 
			
		||||
    context->Palette[x].G = gamma[value >> 4];
 | 
			
		||||
    context->Palette[x].R = gamma[value & 0x0F];
 | 
			
		||||
  }
 | 
			
		||||
  fclose(file_forme);
 | 
			
		||||
  fclose(file_couleur);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user