Fixed the copy & paste.

This commit is contained in:
David Capello 2007-12-06 03:20:49 +00:00
parent d1c38d7dfe
commit 549210b95f
7 changed files with 88 additions and 89 deletions

View File

@ -70,7 +70,7 @@ static void do_quick (int action)
dst_layer = sprite->layer;
/* create a new layer from the mask */
handle_layer = NewLayerFromMask ();
handle_layer = NewLayerFromMask(sprite, sprite);
if (!handle_layer)
return;

View File

@ -225,7 +225,7 @@ Image *GetImage2(Sprite *sprite, int *x, int *y, int *opacity); /* CODE */
void LoadPalette(const char *filename);
void ClearMask(void);
Layer *NewLayerFromMask(void);
Layer *NewLayerFromMask(Sprite *src_sprite, Sprite *dst_sprite);
/* util/msk_file.c */

View File

@ -1055,14 +1055,6 @@ static int bind_ClearMask(lua_State *L)
return 0;
}
static int bind_NewLayerFromMask(lua_State *L)
{
Layer *return_value;
return_value = NewLayerFromMask();
push_userdata(L, Type_Layer, return_value);
return 1;
}
static int bind_load_msk_file(lua_State *L)
{
Mask *return_value;
@ -3256,7 +3248,6 @@ const luaL_reg bindings_routines[] = {
{ "GetImage2", bind_GetImage2 },
{ "LoadPalette", bind_LoadPalette },
{ "ClearMask", bind_ClearMask },
{ "NewLayerFromMask", bind_NewLayerFromMask },
{ "load_msk_file", bind_load_msk_file },
{ "save_msk_file", bind_save_msk_file },
{ "sprite_quantize", bind_sprite_quantize },

View File

@ -117,7 +117,7 @@ bool has_clipboard_image(int *w, int *h)
}
}
void copy_image_to_clipboard(struct Image *image)
void copy_image_to_clipboard(Image *image)
{
Sprite *sprite;
Image *dest;
@ -164,7 +164,9 @@ void paste_from_clipboard(void)
int xout[4], yout[4];
bool paste;
if (!current_sprite || current_sprite == clipboard || !clipboard->layer ||
if (!current_sprite ||
current_sprite == clipboard ||
!clipboard->layer ||
!is_interactive())
return;
@ -636,13 +638,18 @@ static int low_copy(void)
Sprite *sprite;
Layer *layer;
layer = NewLayerFromMask();
if (!layer)
return FALSE;
sprite = sprite_new(current_sprite->imgtype,
current_sprite->w,
current_sprite->h);
if (!sprite)
return FALSE;
layer = NewLayerFromMask(current_sprite, sprite);
if (!layer) {
sprite_free(sprite);
return FALSE;
}
layer_add_layer(sprite->set, layer);
sprite_set_layer(sprite, layer);
sprite_set_frame(sprite, current_sprite->frame);

View File

@ -184,20 +184,21 @@ void ClearMask(void)
/* returns a new layer created from the current mask in the current
sprite, the layer isn't added to the sprite */
Layer *NewLayerFromMask(void)
Layer *NewLayerFromMask(Sprite *src_sprite, Sprite *dst_sprite)
{
Sprite *sprite = current_sprite;
unsigned char *address;
int x, y, u, v, getx, gety;
Image *dst, *src = GetImage2 (sprite, &x, &y, NULL);
Image *dst, *src = GetImage2(src_sprite, &x, &y, NULL);
Layer *layer;
Cel *cel;
div_t d;
if (!sprite || !sprite->mask || !sprite->mask->bitmap || !src)
if (!src_sprite || !src_sprite->mask || !src_sprite->mask->bitmap || !src)
return NULL;
dst = image_new(sprite->imgtype, sprite->mask->w, sprite->mask->h);
dst = image_new(dst_sprite->imgtype,
src_sprite->mask->w,
src_sprite->mask->h);
if (!dst)
return NULL;
@ -205,14 +206,14 @@ Layer *NewLayerFromMask(void)
image_clear(dst, 0);
/* copy the masked zones */
for (v=0; v<sprite->mask->h; v++) {
for (v=0; v<src_sprite->mask->h; v++) {
d = div(0, 8);
address = ((unsigned char **)sprite->mask->bitmap->line)[v]+d.quot;
address = ((unsigned char **)src_sprite->mask->bitmap->line)[v]+d.quot;
for (u=0; u<sprite->mask->w; u++) {
for (u=0; u<src_sprite->mask->w; u++) {
if ((*address & (1<<d.rem))) {
getx = u+sprite->mask->x-x;
gety = v+sprite->mask->y-y;
getx = u+src_sprite->mask->x-x;
gety = v+src_sprite->mask->y-y;
if ((getx >= 0) && (getx < src->w) &&
(gety >= 0) && (gety < src->h))
@ -224,7 +225,7 @@ Layer *NewLayerFromMask(void)
}
}
layer = layer_new(sprite);
layer = layer_new(dst_sprite);
if (!layer) {
image_free(dst);
return NULL;
@ -232,8 +233,8 @@ Layer *NewLayerFromMask(void)
layer_set_blend_mode(layer, BLEND_MODE_NORMAL);
cel = cel_new(sprite->frame, stock_add_image(sprite->stock, dst));
cel_set_position(cel, sprite->mask->x, sprite->mask->y);
cel = cel_new(dst_sprite->frame, stock_add_image(dst_sprite->stock, dst));
cel_set_position(cel, dst_sprite->mask->x, dst_sprite->mask->y);
layer_add_cel(layer, cel);

View File

@ -33,7 +33,7 @@ struct Image *GetImage2(struct Sprite *sprite, int *x, int *y, int *opacity);
void LoadPalette(const char *filename);
void ClearMask(void);
struct Layer *NewLayerFromMask(void);
struct Layer *NewLayerFromMask(struct Sprite *src, struct Sprite *dst);
struct Image *GetLayerImage(struct Layer *layer, int *x, int *y, int frame);