mirror of
https://github.com/deater/dos33fsprogs.git
synced 2025-01-10 02:29:58 +00:00
second: more commenting of box code
This commit is contained in:
parent
bed43f7108
commit
9be823f7c4
@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
/* Try to automate part of the annoyingly tedious rotoscoping process */
|
/* Try to automate part of the annoyingly tedious rotoscoping process */
|
||||||
|
|
||||||
|
/* For input assumes a 40x48 (or 80x48, double wide) PNG file */
|
||||||
|
/* with the Apple II palette */
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
@ -134,6 +137,10 @@ static struct color_lookup_t {
|
|||||||
|
|
||||||
static struct color_lookup_t color_backup[16];
|
static struct color_lookup_t color_backup[16];
|
||||||
|
|
||||||
|
/* Permute the top 4 colors in the color list histogram */
|
||||||
|
/* We do this to see if the resulting data is more compact */
|
||||||
|
/* We skip the black background, it might be interesting to include that */
|
||||||
|
/* as a normal color */
|
||||||
static void permute_colors(int which) {
|
static void permute_colors(int which) {
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
@ -218,6 +225,12 @@ int create_using_hlins_by_color(void) {
|
|||||||
return current_primitive;
|
return current_primitive;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Find the smallest rectangle that includes all of a certain color */
|
||||||
|
/* We calculate this because if we don't track and this and include */
|
||||||
|
/* Don't Cares, then the algorithm will make overly-huge rectangles */
|
||||||
|
/* that are bigger than needed and make subsequent rectangles */
|
||||||
|
/* pessimistic */
|
||||||
|
|
||||||
int find_max_color_extent(int current_color,int *color_minx,int *color_miny,
|
int find_max_color_extent(int current_color,int *color_minx,int *color_miny,
|
||||||
int *color_maxx,int *color_maxy) {
|
int *color_maxx,int *color_maxy) {
|
||||||
|
|
||||||
@ -249,6 +262,7 @@ int find_max_color_extent(int current_color,int *color_minx,int *color_miny,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The main routine */
|
||||||
int create_using_boxes(void) {
|
int create_using_boxes(void) {
|
||||||
|
|
||||||
int current_primitive=0;
|
int current_primitive=0;
|
||||||
@ -263,14 +277,19 @@ int create_using_boxes(void) {
|
|||||||
if (current_color==background_color) continue;
|
if (current_color==background_color) continue;
|
||||||
|
|
||||||
|
|
||||||
|
/* calculate maximum color extent */
|
||||||
find_max_color_extent(current_color,
|
find_max_color_extent(current_color,
|
||||||
&color_minx,&color_miny,
|
&color_minx,&color_miny,
|
||||||
&color_maxx,&color_maxy);
|
&color_maxx,&color_maxy);
|
||||||
|
|
||||||
|
/* Try all possible box sizes. */
|
||||||
|
/* Can be exhaustive as there are only 40x48 possibilities */
|
||||||
|
/* Table is pre-sorted by size */
|
||||||
for(box=0;box<NUM_BOX_SIZES;box++) {
|
for(box=0;box<NUM_BOX_SIZES;box++) {
|
||||||
|
|
||||||
int xx,yy,box_found,color_found,color_found2;
|
int xx,yy,box_found,color_found,color_found2;
|
||||||
|
|
||||||
|
/* check to see if this box size is best fit for color */
|
||||||
for(row=0;row<48-box_sizes[box].y;row++) {
|
for(row=0;row<48-box_sizes[box].y;row++) {
|
||||||
for(col=0;col<40-box_sizes[box].x;col++) {
|
for(col=0;col<40-box_sizes[box].x;col++) {
|
||||||
box_found=1;
|
box_found=1;
|
||||||
@ -280,12 +299,13 @@ int create_using_boxes(void) {
|
|||||||
for(yy=0;yy<box_sizes[box].y;yy++) {
|
for(yy=0;yy<box_sizes[box].y;yy++) {
|
||||||
for(xx=0;xx<box_sizes[box].x;xx++) {
|
for(xx=0;xx<box_sizes[box].x;xx++) {
|
||||||
|
|
||||||
|
/* Only a fit if color is included */
|
||||||
// only counts if color found
|
/* i.e. don't have one that's all don't cares */
|
||||||
if (framebuffer[xx+col][yy+row]==current_color) {
|
if (framebuffer[xx+col][yy+row]==current_color) {
|
||||||
color_found=1;
|
color_found=1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If there's a color that is wrong, early exit */
|
||||||
if ((framebuffer[xx+col][yy+row]==background_color)||
|
if ((framebuffer[xx+col][yy+row]==background_color)||
|
||||||
(framebuffer[xx+col][yy+row]==0xff))
|
(framebuffer[xx+col][yy+row]==0xff))
|
||||||
{
|
{
|
||||||
@ -293,9 +313,13 @@ int create_using_boxes(void) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} // xx
|
} // xx
|
||||||
|
|
||||||
|
/* early exit */
|
||||||
if (!box_found) break;
|
if (!box_found) break;
|
||||||
} // yy
|
} // yy
|
||||||
|
|
||||||
|
/* This isn't a good fit if rectangle is bigger */
|
||||||
|
/* Than the minimal rectangle containing the colors */
|
||||||
if (( (col)>=color_minx)&&((col+box_sizes[box].x-1)<=color_maxx)&&
|
if (( (col)>=color_minx)&&((col+box_sizes[box].x-1)<=color_maxx)&&
|
||||||
((row)>=color_miny)&&((row+box_sizes[box].y-1)<=color_maxy)) {
|
((row)>=color_miny)&&((row+box_sizes[box].y-1)<=color_maxy)) {
|
||||||
color_found2=1;
|
color_found2=1;
|
||||||
@ -341,6 +365,8 @@ int create_using_boxes(void) {
|
|||||||
return current_primitive;
|
return current_primitive;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Comparison routines for the qsort()s */
|
||||||
|
|
||||||
static int compare_type(const void *p1, const void *p2) {
|
static int compare_type(const void *p1, const void *p2) {
|
||||||
|
|
||||||
struct primitive_list_t *first,*second;
|
struct primitive_list_t *first,*second;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user