WIP - Flower: Support sizes
Stalk color not matching leaf & base is more obvious at larger sizes. Base, petals, and leaf bitmaps need to be drawn (just scaled up, and made blurry, for the moment).
This commit is contained in:
parent
1f6f7bb746
commit
c448f090c5
5 changed files with 128 additions and 19 deletions
|
|
@ -45,6 +45,7 @@ https://tuxpaint.org/
|
||||||
+ Distortion
|
+ Distortion
|
||||||
+ Emboss
|
+ Emboss
|
||||||
+ Fisheye
|
+ Fisheye
|
||||||
|
+ [WIP] Flower
|
||||||
+ Foam
|
+ Foam
|
||||||
+ Googly Eyes
|
+ Googly Eyes
|
||||||
+ Kaleidoscope, Symmetric L/R & U/D, Pattern, Tiles
|
+ Kaleidoscope, Symmetric L/R & U/D, Pattern, Tiles
|
||||||
|
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 49 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 494 B After Width: | Height: | Size: 22 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 734 B After Width: | Height: | Size: 34 KiB |
|
|
@ -23,7 +23,11 @@
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
(See COPYING.txt)
|
(See COPYING.txt)
|
||||||
|
|
||||||
Last updated: February 12, 2023
|
Last updated: April 23, 2023
|
||||||
|
|
||||||
|
FIXME:
|
||||||
|
* Stalk color (RGB values) should match leaf & base bitmaps' colors
|
||||||
|
* Bitmaps need to be redrawn at a larger size, to avoid blurriness
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
@ -45,13 +49,22 @@ enum
|
||||||
LEAFSIDE_LEFT_UP
|
LEAFSIDE_LEFT_UP
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Note: We need to be able to have a default width of 32px when DEFAULT_SIZE
|
||||||
|
* is chosen, to match legacy Flower tool's size */
|
||||||
|
#define NUM_SIZES 4
|
||||||
|
#define MAX_WIDTH 128
|
||||||
|
#define DEFAULT_SIZE (32 / (MAX_WIDTH / NUM_SIZES))
|
||||||
|
|
||||||
|
static int flower_cur_size = DEFAULT_SIZE;
|
||||||
|
|
||||||
static Mix_Chunk *flower_click_snd, *flower_release_snd;
|
static Mix_Chunk *flower_click_snd, *flower_release_snd;
|
||||||
static Uint8 flower_r, flower_g, flower_b;
|
static Uint8 flower_r, flower_g, flower_b;
|
||||||
static int flower_min_x, flower_max_x, flower_bottom_x, flower_bottom_y;
|
static int flower_min_x, flower_max_x, flower_bottom_x, flower_bottom_y;
|
||||||
static int flower_side_first;
|
static int flower_side_first;
|
||||||
static int flower_side_decided;
|
static int flower_side_decided;
|
||||||
static SDL_Surface *flower_base, *flower_leaf, *flower_petals,
|
static SDL_Surface *flower_base_full = NULL, *flower_leaf_full = NULL, *flower_petals_full = NULL;
|
||||||
*flower_petals_colorized;
|
static SDL_Surface *flower_base = NULL, *flower_leaf = NULL, *flower_petals = NULL,
|
||||||
|
*flower_petals_colorized = NULL;
|
||||||
|
|
||||||
/* Local function prototypes: */
|
/* Local function prototypes: */
|
||||||
|
|
||||||
|
|
@ -66,9 +79,8 @@ static void flower_drawflower(magic_api * api, SDL_Surface * canvas, int x,
|
||||||
static Point2D flower_PointOnCubicBezier(Point2D * cp, float t);
|
static Point2D flower_PointOnCubicBezier(Point2D * cp, float t);
|
||||||
static void flower_ComputeBezier(Point2D * cp, int numberOfPoints,
|
static void flower_ComputeBezier(Point2D * cp, int numberOfPoints,
|
||||||
Point2D * curve);
|
Point2D * curve);
|
||||||
static void flower_colorize_petals(magic_api * api);
|
|
||||||
Uint32 flower_api_version(void);
|
Uint32 flower_api_version(void);
|
||||||
int flower_init(magic_api * api);
|
int flower_init(magic_api * api, Uint32 disabled_features);
|
||||||
int flower_get_tool_count(magic_api * api);
|
int flower_get_tool_count(magic_api * api);
|
||||||
SDL_Surface *flower_get_icon(magic_api * api, int which);
|
SDL_Surface *flower_get_icon(magic_api * api, int which);
|
||||||
char *flower_get_name(magic_api * api, int which);
|
char *flower_get_name(magic_api * api, int which);
|
||||||
|
|
@ -102,6 +114,9 @@ void flower_switchin(magic_api * api, int which, int mode,
|
||||||
void flower_switchout(magic_api * api, int which, int mode,
|
void flower_switchout(magic_api * api, int which, int mode,
|
||||||
SDL_Surface * canvas);
|
SDL_Surface * canvas);
|
||||||
int flower_modes(magic_api * api, int which);
|
int flower_modes(magic_api * api, int which);
|
||||||
|
Uint8 flower_accepted_sizes(magic_api * api, int which, int mode);
|
||||||
|
Uint8 flower_default_size(magic_api * api, int which, int mode);
|
||||||
|
void flower_set_size(magic_api * api, int which, int mode, SDL_Surface * canvas, SDL_Surface * last, Uint8 size, SDL_Rect * update_rect);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -112,9 +127,11 @@ Uint32 flower_api_version(void)
|
||||||
|
|
||||||
|
|
||||||
// No setup required:
|
// No setup required:
|
||||||
int flower_init(magic_api * api)
|
int flower_init(magic_api * api, Uint32 disabled_features ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
char fname[1024];
|
char fname[1024];
|
||||||
|
SDL_Surface * tmp_surf;
|
||||||
|
int h;
|
||||||
|
|
||||||
snprintf(fname, sizeof(fname), "%ssounds/magic/flower_click.ogg",
|
snprintf(fname, sizeof(fname), "%ssounds/magic/flower_click.ogg",
|
||||||
api->data_directory);
|
api->data_directory);
|
||||||
|
|
@ -126,15 +143,49 @@ int flower_init(magic_api * api)
|
||||||
|
|
||||||
snprintf(fname, sizeof(fname), "%simages/magic/flower_base.png",
|
snprintf(fname, sizeof(fname), "%simages/magic/flower_base.png",
|
||||||
api->data_directory);
|
api->data_directory);
|
||||||
flower_base = IMG_Load(fname);
|
tmp_surf = IMG_Load(fname);
|
||||||
|
if (tmp_surf == NULL) {
|
||||||
|
fprintf(stderr, "Cannot load %s", fname);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
h = tmp_surf->h * MAX_WIDTH / tmp_surf->w;
|
||||||
|
flower_base_full = api->scale(tmp_surf, MAX_WIDTH, h, 1);
|
||||||
|
if (flower_base_full == NULL) {
|
||||||
|
fprintf(stderr, "Cannot scale %s", fname);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
snprintf(fname, sizeof(fname), "%simages/magic/flower_leaf.png",
|
snprintf(fname, sizeof(fname), "%simages/magic/flower_leaf.png",
|
||||||
api->data_directory);
|
api->data_directory);
|
||||||
flower_leaf = IMG_Load(fname);
|
tmp_surf = IMG_Load(fname);
|
||||||
|
if (tmp_surf == NULL) {
|
||||||
|
fprintf(stderr, "Cannot load %s", fname);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
/* N.B.: Leaf is 1/2 as wide as base & petals */
|
||||||
|
h = tmp_surf->h * MAX_WIDTH / tmp_surf->w;
|
||||||
|
flower_leaf_full = api->scale(tmp_surf, MAX_WIDTH / 2, h, 1);
|
||||||
|
if (flower_leaf_full == NULL) {
|
||||||
|
fprintf(stderr, "Cannot scale %s", fname);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
snprintf(fname, sizeof(fname), "%simages/magic/flower_petals.png",
|
snprintf(fname, sizeof(fname), "%simages/magic/flower_petals.png",
|
||||||
api->data_directory);
|
api->data_directory);
|
||||||
flower_petals = IMG_Load(fname);
|
tmp_surf = IMG_Load(fname);
|
||||||
|
if (tmp_surf == NULL) {
|
||||||
|
fprintf(stderr, "Cannot load %s", fname);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
h = tmp_surf->h * MAX_WIDTH / tmp_surf->w;
|
||||||
|
flower_petals_full = api->scale(tmp_surf, MAX_WIDTH, h, 1);
|
||||||
|
if (flower_petals_full == NULL) {
|
||||||
|
fprintf(stderr, "Cannot scale %s", fname);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
flower_cur_size = DEFAULT_SIZE;
|
||||||
|
flower_set_size(api, 0, 0, NULL, NULL, flower_cur_size, NULL);
|
||||||
|
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
@ -268,8 +319,8 @@ void flower_release(magic_api * api, int which ATTRIBUTE_UNUSED,
|
||||||
{
|
{
|
||||||
/* Don't let flower be too low compared to base: */
|
/* Don't let flower be too low compared to base: */
|
||||||
|
|
||||||
if (y >= flower_bottom_y - 32)
|
if (y >= flower_bottom_y - flower_base->h)
|
||||||
y = flower_bottom_y - 32;
|
y = flower_bottom_y - flower_base->h;
|
||||||
|
|
||||||
|
|
||||||
/* Do final calcs and draw base: */
|
/* Do final calcs and draw base: */
|
||||||
|
|
@ -306,8 +357,11 @@ static void flower_drawflower(magic_api * api ATTRIBUTE_UNUSED,
|
||||||
{
|
{
|
||||||
SDL_Rect dest;
|
SDL_Rect dest;
|
||||||
|
|
||||||
dest.x = x - (flower_petals->w / 2);
|
if (flower_petals_colorized == NULL) // Abort!
|
||||||
dest.y = y - (flower_petals->h / 2);
|
return;
|
||||||
|
|
||||||
|
dest.x = x - (flower_petals_colorized->w / 2);
|
||||||
|
dest.y = y - (flower_petals_colorized->h / 2);
|
||||||
|
|
||||||
SDL_BlitSurface(flower_petals_colorized, NULL, canvas, &dest);
|
SDL_BlitSurface(flower_petals_colorized, NULL, canvas, &dest);
|
||||||
}
|
}
|
||||||
|
|
@ -317,6 +371,9 @@ static void flower_drawbase(magic_api * api ATTRIBUTE_UNUSED,
|
||||||
{
|
{
|
||||||
SDL_Rect dest;
|
SDL_Rect dest;
|
||||||
|
|
||||||
|
if (flower_base == NULL) // Abort!
|
||||||
|
return;
|
||||||
|
|
||||||
dest.x = flower_bottom_x - (flower_base->w / 2);
|
dest.x = flower_bottom_x - (flower_base->w / 2);
|
||||||
dest.y = flower_bottom_y;
|
dest.y = flower_bottom_y;
|
||||||
|
|
||||||
|
|
@ -336,6 +393,9 @@ static void flower_drawstalk(magic_api * api ATTRIBUTE_UNUSED,
|
||||||
int xx, yy, side;
|
int xx, yy, side;
|
||||||
|
|
||||||
|
|
||||||
|
if (flower_leaf == NULL) // Abort!
|
||||||
|
return;
|
||||||
|
|
||||||
/* Compute a nice bezier curve for the stalk, based on the
|
/* Compute a nice bezier curve for the stalk, based on the
|
||||||
base (x,y), leftmost (x), rightmost (x), and top (x,y) */
|
base (x,y), leftmost (x), rightmost (x), and top (x,y) */
|
||||||
|
|
||||||
|
|
@ -377,8 +437,8 @@ static void flower_drawstalk(magic_api * api ATTRIBUTE_UNUSED,
|
||||||
{
|
{
|
||||||
dest.x = curve[i].x;
|
dest.x = curve[i].x;
|
||||||
dest.y = curve[i].y;
|
dest.y = curve[i].y;
|
||||||
dest.w = 2;
|
dest.w = 4;
|
||||||
dest.h = 2;
|
dest.h = 4;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -387,11 +447,11 @@ static void flower_drawstalk(magic_api * api ATTRIBUTE_UNUSED,
|
||||||
|
|
||||||
dest.x = left;
|
dest.x = left;
|
||||||
dest.y = curve[i].y;
|
dest.y = curve[i].y;
|
||||||
dest.w = right - left + 1;
|
dest.w = right - left + ((flower_petals->w - 1) / 32) + 1; // 1px wide for smallest sizes; wider for larger sizes
|
||||||
dest.h = 2;
|
dest.h = 2 * (((flower_petals->w - 1) / 32) + 1); // 1px tall for smallest sizes; taller for larger sizes
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_FillRect(canvas, &dest, SDL_MapRGB(canvas->format, 0, 128, 0));
|
SDL_FillRect(canvas, &dest, SDL_MapRGB(canvas->format, 0, 128, 0)); // FIXME: Match base & leaf color!!! -bjk 2023.04.23
|
||||||
|
|
||||||
|
|
||||||
/* When we're done (final render), we can add some random leaves: */
|
/* When we're done (final render), we can add some random leaves: */
|
||||||
|
|
@ -513,6 +573,13 @@ void flower_shutdown(magic_api * api ATTRIBUTE_UNUSED)
|
||||||
SDL_FreeSurface(flower_petals);
|
SDL_FreeSurface(flower_petals);
|
||||||
if (flower_petals_colorized != NULL)
|
if (flower_petals_colorized != NULL)
|
||||||
SDL_FreeSurface(flower_petals_colorized);
|
SDL_FreeSurface(flower_petals_colorized);
|
||||||
|
|
||||||
|
if (flower_base_full != NULL)
|
||||||
|
SDL_FreeSurface(flower_base_full);
|
||||||
|
if (flower_leaf_full != NULL)
|
||||||
|
SDL_FreeSurface(flower_leaf_full);
|
||||||
|
if (flower_petals_full != NULL)
|
||||||
|
SDL_FreeSurface(flower_petals_full);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Record the color from Tux Paint:
|
// Record the color from Tux Paint:
|
||||||
|
|
@ -605,6 +672,9 @@ static void flower_colorize_petals(magic_api * api)
|
||||||
if (flower_petals_colorized != NULL)
|
if (flower_petals_colorized != NULL)
|
||||||
SDL_FreeSurface(flower_petals_colorized);
|
SDL_FreeSurface(flower_petals_colorized);
|
||||||
|
|
||||||
|
if (flower_petals == NULL) // Abort!
|
||||||
|
return;
|
||||||
|
|
||||||
/* Create a surface to render into: */
|
/* Create a surface to render into: */
|
||||||
|
|
||||||
amask =
|
amask =
|
||||||
|
|
@ -637,7 +707,7 @@ static void flower_colorize_petals(magic_api * api)
|
||||||
flower_g, flower_b, a));
|
flower_g, flower_b, a));
|
||||||
|
|
||||||
if (api->in_circle
|
if (api->in_circle
|
||||||
((x - flower_petals->w / 2), (y - flower_petals->h / 2), 8))
|
((x - flower_petals->w / 2), (y - flower_petals->h / 2), (flower_petals->w / 4)))
|
||||||
{
|
{
|
||||||
api->putpixel(flower_petals_colorized, x, y,
|
api->putpixel(flower_petals_colorized, x, y,
|
||||||
SDL_MapRGBA(flower_petals_colorized->format, 0xFF, 0xFF,
|
SDL_MapRGBA(flower_petals_colorized->format, 0xFF, 0xFF,
|
||||||
|
|
@ -666,3 +736,41 @@ int flower_modes(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
return (MODE_PAINT_WITH_PREVIEW);
|
return (MODE_PAINT_WITH_PREVIEW);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Uint8 flower_accepted_sizes(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
return NUM_SIZES;
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint8 flower_default_size(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
return DEFAULT_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void flower_set_size(magic_api * api, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED, SDL_Surface * canvas ATTRIBUTE_UNUSED, SDL_Surface * last ATTRIBUTE_UNUSED, Uint8 size, SDL_Rect * update_rect ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
int scale, width, height;
|
||||||
|
|
||||||
|
flower_cur_size = size;
|
||||||
|
scale = (size * 100) / NUM_SIZES;
|
||||||
|
|
||||||
|
width = (scale * flower_base_full->w) / 100;
|
||||||
|
height = (scale * flower_base_full->h) / 100;
|
||||||
|
if (flower_base != NULL)
|
||||||
|
SDL_FreeSurface(flower_base);
|
||||||
|
flower_base = api->scale(flower_base_full, width, height, 1);
|
||||||
|
|
||||||
|
width = (scale * flower_leaf_full->w) / 100;
|
||||||
|
height = (scale * flower_leaf_full->h) / 100;
|
||||||
|
if (flower_leaf != NULL)
|
||||||
|
SDL_FreeSurface(flower_leaf);
|
||||||
|
flower_leaf = api->scale(flower_leaf_full, width, height, 1);
|
||||||
|
|
||||||
|
width = (scale * flower_petals_full->w) / 100;
|
||||||
|
height = (scale * flower_petals_full->h) / 100;
|
||||||
|
if (flower_petals != NULL)
|
||||||
|
SDL_FreeSurface(flower_petals);
|
||||||
|
flower_petals = api->scale(flower_petals_full, width, height, 1);
|
||||||
|
|
||||||
|
flower_colorize_petals(api);
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue