rewrite Save_NEO(). Now writes color Cycling info
This commit is contained in:
		
							parent
							
								
									7a2c46ccc4
								
							
						
					
					
						commit
						93bc0e6459
					
				@ -2419,66 +2419,127 @@ error:
 | 
			
		||||
/// Save in NeoChrome format
 | 
			
		||||
void Save_NEO(T_IO_Context * context)
 | 
			
		||||
{
 | 
			
		||||
  FILE *file;
 | 
			
		||||
  word resolution = 0;
 | 
			
		||||
  FILE *file = NULL;
 | 
			
		||||
  short x_pos,y_pos;
 | 
			
		||||
  byte * buffer;
 | 
			
		||||
  byte * ptr;
 | 
			
		||||
  word color_cycling_range = 0, color_cycling_delay = 0;
 | 
			
		||||
  word display_time = 0;
 | 
			
		||||
  word image_width = 320, image_height = 200;
 | 
			
		||||
  byte buffer[32];
 | 
			
		||||
  byte pixels[320];
 | 
			
		||||
  char * ext;
 | 
			
		||||
  int i, j;
 | 
			
		||||
 | 
			
		||||
  File_error=0;
 | 
			
		||||
  // Ouverture du fichier
 | 
			
		||||
  if ((file=Open_file_write(context)))
 | 
			
		||||
  File_error = 1;
 | 
			
		||||
  file = Open_file_write(context);
 | 
			
		||||
  if (file == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  // flags and resolution
 | 
			
		||||
  if (!Write_word_be(file, 0) || !Write_word_be(file, resolution))
 | 
			
		||||
    goto error;
 | 
			
		||||
 | 
			
		||||
  // palette
 | 
			
		||||
  PI1_code_palette(context->Palette, buffer);
 | 
			
		||||
  if (!Write_bytes(file, buffer, 16*2))
 | 
			
		||||
    goto error;
 | 
			
		||||
 | 
			
		||||
  // file name
 | 
			
		||||
  i = 0;
 | 
			
		||||
  j = 0;
 | 
			
		||||
  ext = strrchr(context->File_name, '.');
 | 
			
		||||
  while (j < 8 && ext != (context->File_name + i))
 | 
			
		||||
  {
 | 
			
		||||
    setvbuf(file, NULL, _IOFBF, 64*1024);
 | 
			
		||||
 | 
			
		||||
    // allocation d'un buffer mémoire
 | 
			
		||||
    buffer=(byte *)malloc(32128);
 | 
			
		||||
    // Codage de la résolution
 | 
			
		||||
    buffer[0]=0x00;
 | 
			
		||||
    buffer[1]=0x00;
 | 
			
		||||
    buffer[2]=0x00;
 | 
			
		||||
    buffer[3]=0x00;
 | 
			
		||||
    // Codage de la palette
 | 
			
		||||
    PI1_code_palette(context->Palette, buffer+4);
 | 
			
		||||
    // Codage de l'image
 | 
			
		||||
    ptr=buffer+128;
 | 
			
		||||
    for (y_pos=0;y_pos<200;y_pos++)
 | 
			
		||||
    {
 | 
			
		||||
      // Codage de la ligne
 | 
			
		||||
      memset(pixels,0,320);
 | 
			
		||||
      if (y_pos<context->Height)
 | 
			
		||||
      {
 | 
			
		||||
        for (x_pos=0;(x_pos<320) && (x_pos<context->Width);x_pos++)
 | 
			
		||||
          pixels[x_pos]=Get_pixel(context, x_pos,y_pos);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      for (x_pos=0;x_pos<(320>>4);x_pos++)
 | 
			
		||||
      {
 | 
			
		||||
        PI1_16p_to_8b(pixels+(x_pos<<4),ptr);
 | 
			
		||||
        ptr+=8;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (Write_bytes(file,buffer,32128))
 | 
			
		||||
    {
 | 
			
		||||
      fclose(file);
 | 
			
		||||
    }
 | 
			
		||||
    else // Error d'écriture (disque plein ou protégé)
 | 
			
		||||
    {
 | 
			
		||||
      fclose(file);
 | 
			
		||||
      Remove_file(context);
 | 
			
		||||
      File_error=1;
 | 
			
		||||
    }
 | 
			
		||||
    // Libération du buffer mémoire
 | 
			
		||||
    free(buffer);
 | 
			
		||||
    buffer = NULL;
 | 
			
		||||
    byte c = context->File_name[i++];
 | 
			
		||||
    if (c == 0)
 | 
			
		||||
      break;
 | 
			
		||||
    if (c >= 'a' && c <= 'z')
 | 
			
		||||
      c -= 32;
 | 
			
		||||
    if ((c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || (c == '_'))
 | 
			
		||||
      buffer[j++] = c;
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  while (j < 8)
 | 
			
		||||
    buffer[j++] = ' ';
 | 
			
		||||
  buffer[j++] = '.';
 | 
			
		||||
  if (ext != NULL)
 | 
			
		||||
  {
 | 
			
		||||
    i = 0;
 | 
			
		||||
    while (j < 12)
 | 
			
		||||
    {
 | 
			
		||||
      byte c = ext[i++];
 | 
			
		||||
      if (c == 0)
 | 
			
		||||
        break;
 | 
			
		||||
      if (c >= 'a' && c <= 'z')
 | 
			
		||||
        c -= 32;
 | 
			
		||||
      if ((c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || (c == '_'))
 | 
			
		||||
        buffer[j++] = c;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  while (j < 12)
 | 
			
		||||
    buffer[j++] = ' ';
 | 
			
		||||
 | 
			
		||||
  if (!Write_bytes(file, buffer, 12))
 | 
			
		||||
    goto error;
 | 
			
		||||
 | 
			
		||||
  // Save the 1st valid Color cycling range
 | 
			
		||||
  for (i = 0; i < context->Color_cycles; i++)
 | 
			
		||||
  {
 | 
			
		||||
    if (context->Cycle_range[i].Start < 16 && context->Cycle_range[i].End < 16)
 | 
			
		||||
    {
 | 
			
		||||
      color_cycling_range = 0x8000 | (context->Cycle_range[i].Start << 4) | context->Cycle_range[i].End;
 | 
			
		||||
      if (context->Cycle_range[i].Speed > 0)
 | 
			
		||||
      {
 | 
			
		||||
        color_cycling_delay = 175 / context->Cycle_range[i].Speed;
 | 
			
		||||
        if (color_cycling_delay > 0 && context->Cycle_range[i].Inverse)
 | 
			
		||||
          color_cycling_delay = 256 - color_cycling_delay;
 | 
			
		||||
        color_cycling_delay |= 0x8000;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if (!Write_word_be(file, color_cycling_range) || !Write_word_be(file, color_cycling_delay) || !Write_word_be(file, display_time))
 | 
			
		||||
    goto error;
 | 
			
		||||
 | 
			
		||||
  // Save image position and size
 | 
			
		||||
  if (!Write_word_be(file, 0) || !Write_word_be(file, 0)
 | 
			
		||||
      || !Write_word_be(file, image_width) || !Write_word_be(file, image_height))
 | 
			
		||||
    goto error;
 | 
			
		||||
 | 
			
		||||
  // Fill with 128 bytes header with 0's
 | 
			
		||||
  // a few files have the string "NEO!" at offset 124 (0x7C)
 | 
			
		||||
  for (i = ftell(file); i < 128; i++)
 | 
			
		||||
  {
 | 
			
		||||
    if (!Write_byte(file, 0))
 | 
			
		||||
      goto error;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // image coding
 | 
			
		||||
  for (y_pos=0;y_pos<200;y_pos++)
 | 
			
		||||
  {
 | 
			
		||||
    // Codage de la ligne
 | 
			
		||||
    memset(pixels, 0, 320);
 | 
			
		||||
    if (y_pos < context->Height)
 | 
			
		||||
    {
 | 
			
		||||
      for (x_pos = 0; (x_pos < 320) && (x_pos < context->Width); x_pos++)
 | 
			
		||||
        pixels[x_pos] = Get_pixel(context, x_pos, y_pos);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (x_pos=0; x_pos < 320; x_pos += 16)
 | 
			
		||||
    {
 | 
			
		||||
      PI1_16p_to_8b(pixels + x_pos, buffer);
 | 
			
		||||
      if (!Write_bytes(file, buffer, 8))
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fclose(file);
 | 
			
		||||
  File_error = 0;
 | 
			
		||||
  return;
 | 
			
		||||
 | 
			
		||||
error:
 | 
			
		||||
  if (file != NULL)
 | 
			
		||||
    fclose(file);
 | 
			
		||||
    Remove_file(context);
 | 
			
		||||
    File_error=1;
 | 
			
		||||
  }
 | 
			
		||||
  Remove_file(context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* @} */
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user