Apple II HGR & DHGR Load/Save
This commit is contained in:
		
							parent
							
								
									f38b335b80
								
							
						
					
					
						commit
						1bffaacead
					
				@ -148,6 +148,7 @@ enum FILE_FORMATS
 | 
			
		||||
  FORMAT_INFO, ///< Amiga OS icons
 | 
			
		||||
  FORMAT_FLI,  ///< Autodesk Animator FLI/FLC
 | 
			
		||||
  FORMAT_MOTO, ///< Thomson MO/TO computers pictures
 | 
			
		||||
  FORMAT_HGR,  ///< Apple II HGR and DHGR
 | 
			
		||||
  FORMAT_MISC, ///< Must be last of enum: others formats recognized by SDL_image
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -155,5 +155,10 @@ void Test_MOTO(T_IO_Context *, FILE *);
 | 
			
		||||
void Load_MOTO(T_IO_Context *);
 | 
			
		||||
void Save_MOTO(T_IO_Context *);
 | 
			
		||||
 | 
			
		||||
// -- Apple II HGR and DHGR pictures ----------------------------------------
 | 
			
		||||
void Test_HGR(T_IO_Context *, FILE *);
 | 
			
		||||
void Load_HGR(T_IO_Context *);
 | 
			
		||||
void Save_HGR(T_IO_Context *);
 | 
			
		||||
 | 
			
		||||
/// @}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -91,6 +91,7 @@ const T_Format File_formats[] = {
 | 
			
		||||
    "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;pmg;rpm;"
 | 
			
		||||
    "cpc;scr;win;"
 | 
			
		||||
    "hgr;dhgr;"
 | 
			
		||||
    "tga;pnm;xpm;xcf;jpg;jpeg;tif;tiff;ico;ic2;cur;cm5;pph;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, "", "*"},
 | 
			
		||||
@ -123,6 +124,7 @@ const T_Format File_formats[] = {
 | 
			
		||||
  {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,Save_MOTO,0, 1, 0, "bin", "bin;map"},
 | 
			
		||||
  {FORMAT_HGR, " hgr", Test_HGR, Load_HGR, Save_HGR, 0, 0, 1, "hgr", "hgr;dhgr;bin"},
 | 
			
		||||
  {FORMAT_MISC,"misc.",NULL,     NULL,     NULL,     0, 0, 0, "",    "tga;pnm;xpm;xcf;jpg;jpeg;tif;tiff"},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -6671,3 +6671,240 @@ error:
 | 
			
		||||
    fclose(file);
 | 
			
		||||
  File_error = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/////////////////////////////// Apple II Files //////////////////////////////
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Test for an Apple II HGR or DHGR raw file
 | 
			
		||||
 */
 | 
			
		||||
void Test_HGR(T_IO_Context * context, FILE * file)
 | 
			
		||||
{
 | 
			
		||||
  long file_size;
 | 
			
		||||
 | 
			
		||||
  (void)context;
 | 
			
		||||
  File_error = 1;
 | 
			
		||||
 | 
			
		||||
  file_size = File_length_file(file);
 | 
			
		||||
  if (file_size == 8192)  // HGR
 | 
			
		||||
    File_error = 0;
 | 
			
		||||
  else if(file_size == 16384) // DHGR
 | 
			
		||||
    File_error = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Load HGR (280x192) or DHGR (560x192) Apple II pictures
 | 
			
		||||
 *
 | 
			
		||||
 * Creates 2 layers :
 | 
			
		||||
 * 1. Monochrome
 | 
			
		||||
 * 2. Color
 | 
			
		||||
 */
 | 
			
		||||
void Load_HGR(T_IO_Context * context)
 | 
			
		||||
{
 | 
			
		||||
  unsigned long file_size;
 | 
			
		||||
  FILE * file;
 | 
			
		||||
  byte * vram[2];
 | 
			
		||||
  int bank;
 | 
			
		||||
  int x, y;
 | 
			
		||||
  int is_dhgr = 0;
 | 
			
		||||
 | 
			
		||||
  file = Open_file_read(context);
 | 
			
		||||
  if (file == NULL)
 | 
			
		||||
  {
 | 
			
		||||
    File_error = 1;
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  file_size = File_length_file(file);
 | 
			
		||||
  if (file_size == 16384)
 | 
			
		||||
    is_dhgr = 1;
 | 
			
		||||
 | 
			
		||||
  vram[0] = malloc(8192);
 | 
			
		||||
  Read_bytes(file, vram[0], 8192);
 | 
			
		||||
  if (is_dhgr)
 | 
			
		||||
  {
 | 
			
		||||
    vram[1] = malloc(8192);
 | 
			
		||||
    Read_bytes(file, vram[1], 8192);
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
    vram[1] = NULL;
 | 
			
		||||
  fclose(file);
 | 
			
		||||
 | 
			
		||||
  if (Config.Clear_palette)
 | 
			
		||||
    memset(context->Palette,0,sizeof(T_Palette));
 | 
			
		||||
  if (is_dhgr)
 | 
			
		||||
  {
 | 
			
		||||
    DHGR_set_palette(context->Palette);
 | 
			
		||||
    Pre_load(context, 560, 192, file_size, FORMAT_HGR, PIXEL_TALL, 4);
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    HGR_set_palette(context->Palette);
 | 
			
		||||
    Pre_load(context, 280, 192, file_size, FORMAT_HGR, PIXEL_SIMPLE, 2);
 | 
			
		||||
  }
 | 
			
		||||
  for (y = 0; y < 192; y++)
 | 
			
		||||
  {
 | 
			
		||||
    byte palette = 0, color = 0;
 | 
			
		||||
    byte previous_palette = 0;  // palette for the previous pixel pair
 | 
			
		||||
    int column, i;
 | 
			
		||||
    int offset = ((y & 7) << 10) + ((y & 070) << 4) + ((y >> 6) * 40);
 | 
			
		||||
    x = 0;
 | 
			
		||||
    for (column = 0; column < 40; column++)
 | 
			
		||||
    for (bank = 0; bank <= is_dhgr; bank++)
 | 
			
		||||
    {
 | 
			
		||||
      byte b = vram[bank][offset+column];
 | 
			
		||||
      if (!is_dhgr)
 | 
			
		||||
        palette = (b & 0x80) ? 4 : 0;
 | 
			
		||||
      else
 | 
			
		||||
        palette = (b & 0x80) ? 0 : 16;
 | 
			
		||||
      for (i = 0; i < 7; i++)
 | 
			
		||||
      {
 | 
			
		||||
        if (context->Type == CONTEXT_MAIN_IMAGE)
 | 
			
		||||
        {
 | 
			
		||||
          // monochrome
 | 
			
		||||
          Set_loading_layer(context, 0);
 | 
			
		||||
          Set_pixel(context, x, y, ((b & 1) * (is_dhgr ? 15 : 3)) + palette);
 | 
			
		||||
          Set_loading_layer(context, 1);
 | 
			
		||||
        }
 | 
			
		||||
        // color
 | 
			
		||||
        color = (color << 1) | (b & 1);
 | 
			
		||||
        if (is_dhgr)
 | 
			
		||||
        {
 | 
			
		||||
          if ((x & 3) == 0)
 | 
			
		||||
            previous_palette = palette; // what is important is the value when the 1st bit was read...
 | 
			
		||||
          /// emulate "chat mauve" DHGR mixed mode.
 | 
			
		||||
          /// see http://boutillon.free.fr/Underground/Anim_Et_Graph/Extasie_Chat_Mauve_Reloaded/Extasie_Chat_Mauve_Reloaded.html
 | 
			
		||||
          if (previous_palette) // BW
 | 
			
		||||
            Set_pixel(context, x, y, ((b & 1) * 15) + palette);
 | 
			
		||||
          else if ((x & 3) == 3)
 | 
			
		||||
          {
 | 
			
		||||
            Set_pixel(context, x - 3, y, (color & 15) + palette);
 | 
			
		||||
            Set_pixel(context, x - 2, y, (color & 15) + palette);
 | 
			
		||||
            Set_pixel(context, x - 1, y, (color & 15) + palette);
 | 
			
		||||
            Set_pixel(context, x, y, (color & 15) + palette);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
          if (x & 1)
 | 
			
		||||
          {
 | 
			
		||||
            if ((color & 6) == 6) // 2 bits to 1 => force White
 | 
			
		||||
            {
 | 
			
		||||
              Set_pixel(context, x - 2, y, 3 + previous_palette);
 | 
			
		||||
              Set_pixel(context, x - 1, y, 3 + palette);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
              Set_pixel(context, x - 1, y, (color & 3) + palette);
 | 
			
		||||
            Set_pixel(context, x, y, (color & 3) + palette);
 | 
			
		||||
            previous_palette = palette;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        b >>= 1;
 | 
			
		||||
        x++;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  // show hidden data in HOLES
 | 
			
		||||
  for (y = 0; y < 64; y++)
 | 
			
		||||
  for (bank = 0; bank < 1; bank++)
 | 
			
		||||
  {
 | 
			
		||||
    byte b = 0;
 | 
			
		||||
    for (x = 0; x < 8; x++)
 | 
			
		||||
      b |= vram[bank][x + (y << 7) + 120];
 | 
			
		||||
    if (b != 0)
 | 
			
		||||
      GFX2_LogHexDump(GFX2_DEBUG, bank ? "AUX " : "MAIN", vram[bank], (y << 7) + 120, 8);
 | 
			
		||||
  }
 | 
			
		||||
  free(vram[0]);
 | 
			
		||||
  free(vram[1]);
 | 
			
		||||
  File_error = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Save HGR (280x192) or DHGR (560x192) Apple II pictures
 | 
			
		||||
 *
 | 
			
		||||
 * The data saved is the "monochrome" data from layer 1
 | 
			
		||||
 */
 | 
			
		||||
void Save_HGR(T_IO_Context * context)
 | 
			
		||||
{
 | 
			
		||||
  FILE * file;
 | 
			
		||||
  byte * vram[2];
 | 
			
		||||
  int bank;
 | 
			
		||||
  int x, y;
 | 
			
		||||
  int is_dhgr = 0;
 | 
			
		||||
 | 
			
		||||
  File_error = 1;
 | 
			
		||||
  if (context->Height != 192 || (context->Width != 280 && context->Width != 560))
 | 
			
		||||
  {
 | 
			
		||||
    Warning_message("Picture must be 280x192 (HGR) or 560x192 (DHGR)");
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  if (context->Width == 560)
 | 
			
		||||
    is_dhgr = 1;
 | 
			
		||||
  
 | 
			
		||||
  file = Open_file_write(context);
 | 
			
		||||
  if (file == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
  vram[0] = calloc(8192, 1);
 | 
			
		||||
  if (vram[0] == NULL)
 | 
			
		||||
  {
 | 
			
		||||
    fclose(file);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  if (is_dhgr)
 | 
			
		||||
  {
 | 
			
		||||
    vram[1] = calloc(8192, 1);
 | 
			
		||||
    if (vram[1] == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      free(vram[0]);
 | 
			
		||||
      fclose(file);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
    vram[1] = NULL;
 | 
			
		||||
 | 
			
		||||
  Set_saving_layer(context, 0); // "monochrome" layer
 | 
			
		||||
  for (y = 0; y < 192; y++)
 | 
			
		||||
  {
 | 
			
		||||
    int i, column = 0;
 | 
			
		||||
    int offset = ((y & 7) << 10) + ((y & 070) << 4) + ((y >> 6) * 40);
 | 
			
		||||
    x = 0;
 | 
			
		||||
    bank = 0;
 | 
			
		||||
    while (x < context->Width)
 | 
			
		||||
    {
 | 
			
		||||
      byte b;
 | 
			
		||||
      if (is_dhgr)
 | 
			
		||||
        b = (Get_pixel(context, x, y) & 16) ? 0 : 0x80;
 | 
			
		||||
      else
 | 
			
		||||
        b = (Get_pixel(context, x, y) & 4) ? 0x80 : 0;
 | 
			
		||||
      for (i = 0; i < 7; i++)
 | 
			
		||||
      {
 | 
			
		||||
        b = b | ((Get_pixel(context, x++, y) & 1) << i);
 | 
			
		||||
      }
 | 
			
		||||
      vram[bank][offset + column] = b;
 | 
			
		||||
      if (is_dhgr)
 | 
			
		||||
      {
 | 
			
		||||
        if (++bank > 1)
 | 
			
		||||
        {
 | 
			
		||||
          bank = 0;
 | 
			
		||||
          column++;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      else
 | 
			
		||||
        column++;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (Write_bytes(file, vram[0], 8192))
 | 
			
		||||
  {
 | 
			
		||||
    if (is_dhgr)
 | 
			
		||||
    {
 | 
			
		||||
      if (Write_bytes(file, vram[1], 8192))
 | 
			
		||||
        File_error = 0;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
      File_error = 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  free(vram[0]);
 | 
			
		||||
  free(vram[1]);
 | 
			
		||||
  fclose(file);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										46
									
								
								src/oldies.c
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								src/oldies.c
									
									
									
									
									
								
							@ -2,6 +2,7 @@
 | 
			
		||||
*/
 | 
			
		||||
/*  Grafx2 - The Ultimate 256-color bitmap paint program
 | 
			
		||||
 | 
			
		||||
    Copyright 2018 Thomas Bernard
 | 
			
		||||
    Copyright 2008 Yves Rizoud
 | 
			
		||||
    Copyright 2008 Franck Charlet
 | 
			
		||||
    Copyright 2007 Adrien Destugues
 | 
			
		||||
@ -748,3 +749,48 @@ void MOTO_set_TO7_palette(T_Components * palette)
 | 
			
		||||
  palette[17].G = 127;
 | 
			
		||||
  palette[17].B = 127;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HGR_set_palette(T_Components * palette)
 | 
			
		||||
{
 | 
			
		||||
  static const T_Components hgr_palette[] = {
 | 
			
		||||
    {   0,   0,   0 },  // black
 | 
			
		||||
    {   0, 255,   0 },  // green
 | 
			
		||||
    { 255,   0, 255 },  // purple
 | 
			
		||||
    { 255, 255, 255 },  // white
 | 
			
		||||
    {   0,   0,   0 },  // black
 | 
			
		||||
    { 255,  80,   0 },  // orange
 | 
			
		||||
    {   0, 175, 255 },  // blue
 | 
			
		||||
    { 255, 255, 255 }   // white
 | 
			
		||||
  };
 | 
			
		||||
  memcpy(palette, hgr_palette, sizeof(hgr_palette));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DHGR_set_palette(T_Components * palette)
 | 
			
		||||
{
 | 
			
		||||
  // Color Palette from the JACE emulator
 | 
			
		||||
  static const T_Components dhgr_palette[] = {
 | 
			
		||||
    {0,0,0},      /* 0 black */
 | 
			
		||||
    {177,0,93},   /* 1 red */
 | 
			
		||||
    {94,86,0},    /* 8 brown */
 | 
			
		||||
    {255,86,0},   /* 9 orange */
 | 
			
		||||
    {0,127,34},   /* 4 dk green */
 | 
			
		||||
    {127,127,127},/* 5 gray */
 | 
			
		||||
    {44,213,0},   /* 12 lt green */
 | 
			
		||||
    {222,213,0},  /* 13 yellow */
 | 
			
		||||
    {32,41,255},  /* 2 dk blue */
 | 
			
		||||
    {210,41,255}, /* 3 purple */
 | 
			
		||||
    {127,127,127},/* 10 grey */
 | 
			
		||||
    {255,127,220},/* 11 pink */
 | 
			
		||||
    {0,168,255},  /* 6 med blue */
 | 
			
		||||
    {160,168,255},/* 7 lt blue */
 | 
			
		||||
    {77,255,161}, /* 14 aqua */
 | 
			
		||||
    {255,255,255} /* 15 white */
 | 
			
		||||
  };
 | 
			
		||||
  memcpy(palette, dhgr_palette, sizeof(dhgr_palette));
 | 
			
		||||
  palette[16].R = 0;
 | 
			
		||||
  palette[16].G = 0;
 | 
			
		||||
  palette[16].B = 0;
 | 
			
		||||
  palette[31].R = 255;
 | 
			
		||||
  palette[31].G = 255;
 | 
			
		||||
  palette[31].B = 255;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										19
									
								
								src/oldies.h
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								src/oldies.h
									
									
									
									
									
								
							@ -2,6 +2,7 @@
 | 
			
		||||
*/
 | 
			
		||||
/*  Grafx2 - The Ultimate 256-color bitmap paint program
 | 
			
		||||
 | 
			
		||||
    Copyright 2018 Thomas Bernard
 | 
			
		||||
    Copyright 2008 Adrien Destugues
 | 
			
		||||
 | 
			
		||||
    Grafx2 is free software; you can redistribute it and/or
 | 
			
		||||
@ -224,3 +225,21 @@ void MOTO_set_MO5_palette(T_Components * palette);
 | 
			
		||||
void MOTO_set_TO7_palette(T_Components * palette);
 | 
			
		||||
 | 
			
		||||
/** @}*/
 | 
			
		||||
 | 
			
		||||
/** @defgroup apple2 Apple II
 | 
			
		||||
 *
 | 
			
		||||
 * HGR and DHGR modes
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Set the 6 color Apple II HGR palette
 | 
			
		||||
 */
 | 
			
		||||
void HGR_set_palette(T_Components * palette);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Set the 16 color Apple II DHGR palette
 | 
			
		||||
 */
 | 
			
		||||
void DHGR_set_palette(T_Components * palette);
 | 
			
		||||
 | 
			
		||||
/** @}*/
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user