support "scale" keyword in *.dat files for high-resolution stamps
This commit is contained in:
parent
5bd1e54d9a
commit
c8bbaa68ed
2 changed files with 71 additions and 34 deletions
|
|
@ -7,7 +7,10 @@ bill@newbreedsoftware.com
|
||||||
http://www.newbreedsoftware.com/tuxpaint/
|
http://www.newbreedsoftware.com/tuxpaint/
|
||||||
|
|
||||||
|
|
||||||
2004.November.23 (0.9.15)
|
2004.November.24 (0.9.15)
|
||||||
|
* Added "scale" keyword (*.dat files) for high-resolution stamp images.
|
||||||
|
Albert Cahalan <albert@users.sf.net>
|
||||||
|
|
||||||
* Can now use pretty much any window size, like 1234x666.
|
* Can now use pretty much any window size, like 1234x666.
|
||||||
Albert Cahalan <albert@users.sf.net>
|
Albert Cahalan <albert@users.sf.net>
|
||||||
|
|
||||||
|
|
|
||||||
100
src/tuxpaint.c
100
src/tuxpaint.c
|
|
@ -497,12 +497,12 @@ static int lang_use_right_to_left[] = {
|
||||||
|
|
||||||
|
|
||||||
typedef struct info_type {
|
typedef struct info_type {
|
||||||
|
double ratio;
|
||||||
int colorable;
|
int colorable;
|
||||||
int tintable;
|
int tintable;
|
||||||
int mirrorable;
|
int mirrorable;
|
||||||
int flipable;
|
int flipable;
|
||||||
int tintgray;
|
int tintgray;
|
||||||
// int min, def, max; // TODO: size range
|
|
||||||
} info_type;
|
} info_type;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -4105,6 +4105,30 @@ static const char *getfilename(const char* path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// The original Tux Paint canvas was 608x472. The canvas can be
|
||||||
|
// other sizes now, but many old stamps are sized for the small
|
||||||
|
// canvas. So, with larger canvases, we must choose a good scale
|
||||||
|
// factor to compensate. As the canvas size grows, the user will
|
||||||
|
// want a balance of "more stamps on the screen" and "stamps not
|
||||||
|
// getting tiny". This will calculate the needed scale factor.
|
||||||
|
static unsigned compute_default_scale_factor(double ratio)
|
||||||
|
{
|
||||||
|
double old_diag = sqrt(608*608+472*472);
|
||||||
|
double new_diag = sqrt(canvas->w*canvas->w+canvas->h*canvas->h);
|
||||||
|
double good_def = ratio*sqrt(new_diag/old_diag);
|
||||||
|
double good_log = log(good_def);
|
||||||
|
unsigned defsize = HARD_MAX_STAMP_SIZE;
|
||||||
|
while(defsize>0)
|
||||||
|
{
|
||||||
|
double this_err = good_log - log(scaletable[defsize].numer / (double)scaletable[defsize].denom);
|
||||||
|
double next_err = good_log - log(scaletable[defsize-1].numer / (double)scaletable[defsize-1].denom);
|
||||||
|
if( fabs(next_err) > fabs(this_err) ) break;
|
||||||
|
defsize--;
|
||||||
|
}
|
||||||
|
return defsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Setup: */
|
/* Setup: */
|
||||||
|
|
||||||
static void setup(int argc, char * argv[])
|
static void setup(int argc, char * argv[])
|
||||||
|
|
@ -5526,27 +5550,7 @@ static void setup(int argc, char * argv[])
|
||||||
free(homedirdir);
|
free(homedirdir);
|
||||||
|
|
||||||
|
|
||||||
// The original Tux Paint canvas was 608x472. The canvas can be
|
unsigned default_stamp_size = compute_default_scale_factor(1.0);
|
||||||
// other sizes now, but many old stamps are sized for the small
|
|
||||||
// canvas. So, with larger canvases, we must choose a good scale
|
|
||||||
// factor to compensate. As the canvas size grows, the user will
|
|
||||||
// want a balance of "more stamps on the screen" and "stamps not
|
|
||||||
// getting tiny". This will calculate the needed scale factor.
|
|
||||||
unsigned default_stamp_size;
|
|
||||||
{
|
|
||||||
double old_diag = sqrt(608*608+472*472);
|
|
||||||
double new_diag = sqrt(canvas->w*canvas->w+canvas->h*canvas->h);
|
|
||||||
double good_def = sqrt(new_diag/old_diag);
|
|
||||||
double good_log = log(good_def);
|
|
||||||
unsigned defsize = HARD_MAX_STAMP_SIZE;
|
|
||||||
while(defsize>0){
|
|
||||||
double this_err = good_log - log(scaletable[defsize].numer / (double)scaletable[defsize].denom);
|
|
||||||
double next_err = good_log - log(scaletable[defsize-1].numer / (double)scaletable[defsize-1].denom);
|
|
||||||
if( fabs(next_err) > fabs(this_err) ) break;
|
|
||||||
defsize--;
|
|
||||||
}
|
|
||||||
default_stamp_size = defsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create stamp thumbnails: */
|
/* Create stamp thumbnails: */
|
||||||
|
|
||||||
|
|
@ -5595,14 +5599,9 @@ static void setup(int argc, char * argv[])
|
||||||
inf_stamps[i]->mirrorable = 1;
|
inf_stamps[i]->mirrorable = 1;
|
||||||
inf_stamps[i]->tintgray = 1;
|
inf_stamps[i]->tintgray = 1;
|
||||||
inf_stamps[i]->flipable = 1;
|
inf_stamps[i]->flipable = 1;
|
||||||
// inf_stamps[i]->min = 0;
|
inf_stamps[i]->ratio = 1.0;
|
||||||
// inf_stamps[i]->def = 0;
|
|
||||||
// inf_stamps[i]->max = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// TODO: convert inf_stamps[i]->min and such to usable data
|
|
||||||
//
|
|
||||||
{
|
{
|
||||||
unsigned int upper = HARD_MAX_STAMP_SIZE;
|
unsigned int upper = HARD_MAX_STAMP_SIZE;
|
||||||
unsigned int lower = 0;
|
unsigned int lower = 0;
|
||||||
|
|
@ -5643,6 +5642,8 @@ static void setup(int argc, char * argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned mid = default_stamp_size;
|
unsigned mid = default_stamp_size;
|
||||||
|
if(inf_stamps[i]->ratio != 1.0)
|
||||||
|
mid = compute_default_scale_factor(inf_stamps[i]->ratio);
|
||||||
|
|
||||||
if(mid > upper)
|
if(mid > upper)
|
||||||
mid = upper;
|
mid = upper;
|
||||||
|
|
@ -8478,17 +8479,13 @@ static info_type * loadinfo(const char * const fname)
|
||||||
|
|
||||||
/* Clear info struct first: */
|
/* Clear info struct first: */
|
||||||
|
|
||||||
|
inf.ratio = 1.0;
|
||||||
inf.colorable = 0;
|
inf.colorable = 0;
|
||||||
inf.tintable = 0;
|
inf.tintable = 0;
|
||||||
inf.mirrorable = 1;
|
inf.mirrorable = 1;
|
||||||
inf.tintgray = 1;
|
inf.tintgray = 1;
|
||||||
inf.flipable = 1;
|
inf.flipable = 1;
|
||||||
|
|
||||||
// inf.min = 0; // dummy values
|
|
||||||
// inf.def = 0;
|
|
||||||
// inf.max = 0;
|
|
||||||
|
|
||||||
|
|
||||||
/* Load info! */
|
/* Load info! */
|
||||||
|
|
||||||
dat_fname = strdup(fname);
|
dat_fname = strdup(fname);
|
||||||
|
|
@ -8527,6 +8524,43 @@ static info_type * loadinfo(const char * const fname)
|
||||||
inf.colorable = 1;
|
inf.colorable = 1;
|
||||||
else if (strcmp(buf, "tintable") == 0)
|
else if (strcmp(buf, "tintable") == 0)
|
||||||
inf.tintable = 1;
|
inf.tintable = 1;
|
||||||
|
else if (!memcmp(buf, "scale", 5) && (isspace(buf[5]) || buf[5]=='='))
|
||||||
|
{
|
||||||
|
double tmp, tmp2;
|
||||||
|
char *cp = buf+6;
|
||||||
|
while (isspace(*cp) || *cp=='=')
|
||||||
|
cp++;
|
||||||
|
if (strchr(cp,'%'))
|
||||||
|
{
|
||||||
|
tmp = strtod(cp,NULL) / 100.0;
|
||||||
|
if (tmp > 0.0001 && tmp < 10000.0)
|
||||||
|
inf.ratio = tmp;
|
||||||
|
}
|
||||||
|
else if (strchr(cp,':'))
|
||||||
|
{
|
||||||
|
tmp = strtod(cp,&cp);
|
||||||
|
while(*cp && !isdigit(*cp))
|
||||||
|
cp++;
|
||||||
|
tmp2 = strtod(cp,NULL);
|
||||||
|
if (tmp>0.0001 && tmp<10000.0 && tmp2>0.0001 && tmp2<10000.0 && tmp/tmp2>0.0001 && tmp/tmp2<10000.0)
|
||||||
|
inf.ratio = tmp/tmp2;
|
||||||
|
}
|
||||||
|
else if (strchr(cp,'/'))
|
||||||
|
{
|
||||||
|
tmp = strtod(cp,&cp);
|
||||||
|
while(*cp && !isdigit(*cp))
|
||||||
|
cp++;
|
||||||
|
tmp2 = strtod(cp,NULL);
|
||||||
|
if (tmp>0.0001 && tmp<10000.0 && tmp2>0.0001 && tmp2<10000.0 && tmp2/tmp>0.0001 && tmp2/tmp<10000.0)
|
||||||
|
inf.ratio = tmp2/tmp;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tmp = strtod(cp,NULL);
|
||||||
|
if (tmp > 0.0001 && tmp < 10000.0)
|
||||||
|
inf.ratio = 1.0 / tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (strcmp(buf, "nomirror") == 0)
|
else if (strcmp(buf, "nomirror") == 0)
|
||||||
inf.mirrorable = 0;
|
inf.mirrorable = 0;
|
||||||
else if (strcmp(buf, "notintgray") == 0)
|
else if (strcmp(buf, "notintgray") == 0)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue