/* vim:expandtab:ts=2 sw=2: */ /* Grafx2 - The Ultimate 256-color bitmap paint program Copyright 2008 Yves Rizoud Copyright 2008 Franck Charlet Copyright 2007 Adrien Destugues Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud) Grafx2 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. Grafx2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Grafx2; if not, see */ #include #ifndef _MSC_VER #include #endif #include #include #include "struct.h" #include "global.h" #include "errors.h" #include "misc.h" #include "palette.h" #include "pages.h" #include "windows.h" #include "layers.h" void Pixel_in_layer(word x,word y, byte layer, byte color) { *((y)*Main.image_width+(x)+Main.backups->Pages->Image[layer].Pixels)=color; } byte C64_FLI(byte *bitmap, byte *screen_ram, byte *color_ram, byte *background) { word used_colors[200][40]; word block_used_colors[25][40]; word line_used_colors[200]; byte used_colors_count[200][40]; dword usage[16]; word x,y,row,col; int i; byte line_color[200]; byte block_color[25][40]; word best_color_count; byte best_color; const byte no_color=16; // Prerequisites if (Main.backups->Pages->Nb_layers < 3) return 1; if (Main.image_width != 160 || Main.image_height != 200) return 2; memset(used_colors,0,200*40*sizeof(word)); memset(block_used_colors,0,25*40*sizeof(word)); memset(line_used_colors,0,200*sizeof(word)); memset(used_colors_count,0,200*40*sizeof(byte)); // Initialize these as "unset" memset(line_color,no_color,200*sizeof(byte)); memset(block_color,no_color,25*40*sizeof(byte)); // Examine all 4-pixel blocks to fill used_colors[][] for (row=0;row<200;row++) { for (col=0;col<40;col++) { for (x=0;x<4;x++) { byte c=*((row)*Main.image_width+(col*4+x)+Main.backups->Pages->Image[2].Pixels); used_colors[row][col] |= 1<Pages->Image[0].Pixels); if (c<16) { line_color[row]=c; for (col=0;col<40;col++) { // Remove that color from the sets used_colors[row][col] &= ~(1<Pages->Image[1].Pixels); if (c<16) { block_color[row/8][col]=c; // Remove that color from the sets for (y=0; y<8;y++) used_colors[row+y][col] &= ~(1<best_color_count) { best_color_count=usage[i]; best_color=i; } } line_color[row]=best_color; // Remove that color from the sets for (col=0;col<40;col++) { if (used_colors[row][col] & (1<2) { filter &= used_colors[row+y][col]; for (i=0; i<16; i++) { if (used_colors[row+y][col] & (1<best_color_count) { best_color_count=usage[i]; best_color=i; } } } } block_color[row/8][col]=best_color; // Remove that color from the sets for (y=0;y<8;y++) { if (used_colors[row+y][col] & (1<15) c1=16; if (c2>15) c2=16; // Output Screen RAMs if (screen_ram!=NULL) screen_ram[y*1024+row*40+col] = (c1&15) | ((c2&15)<<4); // Output bitmap if (bitmap!=NULL) { for(x=0; x<4; x++) { byte bits; byte c=*((row*8+y)*Main.image_width+(col*4+x)+Main.backups->Pages->Image[2].Pixels); if (c==line_color[row*8+y]) // BG color bits=0; else if (c==block_color[row][col]) // block color bits=3; else if (c==c1) // Color 1 bits=2; else if (c==c2) // Color 2 bits=1; else // problem bits=0; // clear target bits //bitmap[row*320+col*8+y] &= ~(3<<((3-x)*2)); // set them bitmap[row*320+col*8+y] |= bits<<((3-x)*2); } } } } } //memset(background,3,200); //memset(color_ram,5,8000); //memset(screen_ram,(9<<4) | 7,8192); return 0; } byte C64_FLI_enforcer(void) { byte background[200]; byte bitmap[8000]; byte screen_ram[8192]; byte color_ram[1000]; int row, col, x, y; byte c[4]; // Checks if (Main.image_width != 160) return 1; if (Main.image_height != 200) return 1; if (Main.backups->Pages->Nb_layers != 4) return 2; Backup_layers(3); memset(bitmap,0,8000); memset(background,0,200); memset(color_ram,0,1000); memset(screen_ram,0,8192); C64_FLI(bitmap, screen_ram, color_ram, background); for(row=0; row<25; row++) { for(col=0; col<40; col++) { c[3]=color_ram[row*40+col]&15; for(y=0; y<8; y++) { int pixel=bitmap[row*320+col*8+y]; c[0]=background[row*8+y]&15; c[1]=screen_ram[y*1024+row*40+col]>>4; c[2]=screen_ram[y*1024+row*40+col]&15; for(x=0; x<4; x++) { int color=c[(pixel&3)]; pixel>>=2; Pixel_in_layer(col*4+(3-x),row*8+y,3,color); } } } } End_of_modification(); // Visible feedback: // If the "check" layer was visible, manually update the whole thing if (Main.layers_visible & (1<<3)) { Hide_cursor(); Redraw_layered_image(); Display_all_screen(); Display_layerbar(); Display_cursor(); } else // Otherwise, simply toggle the layer visiblity Layer_activate(3,RIGHT_SIDE); return 0; }