rewrite Save_C64_hires()
- easier to understand. - Count_used_colors_area() not used anymore (not safe for Save function as it does not get the pixels from the Saving context)
This commit is contained in:
		
							parent
							
								
									f8dfe6227e
								
							
						
					
					
						commit
						eda6e57574
					
				@ -3203,94 +3203,113 @@ static int Save_C64_window(enum c64_format *saveFormat, byte *saveWhat, byte *lo
 | 
			
		||||
  return button==1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int Save_C64_hires(T_IO_Context *context, byte saveWhat, byte loadAddr)
 | 
			
		||||
/// Save a C64 hires picture
 | 
			
		||||
///
 | 
			
		||||
/// c64 hires is 320x200 with only 2 colors per 8x8 block.
 | 
			
		||||
static int Save_C64_hires(T_IO_Context *context, byte saveWhat, byte loadAddr)
 | 
			
		||||
{
 | 
			
		||||
    int cx,cy,x,y,c1,c2=0,i,pixel,bits,pos=0;
 | 
			
		||||
    word numcolors;
 | 
			
		||||
    dword cusage[256];
 | 
			
		||||
    byte screen_ram[1000],bitmap[8000];
 | 
			
		||||
    FILE *file;
 | 
			
		||||
  int i, pos = 0;
 | 
			
		||||
  word cx, cy, x, y;
 | 
			
		||||
  byte screen_ram[1000],bitmap[8000];
 | 
			
		||||
  FILE *file;
 | 
			
		||||
 | 
			
		||||
    for(x=0;x<1000;x++)screen_ram[x]=1; // init colormem to black/white
 | 
			
		||||
 | 
			
		||||
    for(cy=0; cy<25; cy++) // Character line, 25 lines
 | 
			
		||||
  for(cy=0; cy<25; cy++) // Character line, 25 lines
 | 
			
		||||
  {
 | 
			
		||||
    for(cx=0; cx<40; cx++) // Character column, 40 columns
 | 
			
		||||
    {
 | 
			
		||||
        for(cx=0; cx<40; cx++) // Character column, 40 columns
 | 
			
		||||
      byte fg, bg;  // foreground and background colors for the 8x8 block
 | 
			
		||||
      byte c[2];
 | 
			
		||||
      int count = 0;
 | 
			
		||||
      // first pass : find colors used
 | 
			
		||||
      for(y=0; y<8; y++)
 | 
			
		||||
      {
 | 
			
		||||
        for(x=0; x<8; x++)
 | 
			
		||||
        {
 | 
			
		||||
            for(i=0;i<256;i++)
 | 
			
		||||
                cusage[i]=0;
 | 
			
		||||
 | 
			
		||||
            numcolors=Count_used_colors_area(cusage,cx*8,cy*8,8,8);
 | 
			
		||||
            if (numcolors>2)
 | 
			
		||||
            {
 | 
			
		||||
                Warning_with_format("More than 2 colors\nin 8x8 pixel cell: (%d, %d)\nRect: (%d, %d, %d, %d)", cx, cy, cx * 8, cy * 8, cx * 8 + 7, cy * 8 + 7);
 | 
			
		||||
                // TODO here we should hilite the offending block
 | 
			
		||||
                return 1;
 | 
			
		||||
            }
 | 
			
		||||
            c1 = 0; c2 = 0;
 | 
			
		||||
            for(i=0;i<16;i++)
 | 
			
		||||
            {
 | 
			
		||||
                if(cusage[i])
 | 
			
		||||
                {
 | 
			
		||||
                    c2=i;
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            c1=c2+1;
 | 
			
		||||
            for(i=c2;i<16;i++)
 | 
			
		||||
            {
 | 
			
		||||
                if(cusage[i])
 | 
			
		||||
                {
 | 
			
		||||
                  c1=i;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            screen_ram[cx+cy*40]=(c2<<4)|c1;
 | 
			
		||||
 | 
			
		||||
            for(y=0; y<8; y++)
 | 
			
		||||
            {
 | 
			
		||||
                bits=0;
 | 
			
		||||
                for(x=0; x<8; x++)
 | 
			
		||||
                {
 | 
			
		||||
                    pixel=Get_pixel(context, x+cx*8,y+cy*8);
 | 
			
		||||
                    if(pixel>15)
 | 
			
		||||
                    {
 | 
			
		||||
                        Warning_message("Color above 15 used");
 | 
			
		||||
                        // TODO hilite offending block here too?
 | 
			
		||||
                        // or make it smarter with color allocation?
 | 
			
		||||
                        // However, the palette is fixed to the 16 first colors
 | 
			
		||||
                        return 1;
 | 
			
		||||
                    }
 | 
			
		||||
                    bits=bits<<1;
 | 
			
		||||
                    if (pixel==c2) bits|=1;
 | 
			
		||||
                }
 | 
			
		||||
                bitmap[pos++]=bits;
 | 
			
		||||
            }
 | 
			
		||||
          byte pixel = Get_pixel(context, x+cx*8,y+cy*8);
 | 
			
		||||
          if(pixel>15)
 | 
			
		||||
          {
 | 
			
		||||
            Warning_message("Color above 15 used");
 | 
			
		||||
            // TODO hilite offending block here too?
 | 
			
		||||
            // or make it smarter with color allocation?
 | 
			
		||||
            // However, the palette is fixed to the 16 first colors
 | 
			
		||||
            return 1;
 | 
			
		||||
          }
 | 
			
		||||
          for (i = 0; i < count; i++)
 | 
			
		||||
          {
 | 
			
		||||
            if (c[i] == pixel)
 | 
			
		||||
              break;
 | 
			
		||||
          }
 | 
			
		||||
          if (i >= 2)
 | 
			
		||||
          {
 | 
			
		||||
            Warning_with_format("More than 2 colors\nin 8x8 pixel cell: (%d, %d)\nRect: (%d, %d, %d, %d)", cx, cy, cx * 8, cy * 8, cx * 8 + 7, cy * 8 + 7);
 | 
			
		||||
            // TODO here we should hilite the offending block
 | 
			
		||||
            return 1;
 | 
			
		||||
          }
 | 
			
		||||
          if (i >= count)
 | 
			
		||||
            c[count++] = pixel;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (count == 1)
 | 
			
		||||
      {
 | 
			
		||||
        if (c[0] == 0)  // only black
 | 
			
		||||
          fg = 1; // white
 | 
			
		||||
        else
 | 
			
		||||
          fg = c[0];
 | 
			
		||||
        bg = 0; // black
 | 
			
		||||
      }
 | 
			
		||||
      else
 | 
			
		||||
      {
 | 
			
		||||
        // set lower color index as background
 | 
			
		||||
        if (c[0] < c[1])
 | 
			
		||||
        {
 | 
			
		||||
          fg = c[1];
 | 
			
		||||
          bg = c[0];
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
          fg = c[0];
 | 
			
		||||
          bg = c[1];
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      screen_ram[cx+cy*40] = (fg<<4) | bg;
 | 
			
		||||
 | 
			
		||||
      // 2nd pass : store bitmap (0 = background, 1 = foreground)
 | 
			
		||||
      for(y=0; y<8; y++)
 | 
			
		||||
      {
 | 
			
		||||
        byte bits = 0;
 | 
			
		||||
        for(x=0; x<8; x++)
 | 
			
		||||
        {
 | 
			
		||||
          bits <<= 1;
 | 
			
		||||
          if (Get_pixel(context, x+cx*8, y+cy*8) == fg)
 | 
			
		||||
            bits |= 1;
 | 
			
		||||
        }
 | 
			
		||||
        bitmap[pos++] = bits;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    file = Open_file_write(context);
 | 
			
		||||
  file = Open_file_write(context);
 | 
			
		||||
 | 
			
		||||
    if(!file)
 | 
			
		||||
    {
 | 
			
		||||
        Warning_message("File open failed");
 | 
			
		||||
        File_error = 1;
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
  if(!file)
 | 
			
		||||
  {
 | 
			
		||||
    Warning_message("File open failed");
 | 
			
		||||
    File_error = 1;
 | 
			
		||||
    return 1;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    setvbuf(file, NULL, _IOFBF, 64*1024);
 | 
			
		||||
  if (loadAddr)
 | 
			
		||||
  {
 | 
			
		||||
    Write_byte(file,0);
 | 
			
		||||
    Write_byte(file,loadAddr);
 | 
			
		||||
  }
 | 
			
		||||
  if (saveWhat==0 || saveWhat==1)
 | 
			
		||||
    Write_bytes(file,bitmap,8000);
 | 
			
		||||
  if (saveWhat==0 || saveWhat==2)
 | 
			
		||||
    Write_bytes(file,screen_ram,1000);
 | 
			
		||||
 | 
			
		||||
    if (loadAddr)
 | 
			
		||||
    {
 | 
			
		||||
        Write_byte(file,0);
 | 
			
		||||
        Write_byte(file,loadAddr);
 | 
			
		||||
    }
 | 
			
		||||
    if (saveWhat==0 || saveWhat==1)
 | 
			
		||||
        Write_bytes(file,bitmap,8000);
 | 
			
		||||
    if (saveWhat==0 || saveWhat==2)
 | 
			
		||||
        Write_bytes(file,screen_ram,1000);
 | 
			
		||||
 | 
			
		||||
    fclose(file);
 | 
			
		||||
    return 0;
 | 
			
		||||
  fclose(file);
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined(__GNUC__) && __GNUC__ > 2
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user