moved tinter code into own function
This commit is contained in:
parent
c8bbaa68ed
commit
8be0d5be48
2 changed files with 56 additions and 42 deletions
|
|
@ -8,6 +8,9 @@ http://www.newbreedsoftware.com/tuxpaint/
|
||||||
|
|
||||||
|
|
||||||
2004.November.24 (0.9.15)
|
2004.November.24 (0.9.15)
|
||||||
|
* Moved tinter code into own function.
|
||||||
|
Albert Cahalan <albert@users.sf.net>
|
||||||
|
|
||||||
* Added "scale" keyword (*.dat files) for high-resolution stamp images.
|
* Added "scale" keyword (*.dat files) for high-resolution stamp images.
|
||||||
Albert Cahalan <albert@users.sf.net>
|
Albert Cahalan <albert@users.sf.net>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3009,6 +3009,58 @@ static void blit_brush(int x, int y)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct multichan {
|
||||||
|
double r,g,b; // linear
|
||||||
|
double L,u,v; // L,a,b would be better -- 2-way formula unknown
|
||||||
|
double hue,sat;
|
||||||
|
unsigned char or,og,ob,oa; // old 8-bit sRGB values
|
||||||
|
unsigned char nr,ng,nb,na; // new 8-bit sRGB values
|
||||||
|
} multichan;
|
||||||
|
|
||||||
|
static void tint_surface(SDL_Surface * tmp_surf, SDL_Surface * surf_ptr)
|
||||||
|
{
|
||||||
|
|
||||||
|
float col_hue, col_sat, col_val,
|
||||||
|
stamp_hue, stamp_sat, stamp_val;
|
||||||
|
|
||||||
|
Uint8 r, g, b, a;
|
||||||
|
int xx, yy;
|
||||||
|
|
||||||
|
rgbtohsv(color_hexes[cur_color][0],
|
||||||
|
color_hexes[cur_color][1],
|
||||||
|
color_hexes[cur_color][2],
|
||||||
|
&col_hue, &col_sat, &col_val);
|
||||||
|
|
||||||
|
|
||||||
|
/* Render the stamp: */
|
||||||
|
|
||||||
|
SDL_LockSurface(surf_ptr);
|
||||||
|
SDL_LockSurface(tmp_surf);
|
||||||
|
|
||||||
|
for (yy = 0; yy < surf_ptr->h; yy++)
|
||||||
|
{
|
||||||
|
for (xx = 0; xx < surf_ptr->w; xx++)
|
||||||
|
{
|
||||||
|
SDL_GetRGBA(getpixel(surf_ptr, xx, yy),
|
||||||
|
surf_ptr->format,
|
||||||
|
&r, &g, &b, &a);
|
||||||
|
|
||||||
|
rgbtohsv(r, g, b, &stamp_hue, &stamp_sat, &stamp_val);
|
||||||
|
|
||||||
|
if ( stamp_tintgray(cur_stamp) || stamp_sat > 0.25 )
|
||||||
|
hsvtorgb(col_hue, col_sat, stamp_val, &r, &g, &b);
|
||||||
|
// else
|
||||||
|
// hsvtorgb(col_hue, col_sat, stamp_val, &r, &g, &b);
|
||||||
|
|
||||||
|
putpixel(tmp_surf, xx, yy,
|
||||||
|
SDL_MapRGBA(tmp_surf->format, r, g, b, a));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_UnlockSurface(tmp_surf);
|
||||||
|
SDL_UnlockSurface(surf_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
/* Draw using the current stamp: */
|
/* Draw using the current stamp: */
|
||||||
|
|
||||||
static void stamp_draw(int x, int y)
|
static void stamp_draw(int x, int y)
|
||||||
|
|
@ -3018,8 +3070,6 @@ static void stamp_draw(int x, int y)
|
||||||
Uint32 amask;
|
Uint32 amask;
|
||||||
Uint8 r, g, b, a;
|
Uint8 r, g, b, a;
|
||||||
int xx, yy, dont_free_tmp_surf, base_x, base_y;
|
int xx, yy, dont_free_tmp_surf, base_x, base_y;
|
||||||
float col_hue, col_sat, col_val,
|
|
||||||
stamp_hue, stamp_sat, stamp_val;
|
|
||||||
|
|
||||||
|
|
||||||
/* Use a pre-mirrored version, if there is one? */
|
/* Use a pre-mirrored version, if there is one? */
|
||||||
|
|
@ -3124,46 +3174,7 @@ static void stamp_draw(int x, int y)
|
||||||
}
|
}
|
||||||
else if (stamp_tintable(cur_stamp))
|
else if (stamp_tintable(cur_stamp))
|
||||||
{
|
{
|
||||||
/* Render the stamp in the chosen color: */
|
tint_surface(tmp_surf, surf_ptr);
|
||||||
|
|
||||||
/* FIXME: It sucks to render this EVERY TIME. Why not just when
|
|
||||||
they pick the color, or pick the stamp, like with brushes?
|
|
||||||
(Why? Because I'm LAZY! :^) ) */
|
|
||||||
|
|
||||||
|
|
||||||
rgbtohsv(color_hexes[cur_color][0],
|
|
||||||
color_hexes[cur_color][1],
|
|
||||||
color_hexes[cur_color][2],
|
|
||||||
&col_hue, &col_sat, &col_val);
|
|
||||||
|
|
||||||
|
|
||||||
/* Render the stamp: */
|
|
||||||
|
|
||||||
SDL_LockSurface(surf_ptr);
|
|
||||||
SDL_LockSurface(tmp_surf);
|
|
||||||
|
|
||||||
for (yy = 0; yy < surf_ptr->h; yy++)
|
|
||||||
{
|
|
||||||
for (xx = 0; xx < surf_ptr->w; xx++)
|
|
||||||
{
|
|
||||||
SDL_GetRGBA(getpixel(surf_ptr, xx, yy),
|
|
||||||
surf_ptr->format,
|
|
||||||
&r, &g, &b, &a);
|
|
||||||
|
|
||||||
rgbtohsv(r, g, b, &stamp_hue, &stamp_sat, &stamp_val);
|
|
||||||
|
|
||||||
if ( stamp_tintgray(cur_stamp) || stamp_sat > 0.25 )
|
|
||||||
hsvtorgb(col_hue, col_sat, stamp_val, &r, &g, &b);
|
|
||||||
// else
|
|
||||||
// hsvtorgb(col_hue, col_sat, stamp_val, &r, &g, &b);
|
|
||||||
|
|
||||||
putpixel(tmp_surf, xx, yy,
|
|
||||||
SDL_MapRGBA(tmp_surf->format, r, g, b, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_UnlockSurface(tmp_surf);
|
|
||||||
SDL_UnlockSurface(surf_ptr);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue