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

@ -59,10 +59,10 @@ static void do_quick (int action)
Image *dst; Image *dst;
Mask *mask_backup; Mask *mask_backup;
if (!is_interactive () || !sprite) if (!is_interactive() || !sprite)
return; return;
dst = GetImage2 (sprite, &x, &y, NULL); dst = GetImage2(sprite, &x, &y, NULL);
if (!dst) if (!dst)
return; return;
@ -70,7 +70,7 @@ static void do_quick (int action)
dst_layer = sprite->layer; dst_layer = sprite->layer;
/* create a new layer from the mask */ /* create a new layer from the mask */
handle_layer = NewLayerFromMask (); handle_layer = NewLayerFromMask(sprite, sprite);
if (!handle_layer) if (!handle_layer)
return; return;
@ -84,36 +84,36 @@ static void do_quick (int action)
/* save the current mask region */ /* save the current mask region */
if (action != ACTION_COPY) { if (action != ACTION_COPY) {
dirty_rectfill (dirty, dirty_rectfill(dirty,
sprite->mask->x-x, sprite->mask->x-x,
sprite->mask->y-y, sprite->mask->y-y,
sprite->mask->x-x + sprite->mask->w-1, sprite->mask->x-x + sprite->mask->w-1,
sprite->mask->y-y + sprite->mask->h-1); sprite->mask->y-y + sprite->mask->h-1);
dirty_get (dirty); dirty_get(dirty);
} }
/* clear the mask region */ /* clear the mask region */
if (action == ACTION_MOVE) { if (action == ACTION_MOVE) {
int enabled = undo_is_enabled (sprite->undo); int enabled = undo_is_enabled(sprite->undo);
undo_disable (sprite->undo); undo_disable(sprite->undo);
ClearMask (); ClearMask();
if (enabled) if (enabled)
undo_enable (sprite->undo); undo_enable(sprite->undo);
} }
/* copy the mask */ /* copy the mask */
mask_backup = mask_new_copy (sprite->mask); mask_backup = mask_new_copy(sprite->mask);
/* deselect the mask */ /* deselect the mask */
mask_none (sprite->mask); mask_none(sprite->mask);
/* insert the new layer in the top of the current one */ /* insert the new layer in the top of the current one */
layer_add_layer (sprite->set, handle_layer); layer_add_layer(sprite->set, handle_layer);
layer_move_layer (sprite->set, handle_layer, dst_layer); layer_move_layer(sprite->set, handle_layer, dst_layer);
/* select the layer */ /* select the layer */
sprite_set_layer (sprite, handle_layer); sprite_set_layer(sprite, handle_layer);
/* regenerate the boundaries (the mask was deselected) and redraw /* regenerate the boundaries (the mask was deselected) and redraw
the sprite */ the sprite */
@ -121,79 +121,79 @@ static void do_quick (int action)
update_screen_for_sprite(sprite); update_screen_for_sprite(sprite);
/* move the new layer to a new position */ /* move the new layer to a new position */
ret = interactive_move_layer (MODE_CLICKANDCLICK, FALSE, my_callback); ret = interactive_move_layer(MODE_CLICKANDCLICK, FALSE, my_callback);
/* all ok, merge the layer down */ /* all ok, merge the layer down */
if (ret) { if (ret) {
int u, v; int u, v;
Image *src = GetImage2 (sprite, &u, &v, NULL); Image *src = GetImage2(sprite, &u, &v, NULL);
Dirty *dirty_copy = dirty_new_copy (dirty); Dirty *dirty_copy = dirty_new_copy(dirty);
/* restore the "dst" image */ /* restore the "dst" image */
dirty_swap (dirty_copy); dirty_swap(dirty_copy);
/* save the mask area in the new position too */ /* save the mask area in the new position too */
dirty_rectfill (dirty, u-x, v-y, dirty_rectfill(dirty, u-x, v-y,
u-x + src->w-1, u-x + src->w-1,
v-y + src->h-1); v-y + src->h-1);
dirty_get (dirty); dirty_get(dirty);
/* put the first cleared part */ /* put the first cleared part */
dirty_put (dirty_copy); dirty_put(dirty_copy);
dirty_free (dirty_copy); dirty_free(dirty_copy);
switch (action) { switch (action) {
case ACTION_MOVE: case ACTION_MOVE:
case ACTION_COPY: case ACTION_COPY:
/* merge the source image in the destination */ /* merge the source image in the destination */
image_merge (dst, src, u-x, v-y, 255, handle_layer->blend_mode); image_merge(dst, src, u-x, v-y, 255, handle_layer->blend_mode);
break; break;
case ACTION_SWAP: case ACTION_SWAP:
/* swap areas */ /* swap areas */
/* sprite_set_mask (sprite, mask_backup); */ /* sprite_set_mask(sprite, mask_backup); */
/* image_swap (dst, src, u-x, v-y); */ /* image_swap(dst, src, u-x, v-y); */
break; break;
} }
/* restore the mask */ /* restore the mask */
sprite_set_mask (sprite, mask_backup); sprite_set_mask(sprite, mask_backup);
/* insert the undo operation */ /* insert the undo operation */
if (undo_is_enabled (sprite->undo)) { if (undo_is_enabled (sprite->undo)) {
undo_open (sprite->undo); undo_open(sprite->undo);
undo_dirty (sprite->undo, dirty); undo_dirty(sprite->undo, dirty);
undo_int (sprite->undo, (GfxObj *)sprite->mask, &sprite->mask->x); undo_int(sprite->undo, (GfxObj *)sprite->mask, &sprite->mask->x);
undo_int (sprite->undo, (GfxObj *)sprite->mask, &sprite->mask->y); undo_int(sprite->undo, (GfxObj *)sprite->mask, &sprite->mask->y);
undo_close (sprite->undo); undo_close(sprite->undo);
} }
/* move the mask to the new position */ /* move the mask to the new position */
mask_move (sprite->mask, u-(sprite->mask->x-x), v-(sprite->mask->y-y)); mask_move(sprite->mask, u-(sprite->mask->x-x), v-(sprite->mask->y-y));
sprite_generate_mask_boundaries (sprite); sprite_generate_mask_boundaries(sprite);
} }
/* user cancels the operation */ /* user cancels the operation */
else { else {
/* restore the "dst" image */ /* restore the "dst" image */
dirty_put (dirty); dirty_put(dirty);
/* restore the mask */ /* restore the mask */
sprite_set_mask (sprite, mask_backup); sprite_set_mask(sprite, mask_backup);
sprite_generate_mask_boundaries (sprite); sprite_generate_mask_boundaries(sprite);
} }
/* free the mask copy */ /* free the mask copy */
mask_free (mask_backup); mask_free(mask_backup);
/* free the dirty */ /* free the dirty */
dirty_free (dirty); dirty_free(dirty);
/* select the destination layer */ /* select the destination layer */
sprite_set_layer (sprite, dst_layer); sprite_set_layer(sprite, dst_layer);
/* remove the temporary created layer */ /* remove the temporary created layer */
layer_remove_layer ((Layer *)handle_layer->parent, handle_layer); layer_remove_layer((Layer *)handle_layer->parent, handle_layer);
/* refresh the sprite */ /* refresh the sprite */
update_screen_for_sprite(sprite); update_screen_for_sprite(sprite);

View File

@ -126,28 +126,28 @@ Sprite *sprite_new_copy(const Sprite *sprite)
/* copy layers */ /* copy layers */
if (sprite_copy->set) { if (sprite_copy->set) {
layer_free (sprite_copy->set); layer_free(sprite_copy->set);
sprite_copy->set = NULL; sprite_copy->set = NULL;
} }
if (sprite->set) { if (sprite->set) {
sprite_copy->set = layer_new_copy (sprite->set); sprite_copy->set = layer_new_copy(sprite->set);
if (!sprite_copy->set) { if (!sprite_copy->set) {
sprite_free (sprite_copy); sprite_free(sprite_copy);
return NULL; return NULL;
} }
/* setup the layer set */ /* setup the layer set */
layer_set_parent (sprite_copy->set, (GfxObj *)sprite_copy); layer_set_parent(sprite_copy->set, (GfxObj *)sprite_copy);
} }
/* selected layer */ /* selected layer */
if (sprite->layer) { if (sprite->layer) {
selected_layer = sprite_layer2index (sprite, sprite->layer); selected_layer = sprite_layer2index(sprite, sprite->layer);
sprite_copy->layer = sprite_index2layer (sprite_copy, selected_layer); sprite_copy->layer = sprite_index2layer(sprite_copy, selected_layer);
} }
sprite_generate_mask_boundaries (sprite_copy); sprite_generate_mask_boundaries(sprite_copy);
return sprite_copy; return sprite_copy;
} }

View File

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

View File

@ -1055,14 +1055,6 @@ static int bind_ClearMask(lua_State *L)
return 0; 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) static int bind_load_msk_file(lua_State *L)
{ {
Mask *return_value; Mask *return_value;
@ -3256,7 +3248,6 @@ const luaL_reg bindings_routines[] = {
{ "GetImage2", bind_GetImage2 }, { "GetImage2", bind_GetImage2 },
{ "LoadPalette", bind_LoadPalette }, { "LoadPalette", bind_LoadPalette },
{ "ClearMask", bind_ClearMask }, { "ClearMask", bind_ClearMask },
{ "NewLayerFromMask", bind_NewLayerFromMask },
{ "load_msk_file", bind_load_msk_file }, { "load_msk_file", bind_load_msk_file },
{ "save_msk_file", bind_save_msk_file }, { "save_msk_file", bind_save_msk_file },
{ "sprite_quantize", bind_sprite_quantize }, { "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; Sprite *sprite;
Image *dest; Image *dest;
@ -138,7 +138,7 @@ void cut_to_clipboard(void)
if (!current_sprite) if (!current_sprite)
return; return;
if (!low_copy ()) if (!low_copy())
console_printf ("Can't copying an image portion from the current layer\n"); console_printf ("Can't copying an image portion from the current layer\n");
else { else {
ClearMask (); ClearMask ();
@ -164,7 +164,9 @@ void paste_from_clipboard(void)
int xout[4], yout[4]; int xout[4], yout[4];
bool paste; bool paste;
if (!current_sprite || current_sprite == clipboard || !clipboard->layer || if (!current_sprite ||
current_sprite == clipboard ||
!clipboard->layer ||
!is_interactive()) !is_interactive())
return; return;
@ -636,13 +638,18 @@ static int low_copy(void)
Sprite *sprite; Sprite *sprite;
Layer *layer; Layer *layer;
layer = NewLayerFromMask();
if (!layer)
return FALSE;
sprite = sprite_new(current_sprite->imgtype, sprite = sprite_new(current_sprite->imgtype,
current_sprite->w, current_sprite->w,
current_sprite->h); 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); layer_add_layer(sprite->set, layer);
sprite_set_layer(sprite, layer); sprite_set_layer(sprite, layer);
sprite_set_frame(sprite, current_sprite->frame); 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 /* returns a new layer created from the current mask in the current
sprite, the layer isn't added to the sprite */ 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; unsigned char *address;
int x, y, u, v, getx, gety; 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; Layer *layer;
Cel *cel; Cel *cel;
div_t d; div_t d;
if (!sprite || !sprite->mask || !sprite->mask->bitmap || !src) if (!src_sprite || !src_sprite->mask || !src_sprite->mask->bitmap || !src)
return NULL; 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) if (!dst)
return NULL; return NULL;
@ -205,35 +206,35 @@ Layer *NewLayerFromMask(void)
image_clear(dst, 0); image_clear(dst, 0);
/* copy the masked zones */ /* 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); 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))) { if ((*address & (1<<d.rem))) {
getx = u+sprite->mask->x-x; getx = u+src_sprite->mask->x-x;
gety = v+sprite->mask->y-y; gety = v+src_sprite->mask->y-y;
if ((getx >= 0) && (getx < src->w) && if ((getx >= 0) && (getx < src->w) &&
(gety >= 0) && (gety < src->h)) (gety >= 0) && (gety < src->h))
dst->method->putpixel (dst, u, v, dst->method->putpixel(dst, u, v,
src->method->getpixel (src, getx, gety)); src->method->getpixel(src, getx, gety));
} }
_image_bitmap_next_bit (d, address); _image_bitmap_next_bit(d, address);
} }
} }
layer = layer_new(sprite); layer = layer_new(dst_sprite);
if (!layer) { if (!layer) {
image_free (dst); image_free(dst);
return NULL; return NULL;
} }
layer_set_blend_mode(layer, BLEND_MODE_NORMAL); layer_set_blend_mode(layer, BLEND_MODE_NORMAL);
cel = cel_new(sprite->frame, stock_add_image(sprite->stock, dst)); cel = cel_new(dst_sprite->frame, stock_add_image(dst_sprite->stock, dst));
cel_set_position(cel, sprite->mask->x, sprite->mask->y); cel_set_position(cel, dst_sprite->mask->x, dst_sprite->mask->y);
layer_add_cel(layer, cel); 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 LoadPalette(const char *filename);
void ClearMask(void); 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); struct Image *GetLayerImage(struct Layer *layer, int *x, int *y, int frame);