diff --git a/src/app.cpp b/src/app.cpp index 4d5710771..ca608e782 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -340,7 +340,7 @@ void app_refresh_screen(const Sprite* sprite) assert(screen != NULL); if (sprite) - set_current_palette(sprite_get_palette(sprite, sprite->frame), false); + set_current_palette(sprite->getCurrentPalette(), false); else set_current_palette(NULL, false); @@ -360,7 +360,7 @@ void app_realloc_sprite_list() for (SpriteList::const_iterator it = list.begin(); it != list.end(); ++it) { Sprite* sprite = *it; - tabs_set_text_for_tab(tabsbar, get_filename(sprite->filename), sprite); + tabs_set_text_for_tab(tabsbar, get_filename(sprite->getFilename()), sprite); } } @@ -425,7 +425,7 @@ int app_get_current_image_type() Sprite* sprite = context->get_current_sprite(); if (sprite != NULL) - return sprite->imgtype; + return sprite->getImgType(); else if (screen != NULL && bitmap_color_depth(screen) == 8) return IMAGE_INDEXED; else @@ -450,10 +450,10 @@ int app_get_fg_color(Sprite *sprite) color_t c = colorbar_get_fg_color(colorbar); assert(sprite != NULL); - if (sprite->layer != NULL) - return get_color_for_layer(sprite->layer, c); + if (sprite->getCurrentLayer() != NULL) + return get_color_for_layer(sprite->getCurrentLayer(), c); else - return get_color_for_image(sprite->imgtype, c); + return get_color_for_image(sprite->getImgType(), c); } int app_get_bg_color(Sprite *sprite) @@ -461,10 +461,10 @@ int app_get_bg_color(Sprite *sprite) color_t c = colorbar_get_bg_color(colorbar); assert(sprite != NULL); - if (sprite->layer != NULL) - return get_color_for_layer(sprite->layer, c); + if (sprite->getCurrentLayer() != NULL) + return get_color_for_layer(sprite->getCurrentLayer(), c); else - return get_color_for_image(sprite->imgtype, c); + return get_color_for_image(sprite->getImgType(), c); } int app_get_color_to_clear_layer(Layer *layer) diff --git a/src/commands/cmd_background_from_layer.cpp b/src/commands/cmd_background_from_layer.cpp index 93d7db36f..6ba75b506 100644 --- a/src/commands/cmd_background_from_layer.cpp +++ b/src/commands/cmd_background_from_layer.cpp @@ -49,11 +49,11 @@ bool BackgroundFromLayerCommand::enabled(Context* context) const CurrentSpriteReader sprite(context); return sprite != NULL && - sprite->layer != NULL && - sprite_get_background_layer(sprite) == NULL && - sprite->layer->is_image() && - sprite->layer->is_readable() && - sprite->layer->is_writable(); + sprite->getCurrentLayer() != NULL && + sprite->getBackgroundLayer() == NULL && + sprite->getCurrentLayer()->is_image() && + sprite->getCurrentLayer()->is_readable() && + sprite->getCurrentLayer()->is_writable(); } void BackgroundFromLayerCommand::execute(Context* context) @@ -63,11 +63,11 @@ void BackgroundFromLayerCommand::execute(Context* context) // each frame of the layer to be converted as `Background' must be // cleared using the selected background color in the color-bar int bgcolor = context->getBgColor(); - bgcolor = fixup_color_for_background(sprite->imgtype, bgcolor); + bgcolor = fixup_color_for_background(sprite->getImgType(), bgcolor); { Undoable undoable(sprite, "Background from Layer"); - undoable.background_from_layer(static_cast(sprite->layer), bgcolor); + undoable.background_from_layer(static_cast(sprite->getCurrentLayer()), bgcolor); undoable.commit(); } update_screen_for_sprite(sprite); diff --git a/src/commands/cmd_canvas_size.cpp b/src/commands/cmd_canvas_size.cpp index d8c9f0a36..12b48ab83 100644 --- a/src/commands/cmd_canvas_size.cpp +++ b/src/commands/cmd_canvas_size.cpp @@ -100,8 +100,8 @@ void CanvasSizeCommand::execute(Context* context) int x1 = -m_left; int y1 = -m_top; - int x2 = sprite->w + m_right; - int y2 = sprite->h + m_bottom; + int x2 = sprite->getWidth() + m_right; + int y2 = sprite->getHeight() + m_bottom; if (x2 <= x1) x2 = x1+1; if (y2 <= y1) y2 = y1+1; @@ -112,7 +112,7 @@ void CanvasSizeCommand::execute(Context* context) undoable.crop_sprite(x1, y1, x2-x1, y2-y1, bgcolor); undoable.commit(); } - sprite_generate_mask_boundaries(sprite); + sprite->generateMaskBoundaries(); update_screen_for_sprite(sprite); } diff --git a/src/commands/cmd_cel_properties.cpp b/src/commands/cmd_cel_properties.cpp index 1546a8dfd..831caf106 100644 --- a/src/commands/cmd_cel_properties.cpp +++ b/src/commands/cmd_cel_properties.cpp @@ -57,24 +57,22 @@ bool CelPropertiesCommand::enabled(Context* context) const CurrentSpriteReader sprite(context); return sprite && - sprite->layer && - sprite->layer->is_image(); + sprite->getCurrentLayer() && + sprite->getCurrentLayer()->is_image(); } void CelPropertiesCommand::execute(Context* context) { JWidget label_frame, label_pos, label_size; JWidget slider_opacity, button_ok; - Layer* layer; - Cel* cel; char buf[1024]; int memsize; const CurrentSpriteReader sprite(context); - layer = sprite->layer; + const Layer* layer = sprite->getCurrentLayer(); - /* get current cel (can be NULL) */ - cel = static_cast(layer)->get_cel(sprite->frame); + // Get current cel (can be NULL) + const Cel* cel = static_cast(layer)->get_cel(sprite->getCurrentFrame()); FramePtr window(load_widget("celprop.jid", "cel_properties")); get_widgets(window, @@ -93,7 +91,7 @@ void CelPropertiesCommand::execute(Context* context) button_ok->setEnabled(false); } - usprintf(buf, "%d/%d", sprite->frame+1, sprite->frames); + usprintf(buf, "%d/%d", sprite->getCurrentFrame()+1, sprite->getTotalFrames()); label_frame->setText(buf); if (cel != NULL) { @@ -103,13 +101,13 @@ void CelPropertiesCommand::execute(Context* context) /* dimension (and memory size) */ memsize = - image_line_size(sprite->stock->image[cel->image], - sprite->stock->image[cel->image]->w)* - sprite->stock->image[cel->image]->h; + image_line_size(sprite->getStock()->image[cel->image], + sprite->getStock()->image[cel->image]->w)* + sprite->getStock()->image[cel->image]->h; usprintf(buf, "%dx%d (", - sprite->stock->image[cel->image]->w, - sprite->stock->image[cel->image]->h); + sprite->getStock()->image[cel->image]->w, + sprite->getStock()->image[cel->image]->h); get_pretty_memsize(memsize, buf+ustrsize(buf), sizeof(buf)-ustrsize(buf)); @@ -135,18 +133,22 @@ void CelPropertiesCommand::execute(Context* context) window->open_window_fg(); if (window->get_killer() == button_ok) { + SpriteWriter sprite_writer(sprite); + Layer* layer_writer = sprite_writer->getCurrentLayer(); + Cel* cel_writer = static_cast(layer_writer)->get_cel(sprite->getCurrentFrame()); + int new_opacity = jslider_get_value(slider_opacity); /* the opacity was changed? */ - if (cel != NULL && - cel->opacity != new_opacity) { - if (undo_is_enabled(sprite->undo)) { - undo_set_label(sprite->undo, "Cel Opacity Change"); - undo_int(sprite->undo, (GfxObj *)cel, &cel->opacity); + if (cel_writer != NULL && + cel_writer->opacity != new_opacity) { + if (undo_is_enabled(sprite_writer->getUndo())) { + undo_set_label(sprite_writer->getUndo(), "Cel Opacity Change"); + undo_int(sprite_writer->getUndo(), (GfxObj *)cel_writer, &cel_writer->opacity); } /* change cel opacity */ - cel_set_opacity(cel, new_opacity); + cel_set_opacity(cel_writer, new_opacity); update_screen_for_sprite(sprite); } diff --git a/src/commands/cmd_change_image_type.cpp b/src/commands/cmd_change_image_type.cpp index cbe85d0c2..06cb6678c 100644 --- a/src/commands/cmd_change_image_type.cpp +++ b/src/commands/cmd_change_image_type.cpp @@ -74,7 +74,7 @@ bool ChangeImageTypeCommand::enabled(Context* context) const CurrentSpriteReader sprite(context); if (sprite != NULL && - sprite->imgtype == IMAGE_INDEXED && + sprite->getImgType() == IMAGE_INDEXED && m_imgtype == IMAGE_INDEXED && m_dithering == DITHERING_ORDERED) return false; @@ -88,14 +88,14 @@ bool ChangeImageTypeCommand::checked(Context* context) const CurrentSpriteReader sprite(context); if (sprite != NULL && - sprite->imgtype == IMAGE_INDEXED && + sprite->getImgType() == IMAGE_INDEXED && m_imgtype == IMAGE_INDEXED && m_dithering == DITHERING_ORDERED) return false; return sprite != NULL && - sprite->imgtype == m_imgtype; + sprite->getImgType() == m_imgtype; } void ChangeImageTypeCommand::execute(Context* context) diff --git a/src/commands/cmd_clear.cpp b/src/commands/cmd_clear.cpp index 853b2277d..0178869fc 100644 --- a/src/commands/cmd_clear.cpp +++ b/src/commands/cmd_clear.cpp @@ -55,25 +55,25 @@ bool ClearCommand::enabled(Context* context) const CurrentSpriteReader sprite(context); return sprite != NULL && - sprite->layer != NULL && - sprite->layer->is_image() && - sprite->layer->is_readable() && - sprite->layer->is_writable(); + sprite->getCurrentLayer() != NULL && + sprite->getCurrentLayer()->is_image() && + sprite->getCurrentLayer()->is_readable() && + sprite->getCurrentLayer()->is_writable(); } void ClearCommand::execute(Context* context) { CurrentSpriteWriter sprite(context); - bool empty_mask = sprite->mask->is_empty(); + bool empty_mask = sprite->getMask()->is_empty(); { Undoable undoable(sprite, "Clear"); - undoable.clear_mask(app_get_color_to_clear_layer(sprite->layer)); + undoable.clear_mask(app_get_color_to_clear_layer(sprite->getCurrentLayer())); if (!empty_mask) undoable.deselect_mask(); undoable.commit(); } if (!empty_mask) - sprite_generate_mask_boundaries(sprite); + sprite->generateMaskBoundaries(); update_screen_for_sprite(sprite); } diff --git a/src/commands/cmd_close_file.cpp b/src/commands/cmd_close_file.cpp index c0b34e9d1..a09b5d394 100644 --- a/src/commands/cmd_close_file.cpp +++ b/src/commands/cmd_close_file.cpp @@ -122,11 +122,11 @@ try_again:; CurrentSpriteReader sprite(context); // see if the sprite has changes - while (sprite_is_modified(sprite)) { + while (sprite->isModified()) { // ask what want to do the user with the changes in the sprite int ret = jalert("%s<<%s<<%s||%s||%s||%s", _("Warning"), _("Saving changes in:"), - get_filename(sprite->filename), + get_filename(sprite->getFilename()), _("&Save"), _("&Discard"), _("&Cancel")); if (ret == 1) { @@ -159,7 +159,7 @@ try_again:; CurrentSpriteWriter sprite(context); app_get_statusbar() ->setStatusText(0, "Sprite '%s' closed.", - get_filename(sprite->filename)); + get_filename(sprite->getFilename())); sprite.destroy(); } return true; diff --git a/src/commands/cmd_configure_tools.cpp b/src/commands/cmd_configure_tools.cpp index e4cc1d56f..42de73990 100644 --- a/src/commands/cmd_configure_tools.cpp +++ b/src/commands/cmd_configure_tools.cpp @@ -453,9 +453,9 @@ static bool set_grid_button_select_hook(JWidget widget, void *data) // TODO use the same context as in ConfigureTools::execute const CurrentSpriteReader sprite(UIContext::instance()); - if (sprite && sprite->mask && sprite->mask->bitmap) { - Rect bounds(sprite->mask->x, sprite->mask->y, - sprite->mask->w, sprite->mask->h); + if (sprite && sprite->getMask() && sprite->getMask()->bitmap) { + Rect bounds(sprite->getMask()->x, sprite->getMask()->y, + sprite->getMask()->w, sprite->getMask()->h); UIContext::instance()->getSettings()->setGridBounds(bounds); diff --git a/src/commands/cmd_copy.cpp b/src/commands/cmd_copy.cpp index 13107671c..671e96866 100644 --- a/src/commands/cmd_copy.cpp +++ b/src/commands/cmd_copy.cpp @@ -51,12 +51,12 @@ bool CopyCommand::enabled(Context* context) const CurrentSpriteReader sprite(context); if ((sprite) && - (sprite->layer) && - (sprite->layer->is_readable()) && - (sprite->layer->is_writable()) && - (sprite->mask) && - (sprite->mask->bitmap)) - return GetImage(sprite) ? true: false; + (sprite->getCurrentLayer()) && + (sprite->getCurrentLayer()->is_readable()) && + (sprite->getCurrentLayer()->is_writable()) && + (sprite->getMask()) && + (sprite->getMask()->bitmap)) + return sprite->getCurrentImage() ? true: false; else return false; } diff --git a/src/commands/cmd_crop.cpp b/src/commands/cmd_crop.cpp index a32eabf8c..4ccbf8257 100644 --- a/src/commands/cmd_crop.cpp +++ b/src/commands/cmd_crop.cpp @@ -57,8 +57,8 @@ bool CropSpriteCommand::enabled(Context* context) const CurrentSpriteReader sprite(context); return sprite != NULL && - sprite->mask != NULL && - sprite->mask->bitmap != NULL; + sprite->getMask() != NULL && + sprite->getMask()->bitmap != NULL; } void CropSpriteCommand::execute(Context* context) @@ -66,16 +66,16 @@ void CropSpriteCommand::execute(Context* context) CurrentSpriteWriter sprite(context); { Undoable undoable(sprite, "Sprite Crop"); - int bgcolor = get_color_for_image(sprite->imgtype, + int bgcolor = get_color_for_image(sprite->getImgType(), colorbar_get_bg_color(app_get_colorbar())); - undoable.crop_sprite(sprite->mask->x, - sprite->mask->y, - sprite->mask->w, - sprite->mask->h, + undoable.crop_sprite(sprite->getMask()->x, + sprite->getMask()->y, + sprite->getMask()->w, + sprite->getMask()->h, bgcolor); undoable.commit(); } - sprite_generate_mask_boundaries(sprite); + sprite->generateMaskBoundaries(); update_screen_for_sprite(sprite); } @@ -114,7 +114,7 @@ void AutocropSpriteCommand::execute(Context* context) undoable.autocrop_sprite(colorbar_get_bg_color(app_get_colorbar())); undoable.commit(); } - sprite_generate_mask_boundaries(sprite); + sprite->generateMaskBoundaries(); update_screen_for_sprite(sprite); } diff --git a/src/commands/cmd_cut.cpp b/src/commands/cmd_cut.cpp index bede25304..6ffe8f5d8 100644 --- a/src/commands/cmd_cut.cpp +++ b/src/commands/cmd_cut.cpp @@ -50,12 +50,12 @@ bool CutCommand::enabled(Context* context) { const CurrentSpriteReader sprite(context); if ((sprite) && - (sprite->layer) && - (sprite->layer->is_readable()) && - (sprite->layer->is_writable()) && - (sprite->mask) && - (sprite->mask->bitmap)) - return GetImage(sprite) ? true: false; + (sprite->getCurrentLayer()) && + (sprite->getCurrentLayer()->is_readable()) && + (sprite->getCurrentLayer()->is_writable()) && + (sprite->getMask()) && + (sprite->getMask()->bitmap)) + return sprite->getCurrentImage() ? true: false; else return false; } diff --git a/src/commands/cmd_deselect_mask.cpp b/src/commands/cmd_deselect_mask.cpp index 62bf959b0..524f2def3 100644 --- a/src/commands/cmd_deselect_mask.cpp +++ b/src/commands/cmd_deselect_mask.cpp @@ -49,7 +49,7 @@ DeselectMaskCommand::DeselectMaskCommand() bool DeselectMaskCommand::enabled(Context* context) { const CurrentSpriteReader sprite(context); - return sprite && !sprite->mask->is_empty(); + return sprite && !sprite->getMask()->is_empty(); } void DeselectMaskCommand::execute(Context* context) @@ -60,7 +60,7 @@ void DeselectMaskCommand::execute(Context* context) undoable.deselect_mask(); undoable.commit(); } - sprite_generate_mask_boundaries(sprite); + sprite->generateMaskBoundaries(); update_screen_for_sprite(sprite); } diff --git a/src/commands/cmd_duplicate_layer.cpp b/src/commands/cmd_duplicate_layer.cpp index a555b08fb..74c1d35dc 100644 --- a/src/commands/cmd_duplicate_layer.cpp +++ b/src/commands/cmd_duplicate_layer.cpp @@ -55,7 +55,7 @@ DuplicateLayerCommand::DuplicateLayerCommand() bool DuplicateLayerCommand::enabled(Context* context) { const CurrentSpriteReader sprite(context); - return sprite && sprite->layer; + return sprite && sprite->getCurrentLayer(); } void DuplicateLayerCommand::execute(Context* context) @@ -68,15 +68,15 @@ void DuplicateLayerCommand::execute(Context* context) static Layer* duplicate_layer(Sprite* sprite) { /* open undo */ - if (undo_is_enabled(sprite->undo)) { - undo_set_label(sprite->undo, "Layer Duplication"); - undo_open(sprite->undo); + if (undo_is_enabled(sprite->getUndo())) { + undo_set_label(sprite->getUndo(), "Layer Duplication"); + undo_open(sprite->getUndo()); } - Layer* layer_copy = sprite->layer->duplicate_for(sprite); + Layer* layer_copy = sprite->getCurrentLayer()->duplicate_for(sprite); if (!layer_copy) { - if (undo_is_enabled(sprite->undo)) - undo_close(sprite->undo); + if (undo_is_enabled(sprite->getUndo())) + undo_close(sprite->getUndo()); Console console; console.printf("Not enough memory"); @@ -88,19 +88,19 @@ static Layer* duplicate_layer(Sprite* sprite) layer_copy->set_name(layer_copy->get_name() + " " + _("Copy")); /* add the new layer in the sprite */ - if (undo_is_enabled(sprite->undo)) - undo_add_layer(sprite->undo, sprite->layer->get_parent(), layer_copy); + if (undo_is_enabled(sprite->getUndo())) + undo_add_layer(sprite->getUndo(), sprite->getCurrentLayer()->get_parent(), layer_copy); - sprite->layer->get_parent()->add_layer(layer_copy); + sprite->getCurrentLayer()->get_parent()->add_layer(layer_copy); - if (undo_is_enabled(sprite->undo)) { - undo_move_layer(sprite->undo, layer_copy); - undo_set_layer(sprite->undo, sprite); - undo_close(sprite->undo); + if (undo_is_enabled(sprite->getUndo())) { + undo_move_layer(sprite->getUndo(), layer_copy); + undo_set_layer(sprite->getUndo(), sprite); + undo_close(sprite->getUndo()); } - sprite->layer->get_parent()->move_layer(layer_copy, sprite->layer); - sprite_set_layer(sprite, layer_copy); + sprite->getCurrentLayer()->get_parent()->move_layer(layer_copy, sprite->getCurrentLayer()); + sprite->setCurrentLayer(layer_copy); return layer_copy; } diff --git a/src/commands/cmd_duplicate_sprite.cpp b/src/commands/cmd_duplicate_sprite.cpp index 0f89bce99..7bebc62af 100644 --- a/src/commands/cmd_duplicate_sprite.cpp +++ b/src/commands/cmd_duplicate_sprite.cpp @@ -71,9 +71,9 @@ void DuplicateSpriteCommand::execute(Context* context) dst_name = jwidget_find_name(window, "dst_name"); flatten = jwidget_find_name(window, "flatten"); - src_name->setText(get_filename(sprite->filename)); + src_name->setText(get_filename(sprite->getFilename())); - sprintf(buf, "%s %s", sprite->filename, _("Copy")); + sprintf(buf, "%s %s", sprite->getFilename(), _("Copy")); dst_name->setText(buf); if (get_config_bool("DuplicateSprite", "Flatten", false)) @@ -89,12 +89,12 @@ void DuplicateSpriteCommand::execute(Context* context) // make a copy of the current sprite Sprite *sprite_copy; if (jwidget_is_selected(flatten)) - sprite_copy = sprite_new_flatten_copy(sprite); + sprite_copy = Sprite::createFlattenCopy(*sprite); else - sprite_copy = sprite_new_copy(sprite); + sprite_copy = new Sprite(*sprite); if (sprite_copy != NULL) { - sprite_set_filename(sprite_copy, dst_name->getText()); + sprite_copy->setFilename(dst_name->getText()); context->add_sprite(sprite_copy); set_sprite_in_more_reliable_editor(sprite_copy); diff --git a/src/commands/cmd_exit.cpp b/src/commands/cmd_exit.cpp index 7a81bf254..dec840190 100644 --- a/src/commands/cmd_exit.cpp +++ b/src/commands/cmd_exit.cpp @@ -51,7 +51,7 @@ void ExitCommand::execute(Context* context) while (sprite) { // check if this sprite is modified - if (sprite_is_modified(sprite)) { + if (sprite->isModified()) { if (jalert(_("Warning<screen_to_editor(jmouse_x(0), jmouse_y(0), &x, &y); // get the color from the image - color_t color = color_from_image(sprite->imgtype, - sprite_getpixel(sprite, x, y)); + color_t color = color_from_image(sprite->getImgType(), + sprite->getPixel(x, y)); if (color_type(color) != COLOR_TYPE_MASK) { // TODO replace the color in the "context", not directly from the color-bar diff --git a/src/commands/cmd_flatten_layers.cpp b/src/commands/cmd_flatten_layers.cpp index 140834f4d..47deafdc1 100644 --- a/src/commands/cmd_flatten_layers.cpp +++ b/src/commands/cmd_flatten_layers.cpp @@ -56,7 +56,7 @@ bool FlattenLayersCommand::enabled(Context* context) void FlattenLayersCommand::execute(Context* context) { CurrentSpriteWriter sprite(context); - int bgcolor = get_color_for_image(sprite->imgtype, + int bgcolor = get_color_for_image(sprite->getImgType(), colorbar_get_bg_color(app_get_colorbar())); { Undoable undoable(sprite, "Flatten Layers"); diff --git a/src/commands/cmd_flip.cpp b/src/commands/cmd_flip.cpp index 0ccd9f800..949ab7196 100644 --- a/src/commands/cmd_flip.cpp +++ b/src/commands/cmd_flip.cpp @@ -98,11 +98,11 @@ void FlipCommand::execute(Context* context) int x1, y1, x2, y2; int x, y; - image = GetImage2(sprite, &x, &y, NULL); + image = sprite->getCurrentImage(&x, &y); if (!image) return; // mask is empty? - if (sprite->mask->is_empty()) { + if (sprite->getMask()->is_empty()) { // so we flip the entire image x1 = 0; y1 = 0; @@ -111,10 +111,10 @@ void FlipCommand::execute(Context* context) } else { // apply the cel offset - x1 = sprite->mask->x - x; - y1 = sprite->mask->y - y; - x2 = sprite->mask->x + sprite->mask->w - 1 - x; - y2 = sprite->mask->y + sprite->mask->h - 1 - y; + x1 = sprite->getMask()->x - x; + y1 = sprite->getMask()->y - y; + x2 = sprite->getMask()->x + sprite->getMask()->w - 1 - x; + y2 = sprite->getMask()->y + sprite->getMask()->h - 1 - y; // clip x1 = MID(0, x1, image->w-1); @@ -129,16 +129,16 @@ void FlipCommand::execute(Context* context) else { // get all sprite cels CelList cels; - sprite_get_cels(sprite, cels); + sprite->getCels(cels); // for each cel... for (CelIterator it = cels.begin(); it != cels.end(); ++it) { Cel* cel = *it; - Image* image = stock_get_image(sprite->stock, cel->image); + Image* image = stock_get_image(sprite->getStock(), cel->image); undoable.set_cel_position(cel, - m_flip_horizontal ? sprite->w - image->w - cel->x: cel->x, - m_flip_vertical ? sprite->h - image->h - cel->y: cel->y); + m_flip_horizontal ? sprite->getWidth() - image->w - cel->x: cel->x, + m_flip_vertical ? sprite->getHeight() - image->h - cel->y: cel->y); undoable.flip_image(image, 0, 0, image->w-1, image->h-1, m_flip_horizontal, m_flip_vertical); diff --git a/src/commands/cmd_frame_properties.cpp b/src/commands/cmd_frame_properties.cpp index 17ff5e18c..1bc7a5806 100644 --- a/src/commands/cmd_frame_properties.cpp +++ b/src/commands/cmd_frame_properties.cpp @@ -60,7 +60,7 @@ bool FramePropertiesCommand::enabled(Context* context) void FramePropertiesCommand::execute(Context* context) { const CurrentSpriteReader sprite(context); - dialogs_frame_length(sprite, sprite->frame); + dialogs_frame_length(sprite, sprite->getCurrentFrame()); } /* if sprite_frame < 0, set the frame length of all frames */ @@ -81,7 +81,7 @@ void dialogs_frame_length(const SpriteReader& sprite, int sprite_frame) sprintf(buf, "%d", sprite_frame+1); frame->setText(buf); - frlen->setTextf("%d", sprite_get_frlen(sprite, sprite->frame)); + frlen->setTextf("%d", sprite->getFrameDuration(sprite->getCurrentFrame())); window->open_window_fg(); if (window->get_killer() == ok) { diff --git a/src/commands/cmd_goto_frame.cpp b/src/commands/cmd_goto_frame.cpp index c6449ba2a..638d421c7 100644 --- a/src/commands/cmd_goto_frame.cpp +++ b/src/commands/cmd_goto_frame.cpp @@ -55,7 +55,7 @@ bool GotoFirstFrameCommand::enabled(Context* context) void GotoFirstFrameCommand::execute(Context* context) { CurrentSpriteWriter sprite(context); - sprite->frame = 0; + sprite->setCurrentFrame(0); update_screen_for_sprite(sprite); current_editor->editor_update_statusbar_for_standby(); @@ -93,11 +93,12 @@ bool GotoPreviousFrameCommand::enabled(Context* context) void GotoPreviousFrameCommand::execute(Context* context) { CurrentSpriteWriter sprite(context); + int frame = sprite->getCurrentFrame(); - if (sprite->frame > 0) - sprite->frame--; + if (frame > 0) + sprite->setCurrentFrame(frame-1); else - sprite->frame = sprite->frames-1; + sprite->setCurrentFrame(sprite->getTotalFrames()-1); update_screen_for_sprite(sprite); current_editor->editor_update_statusbar_for_standby(); @@ -135,11 +136,12 @@ bool GotoNextFrameCommand::enabled(Context* context) void GotoNextFrameCommand::execute(Context* context) { CurrentSpriteWriter sprite(context); + int frame = sprite->getCurrentFrame(); - if (sprite->frame < sprite->frames-1) - sprite->frame++; + if (frame < sprite->getTotalFrames()-1) + sprite->setCurrentFrame(frame+1); else - sprite->frame = 0; + sprite->setCurrentFrame(0); update_screen_for_sprite(sprite); current_editor->editor_update_statusbar_for_standby(); @@ -177,7 +179,7 @@ bool GotoLastFrameCommand::enabled(Context* context) void GotoLastFrameCommand::execute(Context* context) { CurrentSpriteWriter sprite(context); - sprite->frame = sprite->frames-1; + sprite->setCurrentFrame(sprite->getTotalFrames()-1); update_screen_for_sprite(sprite); current_editor->editor_update_statusbar_for_standby(); diff --git a/src/commands/cmd_goto_layer.cpp b/src/commands/cmd_goto_layer.cpp index 410756fde..25bcd0c39 100644 --- a/src/commands/cmd_goto_layer.cpp +++ b/src/commands/cmd_goto_layer.cpp @@ -59,21 +59,21 @@ bool GotoPreviousLayerCommand::enabled(Context* context) void GotoPreviousLayerCommand::execute(Context* context) { CurrentSpriteWriter sprite(context); - int i = sprite_layer2index(sprite, sprite->layer); + int i = sprite->layerToIndex(sprite->getCurrentLayer()); if (i > 0) i--; else - i = sprite_count_layers(sprite)-1; + i = sprite->countLayers()-1; - sprite->layer = sprite_index2layer(sprite, i); + sprite->setCurrentLayer(sprite->indexToLayer(i)); update_screen_for_sprite(sprite); current_editor->editor_update_statusbar_for_standby(); app_get_statusbar() ->showTip(1000, _("Layer `%s' selected"), - sprite->layer->get_name().c_str()); + sprite->getCurrentLayer()->get_name().c_str()); } ////////////////////////////////////////////////////////////////////// @@ -107,21 +107,21 @@ bool GotoNextLayerCommand::enabled(Context* context) void GotoNextLayerCommand::execute(Context* context) { CurrentSpriteWriter sprite(context); - int i = sprite_layer2index(sprite, sprite->layer); + int i = sprite->layerToIndex(sprite->getCurrentLayer()); - if (i < sprite_count_layers(sprite)-1) + if (i < sprite->countLayers()-1) i++; else i = 0; - sprite->layer = sprite_index2layer(sprite, i); + sprite->setCurrentLayer(sprite->indexToLayer(i)); update_screen_for_sprite(sprite); current_editor->editor_update_statusbar_for_standby(); app_get_statusbar() ->showTip(1000, _("Layer `%s' selected"), - sprite->layer->get_name().c_str()); + sprite->getCurrentLayer()->get_name().c_str()); } ////////////////////////////////////////////////////////////////////// diff --git a/src/commands/cmd_invert_mask.cpp b/src/commands/cmd_invert_mask.cpp index 90b36c330..0537c19d0 100644 --- a/src/commands/cmd_invert_mask.cpp +++ b/src/commands/cmd_invert_mask.cpp @@ -59,7 +59,7 @@ void InvertMaskCommand::execute(Context* context) bool has_mask = false; { const CurrentSpriteReader sprite(context); - if (sprite->mask->bitmap) + if (sprite->getMask()->bitmap) has_mask = true; } @@ -75,39 +75,39 @@ void InvertMaskCommand::execute(Context* context) CurrentSpriteWriter sprite(context); /* undo */ - if (undo_is_enabled(sprite->undo)) { - undo_set_label(sprite->undo, "Mask Invert"); - undo_set_mask(sprite->undo, sprite); + if (undo_is_enabled(sprite->getUndo())) { + undo_set_label(sprite->getUndo(), "Mask Invert"); + undo_set_mask(sprite->getUndo(), sprite); } /* create a new mask */ Mask* mask = mask_new(); /* select all the sprite area */ - mask_replace(mask, 0, 0, sprite->w, sprite->h); + mask_replace(mask, 0, 0, sprite->getWidth(), sprite->getHeight()); /* remove in the new mask the current sprite marked region */ image_rectfill(mask->bitmap, - sprite->mask->x, sprite->mask->y, - sprite->mask->x + sprite->mask->w-1, - sprite->mask->y + sprite->mask->h-1, 0); + sprite->getMask()->x, sprite->getMask()->y, + sprite->getMask()->x + sprite->getMask()->w-1, + sprite->getMask()->y + sprite->getMask()->h-1, 0); /* invert the current mask in the sprite */ - mask_invert(sprite->mask); - if (sprite->mask->bitmap) { + mask_invert(sprite->getMask()); + if (sprite->getMask()->bitmap) { /* copy the inverted region in the new mask */ - image_copy(mask->bitmap, sprite->mask->bitmap, - sprite->mask->x, sprite->mask->y); + image_copy(mask->bitmap, sprite->getMask()->bitmap, + sprite->getMask()->x, sprite->getMask()->y); } /* we need only need the area inside the sprite */ - mask_intersect(mask, 0, 0, sprite->w, sprite->h); + mask_intersect(mask, 0, 0, sprite->getWidth(), sprite->getHeight()); /* set the new mask */ - sprite_set_mask(sprite, mask); + sprite->setMask(mask); mask_free(mask); - sprite_generate_mask_boundaries(sprite); + sprite->generateMaskBoundaries(); update_screen_for_sprite(sprite); } } diff --git a/src/commands/cmd_layer_from_background.cpp b/src/commands/cmd_layer_from_background.cpp index 6d7046cd3..c34701c4e 100644 --- a/src/commands/cmd_layer_from_background.cpp +++ b/src/commands/cmd_layer_from_background.cpp @@ -52,11 +52,11 @@ bool LayerFromBackgroundCommand::enabled(Context* context) const CurrentSpriteReader sprite(context); return sprite && - sprite->layer && - sprite->layer->is_image() && - sprite->layer->is_readable() && - sprite->layer->is_writable() && - sprite->layer->is_background(); + sprite->getCurrentLayer() && + sprite->getCurrentLayer()->is_image() && + sprite->getCurrentLayer()->is_readable() && + sprite->getCurrentLayer()->is_writable() && + sprite->getCurrentLayer()->is_background(); } void LayerFromBackgroundCommand::execute(Context* context) diff --git a/src/commands/cmd_layer_properties.cpp b/src/commands/cmd_layer_properties.cpp index e668852fb..e1958c647 100644 --- a/src/commands/cmd_layer_properties.cpp +++ b/src/commands/cmd_layer_properties.cpp @@ -54,7 +54,7 @@ bool LayerPropertiesCommand::enabled(Context* context) const CurrentSpriteReader sprite(context); return sprite != NULL && - sprite->layer != NULL; + sprite->getCurrentLayer() != NULL; } void LayerPropertiesCommand::execute(Context* context) @@ -62,8 +62,8 @@ void LayerPropertiesCommand::execute(Context* context) JWidget box1, box2, box3, label_name, entry_name; JWidget button_ok, button_cancel, label_bm, view_bm, list_bm; CurrentSpriteWriter sprite(context); - Layer* layer = sprite->layer; - bool with_blend_modes = (layer->is_image() && sprite->imgtype != IMAGE_INDEXED); + Layer* layer = sprite->getCurrentLayer(); + bool with_blend_modes = (layer->is_image() && sprite->getImgType() != IMAGE_INDEXED); FramePtr window(new Frame(false, _("Layer Properties"))); box1 = jbox_new(JI_VERTICAL); diff --git a/src/commands/cmd_load_mask.cpp b/src/commands/cmd_load_mask.cpp index 446e73f25..2fbe24020 100644 --- a/src/commands/cmd_load_mask.cpp +++ b/src/commands/cmd_load_mask.cpp @@ -84,15 +84,15 @@ void LoadMaskCommand::execute(Context* context) static_cast(m_filename.c_str())); // undo - if (undo_is_enabled(sprite->undo)) { - undo_set_label(sprite->undo, "Mask Load"); - undo_set_mask(sprite->undo, sprite); + if (undo_is_enabled(sprite->getUndo())) { + undo_set_label(sprite->getUndo(), "Mask Load"); + undo_set_mask(sprite->getUndo(), sprite); } - sprite_set_mask(sprite, mask); + sprite->setMask(mask); mask_free(mask); - sprite_generate_mask_boundaries(sprite); + sprite->generateMaskBoundaries(); update_screen_for_sprite(sprite); } diff --git a/src/commands/cmd_mask_all.cpp b/src/commands/cmd_mask_all.cpp index efcbbffbf..1e133a278 100644 --- a/src/commands/cmd_mask_all.cpp +++ b/src/commands/cmd_mask_all.cpp @@ -57,15 +57,15 @@ void MaskAllCommand::execute(Context* context) CurrentSpriteWriter sprite(context); /* undo */ - if (undo_is_enabled(sprite->undo)) { - undo_set_label(sprite->undo, "Mask All"); - undo_set_mask(sprite->undo, sprite); + if (undo_is_enabled(sprite->getUndo())) { + undo_set_label(sprite->getUndo(), "Mask All"); + undo_set_mask(sprite->getUndo(), sprite); } /* change the selection */ - mask_replace(sprite->mask, 0, 0, sprite->w, sprite->h); + mask_replace(sprite->getMask(), 0, 0, sprite->getWidth(), sprite->getHeight()); - sprite_generate_mask_boundaries(sprite); + sprite->generateMaskBoundaries(); update_screen_for_sprite(sprite); } diff --git a/src/commands/cmd_merge_down_layer.cpp b/src/commands/cmd_merge_down_layer.cpp index 994259526..dad6fefdc 100644 --- a/src/commands/cmd_merge_down_layer.cpp +++ b/src/commands/cmd_merge_down_layer.cpp @@ -58,11 +58,11 @@ bool MergeDownLayerCommand::enabled(Context* context) if (!sprite) return false; - Layer *src_layer = sprite->layer; + const Layer* src_layer = sprite->getCurrentLayer(); if (!src_layer || !src_layer->is_image()) return false; - Layer* dst_layer = sprite->layer->get_prev(); + const Layer* dst_layer = sprite->getCurrentLayer()->get_prev(); if (!dst_layer || !dst_layer->is_image()) return false; @@ -77,27 +77,27 @@ void MergeDownLayerCommand::execute(Context* context) Image *src_image, *dst_image; int frpos, index; - src_layer = sprite->layer; - dst_layer = sprite->layer->get_prev(); + src_layer = sprite->getCurrentLayer(); + dst_layer = sprite->getCurrentLayer()->get_prev(); - if (undo_is_enabled(sprite->undo)) { - undo_set_label(sprite->undo, "Merge Down Layer"); - undo_open(sprite->undo); + if (undo_is_enabled(sprite->getUndo())) { + undo_set_label(sprite->getUndo(), "Merge Down Layer"); + undo_open(sprite->getUndo()); } - for (frpos=0; frposframes; ++frpos) { + for (frpos=0; frposgetTotalFrames(); ++frpos) { /* get frames */ src_cel = static_cast(src_layer)->get_cel(frpos); dst_cel = static_cast(dst_layer)->get_cel(frpos); /* get images */ if (src_cel != NULL) - src_image = stock_get_image(sprite->stock, src_cel->image); + src_image = stock_get_image(sprite->getStock(), src_cel->image); else src_image = NULL; if (dst_cel != NULL) - dst_image = stock_get_image(sprite->stock, dst_cel->image); + dst_image = stock_get_image(sprite->getStock(), dst_cel->image); else dst_image = NULL; @@ -111,17 +111,17 @@ void MergeDownLayerCommand::execute(Context* context) dst_image = image_new_copy(src_image); /* adding it in the stock of images */ - index = stock_add_image(sprite->stock, dst_image); - if (undo_is_enabled(sprite->undo)) - undo_add_image(sprite->undo, sprite->stock, index); + index = stock_add_image(sprite->getStock(), dst_image); + if (undo_is_enabled(sprite->getUndo())) + undo_add_image(sprite->getUndo(), sprite->getStock(), index); /* creating a copy of the cell */ dst_cel = cel_new(frpos, index); cel_set_position(dst_cel, src_cel->x, src_cel->y); cel_set_opacity(dst_cel, src_cel->opacity); - if (undo_is_enabled(sprite->undo)) - undo_add_cel(sprite->undo, dst_layer, dst_cel); + if (undo_is_enabled(sprite->getUndo())) + undo_add_cel(sprite->getUndo(), dst_layer, dst_cel); static_cast(dst_layer)->add_cel(dst_cel); } @@ -134,8 +134,8 @@ void MergeDownLayerCommand::execute(Context* context) if (dst_layer->is_background()) { x1 = 0; y1 = 0; - x2 = sprite->w; - y2 = sprite->h; + x2 = sprite->getWidth(); + y2 = sprite->getHeight(); bgcolor = app_get_color_to_clear_layer(dst_layer); } /* merge down in a transparent layer */ @@ -159,29 +159,29 @@ void MergeDownLayerCommand::execute(Context* context) src_cel->opacity, static_cast(src_layer)->get_blend_mode()); - if (undo_is_enabled(sprite->undo)) { - undo_int(sprite->undo, (GfxObj *)dst_cel, &dst_cel->x); - undo_int(sprite->undo, (GfxObj *)dst_cel, &dst_cel->y); + if (undo_is_enabled(sprite->getUndo())) { + undo_int(sprite->getUndo(), (GfxObj *)dst_cel, &dst_cel->x); + undo_int(sprite->getUndo(), (GfxObj *)dst_cel, &dst_cel->y); } cel_set_position(dst_cel, x1, y1); - if (undo_is_enabled(sprite->undo)) - undo_replace_image(sprite->undo, sprite->stock, dst_cel->image); - stock_replace_image(sprite->stock, dst_cel->image, new_image); + if (undo_is_enabled(sprite->getUndo())) + undo_replace_image(sprite->getUndo(), sprite->getStock(), dst_cel->image); + stock_replace_image(sprite->getStock(), dst_cel->image, new_image); image_free(dst_image); } } } - if (undo_is_enabled(sprite->undo)) { - undo_set_layer(sprite->undo, sprite); - undo_remove_layer(sprite->undo, src_layer); - undo_close(sprite->undo); + if (undo_is_enabled(sprite->getUndo())) { + undo_set_layer(sprite->getUndo(), sprite); + undo_remove_layer(sprite->getUndo(), src_layer); + undo_close(sprite->getUndo()); } - sprite_set_layer(sprite, dst_layer); + sprite->setCurrentLayer(dst_layer); src_layer->get_parent()->remove_layer(src_layer); delete src_layer; diff --git a/src/commands/cmd_new_file.cpp b/src/commands/cmd_new_file.cpp index 03b7bbf3c..00642bff5 100644 --- a/src/commands/cmd_new_file.cpp +++ b/src/commands/cmd_new_file.cpp @@ -154,15 +154,15 @@ void NewFileCommand::execute(Context* context) } else { usprintf(buf, "Sprite-%04d", ++_sprite_counter); - sprite_set_filename(sprite, buf); + sprite->setFilename(buf); /* if the background color isn't transparent, we have to convert the `Layer 1' in a `Background' */ if (color_type(color) != COLOR_TYPE_MASK) { - assert(sprite->layer && sprite->layer->is_image()); + assert(sprite->getCurrentLayer() && sprite->getCurrentLayer()->is_image()); - static_cast(sprite->layer)->configure_as_background(); - image_clear(GetImage(sprite), get_color_for_image(imgtype, color)); + static_cast(sprite->getCurrentLayer())->configure_as_background(); + image_clear(sprite->getCurrentImage(), get_color_for_image(imgtype, color)); } /* show the sprite to the user */ @@ -187,7 +187,7 @@ static Sprite *new_sprite(Context* context, int imgtype, int w, int h, int ncolo assert(w >= 1 && w <= 9999); assert(h >= 1 && h <= 9999); - return sprite_new_with_layer(imgtype, w, h, ncolors); + return Sprite::createWithLayer(imgtype, w, h, ncolors); } ////////////////////////////////////////////////////////////////////// diff --git a/src/commands/cmd_new_frame.cpp b/src/commands/cmd_new_frame.cpp index 62667dc0b..1b8364fa8 100644 --- a/src/commands/cmd_new_frame.cpp +++ b/src/commands/cmd_new_frame.cpp @@ -62,10 +62,10 @@ bool NewFrameCommand::enabled(Context* context) const CurrentSpriteReader sprite(context); return sprite != NULL && - sprite->layer != NULL && - sprite->layer->is_readable() && - sprite->layer->is_writable() && - sprite->layer->is_image(); + sprite->getCurrentLayer() != NULL && + sprite->getCurrentLayer()->is_readable() && + sprite->getCurrentLayer()->is_writable() && + sprite->getCurrentLayer()->is_image(); } void NewFrameCommand::execute(Context* context) @@ -79,8 +79,8 @@ void NewFrameCommand::execute(Context* context) update_screen_for_sprite(sprite); app_get_statusbar() ->showTip(1000, _("New frame %d/%d"), - sprite->frame+1, - sprite->frames); + sprite->getCurrentFrame()+1, + sprite->getTotalFrames()); } ////////////////////////////////////////////////////////////////////// diff --git a/src/commands/cmd_new_layer.cpp b/src/commands/cmd_new_layer.cpp index fb239da1d..6f7663c30 100644 --- a/src/commands/cmd_new_layer.cpp +++ b/src/commands/cmd_new_layer.cpp @@ -119,7 +119,7 @@ void NewLayerCommand::execute(Context* context) static std::string get_unique_layer_name(Sprite* sprite) { char buf[1024]; - sprintf(buf, "Layer %d", get_max_layer_num(sprite->get_folder())+1); + sprintf(buf, "Layer %d", get_max_layer_num(sprite->getFolder())+1); return buf; } diff --git a/src/commands/cmd_new_layer_set.cpp b/src/commands/cmd_new_layer_set.cpp index 5786352d7..daf4b280b 100644 --- a/src/commands/cmd_new_layer_set.cpp +++ b/src/commands/cmd_new_layer_set.cpp @@ -69,8 +69,8 @@ void NewLayerSetCommand::execute(Context* context) Layer* layer = new LayerFolder(sprite); layer->set_name(name); - sprite->get_folder()->add_layer(layer); - sprite_set_layer(sprite, layer); + sprite->getFolder()->add_layer(layer); + sprite->setCurrentLayer(layer); update_screen_for_sprite(sprite); } diff --git a/src/commands/cmd_palette_editor.cpp b/src/commands/cmd_palette_editor.cpp index 1f0bd82be..eb61d6584 100644 --- a/src/commands/cmd_palette_editor.cpp +++ b/src/commands/cmd_palette_editor.cpp @@ -98,8 +98,8 @@ void PaletteEditorCommand::execute(Context* context) int frame, columns; Palette *palette = NULL; const CurrentSpriteReader sprite(context); - int imgtype = sprite ? sprite->imgtype: IMAGE_INDEXED; - int frame_bak = sprite ? sprite->frame : 0; + int imgtype = sprite ? sprite->getImgType(): IMAGE_INDEXED; + int frame_bak = sprite ? sprite->getCurrentFrame() : 0; bool all_frames_same_palette = true; if (imgtype == IMAGE_GRAYSCALE) { @@ -134,10 +134,10 @@ void PaletteEditorCommand::execute(Context* context) /* create current_sprite->frames palettes */ if (sprite) { - palettes.resize(sprite->frames); + palettes.resize(sprite->getTotalFrames()); - for (frame=0; frameframes; ++frame) { - Palette* orig = sprite_get_palette(sprite, frame); + for (frame=0; framegetTotalFrames(); ++frame) { + const Palette* orig = sprite->getPalette(frame); palettes[frame] = new Palette(frame, orig->size()); orig->copyColorsTo(palettes[frame]); @@ -185,8 +185,8 @@ void PaletteEditorCommand::execute(Context* context) /* frame */ if (sprite) { - jslider_set_range(slider_frame, 0, sprite->frames-1); - jslider_set_value(slider_frame, sprite->frame); + jslider_set_range(slider_frame, 0, sprite->getTotalFrames()-1); + jslider_set_value(slider_frame, sprite->getCurrentFrame()); if (jwidget_is_selected(check_all_frames)) jwidget_disable(slider_frame); @@ -228,24 +228,24 @@ void PaletteEditorCommand::execute(Context* context) if (window->get_killer() == button_ok) { if (sprite) { SpriteWriter sprite_writer(sprite); - sprite_reset_palettes(sprite_writer); + sprite_writer->resetPalettes(); /* one palette */ if (jwidget_is_selected(check_all_frames)) { // Copy the current palette in the first frame get_current_palette()->copyColorsTo(palettes[0]); - sprite_set_palette(sprite_writer, palettes[0], true); + sprite_writer->setPalette(palettes[0], true); } /* various palettes */ else { frame = jslider_get_value(slider_frame); get_current_palette()->copyColorsTo(palettes[frame]); - for (frame=0; frameframes; ++frame) { + for (frame=0; framegetTotalFrames(); ++frame) { if (frame == 0 || palettes[frame]->countDiff(palettes[frame-1], NULL, NULL) > 0) { - sprite_set_palette(sprite_writer, palettes[frame], true); + sprite_writer->setPalette(palettes[frame], true); } } } @@ -261,9 +261,9 @@ void PaletteEditorCommand::execute(Context* context) /* restore the system palette */ if (sprite) { SpriteWriter sprite_writer(sprite); - sprite_writer->frame = frame_bak; + sprite_writer->setCurrentFrame(frame_bak); - set_current_palette(sprite_get_palette(sprite, frame_bak), true); + set_current_palette(sprite->getPalette(frame_bak), true); } else { set_current_palette(NULL, true); @@ -283,7 +283,7 @@ void PaletteEditorCommand::execute(Context* context) if (!palettes.empty()) { assert(sprite); - for (frame=0; frameframes; ++frame) + for (frame=0; framegetTotalFrames(); ++frame) delete palettes[frame]; palettes.clear(); @@ -379,7 +379,7 @@ static void quantize_command(JWidget widget) paledit_get_selected_entries(palette_editor, array); paledit_get_palette(palette_editor)->copyColorsTo(palette); - if (sprite->imgtype == IMAGE_RGB) { + if (sprite->getImgType() == IMAGE_RGB) { SpriteWriter sprite_writer(sprite); sprite_quantize_ex(sprite_writer, palette); } @@ -458,13 +458,13 @@ static bool slider_frame_change_hook(JWidget widget, void *data) const SpriteReader& sprite = get_sprite(widget); assert(sprite != NULL); - int old_frame = sprite->frame; + int old_frame = sprite->getCurrentFrame(); int new_frame = jslider_get_value(slider_frame); get_current_palette()->copyColorsTo(palettes[old_frame]); { SpriteWriter sprite_writer(sprite); - sprite_writer->frame = new_frame; + sprite_writer->setCurrentFrame(new_frame); } set_new_palette(palettes[new_frame]); @@ -484,7 +484,7 @@ static bool check_all_frames_change_hook(JWidget widget, void *data) bool has_two_or_more_palettes = false; int c; - for (c=1; cframes; c++) { + for (c=1; cgetTotalFrames(); c++) { if (palettes[c-1]->countDiff(palettes[c], NULL, NULL) > 0) { has_two_or_more_palettes = true; break; diff --git a/src/commands/cmd_paste.cpp b/src/commands/cmd_paste.cpp index 3d66d6e87..814a8d638 100644 --- a/src/commands/cmd_paste.cpp +++ b/src/commands/cmd_paste.cpp @@ -57,8 +57,8 @@ void PasteCommand::execute(Context* context) { CurrentSpriteWriter sprite(context); - if (undo_is_enabled(sprite->undo)) - undo_set_label(sprite->undo, "Paste"); + if (undo_is_enabled(sprite->getUndo())) + undo_set_label(sprite->getUndo(), "Paste"); clipboard::paste(sprite); } diff --git a/src/commands/cmd_play_animation.cpp b/src/commands/cmd_play_animation.cpp index 248b96f89..68184047e 100644 --- a/src/commands/cmd_play_animation.cpp +++ b/src/commands/cmd_play_animation.cpp @@ -77,7 +77,7 @@ void PlayAnimationCommand::execute(Context* context) Palette *oldpal, *newpal; PALETTE rgbpal; - if (sprite->frames < 2) + if (sprite->getTotalFrames() < 2) return; // desactivate the onionskin @@ -85,7 +85,7 @@ void PlayAnimationCommand::execute(Context* context) jmouse_hide(); - old_frame = sprite->frame; + old_frame = sprite->getCurrentFrame(); LOCK_VARIABLE(speed_timer); LOCK_FUNCTION(speed_timer_callback); @@ -99,17 +99,17 @@ void PlayAnimationCommand::execute(Context* context) oldpal = NULL; speed_timer = 0; while (!done) { - msecs = sprite_get_frlen(sprite, sprite->frame); + msecs = sprite->getFrameDuration(sprite->getCurrentFrame()); install_int_ex(speed_timer_callback, MSEC_TO_TIMER(msecs)); - newpal = sprite_get_palette(sprite, sprite->frame); + newpal = sprite->getPalette(sprite->getCurrentFrame()); if (oldpal != newpal) { newpal->toAllegro(rgbpal); set_palette(rgbpal); oldpal = newpal; } - current_editor->editor_draw_sprite_safe(0, 0, sprite->w, sprite->h); + current_editor->editor_draw_sprite_safe(0, 0, sprite->getWidth(), sprite->getHeight()); do { poll_mouse(); @@ -120,9 +120,10 @@ void PlayAnimationCommand::execute(Context* context) } while (!done && (speed_timer <= 0)); if (!done) { - sprite->frame++; - if (sprite->frame >= sprite->frames) - sprite->frame = 0; + int frame = sprite->getCurrentFrame()+1; + if (frame >= sprite->getTotalFrames()) + frame = 0; + sprite->setCurrentFrame(frame); speed_timer--; } @@ -135,10 +136,10 @@ void PlayAnimationCommand::execute(Context* context) /* if right-click or ESC */ if (mouse_b == 2 || (keypressed() && (readkey()>>8) == KEY_ESC)) /* return to the old frame position */ - sprite->frame = old_frame; + sprite->setCurrentFrame(old_frame); /* refresh all */ - newpal = sprite_get_palette(sprite, sprite->frame); + newpal = sprite->getPalette(sprite->getCurrentFrame()); set_current_palette(newpal, true); jmanager_refresh_screen(); gui_feedback(); diff --git a/src/commands/cmd_preview.cpp b/src/commands/cmd_preview.cpp index 92490840c..d860afc8d 100644 --- a/src/commands/cmd_preview.cpp +++ b/src/commands/cmd_preview.cpp @@ -106,7 +106,7 @@ void PreviewCommand::preview_sprite(Context* context, int flags) old_mouse_x = jmouse_x(0); old_mouse_y = jmouse_y(0); - bmp = create_bitmap(sprite->w, sprite->h); + bmp = create_bitmap(sprite->getWidth(), sprite->getHeight()); if (bmp) { /* print a informative text */ app_get_statusbar()->setStatusText(1, _("Rendering...")); @@ -117,8 +117,8 @@ void PreviewCommand::preview_sprite(Context* context, int flags) jmouse_set_position(JI_SCREEN_W/2, JI_SCREEN_H/2); /* render the sprite in the bitmap */ - image = RenderEngine::renderSprite(sprite, 0, 0, sprite->w, sprite->h, - sprite->frame, 0); + image = RenderEngine::renderSprite(sprite, 0, 0, sprite->getWidth(), sprite->getHeight(), + sprite->getCurrentFrame(), 0); if (image) { image_to_allegro(image, bmp, 0, 0); image_free(image); @@ -132,8 +132,8 @@ void PreviewCommand::preview_sprite(Context* context, int flags) shiftx = - scroll_x + vp->x1 + editor->editor_get_offset_x(); shifty = - scroll_y + vp->y1 + editor->editor_get_offset_y(); - w = sprite->w << editor->editor_get_zoom(); - h = sprite->h << editor->editor_get_zoom(); + w = sprite->getWidth() << editor->editor_get_zoom(); + h = sprite->getHeight() << editor->editor_get_zoom(); redraw = true; do { @@ -259,8 +259,8 @@ void PreviewCommand::preview_sprite(Context* context, int flags) redraw = true; /* render the sprite in the bitmap */ - image = RenderEngine::renderSprite(sprite, 0, 0, sprite->w, sprite->h, - sprite->frame, 0); + image = RenderEngine::renderSprite(sprite, 0, 0, sprite->getWidth(), sprite->getHeight(), + sprite->getCurrentFrame(), 0); if (image) { image_to_allegro(image, bmp, 0, 0); image_free(image); diff --git a/src/commands/cmd_redo.cpp b/src/commands/cmd_redo.cpp index 41aece7e9..a81ea2ac5 100644 --- a/src/commands/cmd_redo.cpp +++ b/src/commands/cmd_redo.cpp @@ -49,7 +49,7 @@ bool RedoCommand::enabled(Context* context) const CurrentSpriteReader sprite(context); return sprite != NULL && - undo_can_redo(sprite->undo); + undo_can_redo(sprite->getUndo()); } void RedoCommand::execute(Context* context) @@ -58,10 +58,10 @@ void RedoCommand::execute(Context* context) app_get_statusbar() ->showTip(1000, _("Redid %s"), - undo_get_next_redo_label(sprite->undo)); + undo_get_next_redo_label(sprite->getUndo())); - undo_do_redo(sprite->undo); - sprite_generate_mask_boundaries(sprite); + undo_do_redo(sprite->getUndo()); + sprite->generateMaskBoundaries(); update_screen_for_sprite(sprite); } diff --git a/src/commands/cmd_remove_cel.cpp b/src/commands/cmd_remove_cel.cpp index 2c39d12c1..da0cb1d1e 100644 --- a/src/commands/cmd_remove_cel.cpp +++ b/src/commands/cmd_remove_cel.cpp @@ -52,20 +52,20 @@ bool RemoveCelCommand::enabled(Context* context) const CurrentSpriteReader sprite(context); return sprite && - sprite->layer && - sprite->layer->is_readable() && - sprite->layer->is_writable() && - sprite->layer->is_image() && - static_cast(sprite->layer)->get_cel(sprite->frame); + sprite->getCurrentLayer() && + sprite->getCurrentLayer()->is_readable() && + sprite->getCurrentLayer()->is_writable() && + sprite->getCurrentLayer()->is_image() && + static_cast(sprite->getCurrentLayer())->get_cel(sprite->getCurrentFrame()); } void RemoveCelCommand::execute(Context* context) { CurrentSpriteWriter sprite(context); - Cel* cel = static_cast(sprite->layer)->get_cel(sprite->frame); + Cel* cel = static_cast(sprite->getCurrentLayer())->get_cel(sprite->getCurrentFrame()); { Undoable undoable(sprite, "Remove Cel"); - undoable.remove_cel(static_cast(sprite->layer), cel); + undoable.remove_cel(static_cast(sprite->getCurrentLayer()), cel); undoable.commit(); } update_screen_for_sprite(sprite); diff --git a/src/commands/cmd_remove_frame.cpp b/src/commands/cmd_remove_frame.cpp index 5c68494f1..7d5685f9b 100644 --- a/src/commands/cmd_remove_frame.cpp +++ b/src/commands/cmd_remove_frame.cpp @@ -52,7 +52,7 @@ bool RemoveFrameCommand::enabled(Context* context) const CurrentSpriteReader sprite(context); return sprite != NULL && - sprite->frames > 1; + sprite->getTotalFrames() > 1; } void RemoveFrameCommand::execute(Context* context) @@ -60,7 +60,7 @@ void RemoveFrameCommand::execute(Context* context) CurrentSpriteWriter sprite(context); { Undoable undoable(sprite, "Remove Frame"); - undoable.remove_frame(sprite->frame); + undoable.remove_frame(sprite->getCurrentFrame()); undoable.commit(); } update_screen_for_sprite(sprite); diff --git a/src/commands/cmd_remove_layer.cpp b/src/commands/cmd_remove_layer.cpp index 183acca20..6b3beb4a8 100644 --- a/src/commands/cmd_remove_layer.cpp +++ b/src/commands/cmd_remove_layer.cpp @@ -56,7 +56,7 @@ bool RemoveLayerCommand::enabled(Context* context) const CurrentSpriteReader sprite(context); return sprite != NULL && - sprite->layer != NULL; + sprite->getCurrentLayer() != NULL; } void RemoveLayerCommand::execute(Context* context) @@ -66,9 +66,9 @@ void RemoveLayerCommand::execute(Context* context) { Undoable undoable(sprite, "Remove Layer"); - layer_name = sprite->layer->get_name(); + layer_name = sprite->getCurrentLayer()->get_name(); - undoable.remove_layer(sprite->layer); + undoable.remove_layer(sprite->getCurrentLayer()); undoable.commit(); } update_screen_for_sprite(sprite); diff --git a/src/commands/cmd_reselect_mask.cpp b/src/commands/cmd_reselect_mask.cpp index 542759f4b..c7701ec68 100644 --- a/src/commands/cmd_reselect_mask.cpp +++ b/src/commands/cmd_reselect_mask.cpp @@ -51,7 +51,7 @@ bool ReselectMaskCommand::enabled(Context* context) const CurrentSpriteReader sprite(context); return sprite != NULL && - sprite_request_mask(sprite, "*deselected*") != NULL; + sprite->requestMask("*deselected*") != NULL; } void ReselectMaskCommand::execute(Context* context) @@ -59,23 +59,23 @@ void ReselectMaskCommand::execute(Context* context) CurrentSpriteWriter sprite(context); Mask *mask; - /* request *deselected* mask */ - mask = sprite_request_mask(sprite, "*deselected*"); + // Request *deselected* mask + mask = sprite->requestMask("*deselected*"); /* undo */ - if (undo_is_enabled(sprite->undo)) { - undo_set_label(sprite->undo, "Mask Reselection"); - undo_set_mask(sprite->undo, sprite); + if (undo_is_enabled(sprite->getUndo())) { + undo_set_label(sprite->getUndo(), "Mask Reselection"); + undo_set_mask(sprite->getUndo(), sprite); } /* set the mask */ - sprite_set_mask(sprite, mask); + sprite->setMask(mask); /* remove the *deselected* mask */ - sprite_remove_mask(sprite, mask); + sprite->removeMask(mask); mask_free(mask); - sprite_generate_mask_boundaries(sprite); + sprite->generateMaskBoundaries(); update_screen_for_sprite(sprite); } diff --git a/src/commands/cmd_rotate_canvas.cpp b/src/commands/cmd_rotate_canvas.cpp index b633f808f..487406311 100644 --- a/src/commands/cmd_rotate_canvas.cpp +++ b/src/commands/cmd_rotate_canvas.cpp @@ -78,32 +78,32 @@ protected: // get all sprite cels CelList cels; - sprite_get_cels(m_sprite, cels); + m_sprite->getCels(cels); // for each cel... for (CelIterator it = cels.begin(); it != cels.end(); ++it) { Cel* cel = *it; - Image* image = stock_get_image(m_sprite->stock, cel->image); + Image* image = stock_get_image(m_sprite->getStock(), cel->image); // change it location switch (m_angle) { case 180: undoable.set_cel_position(cel, - m_sprite->w - cel->x - image->w, - m_sprite->h - cel->y - image->h); + m_sprite->getWidth() - cel->x - image->w, + m_sprite->getHeight() - cel->y - image->h); break; case 90: - undoable.set_cel_position(cel, m_sprite->h - cel->y - image->h, cel->x); + undoable.set_cel_position(cel, m_sprite->getHeight() - cel->y - image->h, cel->x); break; case -90: - undoable.set_cel_position(cel, cel->y, m_sprite->w - cel->x - image->w); + undoable.set_cel_position(cel, cel->y, m_sprite->getWidth() - cel->x - image->w); break; } } // for each stock's image - for (int i=0; istock->nimage; ++i) { - Image* image = stock_get_image(m_sprite->stock, i); + for (int i=0; igetStock()->nimage; ++i) { + Image* image = stock_get_image(m_sprite->getStock(), i); if (!image) continue; @@ -115,7 +115,7 @@ protected: undoable.replace_stock_image(i, new_image); - job_progress((float)i / m_sprite->stock->nimage); + job_progress((float)i / m_sprite->getStock()->nimage); // cancel all the operation? if (is_canceled()) @@ -123,42 +123,42 @@ protected: } // rotate mask - if (m_sprite->mask->bitmap) { + if (m_sprite->getMask()->bitmap) { Mask* new_mask = mask_new(); int x, y; switch (m_angle) { case 180: - x = m_sprite->w - m_sprite->mask->x - m_sprite->mask->w; - y = m_sprite->h - m_sprite->mask->y - m_sprite->mask->h; + x = m_sprite->getWidth() - m_sprite->getMask()->x - m_sprite->getMask()->w; + y = m_sprite->getHeight() - m_sprite->getMask()->y - m_sprite->getMask()->h; break; case 90: - x = m_sprite->h - m_sprite->mask->y - m_sprite->mask->h; - y = m_sprite->mask->x; + x = m_sprite->getHeight() - m_sprite->getMask()->y - m_sprite->getMask()->h; + y = m_sprite->getMask()->x; break; case -90: - x = m_sprite->mask->y; - y = m_sprite->w - m_sprite->mask->x - m_sprite->mask->w; + x = m_sprite->getMask()->y; + y = m_sprite->getWidth() - m_sprite->getMask()->x - m_sprite->getMask()->w; break; } // create the new rotated mask mask_replace(new_mask, x, y, - m_angle == 180 ? m_sprite->mask->w: m_sprite->mask->h, - m_angle == 180 ? m_sprite->mask->h: m_sprite->mask->w); - image_rotate(m_sprite->mask->bitmap, new_mask->bitmap, m_angle); + m_angle == 180 ? m_sprite->getMask()->w: m_sprite->getMask()->h, + m_angle == 180 ? m_sprite->getMask()->h: m_sprite->getMask()->w); + image_rotate(m_sprite->getMask()->bitmap, new_mask->bitmap, m_angle); // copy new mask undoable.copy_to_current_mask(new_mask); mask_free(new_mask); // regenerate mask - sprite_generate_mask_boundaries(m_sprite); + m_sprite->generateMaskBoundaries(); } // change the sprite's size if (m_angle != 180) - undoable.set_sprite_size(m_sprite->h, m_sprite->w); + undoable.set_sprite_size(m_sprite->getHeight(), m_sprite->getWidth()); // commit changes undoable.commit(); @@ -194,7 +194,7 @@ void RotateCanvasCommand::execute(Context* context) RotateCanvasJob job(sprite, m_angle); job.do_job(); } - sprite_generate_mask_boundaries(sprite); + sprite->generateMaskBoundaries(); update_screen_for_sprite(sprite); } diff --git a/src/commands/cmd_save_file.cpp b/src/commands/cmd_save_file.cpp index 04f3882fb..76d6f8e17 100644 --- a/src/commands/cmd_save_file.cpp +++ b/src/commands/cmd_save_file.cpp @@ -105,7 +105,7 @@ static void save_sprite_in_background(Sprite* sprite, bool mark_as_saved) data->thread = thread; data->alert_window = jalert_new(PACKAGE "<filename)); + get_filename(sprite->getFilename())); /* add a monitor to check the saving (FileOp) progress */ data->monitor = add_gui_monitor(monitor_savefile_bg, @@ -128,13 +128,13 @@ static void save_sprite_in_background(Sprite* sprite, bool mark_as_saved) } /* no error? */ else { - RecentFiles::addRecentFile(sprite->filename); + RecentFiles::addRecentFile(sprite->getFilename()); if (mark_as_saved) - sprite_mark_as_saved(sprite); + sprite->markAsSaved(); app_get_statusbar() ->setStatusText(2000, "File %s, saved.", - get_filename(sprite->filename)); + get_filename(sprite->getFilename())); } delete data->progress; @@ -154,7 +154,7 @@ static void save_as_dialog(Sprite* sprite, const char* dlg_title, bool mark_as_s jstring newfilename; int ret; - filename = sprite->filename; + filename = sprite->getFilename(); get_writable_extensions(exts, sizeof(exts)); for (;;) { @@ -186,7 +186,7 @@ static void save_as_dialog(Sprite* sprite, const char* dlg_title, bool mark_as_s /* "no": we must back to select other file-name */ } - sprite_set_filename(sprite, filename.c_str()); + sprite->setFilename(filename.c_str()); app_realloc_sprite_list(); save_sprite_in_background(sprite, mark_as_saved); @@ -236,7 +236,7 @@ void SaveFileCommand::execute(Context* context) /* if the sprite is associated to a file in the file-system, we can save it directly without user interaction */ - if (sprite_is_associated_to_file(sprite)) { + if (sprite->isAssociatedToFile()) { save_sprite_in_background(sprite, true); } /* if the sprite isn't associated to a file, we must to show the @@ -312,13 +312,13 @@ bool SaveFileCopyAsCommand::enabled(Context* context) void SaveFileCopyAsCommand::execute(Context* context) { CurrentSpriteWriter sprite(context); - jstring old_filename = sprite->filename; + jstring old_filename = sprite->getFilename(); // show "Save As" dialog save_as_dialog(sprite, _("Save Sprite Copy As"), false); // restore the file name - sprite_set_filename(sprite, old_filename.c_str()); + sprite->setFilename(old_filename.c_str()); app_realloc_sprite_list(); } diff --git a/src/commands/cmd_save_mask.cpp b/src/commands/cmd_save_mask.cpp index 6505c0a69..32b6fab53 100644 --- a/src/commands/cmd_save_mask.cpp +++ b/src/commands/cmd_save_mask.cpp @@ -56,8 +56,8 @@ bool SaveMaskCommand::enabled(Context* context) if (!sprite) return false; else - return (sprite->mask && - sprite->mask->bitmap) ? true: false; + return (sprite->getMask() && + sprite->getMask()->bitmap) ? true: false; } void SaveMaskCommand::execute(Context* context) @@ -92,7 +92,7 @@ void SaveMaskCommand::execute(Context* context) /* "no": we must back to select other file-name */ } - if (save_msk_file(sprite->mask, filename.c_str()) != 0) + if (save_msk_file(sprite->getMask(), filename.c_str()) != 0) jalert("%s<<%s<<%s||%s", _("Error"), _("Error saving .msk file"), filename.c_str(), _("&Close")); diff --git a/src/commands/cmd_screen_shot.cpp b/src/commands/cmd_screen_shot.cpp index 0fb1f224b..0bcd276df 100644 --- a/src/commands/cmd_screen_shot.cpp +++ b/src/commands/cmd_screen_shot.cpp @@ -80,13 +80,13 @@ void ScreenShotCommand::execute(Context* context) /* creates a sprite with one layer, one image to save the bitmap as a PNG */ { int imgtype = bitmap_color_depth(bmp) == 8 ? IMAGE_INDEXED: IMAGE_RGB; - Sprite *sprite = sprite_new_with_layer(imgtype, bmp->w, bmp->h, 256); - Image *image = GetImage2(sprite, NULL, NULL, NULL); + Sprite* sprite = Sprite::createWithLayer(imgtype, bmp->w, bmp->h, 256); + Image* image = sprite->getCurrentImage(); int x, y, r, g, b; Palette *pal = new Palette(0, 256); pal->fromAllegro(rgbpal); - sprite_set_palette(sprite, pal, true); + sprite->setPalette(pal, true); delete pal; /* convert Allegro "BITMAP" to ASE "Image" */ @@ -116,7 +116,7 @@ void ScreenShotCommand::execute(Context* context) } /* save the sprite */ - sprite_set_filename(sprite, buf); + sprite->setFilename(buf); sprite_save(sprite); /* destroy the sprite */ diff --git a/src/commands/cmd_sprite_properties.cpp b/src/commands/cmd_sprite_properties.cpp index 0e96ebd25..18154ae71 100644 --- a/src/commands/cmd_sprite_properties.cpp +++ b/src/commands/cmd_sprite_properties.cpp @@ -80,7 +80,7 @@ void SpritePropertiesCommand::execute(Context* context) "ok", &ok, NULL); /* update widgets values */ - switch (sprite->imgtype) { + switch (sprite->getImgType()) { case IMAGE_RGB: imgtype_text = "RGB"; break; @@ -96,21 +96,21 @@ void SpritePropertiesCommand::execute(Context* context) } /* filename */ - name->setText(sprite->filename); + name->setText(sprite->getFilename()); /* color mode */ type->setText(imgtype_text.c_str()); /* sprite size (width and height) */ - usprintf(buf, "%dx%d (", sprite->w, sprite->h); - get_pretty_memsize(sprite_get_memsize(sprite), + usprintf(buf, "%dx%d (", sprite->getWidth(), sprite->getHeight()); + get_pretty_memsize(sprite->getMemSize(), buf+ustrsize(buf), sizeof(buf)-ustrsize(buf)); ustrcat(buf, ")"); size->setText(buf); /* how many frames */ - frames->setTextf("%d", sprite->frames); + frames->setTextf("%d", sprite->getTotalFrames()); window->remap_window(); window->center_window(); diff --git a/src/commands/cmd_sprite_size.cpp b/src/commands/cmd_sprite_size.cpp index 4f7a82957..d87a51841 100644 --- a/src/commands/cmd_sprite_size.cpp +++ b/src/commands/cmd_sprite_size.cpp @@ -45,8 +45,8 @@ class SpriteSizeJob : public Job int m_new_height; ResizeMethod m_resize_method; - inline int scale_x(int x) const { return x * m_new_width / m_sprite->w; } - inline int scale_y(int y) const { return y * m_new_height / m_sprite->h; } + inline int scale_x(int x) const { return x * m_new_width / m_sprite->getWidth(); } + inline int scale_y(int y) const { return y * m_new_height / m_sprite->getHeight(); } public: @@ -70,7 +70,7 @@ protected: // get all sprite cels CelList cels; - sprite_get_cels(m_sprite, cels); + m_sprite->getCels(cels); // for each cel... for (CelIterator it = cels.begin(); it != cels.end(); ++it) { @@ -81,8 +81,8 @@ protected: } // for each stock's image - for (int i=0; istock->nimage; ++i) { - Image* image = stock_get_image(m_sprite->stock, i); + for (int i=0; igetStock()->nimage; ++i) { + Image* image = stock_get_image(m_sprite->getStock(), i); if (!image) continue; @@ -99,7 +99,7 @@ protected: undoable.replace_stock_image(i, new_image); - job_progress((float)i / m_sprite->stock->nimage); + job_progress((float)i / m_sprite->getStock()->nimage); // cancel all the operation? if (is_canceled()) @@ -107,17 +107,17 @@ protected: } // resize mask - if (m_sprite->mask->bitmap) { - Image* old_bitmap = image_crop(m_sprite->mask->bitmap, -1, -1, - m_sprite->mask->bitmap->w+2, - m_sprite->mask->bitmap->h+2, 0); + if (m_sprite->getMask()->bitmap) { + Image* old_bitmap = image_crop(m_sprite->getMask()->bitmap, -1, -1, + m_sprite->getMask()->bitmap->w+2, + m_sprite->getMask()->bitmap->h+2, 0); int w = scale_x(old_bitmap->w); int h = scale_y(old_bitmap->h); Mask* new_mask = mask_new(); mask_replace(new_mask, - scale_x(m_sprite->mask->x-1), - scale_y(m_sprite->mask->y-1), MAX(1, w), MAX(1, h)); + scale_x(m_sprite->getMask()->x-1), + scale_y(m_sprite->getMask()->y-1), MAX(1, w), MAX(1, h)); image_resize(old_bitmap, new_mask->bitmap, m_resize_method, get_current_palette(), @@ -134,7 +134,7 @@ protected: mask_free(new_mask); // regenerate mask - sprite_generate_mask_boundaries(m_sprite); + m_sprite->generateMaskBoundaries(); } // resize sprite @@ -197,8 +197,8 @@ void SpriteSizeCommand::execute(Context* context) "method", &method, "ok", &ok, NULL); - width_px->setTextf("%d", sprite->w); - height_px->setTextf("%d", sprite->h); + width_px->setTextf("%d", sprite->getWidth()); + height_px->setTextf("%d", sprite->getHeight()); HOOK(lock_ratio, JI_SIGNAL_CHECK_CHANGE, lock_ratio_change_hook, 0); HOOK(width_px, JI_SIGNAL_ENTRY_CHANGE, width_px_change_hook, 0); @@ -249,13 +249,13 @@ static bool width_px_change_hook(JWidget widget, void *data) { const CurrentSpriteReader sprite(UIContext::instance()); // TODO use the context in sprite size command int width = widget->getTextInt(); - double perc = 100.0 * width / sprite->w; + double perc = 100.0 * width / sprite->getWidth(); widget->findSibling("width_perc")->setTextf(PERC_FORMAT, perc); if (widget->findSibling("lock_ratio")->isSelected()) { widget->findSibling("height_perc")->setTextf(PERC_FORMAT, perc); - widget->findSibling("height_px")->setTextf("%d", sprite->h * width / sprite->w); + widget->findSibling("height_px")->setTextf("%d", sprite->getHeight() * width / sprite->getWidth()); } return true; @@ -265,13 +265,13 @@ static bool height_px_change_hook(JWidget widget, void *data) { const CurrentSpriteReader sprite(UIContext::instance()); // TODO use the context in sprite size command int height = widget->getTextInt(); - double perc = 100.0 * height / sprite->h; + double perc = 100.0 * height / sprite->getHeight(); widget->findSibling("height_perc")->setTextf(PERC_FORMAT, perc); if (widget->findSibling("lock_ratio")->isSelected()) { widget->findSibling("width_perc")->setTextf(PERC_FORMAT, perc); - widget->findSibling("width_px")->setTextf("%d", sprite->w * height / sprite->h); + widget->findSibling("width_px")->setTextf("%d", sprite->getWidth() * height / sprite->getHeight()); } return true; @@ -282,10 +282,10 @@ static bool width_perc_change_hook(JWidget widget, void *data) const CurrentSpriteReader sprite(UIContext::instance()); // TODO use the context in sprite size command double width = widget->getTextDouble(); - widget->findSibling("width_px")->setTextf("%d", (int)(sprite->w * width / 100)); + widget->findSibling("width_px")->setTextf("%d", (int)(sprite->getWidth() * width / 100)); if (widget->findSibling("lock_ratio")->isSelected()) { - widget->findSibling("height_px")->setTextf("%d", (int)(sprite->h * width / 100)); + widget->findSibling("height_px")->setTextf("%d", (int)(sprite->getHeight() * width / 100)); widget->findSibling("height_perc")->setText(widget->getText()); } @@ -297,10 +297,10 @@ static bool height_perc_change_hook(JWidget widget, void *data) const CurrentSpriteReader sprite(UIContext::instance()); // TODO use the context in sprite size command double height = widget->getTextDouble(); - widget->findSibling("height_px")->setTextf("%d", (int)(sprite->h * height / 100)); + widget->findSibling("height_px")->setTextf("%d", (int)(sprite->getHeight() * height / 100)); if (widget->findSibling("lock_ratio")->isSelected()) { - widget->findSibling("width_px")->setTextf("%d", (int)(sprite->w * height / 100)); + widget->findSibling("width_px")->setTextf("%d", (int)(sprite->getWidth() * height / 100)); widget->findSibling("width_perc")->setText(widget->getText()); } diff --git a/src/commands/cmd_undo.cpp b/src/commands/cmd_undo.cpp index 8dc4a4ed7..4d8ba74ac 100644 --- a/src/commands/cmd_undo.cpp +++ b/src/commands/cmd_undo.cpp @@ -49,7 +49,7 @@ bool UndoCommand::enabled(Context* context) const CurrentSpriteReader sprite(context); return sprite != NULL && - undo_can_undo(sprite->undo); + undo_can_undo(sprite->getUndo()); } void UndoCommand::execute(Context* context) @@ -58,10 +58,10 @@ void UndoCommand::execute(Context* context) app_get_statusbar() ->showTip(1000, _("Undid %s"), - undo_get_next_undo_label(sprite->undo)); + undo_get_next_undo_label(sprite->getUndo())); - undo_do_undo(sprite->undo); - sprite_generate_mask_boundaries(sprite); + undo_do_undo(sprite->getUndo()); + sprite->generateMaskBoundaries(); update_screen_for_sprite(sprite); } diff --git a/src/commands/fx/cmd_color_curve.cpp b/src/commands/fx/cmd_color_curve.cpp index 266d804bd..ac01c6b31 100644 --- a/src/commands/fx/cmd_color_curve.cpp +++ b/src/commands/fx/cmd_color_curve.cpp @@ -110,7 +110,7 @@ void ColorCurveCommand::execute(Context* context) set_color_curve(the_curve); curve_editor = curve_editor_new(the_curve, 0, 0, 255, 255); - target_button = target_button_new(sprite->imgtype, true); + target_button = target_button_new(sprite->getImgType(), true); target_button_set_target(target_button, effect.target); if (get_config_bool("ColorCurve", "Preview", true)) diff --git a/src/commands/fx/cmd_convolution_matrix.cpp b/src/commands/fx/cmd_convolution_matrix.cpp index b29c8c8ae..2810eec25 100644 --- a/src/commands/fx/cmd_convolution_matrix.cpp +++ b/src/commands/fx/cmd_convolution_matrix.cpp @@ -118,7 +118,7 @@ void ConvolutionMatrixCommand::execute(Context* context) list_convmatr = jlistbox_new(); listbox_fill_convmatg(list_convmatr); - target_button = target_button_new(sprite->imgtype, true); + target_button = target_button_new(sprite->getImgType(), true); target_button_set_target(target_button, effect.target); if (get_config_bool("ConvolutionMatrix", "Preview", true)) diff --git a/src/commands/fx/cmd_despeckle.cpp b/src/commands/fx/cmd_despeckle.cpp index 56a0e9151..2d1f66277 100644 --- a/src/commands/fx/cmd_despeckle.cpp +++ b/src/commands/fx/cmd_despeckle.cpp @@ -103,7 +103,7 @@ void DespeckleCommand::execute(Context* context) preview = preview_new(&effect); - target_button = target_button_new(sprite->imgtype, true); + target_button = target_button_new(sprite->getImgType(), true); target_button_set_target(target_button, effect.target); entry_width->setTextf("%d", get_config_int("Median", "Width", 3)); diff --git a/src/commands/fx/cmd_invert_color.cpp b/src/commands/fx/cmd_invert_color.cpp index ddf3f8e38..8a20fb116 100644 --- a/src/commands/fx/cmd_invert_color.cpp +++ b/src/commands/fx/cmd_invert_color.cpp @@ -93,7 +93,7 @@ void InvertColorCommand::execute(Context* context) TARGET_BLUE_CHANNEL); preview = preview_new(&effect); - target_button = target_button_new(sprite->imgtype, true); + target_button = target_button_new(sprite->getImgType(), true); target_button_set_target(target_button, effect.target); if (get_config_bool("InvertColor", "Preview", true)) diff --git a/src/commands/fx/cmd_replace_color.cpp b/src/commands/fx/cmd_replace_color.cpp index 34b231e05..5d82f16e7 100644 --- a/src/commands/fx/cmd_replace_color.cpp +++ b/src/commands/fx/cmd_replace_color.cpp @@ -104,14 +104,14 @@ void ReplaceColorCommand::execute(Context* context) button_color1 = colorbutton_new (get_config_color("ReplaceColor", "Color1", colorbar_get_fg_color(app_get_colorbar())), - sprite->imgtype); + sprite->getImgType()); button_color2 = colorbutton_new (get_config_color("ReplaceColor", "Color2", colorbar_get_bg_color(app_get_colorbar())), - sprite->imgtype); + sprite->getImgType()); - target_button = target_button_new(sprite->imgtype, false); + target_button = target_button_new(sprite->getImgType(), false); target_button_set_target(target_button, effect.target); jslider_set_value(slider_fuzziness, @@ -196,8 +196,8 @@ static void make_preview() to = get_config_color("ReplaceColor", "Color2", color_mask()); fuzziness = get_config_int("ReplaceColor", "Fuzziness", 0); - set_replace_colors(get_color_for_layer(sprite->layer, from), - get_color_for_layer(sprite->layer, to), + set_replace_colors(get_color_for_layer(sprite->getCurrentLayer(), from), + get_color_for_layer(sprite->getCurrentLayer(), to), MID(0, fuzziness, 255)); if (jwidget_is_selected(check_preview)) diff --git a/src/core/color.cpp b/src/core/color.cpp index 0f9f95d75..dffed8cfa 100644 --- a/src/core/color.cpp +++ b/src/core/color.cpp @@ -631,14 +631,14 @@ int get_color_for_layer(Layer *layer, color_t color) { return fixup_color_for_layer(layer, - get_color_for_image(layer->getSprite()->imgtype, + get_color_for_image(layer->getSprite()->getImgType(), color)); } int fixup_color_for_layer(Layer *layer, int color) { if (layer->is_background()) - return fixup_color_for_background(layer->getSprite()->imgtype, color); + return fixup_color_for_background(layer->getSprite()->getImgType(), color); else return color; } diff --git a/src/dialogs/aniedit.cpp b/src/dialogs/aniedit.cpp index a5efa6a17..2d52113f5 100644 --- a/src/dialogs/aniedit.cpp +++ b/src/dialogs/aniedit.cpp @@ -99,7 +99,7 @@ enum { A_PART_CEL }; -typedef struct AniEditor +struct AniEditor { const Sprite* sprite; int state; @@ -120,7 +120,7 @@ typedef struct AniEditor int clk_frame; /* keys */ bool space_pressed; -} AniEditor; +}; static JWidget current_anieditor = NULL; @@ -149,7 +149,7 @@ static void anieditor_show_cel(JWidget widget, int layer, int frame); static void anieditor_show_current_cel(JWidget widget); static void anieditor_clean_clk(JWidget widget); static void anieditor_set_scroll(JWidget widget, int x, int y, bool use_refresh_region); -static int anieditor_get_layer_index(JWidget widget, Layer* layer); +static int anieditor_get_layer_index(JWidget widget, const Layer* layer); static void icon_rect(BITMAP* icon, int x1, int y1, int x2, int y2, bool is_selected, bool is_hot, bool is_clk); @@ -176,9 +176,9 @@ void switch_between_animation_and_sprite_editor() window->remap_window(); /* show the current cel */ - int layer = anieditor_get_layer_index(anieditor, sprite->layer); + int layer = anieditor_get_layer_index(anieditor, sprite->getCurrentLayer()); if (layer >= 0) - anieditor_center_cel(anieditor, layer, sprite->frame); + anieditor_center_cel(anieditor, layer, sprite->getCurrentFrame()); /* show the window */ window->open_window_fg(); @@ -327,7 +327,7 @@ static bool anieditor_msg_proc(JWidget widget, JMessage msg) { const SpriteReader sprite((Sprite*)anieditor->sprite); SpriteWriter sprite_writer(sprite); - sprite_writer->frame = anieditor->clk_frame; + sprite_writer->setCurrentFrame(anieditor->clk_frame); } jwidget_dirty(widget); /* TODO replace this by redrawing old current frame and new current frame */ jwidget_hard_capture_mouse(widget); @@ -335,14 +335,14 @@ static bool anieditor_msg_proc(JWidget widget, JMessage msg) break; case A_PART_LAYER: { const SpriteReader sprite((Sprite*)anieditor->sprite); - int old_layer = anieditor_get_layer_index(widget, sprite->layer); - int frame = anieditor->sprite->frame; + int old_layer = anieditor_get_layer_index(widget, sprite->getCurrentLayer()); + int frame = anieditor->sprite->getCurrentFrame(); /* did the user select another layer? */ if (old_layer != anieditor->clk_layer) { { SpriteWriter sprite_writer(sprite); - sprite_writer->layer = anieditor->layers[anieditor->clk_layer]; + sprite_writer->setCurrentLayer(anieditor->layers[anieditor->clk_layer]); } jmouse_hide(); @@ -355,7 +355,7 @@ static bool anieditor_msg_proc(JWidget widget, JMessage msg) } /* change the scroll to show the new selected cel */ - anieditor_show_cel(widget, anieditor->clk_layer, sprite->frame); + anieditor_show_cel(widget, anieditor->clk_layer, sprite->getCurrentFrame()); jwidget_hard_capture_mouse(widget); anieditor->state = STATE_MOVING_LAYER; break; @@ -368,16 +368,16 @@ static bool anieditor_msg_proc(JWidget widget, JMessage msg) break; case A_PART_CEL: { const SpriteReader sprite((Sprite*)anieditor->sprite); - int old_layer = anieditor_get_layer_index(widget, sprite->layer); - int old_frame = sprite->frame; + int old_layer = anieditor_get_layer_index(widget, sprite->getCurrentLayer()); + int old_frame = sprite->getCurrentFrame(); /* select the new clicked-part */ if (old_layer != anieditor->clk_layer || old_frame != anieditor->clk_frame) { { SpriteWriter sprite_writer(sprite); - sprite_writer->layer = anieditor->layers[anieditor->clk_layer]; - sprite_writer->frame = anieditor->clk_frame; + sprite_writer->setCurrentLayer(anieditor->layers[anieditor->clk_layer]); + sprite_writer->setCurrentFrame(anieditor->clk_frame); } jmouse_hide(); @@ -394,7 +394,7 @@ static bool anieditor_msg_proc(JWidget widget, JMessage msg) } /* change the scroll to show the new selected cel */ - anieditor_show_cel(widget, anieditor->clk_layer, sprite->frame); + anieditor_show_cel(widget, anieditor->clk_layer, sprite->getCurrentFrame()); /* capture the mouse (to move the cel) */ jwidget_hard_capture_mouse(widget); @@ -546,7 +546,7 @@ static bool anieditor_msg_proc(JWidget widget, JMessage msg) const SpriteReader sprite((Sprite*)anieditor->sprite); if (anieditor->hot_frame >= 0 && - anieditor->hot_frame < sprite->frames && + anieditor->hot_frame < sprite->getTotalFrames() && anieditor->hot_frame != anieditor->clk_frame+1) { { SpriteWriter sprite_writer(sprite); @@ -590,7 +590,7 @@ static bool anieditor_msg_proc(JWidget widget, JMessage msg) undoable.commit(); /* select the new layer */ - sprite_writer->layer = anieditor->layers[anieditor->clk_layer]; + sprite_writer->setCurrentLayer(anieditor->layers[anieditor->clk_layer]); } catch (locked_sprite_exception& e) { e.show(); @@ -701,9 +701,9 @@ static bool anieditor_msg_proc(JWidget widget, JMessage msg) /* undo */ if (command && strcmp(command->short_name(), CommandId::undo) == 0) { const SpriteReader sprite((Sprite*)anieditor->sprite); - if (undo_can_undo(sprite->undo)) { + if (undo_can_undo(sprite->getUndo())) { SpriteWriter sprite_writer(sprite); - undo_do_undo(sprite_writer->undo); + undo_do_undo(sprite_writer->getUndo()); destroy_thumbnails(); anieditor_regenerate_layers(widget); @@ -716,9 +716,9 @@ static bool anieditor_msg_proc(JWidget widget, JMessage msg) /* redo */ if (command && strcmp(command->short_name(), CommandId::redo) == 0) { const SpriteReader sprite((Sprite*)anieditor->sprite); - if (undo_can_redo(sprite->undo)) { + if (undo_can_redo(sprite->getUndo())) { SpriteWriter sprite_writer(sprite); - undo_do_redo(sprite_writer->undo); + undo_do_redo(sprite_writer->getUndo()); destroy_thumbnails(); anieditor_regenerate_layers(widget); @@ -874,7 +874,7 @@ static void anieditor_get_drawable_frames(JWidget widget, JRect clip, int *first AniEditor* anieditor = anieditor_data(widget); *first_frame = 0; - *last_frame = anieditor->sprite->frames-1; + *last_frame = anieditor->sprite->getTotalFrames()-1; } static void anieditor_draw_header(JWidget widget, JRect clip) @@ -923,7 +923,7 @@ static void anieditor_draw_header_frame(JWidget widget, JRect clip, int frame) /* draw the header for the layers */ usprintf(buf1, "%d", frame+1); - usprintf(buf2, "%d", sprite_get_frlen(anieditor->sprite, frame)); + usprintf(buf2, "%d", anieditor->sprite->getFrameDuration(frame)); anieditor_draw_header_part(widget, clip, x1, y1, x2, y2, is_hot, is_clk, buf1, 0, @@ -938,7 +938,7 @@ static void anieditor_draw_header_frame(JWidget widget, JRect clip, int frame) } /* padding in the right side */ - if (frame == anieditor->sprite->frames-1) { + if (frame == anieditor->sprite->getTotalFrames()-1) { if (x2+1 <= widget->rc->x2-1) { /* right side */ vline(ji_screen, x2+1, y1, y2, ji_color_foreground()); @@ -1025,7 +1025,7 @@ static void anieditor_draw_layer(JWidget widget, JRect clip, int layer_index) Layer *layer = anieditor->layers[layer_index]; BITMAP *icon1 = get_gfx(layer->is_readable() ? GFX_BOX_SHOW: GFX_BOX_HIDE); BITMAP *icon2 = get_gfx(layer->is_writable() ? GFX_BOX_UNLOCK: GFX_BOX_LOCK); - bool selected_layer = (layer == anieditor->sprite->layer); + bool selected_layer = (layer == anieditor->sprite->getCurrentLayer()); bool is_hot = (anieditor->hot_part == A_PART_LAYER && anieditor->hot_layer == layer_index); bool is_clk = (anieditor->clk_part == A_PART_LAYER && anieditor->clk_layer == layer_index); int bg = selected_layer ? @@ -1144,7 +1144,7 @@ static void anieditor_draw_cel(JWidget widget, JRect clip, int layer_index, int SkinneableTheme* theme = static_cast(widget->theme); AniEditor* anieditor = anieditor_data(widget); Layer *layer = anieditor->layers[layer_index]; - bool selected_layer = (layer == anieditor->sprite->layer); + bool selected_layer = (layer == anieditor->sprite->getCurrentLayer()); bool is_hot = (anieditor->hot_part == A_PART_CEL && anieditor->hot_layer == layer_index && anieditor->hot_frame == frame); @@ -1176,7 +1176,7 @@ static void anieditor_draw_cel(JWidget widget, JRect clip, int layer_index, int Rect thumbnail_rect(Point(x1+3, y1+3), Point(x2-2, y2-2)); /* draw the box for the cel */ - if (selected_layer && frame == anieditor->sprite->frame) { + if (selected_layer && frame == anieditor->sprite->getCurrentFrame()) { /* current cel */ if (is_hot) jrectedge(ji_screen, x1, y1, x2, y2-1, @@ -1203,7 +1203,7 @@ static void anieditor_draw_cel(JWidget widget, JRect clip, int layer_index, int /* empty cel? */ if (cel == NULL || - stock_get_image(anieditor->sprite->stock, + stock_get_image(anieditor->sprite->getStock(), cel->image) == NULL) { /* TODO why a cel can't have an associated image? */ jdraw_rectfill(thumbnail_rect, bg); draw_emptyset_symbol(thumbnail_rect, ji_color_disabled()); @@ -1236,7 +1236,7 @@ static void anieditor_draw_cel(JWidget widget, JRect clip, int layer_index, int } /* padding in the right side */ - if (frame == anieditor->sprite->frames-1) { + if (frame == anieditor->sprite->getTotalFrames()-1) { if (x2+1 <= widget->rc->x2-1) { /* right side */ vline(ji_screen, x2+1, y1, y2, ji_color_foreground()); @@ -1264,7 +1264,7 @@ static bool anieditor_draw_part(JWidget widget, int part, int layer, int frame) anieditor_draw_header(widget, widget->rc); return true; case A_PART_HEADER_FRAME: - if (frame >= 0 && frame < anieditor->sprite->frames) { + if (frame >= 0 && frame < anieditor->sprite->getTotalFrames()) { anieditor_draw_header_frame(widget, widget->rc, frame); return true; } @@ -1279,7 +1279,7 @@ static bool anieditor_draw_part(JWidget widget, int part, int layer, int frame) break; case A_PART_CEL: if (layer >= 0 && layer < anieditor->nlayers && - frame >= 0 && frame < anieditor->sprite->frames) { + frame >= 0 && frame < anieditor->sprite->getTotalFrames()) { anieditor_draw_cel(widget, widget->rc, layer, frame); return true; } @@ -1299,15 +1299,14 @@ static void anieditor_regenerate_layers(JWidget widget) anieditor->layers = NULL; } - anieditor->nlayers = sprite_count_layers(anieditor->sprite); + anieditor->nlayers = anieditor->sprite->countLayers(); /* here we build an array with all the layers */ if (anieditor->nlayers > 0) { anieditor->layers = (Layer**)jmalloc(sizeof(Layer*) * anieditor->nlayers); for (c=0; cnlayers; c++) - anieditor->layers[c] = sprite_index2layer(anieditor->sprite, - anieditor->nlayers-c-1); + anieditor->layers[c] = (Layer*)anieditor->sprite->indexToLayer(anieditor->nlayers-c-1); } } @@ -1391,9 +1390,9 @@ static void anieditor_show_cel(JWidget widget, int layer, int frame) static void anieditor_show_current_cel(JWidget widget) { AniEditor* anieditor = anieditor_data(widget); - int layer = anieditor_get_layer_index(widget, anieditor->sprite->layer); + int layer = anieditor_get_layer_index(widget, anieditor->sprite->getCurrentLayer()); if (layer >= 0) - anieditor_show_cel(widget, layer, anieditor->sprite->frame); + anieditor_show_cel(widget, layer, anieditor->sprite->getCurrentFrame()); } static void anieditor_clean_clk(JWidget widget) @@ -1423,7 +1422,7 @@ static void anieditor_set_scroll(JWidget widget, int x, int y, bool use_refresh_ old_scroll_y = anieditor->scroll_y; } - max_scroll_x = anieditor->sprite->frames * FRMSIZE - jrect_w(widget->rc)/2; + max_scroll_x = anieditor->sprite->getTotalFrames() * FRMSIZE - jrect_w(widget->rc)/2; max_scroll_y = anieditor->nlayers * LAYSIZE - jrect_h(widget->rc)/2; max_scroll_x = MAX(0, max_scroll_x); max_scroll_y = MAX(0, max_scroll_y); @@ -1484,7 +1483,7 @@ static void anieditor_set_scroll(JWidget widget, int x, int y, bool use_refresh_ } } -static int anieditor_get_layer_index(JWidget widget, Layer* layer) +static int anieditor_get_layer_index(JWidget widget, const Layer* layer) { AniEditor* anieditor = anieditor_data(widget); int i; diff --git a/src/dialogs/drawtext.cpp b/src/dialogs/drawtext.cpp index 8aa46857b..5157e7d27 100644 --- a/src/dialogs/drawtext.cpp +++ b/src/dialogs/drawtext.cpp @@ -201,7 +201,7 @@ static Image *render_text(Sprite* sprite, FONT *f, const char *text, int color) clear_to_color(bmp, makecol32 (255, 0, 255)); textout(bmp, f, text, 0, 0, makecol32 (255, 255, 255)); - image = image_new(sprite->imgtype, w, h); + image = image_new(sprite->getImgType(), w, h); if (!image) { destroy_bitmap(bmp); return NULL; diff --git a/src/dialogs/maskcol.cpp b/src/dialogs/maskcol.cpp index eb8e56645..d73edf67d 100644 --- a/src/dialogs/maskcol.cpp +++ b/src/dialogs/maskcol.cpp @@ -48,7 +48,7 @@ static bool color_change_hook(JWidget widget, void *data); static bool slider_change_hook(JWidget widget, void *data); static bool preview_change_hook(JWidget widget, void *data); -static Mask *gen_mask(Sprite* sprite); +static Mask *gen_mask(const Sprite* sprite); static void mask_preview(Sprite* sprite); void dialogs_mask_color(Sprite* sprite) @@ -62,7 +62,7 @@ void dialogs_mask_color(Sprite* sprite) if (!is_interactive () || !sprite) return; - image = GetImage(sprite); + image = sprite->getCurrentImage(); if (!image) return; @@ -75,7 +75,7 @@ void dialogs_mask_color(Sprite* sprite) button_color = colorbutton_new (get_config_color("MaskColor", "Color", colorbar_get_fg_color(app_get_colorbar())), - sprite->imgtype); + sprite->getImgType()); button_1 = jbutton_new("1"); button_2 = jbutton_new("2"); label_fuzziness = jlabel_new(_("Fuzziness:")); @@ -126,14 +126,14 @@ void dialogs_mask_color(Sprite* sprite) Mask *mask; /* undo */ - if (undo_is_enabled(sprite->undo)) { - undo_set_label(sprite->undo, "Mask by Color"); - undo_set_mask(sprite->undo, sprite); + if (undo_is_enabled(sprite->getUndo())) { + undo_set_label(sprite->getUndo(), "Mask by Color"); + undo_set_mask(sprite->getUndo(), sprite); } /* change the mask */ mask = gen_mask(sprite); - sprite_set_mask(sprite, mask); + sprite->setMask(mask); mask_free(mask); set_config_color("MaskColor", "Color", @@ -147,7 +147,7 @@ void dialogs_mask_color(Sprite* sprite) } /* update boundaries and editors */ - sprite_generate_mask_boundaries(sprite); + sprite->generateMaskBoundaries(); update_screen_for_sprite(sprite); /* save window configuration */ @@ -186,13 +186,13 @@ static bool preview_change_hook(JWidget widget, void *data) return false; } -static Mask *gen_mask(Sprite* sprite) +static Mask *gen_mask(const Sprite* sprite) { int xpos, ypos, color, fuzziness; - Image* image = GetImage2(sprite, &xpos, &ypos, NULL); + const Image* image = sprite->getCurrentImage(&xpos, &ypos, NULL); - color = get_color_for_image(sprite->imgtype, + color = get_color_for_image(sprite->getImgType(), colorbutton_get_color(button_color)); fuzziness = jslider_get_value(slider_fuzziness); @@ -206,15 +206,11 @@ static Mask *gen_mask(Sprite* sprite) static void mask_preview(Sprite* sprite) { if (jwidget_is_selected(check_preview)) { - Mask *mask = gen_mask(sprite); - Mask *old_mask = sprite->mask; + Mask* mask = gen_mask(sprite); - sprite->mask = mask; - - sprite_generate_mask_boundaries(sprite); + sprite->generateMaskBoundaries(mask); update_screen_for_sprite(sprite); - sprite->mask = old_mask; mask_free(mask); } } diff --git a/src/dialogs/vectmap.cpp b/src/dialogs/vectmap.cpp index 390864b70..44bb768af 100644 --- a/src/dialogs/vectmap.cpp +++ b/src/dialogs/vectmap.cpp @@ -133,7 +133,7 @@ void dialogs_vector_map(Sprite* sprite) if (!is_interactive () || !sprite) return; - image = GetImage(sprite); + image = sprite->getCurrentImage(); if (!image) return; @@ -142,8 +142,8 @@ void dialogs_vector_map(Sprite* sprite) return; /* undo stuff */ - if (undo_is_enabled(sprite->undo)) - undo_image(sprite->undo, image, 0, 0, image->w, image->h); + if (undo_is_enabled(sprite->getUndo())) + undo_image(sprite->getUndo(), image, 0, 0, image->w, image->h); dmax = std::sqrt(static_cast(image->w/2*image->w/2 + image->h/2*image->h/2)); for (y=0; yh; y++) { diff --git a/src/effect/convmatr.cpp b/src/effect/convmatr.cpp index 1b738c61d..3dcb31fb9 100644 --- a/src/effect/convmatr.cpp +++ b/src/effect/convmatr.cpp @@ -332,11 +332,11 @@ JList get_convmatr_stock() void apply_convolution_matrix4(Effect *effect) { - ConvMatr *matrix = data.convmatr; - Image *src = effect->src; - Image *dst = effect->dst; - ase_uint32 *src_address; - ase_uint32 *dst_address; + ConvMatr* matrix = data.convmatr; + const Image* src = effect->src; + Image* dst = effect->dst; + ase_uint32* src_address; + ase_uint32* dst_address; int x, y, dx, dy, color; int getx, gety, addx, addy; int r, g, b, a; @@ -409,11 +409,11 @@ void apply_convolution_matrix4(Effect *effect) void apply_convolution_matrix2(Effect *effect) { - ConvMatr *matrix = data.convmatr; - Image *src = effect->src; - Image *dst = effect->dst; - ase_uint16 *src_address; - ase_uint16 *dst_address; + ConvMatr* matrix = data.convmatr; + const Image* src = effect->src; + Image* dst = effect->dst; + ase_uint16* src_address; + ase_uint16* dst_address; int x, y, dx, dy, color; int getx, gety, addx, addy; int k, a; @@ -470,12 +470,12 @@ void apply_convolution_matrix2(Effect *effect) void apply_convolution_matrix1(Effect *effect) { - Palette *pal = get_current_palette(); - ConvMatr *matrix = data.convmatr; - Image *src = effect->src; - Image *dst = effect->dst; - ase_uint8 *src_address; - ase_uint8 *dst_address; + Palette* pal = get_current_palette(); + ConvMatr* matrix = data.convmatr; + const Image* src = effect->src; + Image* dst = effect->dst; + ase_uint8* src_address; + ase_uint8* dst_address; int x, y, dx, dy, color; int getx, gety, addx, addy; int r, g, b, index; diff --git a/src/effect/effect.cpp b/src/effect/effect.cpp index 42baa2c2b..4e203ce40 100644 --- a/src/effect/effect.cpp +++ b/src/effect/effect.cpp @@ -69,9 +69,9 @@ static EffectData effects_data[] = { }; static EffectData *get_effect_data(const char *name); -static void effect_init(Effect *effect, Layer *layer, Image *image, int offset_x, int offset_y); +static void effect_init(Effect* effect, const Layer* layer, Image* image, int offset_x, int offset_y); static void effect_apply_to_image(Effect *effect, ImageRef *p, int x, int y); -static bool effect_update_mask(Effect *effect, Mask *mask, Image *image); +static bool effect_update_mask(Effect* effect, Mask* mask, const Image* image); int init_module_effect() { @@ -88,13 +88,12 @@ Effect::Effect(const SpriteReader& sprite, const char* name) { int offset_x, offset_y; EffectData* effect_data; - Image* image; void (*apply)(Effect*); effect_data = get_effect_data(name); apply = NULL; - switch (sprite->imgtype) { + switch (sprite->getImgType()) { case IMAGE_RGB: apply = effect_data->apply_4; break; case IMAGE_GRAYSCALE: apply = effect_data->apply_2; break; case IMAGE_INDEXED: apply = effect_data->apply_1; break; @@ -119,11 +118,11 @@ Effect::Effect(const SpriteReader& sprite, const char* name) this->progress = NULL; this->is_cancelled = NULL; - image = GetImage2(sprite, &offset_x, &offset_y, NULL); + Image* image = this->sprite->getCurrentImage(&offset_x, &offset_y); if (image == NULL) throw no_image_exception(); - effect_init(this, sprite->layer, image, offset_x, offset_y); + effect_init(this, sprite->getCurrentLayer(), image, offset_x, offset_y); } Effect::~Effect() @@ -141,15 +140,15 @@ void effect_set_target(Effect *effect, int target) effect->target = target; /* the alpha channel of the background layer can't be modified */ - if (effect->sprite->layer && - effect->sprite->layer->is_background()) + if (effect->sprite->getCurrentLayer() && + effect->sprite->getCurrentLayer()->is_background()) effect->target &= ~TARGET_ALPHA_CHANNEL; } void effect_begin(Effect *effect) { effect->row = 0; - effect->mask = effect->sprite->mask; + effect->mask = effect->sprite->getMask(); effect_update_mask(effect, effect->mask, effect->src); } @@ -161,8 +160,8 @@ void effect_begin_for_preview(Effect *effect) effect->preview_mask = NULL; } - if ((effect->sprite->mask) && (effect->sprite->mask->bitmap)) - effect->preview_mask = mask_new_copy(effect->sprite->mask); + if ((effect->sprite->getMask()) && (effect->sprite->getMask()->bitmap)) + effect->preview_mask = mask_new_copy(effect->sprite->getMask()); else { effect->preview_mask = mask_new(); mask_replace(effect->preview_mask, @@ -186,8 +185,8 @@ void effect_begin_for_preview(Effect *effect) if (x1 < 0) x1 = 0; if (y1 < 0) y1 = 0; - if (x2 >= effect->sprite->w) x2 = effect->sprite->w-1; - if (y2 >= effect->sprite->h) y2 = effect->sprite->h-1; + if (x2 >= effect->sprite->getWidth()) x2 = effect->sprite->getWidth()-1; + if (y2 >= effect->sprite->getHeight()) y2 = effect->sprite->getHeight()-1; x = x1; y = y1; @@ -233,7 +232,7 @@ bool effect_apply_step(Effect *effect) } } -void effect_apply(Effect *effect) +void effect_apply(Effect* effect) { bool cancelled = false; @@ -249,15 +248,15 @@ void effect_apply(Effect *effect) } if (!cancelled) { - /* undo stuff */ - if (undo_is_enabled(effect->sprite->undo)) { - undo_set_label(effect->sprite->undo, + // Undo stuff + if (undo_is_enabled(effect->sprite->getUndo())) { + undo_set_label(effect->sprite->getUndo(), effect->effect_data->label); - undo_image(effect->sprite->undo, effect->src, + undo_image(effect->sprite->getUndo(), effect->src, effect->x, effect->y, effect->w, effect->h); } - /* copy "dst" to "src" */ + // Copy "dst" to "src" image_copy(effect->src, effect->dst, 0, 0); } } @@ -310,8 +309,8 @@ void effect_apply_to_target(Effect *effect) /* open undo group of operations */ if (nimages > 1) { - if (undo_is_enabled(effect->sprite->undo)) - undo_open(effect->sprite->undo); + if (undo_is_enabled(effect->sprite->getUndo())) + undo_open(effect->sprite->getUndo()); } effect->progress_base = 0.0f; @@ -331,8 +330,8 @@ void effect_apply_to_target(Effect *effect) /* close undo group of operations */ if (nimages > 1) { - if (undo_is_enabled(effect->sprite->undo)) - undo_close(effect->sprite->undo); + if (undo_is_enabled(effect->sprite->getUndo())) + undo_close(effect->sprite->getUndo()); } /* free all ImageRefs */ @@ -351,13 +350,13 @@ static EffectData *get_effect_data(const char *name) throw invalid_effect_exception(name); } -static void effect_init(Effect *effect, Layer *layer, Image *image, +static void effect_init(Effect* effect, const Layer* layer, Image* image, int offset_x, int offset_y) { effect->offset_x = offset_x; effect->offset_y = offset_y; - if (!effect_update_mask(effect, effect->sprite->mask, image)) + if (!effect_update_mask(effect, effect->sprite->getMask(), image)) throw invalid_area_exception(); if (effect->preview_mask) { @@ -384,13 +383,13 @@ static void effect_init(Effect *effect, Layer *layer, Image *image, effect->target &= ~TARGET_ALPHA_CHANNEL; } -static void effect_apply_to_image(Effect *effect, ImageRef *p, int x, int y) +static void effect_apply_to_image(Effect* effect, ImageRef* p, int x, int y) { effect_init(effect, p->layer, p->image, x, y); effect_apply(effect); } -static bool effect_update_mask(Effect *effect, Mask *mask, Image *image) +static bool effect_update_mask(Effect* effect, Mask* mask, const Image* image) { int x, y, w, h; diff --git a/src/effect/images_ref.cpp b/src/effect/images_ref.cpp index 72e78fa1b..537f73873 100644 --- a/src/effect/images_ref.cpp +++ b/src/effect/images_ref.cpp @@ -35,8 +35,8 @@ static ImageRef* images_ref_get_from_layer(Sprite* sprite, Layer* layer, int tar ImageRef* images_ref_get_from_sprite(Sprite* sprite, int target, bool write) { - Layer* layer = target & TARGET_ALL_LAYERS ? sprite->get_folder(): - sprite->layer; + Layer* layer = target & TARGET_ALL_LAYERS ? sprite->getFolder(): + sprite->getCurrentLayer(); return images_ref_get_from_layer(sprite, layer, target, write); } @@ -72,7 +72,7 @@ static ImageRef* images_ref_get_from_layer(Sprite* sprite, Layer* layer, int tar { \ ImageRef* image_ref = jnew(ImageRef, 1); \ \ - image_ref->image = layer->getSprite()->stock->image[cel->image]; \ + image_ref->image = layer->getSprite()->getStock()->image[cel->image]; \ image_ref->layer = layer; \ image_ref->cel = cel; \ image_ref->next = NULL; \ @@ -82,7 +82,7 @@ static ImageRef* images_ref_get_from_layer(Sprite* sprite, Layer* layer, int tar ImageRef* first_image = NULL; ImageRef* last_image = NULL; - int frame = sprite->frame; + int frame = sprite->getCurrentFrame(); if (!layer->is_readable()) return NULL; @@ -94,7 +94,7 @@ static ImageRef* images_ref_get_from_layer(Sprite* sprite, Layer* layer, int tar case GFXOBJ_LAYER_IMAGE: { if (target & TARGET_ALL_FRAMES) { - for (frame=0; frameframes; frame++) { + for (frame=0; framegetTotalFrames(); frame++) { Cel* cel = static_cast(layer)->get_cel(frame); if (cel != NULL) NEW_IMAGE(layer, cel); diff --git a/src/file/ase_format.cpp b/src/file/ase_format.cpp index 0af250c01..a62a72738 100644 --- a/src/file/ase_format.cpp +++ b/src/file/ase_format.cpp @@ -74,9 +74,9 @@ static int chunk_start; static bool load_ASE(FileOp *fop); static bool save_ASE(FileOp *fop); -static bool ase_file_read_header(FILE *f, ASE_Header *header); -static void ase_file_prepare_header(FILE *f, ASE_Header *header, Sprite *sprite); -static void ase_file_write_header(FILE *f, ASE_Header *header); +static bool ase_file_read_header(FILE* f, ASE_Header* header); +static void ase_file_prepare_header(FILE* f, ASE_Header* header, const Sprite* sprite); +static void ase_file_write_header(FILE* f, ASE_Header* header); static void ase_file_read_frame_header(FILE *f, ASE_FrameHeader *frame_header); static void ase_file_prepare_frame_header(FILE *f, ASE_FrameHeader *frame_header); @@ -156,15 +156,15 @@ static bool load_ASE(FileOp *fop) } /* set frames and speed */ - sprite_set_frames(sprite, header.frames); - sprite_set_speed(sprite, header.speed); + sprite->setTotalFrames(header.frames); + sprite->setDurationForAllFrames(header.speed); /* prepare variables for layer chunks */ - Layer* last_layer = sprite->get_folder(); + Layer* last_layer = sprite->getFolder(); current_level = -1; /* read frame by frame to end-of-file */ - for (frame=0; frameframes; frame++) { + for (frame=0; framegetTotalFrames(); frame++) { /* start frame position */ frame_pos = ftell(f); fop_progress(fop, (float)frame_pos / (float)header.size); @@ -176,7 +176,7 @@ static bool load_ASE(FileOp *fop) if (frame_header.magic == ASE_FILE_FRAME_MAGIC) { /* use frame-duration field? */ if (frame_header.duration > 0) - sprite_set_frlen(sprite, frame, frame_header.duration); + sprite->setFrameDuration(frame, frame_header.duration); /* read chunks */ for (c=0; cimgtype == IMAGE_INDEXED) { - Palette *prev_pal = sprite_get_palette(sprite, frame); + if (sprite->getImgType() == IMAGE_INDEXED) { + Palette *prev_pal = sprite->getPalette(frame); Palette *pal = chunk_type == ASE_FILE_CHUNK_FLI_COLOR ? ase_file_read_color_chunk(f, sprite, frame): ase_file_read_color2_chunk(f, sprite, frame); if (prev_pal->countDiff(pal, NULL, NULL) > 0) { - sprite_set_palette(sprite, pal, true); + sprite->setPalette(pal, true); } delete pal; @@ -225,7 +225,7 @@ static bool load_ASE(FileOp *fop) /* fop_error(fop, "Cel chunk\n"); */ ase_file_read_cel_chunk(f, sprite, frame, - sprite->imgtype, fop, &header, + sprite->getImgType(), fop, &header, chunk_pos+chunk_size); break; } @@ -237,7 +237,7 @@ static bool load_ASE(FileOp *fop) mask = ase_file_read_mask_chunk(f); if (mask) - sprite_add_mask(sprite, mask); + sprite->addMask(mask); else fop_error(fop, _("Warning: error loading a mask chunk\n")); @@ -299,44 +299,45 @@ static bool save_ASE(FileOp *fop) ase_file_prepare_header(f, &header, sprite); /* write frame */ - for (frame=0; frameframes; frame++) { + for (frame=0; framegetTotalFrames(); frame++) { /* prepare the header */ ase_file_prepare_frame_header(f, &frame_header); /* frame duration */ - frame_header.duration = sprite_get_frlen(sprite, frame); + frame_header.duration = sprite->getFrameDuration(frame); /* the sprite is indexed and the palette changes? (or is the first frame) */ - if (sprite->imgtype == IMAGE_INDEXED && + if (sprite->getImgType() == IMAGE_INDEXED && (frame == 0 || - sprite_get_palette(sprite, frame-1)->countDiff(sprite_get_palette(sprite, frame), NULL, NULL) > 0)) { + sprite->getPalette(frame-1)->countDiff(sprite->getPalette(frame), NULL, NULL) > 0)) { /* write the color chunk */ - ase_file_write_color2_chunk(f, sprite_get_palette(sprite, frame)); + ase_file_write_color2_chunk(f, sprite->getPalette(frame)); } /* write extra chunks in the first frame */ if (frame == 0) { - LayerIterator it = sprite->get_folder()->get_layer_begin(); - LayerIterator end = sprite->get_folder()->get_layer_end(); + LayerIterator it = sprite->getFolder()->get_layer_begin(); + LayerIterator end = sprite->getFolder()->get_layer_end(); /* write layer chunks */ for (; it != end; ++it) ase_file_write_layers(f, *it); /* write masks */ - JI_LIST_FOR_EACH(sprite->repository.masks, link) + JList masks = sprite->getMasksRepository(); + JI_LIST_FOR_EACH(masks, link) ase_file_write_mask_chunk(f, reinterpret_cast(link->data)); } /* write cel chunks */ - ase_file_write_cels(f, sprite, sprite->get_folder(), frame); + ase_file_write_cels(f, sprite, sprite->getFolder(), frame); /* write the frame header */ ase_file_write_frame_header(f, &frame_header); /* progress */ - if (sprite->frames > 1) - fop_progress(fop, (float)(frame+1) / (float)(sprite->frames)); + if (sprite->getTotalFrames() > 1) + fop_progress(fop, (float)(frame+1) / (float)(sprite->getTotalFrames())); } /* write the header */ @@ -379,24 +380,24 @@ static bool ase_file_read_header(FILE *f, ASE_Header *header) return true; } -static void ase_file_prepare_header(FILE *f, ASE_Header *header, Sprite *sprite) +static void ase_file_prepare_header(FILE *f, ASE_Header *header, const Sprite* sprite) { header->pos = ftell(f); header->size = 0; header->magic = ASE_FILE_MAGIC; - header->frames = sprite->frames; - header->width = sprite->w; - header->height = sprite->h; - header->depth = sprite->imgtype == IMAGE_RGB ? 32: - sprite->imgtype == IMAGE_GRAYSCALE ? 16: - sprite->imgtype == IMAGE_INDEXED ? 8: 0; + header->frames = sprite->getTotalFrames(); + header->width = sprite->getWidth(); + header->height = sprite->getHeight(); + header->depth = (sprite->getImgType() == IMAGE_RGB ? 32: + sprite->getImgType() == IMAGE_GRAYSCALE ? 16: + sprite->getImgType() == IMAGE_INDEXED ? 8: 0); header->flags = 0; - header->speed = sprite_get_frlen(sprite, 0); + header->speed = sprite->getFrameDuration(0); header->next = 0; header->frit = 0; header->unknown = 0; - header->ncolors = sprite_get_palette(sprite, 0)->size(); + header->ncolors = sprite->getPalette(0)->size(); fseek(f, header->pos+128, SEEK_SET); } @@ -560,7 +561,7 @@ static Palette *ase_file_read_color_chunk(FILE *f, Sprite *sprite, int frame) { int i, c, r, g, b, packets, skip, size; Palette* pal = new Palette(frame, 256); - sprite_get_palette(sprite, frame)->copyColorsTo(pal); + sprite->getPalette(frame)->copyColorsTo(pal); packets = fgetw(f); // Number of packets skip = 0; @@ -588,7 +589,7 @@ static Palette *ase_file_read_color2_chunk(FILE *f, Sprite *sprite, int frame) { int i, c, r, g, b, packets, skip, size; Palette* pal = new Palette(frame, 256); - sprite_get_palette(sprite, frame)->copyColorsTo(pal); + sprite->getPalette(frame)->copyColorsTo(pal); packets = fgetw(f); /* number of packets */ skip = 0; @@ -994,7 +995,7 @@ static Cel *ase_file_read_cel_chunk(FILE *f, Sprite *sprite, int frame, int imgt ase_file_read_padding(f, 7); - layer = sprite_index2layer(sprite, layer_index); + layer = sprite->indexToLayer(layer_index); if (!layer) { fop_error(fop, _("Frame %d didn't found layer with index %d\n"), frame, layer_index); @@ -1042,7 +1043,7 @@ static Cel *ase_file_read_cel_chunk(FILE *f, Sprite *sprite, int frame, int imgt break; } - cel->image = stock_add_image(sprite->stock, image); + cel->image = stock_add_image(sprite->getStock(), image); } break; } @@ -1054,8 +1055,8 @@ static Cel *ase_file_read_cel_chunk(FILE *f, Sprite *sprite, int frame, int imgt if (link) { // Create a copy of the linked cel (avoid using links cel) - Image* image = image_new_copy(stock_get_image(sprite->stock, link->image)); - cel->image = stock_add_image(sprite->stock, image); + Image* image = image_new_copy(stock_get_image(sprite->getStock(), link->image)); + cel->image = stock_add_image(sprite->getStock(), image); } else { cel_free(cel); @@ -1094,7 +1095,7 @@ static Cel *ase_file_read_cel_chunk(FILE *f, Sprite *sprite, int frame, int imgt break; } - cel->image = stock_add_image(sprite->stock, image); + cel->image = stock_add_image(sprite->getStock(), image); } break; } @@ -1107,7 +1108,7 @@ static Cel *ase_file_read_cel_chunk(FILE *f, Sprite *sprite, int frame, int imgt static void ase_file_write_cel_chunk(FILE *f, Cel *cel, LayerImage *layer, Sprite *sprite) { - int layer_index = sprite_layer2index(sprite, layer); + int layer_index = sprite->layerToIndex(layer); int cel_type = ASE_FILE_COMPRESSED_CEL; ase_file_write_start_chunk(f, ASE_FILE_CHUNK_CEL); @@ -1122,7 +1123,7 @@ static void ase_file_write_cel_chunk(FILE *f, Cel *cel, LayerImage *layer, Sprit switch (cel_type) { case ASE_FILE_RAW_CEL: { - Image* image = stock_get_image(sprite->stock, cel->image); + Image* image = stock_get_image(sprite->getStock(), cel->image); if (image) { // Width and height @@ -1160,7 +1161,7 @@ static void ase_file_write_cel_chunk(FILE *f, Cel *cel, LayerImage *layer, Sprit break; case ASE_FILE_COMPRESSED_CEL: { - Image* image = stock_get_image(sprite->stock, cel->image); + Image* image = stock_get_image(sprite->getStock(), cel->image); if (image) { // Width and height diff --git a/src/file/file.cpp b/src/file/file.cpp index 5720121fb..fa7fff65d 100644 --- a/src/file/file.cpp +++ b/src/file/file.cpp @@ -70,7 +70,7 @@ static void fop_prepare_for_sequence(FileOp *fop); static FileFormat *get_fileformat(const char *extension); static int split_filename(const char *filename, char *left, char *right, int *width); -void get_readable_extensions(char *buf, int size) +void get_readable_extensions(char* buf, int size) { int c; @@ -87,7 +87,7 @@ void get_readable_extensions(char *buf, int size) } } -void get_writable_extensions(char *buf, int size) +void get_writable_extensions(char* buf, int size) { int c; @@ -260,10 +260,10 @@ FileOp *fop_to_save_sprite(Sprite *sprite) fop->sprite = sprite; /* get the extension of the filename (in lower case) */ - ustrcpy(extension, get_extension(fop->sprite->filename)); + ustrcpy(extension, get_extension(fop->sprite->getFilename())); ustrlwr(extension); - PRINTF("Saving sprite \"%s\" (%s)\n", fop->sprite->filename, extension); + PRINTF("Saving sprite \"%s\" (%s)\n", fop->sprite->getFilename(), extension); /* get the format through the extension of the filename */ fop->format = get_fileformat(extension); @@ -278,7 +278,7 @@ FileOp *fop_to_save_sprite(Sprite *sprite) fatal = false; /* check image type support */ - switch (fop->sprite->imgtype) { + switch (fop->sprite->getImgType()) { case IMAGE_RGB: if (!(fop->format->flags & FILE_SUPPORT_RGB)) { @@ -286,7 +286,7 @@ FileOp *fop_to_save_sprite(Sprite *sprite) fatal = true; } if (!(fop->format->flags & FILE_SUPPORT_RGBA) && - sprite_need_alpha(fop->sprite)) { + fop->sprite->needAlpha()) { usprintf(buf+ustrlen(buf), "<<- %s", _("Alpha channel")); } break; @@ -297,7 +297,7 @@ FileOp *fop_to_save_sprite(Sprite *sprite) fatal = true; } if (!(fop->format->flags & FILE_SUPPORT_GRAYA) && - sprite_need_alpha(fop->sprite)) { + fop->sprite->needAlpha()) { usprintf(buf+ustrlen(buf), "<<- %s", _("Alpha channel")); } break; @@ -313,19 +313,19 @@ FileOp *fop_to_save_sprite(Sprite *sprite) // check frames support if (!(fop->format->flags & (FILE_SUPPORT_FRAMES | FILE_SUPPORT_SEQUENCES))) { - if (fop->sprite->frames > 1) + if (fop->sprite->getTotalFrames() > 1) usprintf(buf+ustrlen(buf), "<<- %s", _("Frames")); } // layers support - if (fop->sprite->get_folder()->get_layers_count() > 1) { + if (fop->sprite->getFolder()->get_layers_count() > 1) { if (!(fop->format->flags & FILE_SUPPORT_LAYERS)) { usprintf(buf+ustrlen(buf), "<<- %s", _("Layers")); } } /* palettes support */ - if (jlist_length(fop->sprite->palettes) > 1) { + if (jlist_length(fop->sprite->getPalettes()) > 1) { if (!(fop->format->flags & (FILE_SUPPORT_PALETTES | FILE_SUPPORT_SEQUENCES))) { usprintf(buf+ustrlen(buf), "<<- %s", _("Palette changes between frames")); @@ -333,15 +333,16 @@ FileOp *fop_to_save_sprite(Sprite *sprite) } /* repositories */ - if (!jlist_empty(fop->sprite->repository.masks)) { + JList masks = fop->sprite->getMasksRepository(); + if (!jlist_empty(masks)) { Mask *mask; JLink link; int count = 0; - JI_LIST_FOR_EACH(fop->sprite->repository.masks, link) { + JI_LIST_FOR_EACH(masks, link) { mask = reinterpret_cast(link->data); - /* names starting with '*' are ignored */ + // Names starting with '*' are ignored if (mask->name && *mask->name == '*') continue; @@ -353,7 +354,7 @@ FileOp *fop_to_save_sprite(Sprite *sprite) } } - if (!jlist_empty(fop->sprite->repository.paths)) { + if (!jlist_empty(fop->sprite->getPathsRepository())) { if (!(fop->format->flags & FILE_SUPPORT_PATHS_REPOSITORY)) { usprintf(buf+ustrlen(buf), "<<- %s", _("Path Repository")); } @@ -394,25 +395,25 @@ FileOp *fop_to_save_sprite(Sprite *sprite) fop_prepare_for_sequence(fop); /* to save one frame */ - if (fop->sprite->frames == 1) { + if (fop->sprite->getTotalFrames() == 1) { jlist_append(fop->seq.filename_list, - jstrdup(fop->sprite->filename)); + jstrdup(fop->sprite->getFilename())); } /* to save more frames */ else { char buf[256], left[256], right[256]; int frame, width, start_from; - start_from = split_filename(fop->sprite->filename, left, right, &width); + start_from = split_filename(fop->sprite->getFilename(), left, right, &width); if (start_from < 0) { start_from = 0; width = - (fop->sprite->frames < 10)? 1: - (fop->sprite->frames < 100)? 2: - (fop->sprite->frames < 1000)? 3: 4; + (fop->sprite->getTotalFrames() < 10)? 1: + (fop->sprite->getTotalFrames() < 100)? 2: + (fop->sprite->getTotalFrames() < 1000)? 3: 4; } - for (frame=0; framesprite->frames; frame++) { + for (frame=0; framesprite->getTotalFrames(); frame++) { /* get the name for this frame */ usprintf(buf, "%s%0*d%s", left, width, start_from+frame, right); jlist_append(fop->seq.filename_list, jstrdup(buf)); @@ -420,7 +421,7 @@ FileOp *fop_to_save_sprite(Sprite *sprite) } } else - fop->filename = jstrdup(fop->sprite->filename); + fop->filename = jstrdup(fop->sprite->getFilename()); /* configure output format? */ if (fop->format->get_options != NULL) { @@ -433,8 +434,7 @@ FileOp *fop_to_save_sprite(Sprite *sprite) } fop->seq.format_options = format_options; - sprite_set_format_options(fop->sprite, - format_options); + fop->sprite->setFormatOptions(format_options); } return fop; @@ -470,16 +470,16 @@ void fop_operate(FileOp *fop) /* TODO set_palette for each frame??? */ #define SEQUENCE_IMAGE() \ do { \ - image_index = stock_add_image(fop->sprite->stock, \ + image_index = stock_add_image(fop->sprite->getStock(), \ fop->seq.image); \ \ fop->seq.last_cel->image = image_index; \ fop->seq.layer->add_cel(fop->seq.last_cel); \ \ - if (sprite_get_palette(fop->sprite, frame) \ + if (fop->sprite->getPalette(frame) \ ->countDiff(fop->seq.palette, NULL, NULL) > 0) { \ fop->seq.palette->setFrame(frame); \ - sprite_set_palette(fop->sprite, fop->seq.palette, true); \ + fop->sprite->setPalette(fop->seq.palette, true); \ } \ \ old_image = fop->seq.image; \ @@ -560,18 +560,17 @@ void fop_operate(FileOp *fop) } fop->filename = jstrdup((char*)jlist_first_data(fop->seq.filename_list)); - /* final setup */ + // Final setup if (fop->sprite != NULL) { - /* configure the layer as the `Background' */ + // Configure the layer as the 'Background' if (!fop->seq.has_alpha) fop->seq.layer->configure_as_background(); - /* set the frames range */ - sprite_set_frames(fop->sprite, frame); + // Set the frames range + fop->sprite->setTotalFrames(frame); - /* set the frames range */ - sprite_set_format_options(fop->sprite, - fop->seq.format_options); + // Set the frames range + fop->sprite->setFormatOptions(fop->seq.format_options); } } /* direct load from one file */ @@ -584,19 +583,18 @@ void fop_operate(FileOp *fop) if (fop->sprite != NULL) { /* select the last layer */ - if (fop->sprite->get_folder()->get_layers_count() > 0) { - LayerIterator last_layer = --fop->sprite->get_folder()->get_layer_end(); - sprite_set_layer(fop->sprite, *last_layer); + if (fop->sprite->getFolder()->get_layers_count() > 0) { + LayerIterator last_layer = --fop->sprite->getFolder()->get_layer_end(); + fop->sprite->setCurrentLayer(*last_layer); } /* set the filename */ if (fop->seq.filename_list) - sprite_set_filename(fop->sprite, - reinterpret_cast(jlist_first_data(fop->seq.filename_list))); + fop->sprite->setFilename(reinterpret_cast(jlist_first_data(fop->seq.filename_list))); else - sprite_set_filename(fop->sprite, fop->filename); + fop->sprite->setFilename(fop->filename); - sprite_mark_as_saved(fop->sprite); + fop->sprite->markAsSaved(); } } /* save ***********************************************************/ @@ -608,36 +606,36 @@ void fop_operate(FileOp *fop) assert(fop->format->flags & FILE_SUPPORT_SEQUENCES); /* create a temporary bitmap */ - fop->seq.image = image_new(fop->sprite->imgtype, - fop->sprite->w, - fop->sprite->h); + fop->seq.image = image_new(fop->sprite->getImgType(), + fop->sprite->getWidth(), + fop->sprite->getHeight()); if (fop->seq.image != NULL) { - int old_frame = fop->sprite->frame; + int old_frame = fop->sprite->getCurrentFrame(); fop->seq.progress_offset = 0.0f; - fop->seq.progress_fraction = 1.0f / (float)fop->sprite->frames; + fop->seq.progress_fraction = 1.0f / (float)fop->sprite->getTotalFrames(); /* for each frame in the sprite */ - for (fop->sprite->frame=0; - fop->sprite->framesprite->frames; - fop->sprite->frame++) { + for (int frame=0; frame < fop->sprite->getTotalFrames(); ++frame) { + fop->sprite->setCurrentFrame(frame); + /* draw all the sprite in this frame in the image */ image_clear(fop->seq.image, 0); - sprite_render(fop->sprite, fop->seq.image, 0, 0); + fop->sprite->render(fop->seq.image, 0, 0); /* setup the palette */ - sprite_get_palette(fop->sprite, fop->sprite->frame) + fop->sprite->getPalette(fop->sprite->getCurrentFrame()) ->copyColorsTo(fop->seq.palette); /* setup the filename to be used */ fop->filename = reinterpret_cast (jlist_nth_data(fop->seq.filename_list, - fop->sprite->frame)); + fop->sprite->getCurrentFrame())); /* call the "save" procedure... did it fail? */ if (!(*fop->format->save)(fop)) { fop_error(fop, _("Error saving frame %d in the file \"%s\"\n"), - fop->sprite->frame+1, fop->filename); + fop->sprite->getCurrentFrame()+1, fop->filename); break; } @@ -645,11 +643,11 @@ void fop_operate(FileOp *fop) } fop->filename = jstrdup(reinterpret_cast(jlist_first_data(fop->seq.filename_list))); - /* destroy the image */ + // Destroy the image image_free(fop->seq.image); - /* restore frame */ - fop->sprite->frame = old_frame; + // Restore frame + fop->sprite->setCurrentFrame(old_frame); } else { fop_error(fop, _("Not enough memory for the temporary bitmap.\n")); @@ -743,7 +741,7 @@ Image *fop_sequence_image(FileOp *fop, int imgtype, int w, int h) LayerImage* layer = new LayerImage(sprite); // Add the layer - sprite->get_folder()->add_layer(layer); + sprite->getFolder()->add_layer(layer); // Done fop->sprite = sprite; @@ -757,7 +755,7 @@ Image *fop_sequence_image(FileOp *fop, int imgtype, int w, int h) else { sprite = fop->sprite; - if (sprite->imgtype != imgtype) + if (sprite->getImgType() != imgtype) return NULL; } diff --git a/src/file/file.h b/src/file/file.h index 8c0a4e350..bd7cf1042 100644 --- a/src/file/file.h +++ b/src/file/file.h @@ -109,12 +109,12 @@ struct FileOp /* available extensions for each load/save operation */ -void get_readable_extensions(char *buf, int size); -void get_writable_extensions(char *buf, int size); +void get_readable_extensions(char* buf, int size); +void get_writable_extensions(char* buf, int size); /* high-level routines to load/save sprites */ -Sprite* sprite_load(const char *filename); +Sprite* sprite_load(const char* filename); int sprite_save(Sprite* sprite); /* low-level routines to load/save sprites */ diff --git a/src/file/fli_format.cpp b/src/file/fli_format.cpp index e0f6b99f0..2b9ecdde2 100644 --- a/src/file/fli_format.cpp +++ b/src/file/fli_format.cpp @@ -54,7 +54,7 @@ static bool load_FLI(FileOp *fop) cmap[c*3+2], 255)); \ } \ pal->setFrame(frpos_out); \ - sprite_set_palette(sprite, pal, true); \ + sprite->setPalette(pal, true); \ } while (0) unsigned char cmap[768]; @@ -102,19 +102,19 @@ static bool load_FLI(FileOp *fop) return false; } - /* create the image */ + // Create the image sprite = new Sprite(IMAGE_INDEXED, w, h, 256); layer = new LayerImage(sprite); - sprite->get_folder()->add_layer(layer); + sprite->getFolder()->add_layer(layer); layer->configure_as_background(); - /* set frames and speed */ - sprite_set_frames(sprite, fli_header.frames); - sprite_set_speed(sprite, fli_header.speed); + // Set frames and speed + sprite->setTotalFrames(fli_header.frames); + sprite->setDurationForAllFrames(fli_header.speed); /* write frame by frame */ for (frpos_in=frpos_out=0; - frpos_inframes; + frpos_ingetTotalFrames(); frpos_in++) { /* read the frame */ fli_read_frame(f, &fli_header, @@ -139,7 +139,7 @@ static bool load_FLI(FileOp *fop) break; } - index = stock_add_image(sprite->stock, image); + index = stock_add_image(sprite->getStock(), image); if (index < 0) { image_free(image); fop_error(fop, _("Not enough memory\n")); @@ -173,10 +173,10 @@ static bool load_FLI(FileOp *fop) layer_add_cel(layer, cel); } #endif - /* the palette and the image don't change: add duration to the last added frame */ + // The palette and the image don't change: add duration to the last added frame else { - sprite_set_frlen(sprite, frpos_out, - sprite_get_frlen(sprite, frpos_out)+fli_header.speed); + sprite->setFrameDuration(frpos_out, + sprite->getFrameDuration(frpos_out)+fli_header.speed); } /* update the old image and color-map to the new ones to compare later */ @@ -184,7 +184,7 @@ static bool load_FLI(FileOp *fop) memcpy(omap, cmap, 768); /* update progress */ - fop_progress(fop, (float)(frpos_in+1) / (float)(sprite->frames)); + fop_progress(fop, (float)(frpos_in+1) / (float)(sprite->getTotalFrames())); if (fop_is_stop(fop)) break; @@ -193,13 +193,13 @@ static bool load_FLI(FileOp *fop) break; } - /* update sprites frames */ - sprite_set_frames(sprite, frpos_out+1); + // Update number of frames + sprite->setTotalFrames(frpos_out+1); - /* close the file */ + // Close the file fclose(f); - /* destroy the bitmaps */ + // Destroy the bitmaps image_free(bmp); image_free(old); delete pal; @@ -223,8 +223,8 @@ static bool save_FLI(FileOp *fop) /* prepare fli header */ fli_header.filesize = 0; fli_header.frames = 0; - fli_header.width = sprite->w; - fli_header.height = sprite->h; + fli_header.width = sprite->getWidth(); + fli_header.height = sprite->getHeight(); if ((fli_header.width == 320) && (fli_header.height == 200)) fli_header.magic = HEADER_FLI; @@ -248,8 +248,8 @@ static bool save_FLI(FileOp *fop) fseek(f, 128, SEEK_SET); /* create the bitmaps */ - bmp = image_new(IMAGE_INDEXED, sprite->w, sprite->h); - old = image_new(IMAGE_INDEXED, sprite->w, sprite->h); + bmp = image_new(IMAGE_INDEXED, sprite->getWidth(), sprite->getHeight()); + old = image_new(IMAGE_INDEXED, sprite->getWidth(), sprite->getHeight()); if ((!bmp) || (!old)) { fop_error(fop, _("Not enough memory for temporary bitmaps.\n")); if (bmp) image_free(bmp); @@ -260,10 +260,10 @@ static bool save_FLI(FileOp *fop) /* write frame by frame */ for (frpos=0; - frposframes; + frposgetTotalFrames(); frpos++) { /* get color map */ - pal = sprite_get_palette(sprite, frpos); + pal = sprite->getPalette(frpos); for (c=0; c<256; c++) { cmap[3*c ] = _rgba_getr(pal->getEntry(c)); cmap[3*c+1] = _rgba_getg(pal->getEntry(c)); @@ -272,11 +272,11 @@ static bool save_FLI(FileOp *fop) /* render the frame in the bitmap */ image_clear(bmp, 0); - layer_render(sprite->get_folder(), bmp, 0, 0, frpos); + layer_render(sprite->getFolder(), bmp, 0, 0, frpos); /* how many times this frame should be written to get the same time that it has in the sprite */ - times = sprite_get_frlen(sprite, frpos) / fli_header.speed; + times = sprite->getFrameDuration(frpos) / fli_header.speed; for (c=0; cframes)); + fop_progress(fop, (float)(frpos+1) / (float)(sprite->getTotalFrames())); } /* write the header and close the file */ @@ -313,8 +313,8 @@ static int get_time_precision(Sprite *sprite) int precision = 1000; int c, len; - for (c = 0; c < sprite->frames && precision > 1; c++) { - len = sprite_get_frlen(sprite, c); + for (c = 0; c < sprite->getTotalFrames() && precision > 1; c++) { + len = sprite->getFrameDuration(c); while (len / precision == 0) precision /= 10; diff --git a/src/file/gif_format.cpp b/src/file/gif_format.cpp index 5b9a7e498..cc64d78ff 100644 --- a/src/file/gif_format.cpp +++ b/src/file/gif_format.cpp @@ -109,7 +109,7 @@ static bool load_GIF(FileOp *fop) goto error; } - sprite_set_frames(sprite, gif->frames_count); + sprite->setTotalFrames(gif->frames_count); layer = new LayerImage(sprite); if (!layer) { @@ -117,7 +117,7 @@ static bool load_GIF(FileOp *fop) goto error; } - sprite->get_folder()->add_layer(layer); + sprite->getFolder()->add_layer(layer); layer->configure_as_background(); image_clear(current_image, gif->background_index); @@ -131,7 +131,7 @@ static bool load_GIF(FileOp *fop) pal = &gif->palette; /* 1/100th seconds to milliseconds */ - sprite_set_frlen(sprite, i, gif->frames[i].duration*10); + sprite->setFrameDuration(i, gif->frames[i].duration*10); /* make the palette */ for (c=0; ccolors_count; c++) { @@ -150,7 +150,7 @@ static bool load_GIF(FileOp *fop) /* first frame or palette changes */ if (i == 0 || opal->countDiff(npal, NULL, NULL)) { npal->setFrame(i); - sprite_set_palette(sprite, npal, true); + sprite->setPalette(npal, true); } /* copy new palette to old palette */ @@ -162,7 +162,7 @@ static bool load_GIF(FileOp *fop) gif->frames[i].w, gif->frames[i].h #else - sprite->w, sprite->h + sprite->getWidth(), sprite->getHeight() #endif ); if (!cel || !image) { @@ -195,7 +195,7 @@ static bool load_GIF(FileOp *fop) 0, 0 #endif ); - cel->image = stock_add_image(sprite->stock, image); + cel->image = stock_add_image(sprite->getStock(), image); layer->add_cel(cel); #ifdef LOAD_GIF_STRUCTURE @@ -291,8 +291,8 @@ static bool save_GIF(FileOp *fop) int w, h; int ret; - bmp = image_new(IMAGE_INDEXED, sprite->w, sprite->h); - old = image_new(IMAGE_INDEXED, sprite->w, sprite->h); + bmp = image_new(IMAGE_INDEXED, sprite->getWidth(), sprite->getHeight()); + old = image_new(IMAGE_INDEXED, sprite->getWidth(), sprite->getHeight()); if (!bmp || !old) { if (bmp) image_free(bmp); if (old) image_free(old); @@ -300,7 +300,7 @@ static bool save_GIF(FileOp *fop) return false; } - gif = gif_create_animation(sprite->frames); + gif = gif_create_animation(sprite->getTotalFrames()); if (!gif) { image_free(bmp); image_free(old); @@ -308,8 +308,8 @@ static bool save_GIF(FileOp *fop) return false; } - gif->width = sprite->w; - gif->height = sprite->h; + gif->width = sprite->getWidth(); + gif->height = sprite->getHeight(); gif->background_index = 0; /* defaults: @@ -324,13 +324,13 @@ static bool save_GIF(FileOp *fop) x1 = y1 = x2 = y2 = 0; opal = NULL; - for (i=0; iframes; ++i) { + for (i=0; igetTotalFrames(); ++i) { /* frame palette */ - npal = sprite_get_palette(sprite, i); + npal = sprite->getPalette(i); /* render the frame in the bitmap */ image_clear(bmp, 0); - layer_render(sprite->get_folder(), bmp, 0, 0, i); + layer_render(sprite->getFolder(), bmp, 0, 0, i); /* first frame */ if (i == 0) { @@ -424,7 +424,7 @@ static bool save_GIF(FileOp *fop) gif->frames[i].yoff = y1; /* milliseconds to 1/100th seconds */ - gif->frames[i].duration = sprite_get_frlen(sprite, i)/10; + gif->frames[i].duration = sprite->getFrameDuration(i)/10; /* image data */ for (y = 0; y < h; y++) { diff --git a/src/file/ico_format.cpp b/src/file/ico_format.cpp index bad1d35dd..7662af05c 100644 --- a/src/file/ico_format.cpp +++ b/src/file/ico_format.cpp @@ -51,7 +51,7 @@ static bool save_ICO(FileOp *fop) int depth, bpp, bw, bitsw; int size, offset, n, i; int c, x, y, b, m, v; - int num = fop->sprite->frames; + int num = fop->sprite->getTotalFrames(); Image *bmp; f = fopen(fop->filename, "wb"); @@ -68,16 +68,16 @@ static bool save_ICO(FileOp *fop) for (n=0; nsprite->w * bpp / 8) + 3) / 4) * 4; - bitsw = ((((fop->sprite->w + 7) / 8) + 3) / 4) * 4; - size = fop->sprite->h * (bw + bitsw) + 40; + bw = (((fop->sprite->getWidth() * bpp / 8) + 3) / 4) * 4; + bitsw = ((((fop->sprite->getWidth() + 7) / 8) + 3) / 4) * 4; + size = fop->sprite->getHeight() * (bw + bitsw) + 40; if (bpp == 8) size += 256 * 4; /* ICONDIRENTRY */ - fputc(fop->sprite->w, f); /* width */ - fputc(fop->sprite->h, f); /* height */ + fputc(fop->sprite->getWidth(), f); /* width */ + fputc(fop->sprite->getHeight(), f); /* height */ fputc(0, f); /* color count */ fputc(0, f); /* reserved */ fputw(1, f); /* color planes */ @@ -88,13 +88,13 @@ static bool save_ICO(FileOp *fop) offset += size; } - bmp = image_new(fop->sprite->imgtype, - fop->sprite->w, - fop->sprite->h); + bmp = image_new(fop->sprite->getImgType(), + fop->sprite->getWidth(), + fop->sprite->getHeight()); for (n=0; nsprite->get_folder(), bmp, 0, 0, n); + layer_render(fop->sprite->getFolder(), bmp, 0, 0, n); depth = 8; /* bitmap_color_depth(bmp); */ bpp = (depth == 8) ? 8 : 24; @@ -120,7 +120,7 @@ static bool save_ICO(FileOp *fop) /* PALETTE */ if (bpp == 8) { - Palette *pal = sprite_get_palette(fop->sprite, n); + Palette *pal = fop->sprite->getPalette(n); fputl(0, f); /* color 0 is black, so the XOR mask works */ diff --git a/src/file/png_format.cpp b/src/file/png_format.cpp index 8b1371215..8a6aa12f2 100644 --- a/src/file/png_format.cpp +++ b/src/file/png_format.cpp @@ -355,12 +355,12 @@ static bool save_PNG(FileOp *fop) switch (image->imgtype) { case IMAGE_RGB: - color_type = sprite_need_alpha(fop->sprite) ? + color_type = fop->sprite->needAlpha() ? PNG_COLOR_TYPE_RGB_ALPHA: PNG_COLOR_TYPE_RGB; break; case IMAGE_GRAYSCALE: - color_type = sprite_need_alpha(fop->sprite) ? + color_type = fop->sprite->needAlpha() ? PNG_COLOR_TYPE_GRAY_ALPHA: PNG_COLOR_TYPE_GRAY; break; diff --git a/src/modules/editors.cpp b/src/modules/editors.cpp index 4b343bb2c..361140dfd 100644 --- a/src/modules/editors.cpp +++ b/src/modules/editors.cpp @@ -121,8 +121,8 @@ void editors_draw_sprite_tiled(const Sprite* sprite, int x1, int y1, int x2, int #else cx1 = 0; cy1 = 0; - cx2 = cx1+sprite->w-1; - cy2 = cy1+sprite->h-1; + cx2 = cx1+sprite->getWidth()-1; + cy2 = cy1+sprite->getHeight()-1; #endif lx1 = MAX(x1, cx1); @@ -156,7 +156,7 @@ void editors_draw_sprite_tiled(const Sprite* sprite, int x1, int y1, int x2, int #else editors_draw_sprite_tiled(sprite, cx1, y1, - MIN(lx1-1, x2-sprite->w), y2); + MIN(lx1-1, x2-sprite->getWidth()), y2); #endif } @@ -169,7 +169,7 @@ void editors_draw_sprite_tiled(const Sprite* sprite, int x1, int y1, int x2, int #else editors_draw_sprite_tiled(sprite, x1, cy1, - x2, MIN(ly1-1, y2-sprite->h)); + x2, MIN(ly1-1, y2-sprite->getHeight())); #endif } } diff --git a/src/modules/gui.cpp b/src/modules/gui.cpp index 4e483e6f2..bf913a4c9 100644 --- a/src/modules/gui.cpp +++ b/src/modules/gui.cpp @@ -459,7 +459,7 @@ void update_screen_for_sprite(const Sprite* sprite) /* with a sprite */ else { /* select the palette of the sprite */ - if (set_current_palette(sprite_get_palette(sprite, sprite->frame), false)) { + if (set_current_palette(sprite->getPalette(sprite->getCurrentFrame()), false)) { /* if the palette changes, refresh the whole screen */ jmanager_refresh_screen(); } diff --git a/src/modules/palettes.cpp b/src/modules/palettes.cpp index 7601401be..57486cd94 100644 --- a/src/modules/palettes.cpp +++ b/src/modules/palettes.cpp @@ -104,9 +104,9 @@ void set_default_palette(Palette* palette) * @param palette If "palette" is NULL will be used the default one * (ase_default_palette) */ -bool set_current_palette(Palette *_palette, bool forced) +bool set_current_palette(const Palette *_palette, bool forced) { - Palette *palette = _palette ? _palette: ase_default_palette; + const Palette *palette = _palette ? _palette: ase_default_palette; bool ret = false; /* have changes */ diff --git a/src/modules/palettes.h b/src/modules/palettes.h index 9e38b7acb..5b5552f30 100644 --- a/src/modules/palettes.h +++ b/src/modules/palettes.h @@ -35,7 +35,7 @@ Palette* get_default_palette(); Palette* get_current_palette(); void set_default_palette(Palette* palette); -bool set_current_palette(Palette* palette, bool forced); +bool set_current_palette(const Palette* palette, bool forced); void set_black_palette(); void set_current_color(int index, int r, int g, int b); diff --git a/src/raster/layer.cpp b/src/raster/layer.cpp index 41a528e8e..6a26a6587 100644 --- a/src/raster/layer.cpp +++ b/src/raster/layer.cpp @@ -52,7 +52,7 @@ Layer::Layer(int type, Sprite* sprite) LAYER_IS_WRITABLE; } -Layer::Layer(Layer* src_layer, Sprite* dst_sprite) +Layer::Layer(const Layer* src_layer, Sprite* dst_sprite) : GfxObj(src_layer->type) { m_sprite = dst_sprite; @@ -113,31 +113,31 @@ LayerImage::LayerImage(Sprite* sprite) m_blend_mode = BLEND_MODE_NORMAL; } -LayerImage::LayerImage(LayerImage* src_layer, Sprite* dst_sprite) +LayerImage::LayerImage(const LayerImage* src_layer, Sprite* dst_sprite) : Layer(src_layer, dst_sprite) { set_blend_mode(src_layer->get_blend_mode()); try { // copy cels - CelIterator it = static_cast(src_layer)->get_cel_begin(); - CelIterator end = static_cast(src_layer)->get_cel_end(); + CelConstIterator it = src_layer->get_cel_begin(); + CelConstIterator end = src_layer->get_cel_end(); for (; it != end; ++it) { - Cel* cel = *it; + const Cel* cel = *it; Cel* cel_copy = cel_new_copy(cel); assert((cel->image >= 0) && - (cel->image < src_layer->getSprite()->stock->nimage)); + (cel->image < src_layer->getSprite()->getStock()->nimage)); - Image* image = src_layer->getSprite()->stock->image[cel->image]; + Image* image = src_layer->getSprite()->getStock()->image[cel->image]; assert(image != NULL); Image* image_copy = image_new_copy(image); - cel_copy->image = stock_add_image(dst_sprite->stock, image_copy); - if (undo_is_enabled(dst_sprite->undo)) - undo_add_image(dst_sprite->undo, dst_sprite->stock, cel_copy->image); + cel_copy->image = stock_add_image(dst_sprite->getStock(), image_copy); + if (undo_is_enabled(dst_sprite->getUndo())) + undo_add_image(dst_sprite->getUndo(), dst_sprite->getStock(), cel_copy->image); add_cel(cel_copy); } @@ -160,11 +160,11 @@ void LayerImage::destroy_all_cels() for (; it != end; ++it) { Cel* cel = *it; - Image* image = getSprite()->stock->image[cel->image]; + Image* image = getSprite()->getStock()->image[cel->image]; assert(image != NULL); - stock_remove_image(getSprite()->stock, image); + stock_remove_image(getSprite()->getStock(), image); image_free(image); cel_free(cel); } @@ -251,12 +251,12 @@ Cel* LayerImage::get_cel(int frame) void LayerImage::configure_as_background() { assert(getSprite() != NULL); - assert(sprite_get_background_layer(getSprite()) == NULL); + assert(getSprite()->getBackgroundLayer() == NULL); *flags_addr() |= LAYER_IS_LOCKMOVE | LAYER_IS_BACKGROUND; set_name("Background"); - getSprite()->get_folder()->move_layer(this, NULL); + getSprite()->getFolder()->move_layer(this, NULL); } ////////////////////////////////////////////////////////////////////// @@ -268,12 +268,12 @@ LayerFolder::LayerFolder(Sprite* sprite) set_name("Layer Set"); } -LayerFolder::LayerFolder(LayerFolder* src_layer, Sprite* dst_sprite) +LayerFolder::LayerFolder(const LayerFolder* src_layer, Sprite* dst_sprite) : Layer(src_layer, dst_sprite) { try { - LayerIterator it = static_cast(src_layer)->get_layer_begin(); - LayerIterator end = static_cast(src_layer)->get_layer_end(); + LayerConstIterator it = src_layer->get_layer_begin(); + LayerConstIterator end = src_layer->get_layer_end(); for (; it != end; ++it) { // duplicate the child @@ -375,12 +375,12 @@ Layer* layer_new_flatten_copy(Sprite* dst_sprite, const Layer* src_layer, /* does this frame have cels to render? */ if (has_cels(src_layer, frame)) { /* create a new image */ - Image* image = image_new(flat_layer->getSprite()->imgtype, w, h); + Image* image = image_new(flat_layer->getSprite()->getImgType(), w, h); try { /* create the new cel for the output layer (add the image to stock too) */ - Cel* cel = cel_new(frame, stock_add_image(flat_layer->getSprite()->stock, image)); + Cel* cel = cel_new(frame, stock_add_image(flat_layer->getSprite()->getStock(), image)); cel_set_position(cel, x, y); /* clear the image and render this frame */ @@ -416,9 +416,9 @@ void layer_render(const Layer* layer, Image* image, int x, int y, int frame) if (cel) { assert((cel->image >= 0) && - (cel->image < layer->getSprite()->stock->nimage)); + (cel->image < layer->getSprite()->getStock()->nimage)); - src_image = layer->getSprite()->stock->image[cel->image]; + src_image = layer->getSprite()->getStock()->image[cel->image]; assert(src_image != NULL); image_merge(image, src_image, diff --git a/src/raster/layer.h b/src/raster/layer.h index 7a16cb04e..aaefa5dd1 100644 --- a/src/raster/layer.h +++ b/src/raster/layer.h @@ -48,7 +48,7 @@ class Layer : public GfxObj protected: Layer(int type, Sprite* sprite); Layer(Sprite* sprite); - Layer(Layer* src_layer, Sprite* dst_sprite); + Layer(const Layer* src_layer, Sprite* dst_sprite); public: virtual ~Layer(); @@ -75,7 +75,7 @@ public: void set_writable(bool b) { if (b) m_flags |= LAYER_IS_WRITABLE; else m_flags &= ~LAYER_IS_WRITABLE; } virtual void get_cels(CelList& cels) = 0; - virtual Layer* duplicate_for(Sprite* sprite) = 0; + virtual Layer* duplicate_for(Sprite* sprite) const = 0; // TODO remove these methods (from C backward-compatibility) unsigned short* flags_addr() { return &m_flags; } @@ -92,7 +92,7 @@ class LayerImage : public Layer public: LayerImage(Sprite* sprite); - LayerImage(LayerImage* copy, Sprite* sprite); + LayerImage(const LayerImage* copy, Sprite* sprite); virtual ~LayerImage(); int get_blend_mode() const { return m_blend_mode; } @@ -113,7 +113,7 @@ public: CelConstIterator get_cel_end() const { return m_cels.end(); } int get_cels_count() const { return m_cels.size(); } - LayerImage* duplicate_for(Sprite* sprite) { return new LayerImage(this, sprite); } + LayerImage* duplicate_for(Sprite* sprite) const { return new LayerImage(this, sprite); } private: void destroy_all_cels(); @@ -128,7 +128,7 @@ class LayerFolder : public Layer public: LayerFolder(Sprite* sprite); - LayerFolder(LayerFolder* copy, Sprite* sprite); + LayerFolder(const LayerFolder* copy, Sprite* sprite); virtual ~LayerFolder(); LayerList get_layers_list() { return m_layers; } @@ -144,7 +144,7 @@ public: void get_cels(CelList& cels); - LayerFolder* duplicate_for(Sprite* sprite) { return new LayerFolder(this, sprite); } + LayerFolder* duplicate_for(Sprite* sprite) const { return new LayerFolder(this, sprite); } private: void destroy_all_layers(); diff --git a/src/raster/sprite.cpp b/src/raster/sprite.cpp index 69565654b..d4096c82a 100644 --- a/src/raster/sprite.cpp +++ b/src/raster/sprite.cpp @@ -18,8 +18,9 @@ #include "config.h" -#include -#include +#include +#include +#include #include "jinete/jlist.h" #include "Vaca/Mutex.h" @@ -30,59 +31,425 @@ #include "raster/raster.h" #include "util/boundary.h" +#ifdef _MSC_VER + #pragma warning(disable: 4355) +#endif + using Vaca::Mutex; using Vaca::ScopedLock; -static Layer *index2layer(const Layer *layer, int index, int *index_count); -static int layer2index(const Layer *layer, const Layer *find_layer, int *index_count); -static int layer_count_layers(const Layer *layer); - -static Sprite* general_copy(const Sprite* src_sprite); +static Layer* index2layer(const Layer* layer, int index, int* index_count); +static int layer2index(const Layer* layer, const Layer* find_layer, int* index_count); ////////////////////////////////////////////////////////////////////// +// SpriteImpl -Sprite::Sprite(int imgtype, int w, int h, int ncolors) - : GfxObj(GFXOBJ_SPRITE) +class SpriteImpl { - assert(w > 0 && h > 0); +public: + SpriteImpl(Sprite* sprite, int imgtype, int width, int height, int ncolors); + ~SpriteImpl(); - /* main properties */ - strcpy(this->filename, "Sprite"); - this->associated_to_file = false; - this->imgtype = imgtype; - this->w = w; - this->h = h; - this->frames = 1; - this->frlens = (int*)jmalloc(sizeof(int)*this->frames); - this->frame = 0; - this->palettes = jlist_new(); - this->stock = stock_new(imgtype); - this->m_folder = new LayerFolder(this); - this->layer = NULL; - this->path = NULL; - this->mask = mask_new(); - this->undo = undo_new(this); - this->repository.paths = jlist_new(); - this->repository.masks = jlist_new(); - this->m_extras = NULL; + static SpriteImpl* copy(Sprite* new_sprite, const SpriteImpl* src_sprite); + static SpriteImpl* copyBase(Sprite* new_sprite, const SpriteImpl* src_sprite); - /* boundary stuff */ - this->bound.nseg = 0; - this->bound.seg = NULL; + bool lock(bool write); + bool lockToWrite(); + void unlockToRead(); + void unlock(); - /* preferred edition options */ - this->preferred.scroll_x = 0; - this->preferred.scroll_y = 0; - this->preferred.zoom = 0; + int getImgType() const { + return m_imgtype; + } + + void setImgType(int imgtype) { + m_imgtype = imgtype; + } + + int getWidth() const { + return m_width; + } + + int getHeight() const { + return m_height; + } + + void setSize(int width, int height) { + assert(width > 0); + assert(height > 0); + + m_width = width; + m_height = height; + } + + const char* getFilename() const { + return m_filename.c_str(); + } + + void setFilename(const char* filename) { + m_filename = filename; + } + + bool isModified() const { + return (m_undo->diff_count == + m_undo->diff_saved) ? false: true; + } + + bool isAssociatedToFile() const { + return m_associated_to_file; + } + + void markAsSaved() { + m_undo->diff_saved = m_undo->diff_count; + m_associated_to_file = true; + } + + bool needAlpha() const { + switch (m_imgtype) { + case IMAGE_RGB: + case IMAGE_GRAYSCALE: + return (getBackgroundLayer() == NULL); + } + return false; + } + + int getMemSize() const; + + const LayerFolder* getFolder() const { + return m_folder; + } + + LayerFolder* getFolder() { + return m_folder; + } + + const LayerImage* getBackgroundLayer() const; + LayerImage* getBackgroundLayer(); + + const Layer* getCurrentLayer() const { + return m_layer; + } + + Layer* getCurrentLayer() { + return m_layer; + } + + void setCurrentLayer(Layer* layer) { + m_layer = layer; + } + + int countLayers() const { + return getFolder()->get_layers_count(); + } + + const Layer* indexToLayer(int index) const { + int index_count = -1; + return index2layer(getFolder(), index, &index_count); + } + + Layer* indexToLayer(int index) { + int index_count = -1; + return index2layer(getFolder(), index, &index_count); + } + + int layerToIndex(const Layer* layer) const { + int index_count = -1; + return layer2index(getFolder(), layer, &index_count); + } + + const Palette* getPalette(int frame) const; + + Palette* getPalette(int frame); + + JList getPalettes() { + return m_palettes; + } + + void setPalette(Palette* pal, bool truncate); + void resetPalettes(); + void deletePalette(Palette* pal); + + const Palette* getCurrentPalette() const { + return getPalette(getCurrentFrame()); + } + + Palette* getCurrentPalette() { + return getPalette(getCurrentFrame()); + } + + int getTotalFrames() const { + return m_frames; + } + + void setTotalFrames(int frames); + + int getFrameDuration(int frame) const { + if (frame >= 0 && frame < m_frames) + return m_frlens[frame]; + else + return 0; + } + + void setFrameDuration(int frame, int msecs) { + if (frame >= 0 && frame < m_frames) + m_frlens[frame] = MID(1, msecs, 65535); + } + + void setDurationForAllFrames(int msecs) { + std::fill(m_frlens.begin(), m_frlens.end(), MID(1, msecs, 65535)); + } + + int getCurrentFrame() const { + return m_frame; + } + + void setCurrentFrame(int frame) { + m_frame = frame; + } + + const Stock* getStock() const { + return m_stock; + } + + Stock* getStock() { + return m_stock; + } + + const Image* getCurrentImage(int* x, int* y, int* opacity) const { + const Image* image = NULL; + + if (getCurrentLayer() != NULL && + getCurrentLayer()->is_image()) { + const Cel* cel = static_cast(getCurrentLayer())->get_cel(getCurrentFrame()); + if (cel) { + assert((cel->image >= 0) && + (cel->image < getStock()->nimage)); + + image = getStock()->image[cel->image]; + + if (x) *x = cel->x; + if (y) *y = cel->y; + if (opacity) *opacity = MID(0, cel->opacity, 255); + } + } + + return image; + } + + Image* getCurrentImage(int* x, int* y, int* opacity) { + Image* image = NULL; + + if (getCurrentLayer() != NULL && + getCurrentLayer()->is_image()) { + Cel* cel = static_cast(getCurrentLayer())->get_cel(getCurrentFrame()); + if (cel) { + assert((cel->image >= 0) && + (cel->image < getStock()->nimage)); + + image = getStock()->image[cel->image]; + + if (x) *x = cel->x; + if (y) *y = cel->y; + if (opacity) *opacity = MID(0, cel->opacity, 255); + } + } + + return image; + } + + void getCels(CelList& cels) { + getFolder()->get_cels(cels); + } + + const Undo* getUndo() const { + return m_undo; + } + + Undo* getUndo() { + return m_undo; + } + + const Mask* getMask() const { + return m_mask; + } + + Mask* getMask() { + return m_mask; + } + + void setMask(const Mask* mask) { + if (m_mask) + mask_free(m_mask); + + m_mask = mask_new_copy(mask); + } + + void addMask(Mask* mask) { + if (!mask->name) // You can't add masks to repository without name + return; + + if (requestMask(mask->name)) // You can't add a mask that already exists + return; + + // And add the new mask + jlist_append(m_repository.masks, mask); + } + + void removeMask(Mask* mask) { + // Remove the mask from the repository + jlist_remove(m_repository.masks, mask); + } + + Mask* requestMask(const char* name) const; + + void generateMaskBoundaries(Mask* mask = NULL); + + JList getMasksRepository() { + return m_repository.masks; + } + + void addPath(Path* path) { + jlist_append(m_repository.paths, path); + } + + void removePath(Path* path) { + jlist_remove(m_repository.paths, path); + } + + void setPath(const Path* path) { + if (m_path) + path_free(m_path); + + m_path = path_new_copy(path); + } + + JList getPathsRepository() { + return m_repository.paths; + } + + void setFormatOptions(FormatOptions* format_options) { + if (m_format_options) + jfree(m_format_options); + + m_format_options = format_options; + } + + void render(Image* image, int x, int y) const { + image_rectfill(image, x, y, x+m_width-1, y+m_height-1, 0); + layer_render(getFolder(), image, x, y, getCurrentFrame()); + } + + int getPixel(int x, int y) const; + + PreferredEditorSettings getPreferredEditorSettings() const { + return m_preferred; + } + + void setPreferredEditorSettings(const PreferredEditorSettings& settings) { + m_preferred = settings; + } + + int getBoundariesSegmentsCount() const { + return m_bound.nseg; + } + + const _BoundSeg* getBoundariesSegments() const { + return m_bound.seg; + } + + void prepareExtra(); + Image* getExtras() { return m_extras; } + int getExtrasOpacity() const { return m_extras_opacity; } + void setExtrasOpacity(int opacity) { m_extras_opacity = opacity; } + +private: + Sprite* m_self; // pointer to the Sprite + int m_imgtype; // image type + int m_width; // image width (in pixels) + int m_height; // image height (in pixels) + std::string m_filename; // sprite's file name + bool m_associated_to_file; // true if this sprite is associated to a file in the file-system + int m_frames; // how many frames has this sprite + std::vector m_frlens; // duration per frame + int m_frame; // current frame, range [0,frames) + JList m_palettes; // list of palettes + Stock* m_stock; // stock to get images + LayerFolder* m_folder; // main folder of layers + Layer* m_layer; // current layer + Path* m_path; // working path + Mask* m_mask; // selected mask region + Undo* m_undo; // undo stack + struct { + JList paths; // paths + JList masks; // masks + } m_repository; + + // Selected mask region boundaries + struct { + int nseg; + _BoundSeg* seg; + } m_bound; + + PreferredEditorSettings m_preferred; + + Image* m_extras; // Image with the sprite size to draw some extra stuff (e.g. editor's cursor) + int m_extras_opacity; // Opacity to be used to draw the extra image + + // Mutex to modify the 'locked' flag. + Vaca::Mutex* m_mutex; + + // True if some thread is writing the sprite. + bool m_write_lock; + + // Greater than zero when one or more threads are reading the sprite. + int m_read_locks; + + // Data to save the file in the same format that it was loaded + FormatOptions* m_format_options; +}; + +SpriteImpl::SpriteImpl(Sprite* sprite, int imgtype, int width, int height, int ncolors) + : m_self(sprite) + , m_imgtype(imgtype) + , m_width(width) + , m_height(height) + , m_filename("Sprite") +{ + assert(width > 0 && height > 0); + + m_associated_to_file = false; + m_frames = 1; + m_frlens.push_back(100); // First frame with 100 msecs of duration + m_frame = 0; + m_palettes = jlist_new(); + m_stock = stock_new(imgtype); + m_folder = new LayerFolder(m_self); + m_layer = NULL; + m_path = NULL; + m_mask = mask_new(); + m_undo = undo_new(m_self); + m_repository.paths = jlist_new(); + m_repository.masks = jlist_new(); + m_extras = NULL; + + // Boundary stuff + m_bound.nseg = 0; + m_bound.seg = NULL; + + // Preferred edition options + m_preferred.scroll_x = 0; + m_preferred.scroll_y = 0; + m_preferred.zoom = 0; // Generate palette - Palette* pal = new Palette(0, ncolors); + Palette pal(0, ncolors); + switch (imgtype) { // For colored images case IMAGE_RGB: case IMAGE_INDEXED: - get_default_palette()->copyColorsTo(pal); + get_default_palette()->copyColorsTo(&pal); break; // For black and white images @@ -91,220 +458,167 @@ Sprite::Sprite(int imgtype, int w, int h, int ncolors) for (int c=0; csetEntry(c, _rgba(g, g, g, 255)); + pal.setEntry(c, _rgba(g, g, g, 255)); } break; } - sprite_set_palette(this, pal, true); - sprite_set_speed(this, 100); - /* multiple access */ + // Multiple access m_write_lock = false; m_read_locks = 0; m_mutex = new Mutex(); // File format options - this->format_options = NULL; + m_format_options = NULL; - // Free the temporary palette - delete pal; + setPalette(&pal, true); } -Sprite::~Sprite() +SpriteImpl* SpriteImpl::copy(Sprite* sprite, const SpriteImpl* src_sprite) { - JLink link; + SpriteImpl* dst_sprite = copyBase(sprite, src_sprite); - // destroy layers - delete m_folder; // destroy layers - - // destroy images' stock - if (this->stock) - stock_free(this->stock); - - /* destroy paths */ - if (this->repository.paths) { - JI_LIST_FOR_EACH(this->repository.paths, link) - path_free(reinterpret_cast(link->data)); - - jlist_free(this->repository.paths); - } - - /* destroy masks */ - if (this->repository.masks) { - JI_LIST_FOR_EACH(this->repository.masks, link) - mask_free(reinterpret_cast(link->data)); - - jlist_free(this->repository.masks); - } - - /* destroy palettes */ - if (this->palettes) { - JI_LIST_FOR_EACH(this->palettes, link) - delete reinterpret_cast(link->data); - - jlist_free(this->palettes); - } - - // destroy undo, mask, etc. - delete this->undo; - delete this->mask; - delete this->m_extras; // image - if (this->frlens) jfree(this->frlens); - if (this->bound.seg) jfree(this->bound.seg); - delete this->m_mutex; - - /* destroy file format options */ - if (this->format_options) - format_options_free(this->format_options); -} - -////////////////////////////////////////////////////////////////////// - -Sprite* sprite_new_copy(const Sprite* src_sprite) -{ - assert(src_sprite != NULL); - - Sprite* dst_sprite = general_copy(src_sprite); - if (!dst_sprite) - return NULL; - - /* copy layers */ + // Copy layers if (dst_sprite->m_folder) { delete dst_sprite->m_folder; // delete dst_sprite->m_folder = NULL; } - assert(src_sprite->get_folder() != NULL); + assert(src_sprite->getFolder() != NULL); - undo_disable(dst_sprite->undo); - dst_sprite->m_folder = src_sprite->get_folder()->duplicate_for(dst_sprite); - undo_enable(dst_sprite->undo); + undo_disable(dst_sprite->getUndo()); + dst_sprite->m_folder = src_sprite->getFolder()->duplicate_for(dst_sprite->m_self); + undo_enable(dst_sprite->getUndo()); if (dst_sprite->m_folder == NULL) { delete dst_sprite; return NULL; } - /* selected layer */ - if (src_sprite->layer != NULL) { - int selected_layer = sprite_layer2index(src_sprite, src_sprite->layer); - dst_sprite->layer = sprite_index2layer(dst_sprite, selected_layer); + // Selected layer + if (src_sprite->getCurrentLayer() != NULL) { + int selected_layer = src_sprite->layerToIndex(src_sprite->getCurrentLayer()); + dst_sprite->setCurrentLayer(dst_sprite->indexToLayer(selected_layer)); } - sprite_generate_mask_boundaries(dst_sprite); + dst_sprite->generateMaskBoundaries(); return dst_sprite; } -Sprite* sprite_new_flatten_copy(const Sprite* src_sprite) +/** + * Makes a copy "sprite" without the layers (only with the empty layer set) + */ +SpriteImpl* SpriteImpl::copyBase(Sprite* new_sprite, const SpriteImpl* src_sprite) { - Sprite* dst_sprite; - Layer *flat_layer; + JLink link; + SpriteImpl* dst_sprite = new SpriteImpl(new_sprite, + src_sprite->m_imgtype, + src_sprite->m_width, src_sprite->m_height, + src_sprite->getPalette(0)->size()); - assert(src_sprite != NULL); - - dst_sprite = general_copy(src_sprite); - if (dst_sprite == NULL) - return NULL; - - /* flatten layers */ - assert(src_sprite->get_folder() != NULL); - - flat_layer = layer_new_flatten_copy(dst_sprite, - src_sprite->get_folder(), - 0, 0, src_sprite->w, src_sprite->h, - 0, src_sprite->frames-1); - if (flat_layer == NULL) { + // Copy stock + stock_free(dst_sprite->m_stock); + dst_sprite->m_stock = stock_new_copy(src_sprite->m_stock); + if (!dst_sprite->m_stock) { delete dst_sprite; return NULL; } - /* add and select the new flat layer */ - dst_sprite->get_folder()->add_layer(flat_layer); - dst_sprite->layer = flat_layer; + /* copy general properties */ + dst_sprite->m_filename = src_sprite->m_filename; + dst_sprite->setTotalFrames(src_sprite->m_frames); + std::copy(src_sprite->m_frlens.begin(), + src_sprite->m_frlens.end(), + dst_sprite->m_frlens.begin()); + + // Copy color palettes + JI_LIST_FOR_EACH(src_sprite->m_palettes, link) { + Palette* pal = reinterpret_cast(link->data); + dst_sprite->setPalette(pal, true); + } + + // Copy path + if (dst_sprite->m_path) { + path_free(dst_sprite->m_path); + dst_sprite->m_path = NULL; + } + + if (src_sprite->m_path) + dst_sprite->m_path = path_new_copy(src_sprite->m_path); + + // Copy mask + if (dst_sprite->m_mask) { + mask_free(dst_sprite->m_mask); + dst_sprite->m_mask = NULL; + } + + if (src_sprite->m_mask) + dst_sprite->m_mask = mask_new_copy(src_sprite->m_mask); + + /* copy repositories */ + JI_LIST_FOR_EACH(src_sprite->m_repository.paths, link) { + Path* path_copy = path_new_copy(reinterpret_cast(link->data)); + if (path_copy) + dst_sprite->addPath(path_copy); + } + + JI_LIST_FOR_EACH(src_sprite->m_repository.masks, link) { + Mask* mask_copy = mask_new_copy(reinterpret_cast(link->data)); + if (mask_copy) + dst_sprite->addMask(mask_copy); + } + + // Copy preferred edition options + dst_sprite->m_preferred = src_sprite->m_preferred; return dst_sprite; } -Sprite* sprite_new_with_layer(int imgtype, int w, int h, int ncolors) +SpriteImpl::~SpriteImpl() { - Sprite* sprite = NULL; - LayerImage *layer = NULL; - Image *image = NULL; - Cel *cel = NULL; + JLink link; - try { - sprite = new Sprite(imgtype, w, h, ncolors); - image = image_new(imgtype, w, h); - layer = new LayerImage(sprite); + // Destroy layers + delete m_folder; - /* clear with mask color */ - image_clear(image, 0); + // Destroy images' stock + if (m_stock) + stock_free(m_stock); - /* configure the first transparent layer */ - layer->set_name("Layer 1"); - layer->set_blend_mode(BLEND_MODE_NORMAL); + // Destroy paths + if (m_repository.paths) { + JI_LIST_FOR_EACH(m_repository.paths, link) + path_free(reinterpret_cast(link->data)); - /* add image in the layer stock */ - int index = stock_add_image(sprite->stock, image); - - /* create the cel */ - cel = cel_new(0, index); - cel_set_position(cel, 0, 0); - - /* add the cel in the layer */ - layer->add_cel(cel); - - /* add the layer in the sprite */ - sprite->get_folder()->add_layer(layer); - - sprite_set_frames(sprite, 1); - sprite_set_filename(sprite, "Sprite"); - sprite_set_layer(sprite, layer); - } - catch (...) { - delete sprite; - delete image; - throw; + jlist_free(m_repository.paths); } - return sprite; -} - -bool sprite_is_modified(const Sprite* sprite) -{ - assert(sprite != NULL); - - return (sprite->undo->diff_count == - sprite->undo->diff_saved) ? false: true; -} - -bool sprite_is_associated_to_file(const Sprite* sprite) -{ - assert(sprite != NULL); - - return sprite->associated_to_file; -} - -void sprite_mark_as_saved(Sprite* sprite) -{ - assert(sprite != NULL); - - sprite->undo->diff_saved = sprite->undo->diff_count; - sprite->associated_to_file = true; -} - -bool sprite_need_alpha(const Sprite* sprite) -{ - assert(sprite != NULL); - - switch (sprite->imgtype) { - - case IMAGE_RGB: - case IMAGE_GRAYSCALE: - return sprite_get_background_layer(sprite) == NULL; + // Destroy masks + if (m_repository.masks) { + JI_LIST_FOR_EACH(m_repository.masks, link) + mask_free(reinterpret_cast(link->data)); + jlist_free(m_repository.masks); } - return false; + + // Destroy palettes + if (m_palettes) { + JI_LIST_FOR_EACH(m_palettes, link) + delete reinterpret_cast(link->data); + + jlist_free(m_palettes); + } + + // Destroy undo, mask, etc. + delete m_undo; + delete m_mask; + delete m_extras; // image + if (m_bound.seg) jfree(m_bound.seg); + delete m_mutex; + + // Destroy file format options + if (m_format_options) + format_options_free(m_format_options); } /** @@ -312,7 +626,7 @@ bool sprite_need_alpha(const Sprite* sprite) * * @return true if the sprite can be accessed in the desired mode. */ -bool Sprite::lock(bool write) +bool SpriteImpl::lock(bool write) { ScopedLock lock(*m_mutex); @@ -342,7 +656,7 @@ bool Sprite::lock(bool write) * If you have locked the sprite to read, using this method * you can raise your access level to write it. */ -bool Sprite::lock_to_write() +bool SpriteImpl::lockToWrite() { ScopedLock lock(*m_mutex); @@ -361,7 +675,7 @@ bool Sprite::lock_to_write() * If you have locked the sprite to write, using this method * you can your access level to only read it. */ -void Sprite::unlock_to_read() +void SpriteImpl::unlockToRead() { ScopedLock lock(*m_mutex); @@ -372,7 +686,7 @@ void Sprite::unlock_to_read() m_read_locks = 1; } -void Sprite::unlock() +void SpriteImpl::unlock() { ScopedLock lock(*m_mutex); @@ -387,28 +701,145 @@ void Sprite::unlock() } } -void Sprite::prepare_extra() +int SpriteImpl::getMemSize() const { - if (!m_extras || - m_extras->imgtype != imgtype || - m_extras->w != w || - m_extras->h != h) { - delete m_extras; // image - m_extras = image_new(imgtype, w, h); - image_clear(m_extras, m_extras->mask_color = 0); + Image *image; + int i, size = 0; + + for (i=0; inimage; i++) { + image = m_stock->image[i]; + + if (image != NULL) + size += image_line_size(image, image->w) * image->h; + } + + return size; +} + +const LayerImage* SpriteImpl::getBackgroundLayer() const +{ + if (getFolder()->get_layers_count() > 0) { + const Layer* bglayer = *getFolder()->get_layer_begin(); + + if (bglayer->is_background()) + return static_cast(bglayer); + } + return NULL; +} + +LayerImage* SpriteImpl::getBackgroundLayer() +{ + if (getFolder()->get_layers_count() > 0) { + Layer* bglayer = *getFolder()->get_layer_begin(); + + if (bglayer->is_background()) + return static_cast(bglayer); + } + return NULL; +} + +void SpriteImpl::setTotalFrames(int frames) +{ + frames = MAX(1, frames); + m_frlens.resize(frames); + + if (frames > m_frames) { + int c; + for (c=m_frames; c(link->data); + if (strcmp(mask->name, name) == 0) + return mask; + } + + return NULL; +} + + +void SpriteImpl::generateMaskBoundaries(Mask* mask) +{ + // No mask specified? Use the current one in the sprite + if (!mask) + mask = m_mask; + + if (m_bound.seg) { + jfree(m_bound.seg); + m_bound.seg = NULL; + m_bound.nseg = 0; + } + + assert(mask != NULL); + + if (mask->bitmap) { + m_bound.seg = find_mask_boundary(mask->bitmap, + &m_bound.nseg, + IgnoreBounds, 0, 0, 0, 0); + for (int c=0; cx; + m_bound.seg[c].y1 += mask->y; + m_bound.seg[c].x2 += mask->x; + m_bound.seg[c].y2 += mask->y; + } } } -Palette* sprite_get_palette(const Sprite* sprite, int frame) +int SpriteImpl::getPixel(int x, int y) const +{ + int color = 0; + + if ((x >= 0) && (y >= 0) && (x < m_width) && (y < m_height)) { + Image* image = image_new(m_imgtype, 1, 1); + image_clear(image, 0); + this->render(image, -x, -y); + color = image_getpixel(image, 0, 0); + image_free(image); + } + + return color; +} + +const Palette* SpriteImpl::getPalette(int frame) const +{ + const Palette* found = NULL; + const Palette* pal; + JLink link; + + assert(frame >= 0); + + JI_LIST_FOR_EACH(m_palettes, link) { + pal = reinterpret_cast(link->data); + if (frame < pal->getFrame()) + break; + + found = pal; + if (frame == pal->getFrame()) + break; + } + + assert(found != NULL); + return found; +} + +Palette* SpriteImpl::getPalette(int frame) { Palette* found = NULL; Palette* pal; JLink link; - assert(sprite != NULL); assert(frame >= 0); - JI_LIST_FOR_EACH(sprite->palettes, link) { + JI_LIST_FOR_EACH(m_palettes, link) { pal = reinterpret_cast(link->data); if (frame < pal->getFrame()) break; @@ -422,20 +853,19 @@ Palette* sprite_get_palette(const Sprite* sprite, int frame) return found; } -void sprite_set_palette(Sprite* sprite, Palette* pal, bool truncate) +void SpriteImpl::setPalette(Palette* pal, bool truncate) { - assert(sprite != NULL); assert(pal != NULL); if (!truncate) { - Palette* sprite_pal = sprite_get_palette(sprite, pal->getFrame()); + Palette* sprite_pal = getPalette(pal->getFrame()); pal->copyColorsTo(sprite_pal); } else { JLink link = NULL; Palette* other; - JI_LIST_FOR_EACH(sprite->palettes, link) { + JI_LIST_FOR_EACH(m_palettes, link) { other = reinterpret_cast(link->data); if (pal->getFrame() == other->getFrame()) { @@ -446,266 +876,544 @@ void sprite_set_palette(Sprite* sprite, Palette* pal, bool truncate) break; } - jlist_insert_before(sprite->palettes, link, new Palette(*pal)); + jlist_insert_before(m_palettes, link, new Palette(*pal)); } } -/** - * Leaves the first palette only in the sprite - */ -void sprite_reset_palettes(Sprite* sprite) +void SpriteImpl::resetPalettes() { JLink link, next; - JI_LIST_FOR_EACH_SAFE(sprite->palettes, link, next) { - if (jlist_first(sprite->palettes) != link) { + JI_LIST_FOR_EACH_SAFE(m_palettes, link, next) { + if (jlist_first(m_palettes) != link) { delete reinterpret_cast(link->data); - jlist_delete_link(sprite->palettes, link); + jlist_delete_link(m_palettes, link); } } } -void sprite_delete_palette(Sprite* sprite, Palette* pal) +void SpriteImpl::deletePalette(Palette* pal) { - assert(sprite != NULL); assert(pal != NULL); - JLink link = jlist_find(sprite->palettes, pal); + JLink link = jlist_find(m_palettes, pal); assert(link != NULL); delete pal; - jlist_delete_link(sprite->palettes, link); + jlist_delete_link(m_palettes, link); +} + +void SpriteImpl::prepareExtra() +{ + if (!m_extras || + m_extras->imgtype != m_imgtype || + m_extras->w != m_width || + m_extras->h != m_height) { + delete m_extras; // image + m_extras = image_new(m_imgtype, m_width, m_height); + image_clear(m_extras, m_extras->mask_color = 0); + } +} + +////////////////////////////////////////////////////////////////////// +// Constructors/Destructor + +Sprite::Sprite() + : GfxObj(GFXOBJ_SPRITE) + , m_impl(NULL) +{ +} + +Sprite::Sprite(int imgtype, int width, int height, int ncolors) + : GfxObj(GFXOBJ_SPRITE) + , m_impl(new SpriteImpl(this, imgtype, width, height, ncolors)) +{ +} + +Sprite::~Sprite() +{ + delete m_impl; +} + +Sprite::Sprite(const Sprite& original) + : GfxObj(GFXOBJ_SPRITE) + , m_impl(SpriteImpl::copy(this, original.m_impl)) +{ +} + +Sprite* Sprite::createFlattenCopy(const Sprite& src_sprite) +{ + Sprite* dst_sprite = new Sprite(); + SpriteImpl* dst_sprite_impl = SpriteImpl::copyBase(dst_sprite, src_sprite.m_impl); + dst_sprite->m_impl = dst_sprite_impl; + + // Flatten layers + assert(src_sprite.getFolder() != NULL); + + Layer* flat_layer; + try { + flat_layer = layer_new_flatten_copy(dst_sprite, + src_sprite.getFolder(), + 0, 0, src_sprite.getWidth(), src_sprite.getHeight(), + 0, src_sprite.getTotalFrames()-1); + } + catch (const std::bad_alloc&) { + delete dst_sprite; + throw; + } + + // Add and select the new flat layer + dst_sprite->getFolder()->add_layer(flat_layer); + dst_sprite->setCurrentLayer(flat_layer); + + return dst_sprite; +} + +Sprite* Sprite::createWithLayer(int imgtype, int width, int height, int ncolors) +{ + Sprite* sprite = NULL; + LayerImage *layer = NULL; + Image *image = NULL; + Cel *cel = NULL; + + try { + sprite = new Sprite(imgtype, width, height, ncolors); + image = image_new(imgtype, width, height); + layer = new LayerImage(sprite); + + /* clear with mask color */ + image_clear(image, 0); + + /* configure the first transparent layer */ + layer->set_name("Layer 1"); + layer->set_blend_mode(BLEND_MODE_NORMAL); + + /* add image in the layer stock */ + int index = stock_add_image(sprite->getStock(), image); + + /* create the cel */ + cel = cel_new(0, index); + cel_set_position(cel, 0, 0); + + /* add the cel in the layer */ + layer->add_cel(cel); + + /* add the layer in the sprite */ + sprite->getFolder()->add_layer(layer); + + sprite->setTotalFrames(1); + sprite->setFilename("Sprite"); + sprite->setCurrentLayer(layer); + } + catch (...) { + delete sprite; + delete image; + throw; + } + + return sprite; +} + +////////////////////////////////////////////////////////////////////// +// Multi-threading ("sprite wrappers" use this) + +/** + * Lock the sprite to read or write it. + * + * @return true if the sprite can be accessed in the desired mode. + */ +bool Sprite::lock(bool write) +{ + return m_impl->lock(write); +} + +/** + * If you have locked the sprite to read, using this method + * you can raise your access level to write it. + */ +bool Sprite::lockToWrite() +{ + return m_impl->lockToWrite(); +} + +/** + * If you have locked the sprite to write, using this method + * you can your access level to only read it. + */ +void Sprite::unlockToRead() +{ + m_impl->unlockToRead(); +} + +void Sprite::unlock() +{ + m_impl->unlock(); +} + +////////////////////////////////////////////////////////////////////// +// Main properties + +int Sprite::getImgType() const +{ + return m_impl->getImgType(); +} + +void Sprite::setImgType(int imgtype) +{ + m_impl->setImgType(imgtype); +} + +int Sprite::getWidth() const +{ + return m_impl->getWidth(); +} + +int Sprite::getHeight() const +{ + return m_impl->getHeight(); +} + +void Sprite::setSize(int width, int height) +{ + m_impl->setSize(width, height); +} + +const char* Sprite::getFilename() const +{ + return m_impl->getFilename(); } /** * Changes the sprite's filename */ -void sprite_set_filename(Sprite* sprite, const char *filename) +void Sprite::setFilename(const char* filename) { - strcpy(sprite->filename, filename); + m_impl->setFilename(filename); } -void sprite_set_format_options(Sprite* sprite, struct FormatOptions *format_options) +bool Sprite::isModified() const { - if (sprite->format_options) - jfree(sprite->format_options); - - sprite->format_options = format_options; + return m_impl->isModified(); } -void sprite_set_size(Sprite* sprite, int w, int h) +bool Sprite::isAssociatedToFile() const { - assert(w > 0); - assert(h > 0); + return m_impl->isAssociatedToFile(); +} - sprite->w = w; - sprite->h = h; +void Sprite::markAsSaved() +{ + m_impl->markAsSaved(); } /** - * Changes the quantity of frames + Returns true if the rendered images will contain alpha values less than 255. + + @note Only RGB and Grayscale images without background needs alpha channel in the render. */ -void sprite_set_frames(Sprite* sprite, int frames) +bool Sprite::needAlpha() const { - frames = MAX(1, frames); - - sprite->frlens = (int*)jrealloc(sprite->frlens, sizeof(int)*frames); - - if (frames > sprite->frames) { - int c; - for (c=sprite->frames; cfrlens[c] = sprite->frlens[sprite->frames-1]; - } - - sprite->frames = frames; + return m_impl->needAlpha(); } -void sprite_set_frlen(Sprite* sprite, int frame, int msecs) +int Sprite::getMemSize() const { - if (frame >= 0 && frame < sprite->frames) - sprite->frlens[frame] = MID(1, msecs, 65535); + return m_impl->getMemSize(); } -int sprite_get_frlen(const Sprite* sprite, int frame) +////////////////////////////////////////////////////////////////////// +// Layers + +const LayerFolder* Sprite::getFolder() const { - if (frame >= 0 && frame < sprite->frames) - return sprite->frlens[frame]; - else - return 0; + return m_impl->getFolder(); } -/** - * Sets a constant frame-rate. - */ -void sprite_set_speed(Sprite* sprite, int msecs) +LayerFolder* Sprite::getFolder() { - int c; - for (c=0; cframes; c++) - sprite->frlens[c] = MID(1, msecs, 65535); + return m_impl->getFolder(); } -/** - * Changes the current path (makes a copy of "path") - */ -void sprite_set_path(Sprite* sprite, const Path* path) +const LayerImage* Sprite::getBackgroundLayer() const { - if (sprite->path) - path_free(sprite->path); - - sprite->path = path_new_copy(path); + return m_impl->getBackgroundLayer(); } -/** - * Changes the current mask (makes a copy of "mask") - */ -void sprite_set_mask(Sprite* sprite, const Mask *mask) +LayerImage* Sprite::getBackgroundLayer() { - if (sprite->mask) - mask_free(sprite->mask); + return m_impl->getBackgroundLayer(); +} - sprite->mask = mask_new_copy(mask); +const Layer* Sprite::getCurrentLayer() const +{ + return m_impl->getCurrentLayer(); +} + +Layer* Sprite::getCurrentLayer() +{ + return m_impl->getCurrentLayer(); } /** * Changes the current layer */ -void sprite_set_layer(Sprite* sprite, Layer *layer) +void Sprite::setCurrentLayer(Layer* layer) { - sprite->layer = layer; + m_impl->setCurrentLayer(layer); } -void sprite_set_frame(Sprite* sprite, int frame) +int Sprite::countLayers() const { - sprite->frame = frame; + return m_impl->countLayers(); } -LayerImage* sprite_get_background_layer(const Sprite* sprite) +const Layer* Sprite::indexToLayer(int index) const { - assert(sprite != NULL); + return m_impl->indexToLayer(index); +} - if (sprite->get_folder()->get_layers_count() > 0) { - Layer* bglayer = *sprite->get_folder()->get_layer_begin(); +Layer* Sprite::indexToLayer(int index) +{ + return m_impl->indexToLayer(index); +} - if (bglayer->is_background()) - return static_cast(bglayer); - } +int Sprite::layerToIndex(const Layer* layer) const +{ + return m_impl->layerToIndex(layer); +} - return NULL; +////////////////////////////////////////////////////////////////////// +// Palettes + +const Palette* Sprite::getPalette(int frame) const +{ + return m_impl->getPalette(frame); +} + +Palette* Sprite::getPalette(int frame) +{ + return m_impl->getPalette(frame); +} + +JList Sprite::getPalettes() +{ + return m_impl->getPalettes(); +} + +void Sprite::setPalette(Palette* pal, bool truncate) +{ + m_impl->setPalette(pal, truncate); } /** - * Adds a path to the sprites's repository + * Removes all palettes from the sprites except the first one. */ -void sprite_add_path(Sprite* sprite, Path* path) +void Sprite::resetPalettes() { - jlist_append(sprite->repository.paths, path); + m_impl->resetPalettes(); +} + +void Sprite::deletePalette(Palette* pal) +{ + m_impl->deletePalette(pal); +} + +const Palette* Sprite::getCurrentPalette() const +{ + return m_impl->getCurrentPalette(); +} + +Palette* Sprite::getCurrentPalette() +{ + return m_impl->getCurrentPalette(); +} + +////////////////////////////////////////////////////////////////////// +// Frames + +int Sprite::getTotalFrames() const +{ + return m_impl->getTotalFrames(); } /** - * Removes a path from the sprites's repository + * Changes the quantity of frames */ -void sprite_remove_path (Sprite* sprite, Path* path) +void Sprite::setTotalFrames(int frames) { - jlist_remove(sprite->repository.paths, path); + m_impl->setTotalFrames(frames); +} + +int Sprite::getFrameDuration(int frame) const +{ + return m_impl->getFrameDuration(frame); +} + +void Sprite::setFrameDuration(int frame, int msecs) +{ + m_impl->setFrameDuration(frame, msecs); +} + +/** + * Sets a constant frame-rate. + */ +void Sprite::setDurationForAllFrames(int msecs) +{ + m_impl->setDurationForAllFrames(msecs); +} + +int Sprite::getCurrentFrame() const +{ + return m_impl->getCurrentFrame(); +} + +void Sprite::setCurrentFrame(int frame) +{ + m_impl->setCurrentFrame(frame); +} + +////////////////////////////////////////////////////////////////////// +// Images + +const Stock* Sprite::getStock() const +{ + return m_impl->getStock(); +} + +Stock* Sprite::getStock() +{ + return m_impl->getStock(); +} + +const Image* Sprite::getCurrentImage(int* x, int* y, int* opacity) const +{ + return m_impl->getCurrentImage(x, y, opacity); +} + +Image* Sprite::getCurrentImage(int* x, int* y, int* opacity) +{ + return m_impl->getCurrentImage(x, y, opacity); +} + +void Sprite::getCels(CelList& cels) +{ + m_impl->getCels(cels); +} + +////////////////////////////////////////////////////////////////////// +// Undo + +const Undo* Sprite::getUndo() const +{ + return m_impl->getUndo(); +} + +Undo* Sprite::getUndo() +{ + return m_impl->getUndo(); +} + +////////////////////////////////////////////////////////////////////// +// Mask + +const Mask* Sprite::getMask() const +{ + return m_impl->getMask(); +} + +Mask* Sprite::getMask() +{ + return m_impl->getMask(); +} + +/** + * Changes the current mask (makes a copy of "mask") + */ +void Sprite::setMask(const Mask* mask) +{ + m_impl->setMask(mask); } /** * Adds a mask to the sprites's repository */ -void sprite_add_mask (Sprite* sprite, Mask *mask) +void Sprite::addMask(Mask* mask) { - /* you can't add masks to repository without name */ - if (!mask->name) - return; - - /* you can't add a mask that already exists */ - if (sprite_request_mask(sprite, mask->name)) - return; - - /* and add the new mask */ - jlist_append(sprite->repository.masks, mask); + m_impl->addMask(mask); } /** * Removes a mask from the sprites's repository */ -void sprite_remove_mask(Sprite* sprite, Mask *mask) +void Sprite::removeMask(Mask* mask) { - /* remove the mask from the repository */ - jlist_remove(sprite->repository.masks, mask); + m_impl->removeMask(mask); } /** * Returns a mask from the sprite's repository searching it by its name */ -Mask *sprite_request_mask(const Sprite* sprite, const char *name) +Mask* Sprite::requestMask(const char* name) const { - Mask *mask; - JLink link; - - JI_LIST_FOR_EACH(sprite->repository.masks, link) { - mask = reinterpret_cast(link->data); - if (strcmp(mask->name, name) == 0) - return mask; - } - - return NULL; + return m_impl->requestMask(name); } -void sprite_render(const Sprite* sprite, Image *image, int x, int y) +void Sprite::generateMaskBoundaries(Mask* mask) { - image_rectfill(image, x, y, x+sprite->w-1, y+sprite->h-1, 0); - layer_render(sprite->get_folder(), image, x, y, sprite->frame); + m_impl->generateMaskBoundaries(mask); } -void sprite_generate_mask_boundaries(Sprite* sprite) +JList Sprite::getMasksRepository() { - int c; - - if (sprite->bound.seg) { - jfree(sprite->bound.seg); - sprite->bound.seg = NULL; - sprite->bound.nseg = 0; - } - - if (sprite->mask->bitmap) { - sprite->bound.seg = find_mask_boundary(sprite->mask->bitmap, - &sprite->bound.nseg, - IgnoreBounds, 0, 0, 0, 0); - for (c=0; cbound.nseg; c++) { - sprite->bound.seg[c].x1 += sprite->mask->x; - sprite->bound.seg[c].y1 += sprite->mask->y; - sprite->bound.seg[c].x2 += sprite->mask->x; - sprite->bound.seg[c].y2 += sprite->mask->y; - } - } + return m_impl->getMasksRepository(); } -Layer* sprite_index2layer(const Sprite* sprite, int index) -{ - int index_count = -1; - assert(sprite != NULL); +////////////////////////////////////////////////////////////////////// +// Path - return index2layer(sprite->get_folder(), index, &index_count); +/** + * Adds a path to the sprites's repository + */ +void Sprite::addPath(Path* path) +{ + m_impl->addPath(path); } -int sprite_layer2index(const Sprite* sprite, const Layer *layer) +/** + * Removes a path from the sprites's repository + */ +void Sprite::removePath(Path* path) { - int index_count = -1; - assert(sprite != NULL); - - return layer2index(sprite->get_folder(), layer, &index_count); + m_impl->removePath(path); } -int sprite_count_layers(const Sprite* sprite) +/** + * Changes the current path (makes a copy of "path") + */ +void Sprite::setPath(const Path* path) { - assert(sprite != NULL); - return sprite->get_folder()->get_layers_count(); + m_impl->setPath(path); } -void sprite_get_cels(const Sprite* sprite, CelList& cels) +JList Sprite::getPathsRepository() { - sprite->get_folder()->get_cels(cels); + return m_impl->getPathsRepository(); +} + +////////////////////////////////////////////////////////////////////// +// Loaded options from file + +void Sprite::setFormatOptions(FormatOptions* format_options) +{ + m_impl->setFormatOptions(format_options); +} + +////////////////////////////////////////////////////////////////////// +// Drawing + +void Sprite::render(Image* image, int x, int y) const +{ + m_impl->render(image, x, y); } /** @@ -713,38 +1421,61 @@ void sprite_get_cels(const Sprite* sprite, CelList& cels) * specified coordinates there're background this routine will return * the 0 color (the mask-color). */ -int sprite_getpixel(const Sprite* sprite, int x, int y) +int Sprite::getPixel(int x, int y) const { - Image *image; - int color = 0; - - if ((x >= 0) && (y >= 0) && (x < sprite->w) && (y < sprite->h)) { - image = image_new(sprite->imgtype, 1, 1); - image_clear(image, 0); - sprite_render(sprite, image, -x, -y); - color = image_getpixel(image, 0, 0); - image_free(image); - } - - return color; + return m_impl->getPixel(x, y); } -int sprite_get_memsize(const Sprite* sprite) +////////////////////////////////////////////////////////////////////// +// Preferred editor settings + +PreferredEditorSettings Sprite::getPreferredEditorSettings() const { - Image *image; - int i, size = 0; - - for (i=0; istock->nimage; i++) { - image = sprite->stock->image[i]; - - if (image != NULL) - size += image_line_size(image, image->w) * image->h; - } - - return size; + return m_impl->getPreferredEditorSettings(); } -static Layer *index2layer(const Layer *layer, int index, int *index_count) +void Sprite::setPreferredEditorSettings(const PreferredEditorSettings& settings) +{ + m_impl->setPreferredEditorSettings(settings); +} + +////////////////////////////////////////////////////////////////////// +// Boundaries + +int Sprite::getBoundariesSegmentsCount() const +{ + return m_impl->getBoundariesSegmentsCount(); +} + +const _BoundSeg* Sprite::getBoundariesSegments() const +{ + return m_impl->getBoundariesSegments(); +} + +////////////////////////////////////////////////////////////////////// +// Extras + +void Sprite::prepareExtra() +{ + m_impl->prepareExtra(); +} + +Image* Sprite::getExtras() +{ + return m_impl->getExtras(); +} + +int Sprite::getExtrasOpacity() const +{ + return m_impl->getExtrasOpacity(); +} + +void Sprite::setExtrasOpacity(int opacity) +{ + m_impl->setExtrasOpacity(opacity); +} + +static Layer* index2layer(const Layer* layer, int index, int* index_count) { if (index == *index_count) return (Layer*)layer; @@ -767,7 +1498,7 @@ static Layer *index2layer(const Layer *layer, int index, int *index_count) } } -static int layer2index(const Layer *layer, const Layer *find_layer, int *index_count) +static int layer2index(const Layer* layer, const Layer* find_layer, int* index_count) { if (layer == find_layer) return *index_count; @@ -789,100 +1520,3 @@ static int layer2index(const Layer *layer, const Layer *find_layer, int *index_c return -1; } } - -static int layer_count_layers(const Layer* layer) -{ - int count = 1; - - if (layer->is_folder()) { - LayerConstIterator it = static_cast(layer)->get_layer_begin(); - LayerConstIterator end = static_cast(layer)->get_layer_end(); - - for (; it != end; ++it) - count += layer_count_layers(*it); - } - - return count; -} - -/** - * Makes a copy "sprite" without the layers (only with the empty layer set) - */ -static Sprite* general_copy(const Sprite* src_sprite) -{ - Sprite* dst_sprite; - JLink link; - - dst_sprite = new Sprite(src_sprite->imgtype, - src_sprite->w, src_sprite->h, - sprite_get_palette(src_sprite, 0)->size()); - if (!dst_sprite) - return NULL; - - /* copy stock */ - stock_free(dst_sprite->stock); - dst_sprite->stock = stock_new_copy(src_sprite->stock); - if (!dst_sprite->stock) { - delete dst_sprite; - return NULL; - } - - /* copy general properties */ - strcpy(dst_sprite->filename, src_sprite->filename); - sprite_set_frames(dst_sprite, src_sprite->frames); - memcpy(dst_sprite->frlens, src_sprite->frlens, sizeof(int)*src_sprite->frames); - - /* copy color palettes */ - JI_LIST_FOR_EACH(src_sprite->palettes, link) { - Palette* pal = reinterpret_cast(link->data); - sprite_set_palette(dst_sprite, pal, true); - } - - /* copy path */ - if (dst_sprite->path) { - path_free(dst_sprite->path); - dst_sprite->path = NULL; - } - - if (src_sprite->path) { - dst_sprite->path = path_new_copy(src_sprite->path); - if (!dst_sprite->path) { - delete dst_sprite; - return NULL; - } - } - - /* copy mask */ - if (dst_sprite->mask) { - mask_free(dst_sprite->mask); - dst_sprite->mask = NULL; - } - - if (src_sprite->mask) { - dst_sprite->mask = mask_new_copy(src_sprite->mask); - if (!dst_sprite->mask) { - delete dst_sprite; - return NULL; - } - } - - /* copy repositories */ - JI_LIST_FOR_EACH(src_sprite->repository.paths, link) { - Path* path_copy = path_new_copy(reinterpret_cast(link->data)); - if (path_copy) - sprite_add_path(dst_sprite, path_copy); - } - - JI_LIST_FOR_EACH(src_sprite->repository.masks, link) { - Mask* mask_copy = mask_new_copy(reinterpret_cast(link->data)); - if (mask_copy) - sprite_add_mask(dst_sprite, mask_copy); - } - - /* copy preferred edition options */ - dst_sprite->preferred.scroll_x = src_sprite->preferred.scroll_x; - dst_sprite->preferred.scroll_y = src_sprite->preferred.scroll_y; - dst_sprite->preferred.zoom = src_sprite->preferred.zoom; - - return dst_sprite; -} diff --git a/src/raster/sprite.h b/src/raster/sprite.h index 424e277bb..94d6e1c32 100644 --- a/src/raster/sprite.h +++ b/src/raster/sprite.h @@ -35,129 +35,185 @@ class Path; class Stock; class Undo; class Sprite; +struct _BoundSeg; -Sprite* sprite_new_copy(const Sprite* src_sprite); +struct PreferredEditorSettings +{ + int scroll_x; + int scroll_y; + int zoom; +}; /** * The main structure used in the whole program to handle a sprite. */ class Sprite : public GfxObj { - friend Sprite* sprite_new_copy(const Sprite* src_sprite); - -public: - char filename[512]; // sprite's file name - bool associated_to_file; // true if this sprite is associated to a file in the file-system - int imgtype; // image type - int w, h; // image width/height size (in pixels) - int frames; // how many frames has this sprite - int* frlens; // duration per frame - int frame; // current frame, range [0,frames) - JList palettes; // list of palettes - Stock *stock; // stock to get images -private: - LayerFolder* m_folder; // main folder of layers -public: - Layer* layer; // current layer - Path* path; // working path - Mask* mask; // selected mask region - Undo* undo; // undo stack - struct { - JList paths; // paths - JList masks; // masks - } repository; - - // Selected mask region boundaries - struct { - int nseg; - struct _BoundSeg *seg; - } bound; - struct { - int scroll_x; - int scroll_y; - int zoom; - } preferred; - -private: - - Image* m_extras; // Image with the sprite size to draw some extra stuff (e.g. editor's cursor) - int m_extras_opacity; // Opacity to be used to draw the extra image - - // Mutex to modify the 'locked' flag. - Vaca::Mutex* m_mutex; - - // True if some thread is writing the sprite. - bool m_write_lock; - - // Greater than zero when one or more threads are reading the sprite. - int m_read_locks; - public: - // Data to save the file in the same format that it was loaded - FormatOptions *format_options; + //////////////////////////////////////// + // Constructors/Destructor - Sprite(int imgtype, int w, int h, int ncolors); + Sprite(int imgtype, int width, int height, int ncolors); + Sprite(const Sprite& original); virtual ~Sprite(); + //////////////////////////////////////// + // Special constructors + + static Sprite* createFlattenCopy(const Sprite& original); + static Sprite* createWithLayer(int imgtype, int width, int height, int ncolors); + + //////////////////////////////////////// + // Multi-threading ("sprite wrappers" use this) + bool lock(bool write); - bool lock_to_write(); - void unlock_to_read(); + bool lockToWrite(); + void unlockToRead(); void unlock(); - LayerFolder* get_folder() const { return m_folder; } + //////////////////////////////////////// + // Main properties - void prepare_extra(); - Image* get_extras() { return m_extras; } - int get_extras_opacity() const { return m_extras_opacity; } - void set_extras_opacity(int opacity) { m_extras_opacity = opacity; } + int getImgType() const; + void setImgType(int imgtype); + + int getWidth() const; + int getHeight() const; + void setSize(int width, int height); + + const char* getFilename() const; + void setFilename(const char* filename); + + bool isModified() const; + bool isAssociatedToFile() const; + void markAsSaved(); + + bool needAlpha() const; + + int getMemSize() const; + + //////////////////////////////////////// + // Layers + + const LayerFolder* getFolder() const; + LayerFolder* getFolder(); + + const LayerImage* getBackgroundLayer() const; + LayerImage* getBackgroundLayer(); + + const Layer* getCurrentLayer() const; + Layer* getCurrentLayer(); + void setCurrentLayer(Layer* layer); + + int countLayers() const; + + const Layer* indexToLayer(int index) const; + Layer* indexToLayer(int index); + int layerToIndex(const Layer* layer) const; + + //////////////////////////////////////// + // Palettes + + const Palette* getPalette(int frame) const; + Palette* getPalette(int frame); + JList getPalettes(); + + void setPalette(Palette* pal, bool truncate); + void resetPalettes(); + void deletePalette(Palette* pal); + + const Palette* getCurrentPalette() const; + Palette* getCurrentPalette(); + + //////////////////////////////////////// + // Frames + + int getTotalFrames() const; + void setTotalFrames(int frames); + + int getFrameDuration(int frame) const; + void setFrameDuration(int frame, int msecs); + void setDurationForAllFrames(int msecs); + + int getCurrentFrame() const; + void setCurrentFrame(int frame); + + //////////////////////////////////////// + // Images + + const Stock* getStock() const; + Stock* getStock(); + + const Image* getCurrentImage(int* x = NULL, int* y = NULL, int* opacity = NULL) const; + Image* getCurrentImage(int* x = NULL, int* y = NULL, int* opacity = NULL); + + void getCels(CelList& cels); + + //////////////////////////////////////// + // Undo + + const Undo* getUndo() const; + Undo* getUndo(); + + //////////////////////////////////////// + // Mask + + const Mask* getMask() const; + Mask* getMask(); + void setMask(const Mask* mask); + + void addMask(Mask* mask); + void removeMask(Mask* mask); + Mask* requestMask(const char* name) const; + + void generateMaskBoundaries(Mask* mask = NULL); + + JList getMasksRepository(); + + //////////////////////////////////////// + // Path + + void addPath(Path* path); + void removePath(Path* path); + void setPath(const Path* path); + + JList getPathsRepository(); + + //////////////////////////////////////// + // Loaded options from file + + void setFormatOptions(FormatOptions* format_options); + + //////////////////////////////////////// + // Drawing + + void render(Image* image, int x, int y) const; + int getPixel(int x, int y) const; + + //////////////////////////////////////// + // Preferred editor settings + + PreferredEditorSettings getPreferredEditorSettings() const; + void setPreferredEditorSettings(const PreferredEditorSettings& settings); + + //////////////////////////////////////// + // Boundaries + + int getBoundariesSegmentsCount() const; + const _BoundSeg* getBoundariesSegments() const; + + //////////////////////////////////////// + // Extras + + void prepareExtra(); + Image* getExtras(); + int getExtrasOpacity() const; + void setExtrasOpacity(int opacity); + +private: + Sprite(); + class SpriteImpl* m_impl; }; -Sprite* sprite_new_flatten_copy(const Sprite* src_sprite); -Sprite* sprite_new_with_layer(int imgtype, int w, int h, int ncolors); - -bool sprite_is_modified(const Sprite* sprite); -bool sprite_is_associated_to_file(const Sprite* sprite); -void sprite_mark_as_saved(Sprite* sprite); - -bool sprite_need_alpha(const Sprite* sprite); - -Palette* sprite_get_palette(const Sprite* sprite, int frame); -void sprite_set_palette(Sprite* sprite, Palette* pal, bool truncate); -void sprite_reset_palettes(Sprite* sprite); -void sprite_delete_palette(Sprite* sprite, Palette* pal); - -void sprite_set_filename(Sprite* sprite, const char* filename); -void sprite_set_format_options(Sprite* sprite, FormatOptions* format_options); -void sprite_set_size(Sprite* sprite, int w, int h); -void sprite_set_frames(Sprite* sprite, int frames); -void sprite_set_frlen(Sprite* sprite, int frame, int msecs); -int sprite_get_frlen(const Sprite* sprite, int frame); -void sprite_set_speed(Sprite* sprite, int msecs); -void sprite_set_path(Sprite* sprite, const Path* path); -void sprite_set_mask(Sprite* sprite, const Mask* mask); -void sprite_set_layer(Sprite* sprite, Layer* layer); -void sprite_set_frame(Sprite* sprite, int frame); - -LayerImage* sprite_get_background_layer(const Sprite* sprite); - -void sprite_add_path(Sprite* sprite, Path* path); -void sprite_remove_path(Sprite* sprite, Path* path); - -void sprite_add_mask(Sprite* sprite, Mask* mask); -void sprite_remove_mask(Sprite* sprite, Mask* mask); -Mask* sprite_request_mask(const Sprite* sprite, const char *name); - -void sprite_render(const Sprite* sprite, Image* image, int x, int y); -void sprite_generate_mask_boundaries(Sprite* sprite); - -Layer* sprite_index2layer(const Sprite* sprite, int index); -int sprite_layer2index(const Sprite* sprite, const Layer* layer); -int sprite_count_layers(const Sprite* sprite); -void sprite_get_cels(const Sprite* sprite, CelList& cels); - -int sprite_getpixel(const Sprite* sprite, int x, int y); - -int sprite_get_memsize(const Sprite* sprite); - #endif diff --git a/src/raster/stock.cpp b/src/raster/stock.cpp index 76961ad18..ce058e33f 100644 --- a/src/raster/stock.cpp +++ b/src/raster/stock.cpp @@ -149,3 +149,11 @@ Image* stock_get_image(Stock* stock, int index) return ((index >= 0) && (index < stock->nimage)) ? stock->image[index]: NULL; } +/** + * Returns the image in the "index" position + */ +const Image* stock_get_image(const Stock* stock, int index) +{ + return ((index >= 0) && (index < stock->nimage)) ? stock->image[index]: NULL; +} + diff --git a/src/raster/stock.h b/src/raster/stock.h index 64b0a8571..be582b69b 100644 --- a/src/raster/stock.h +++ b/src/raster/stock.h @@ -45,5 +45,6 @@ void stock_remove_image(Stock* stock, Image* image); void stock_replace_image(Stock* stock, int index, Image* image); Image* stock_get_image(Stock* stock, int index); +const Image* stock_get_image(const Stock* stock, int index); #endif diff --git a/src/raster/undo.cpp b/src/raster/undo.cpp index 7278c07a9..8d3ff920d 100644 --- a/src/raster/undo.cpp +++ b/src/raster/undo.cpp @@ -79,6 +79,9 @@ enum { /* misc */ UNDO_TYPE_SET_MASK, + UNDO_TYPE_SET_IMGTYPE, + UNDO_TYPE_SET_SIZE, + UNDO_TYPE_SET_FRAME, UNDO_TYPE_SET_FRAMES, UNDO_TYPE_SET_FRLEN, }; @@ -100,6 +103,9 @@ struct UndoChunkSetLayer; struct UndoChunkAddPalette; struct UndoChunkRemovePalette; struct UndoChunkSetMask; +struct UndoChunkSetImgType; +struct UndoChunkSetSize; +struct UndoChunkSetFrame; struct UndoChunkSetFrames; struct UndoChunkSetFrlen; @@ -188,6 +194,15 @@ static void chunk_remove_palette_invert(UndoStream* stream, UndoChunkRemovePalet static void chunk_set_mask_new(UndoStream* stream, Sprite *sprite); static void chunk_set_mask_invert(UndoStream* stream, UndoChunkSetMask* chunk, int state); +static void chunk_set_imgtype_new(UndoStream* stream, Sprite *sprite); +static void chunk_set_imgtype_invert(UndoStream* stream, UndoChunkSetImgType *chunk, int state); + +static void chunk_set_size_new(UndoStream* stream, Sprite *sprite); +static void chunk_set_size_invert(UndoStream* stream, UndoChunkSetSize *chunk, int state); + +static void chunk_set_frame_new(UndoStream* stream, Sprite *sprite); +static void chunk_set_frame_invert(UndoStream* stream, UndoChunkSetFrame *chunk, int state); + static void chunk_set_frames_new(UndoStream* stream, Sprite *sprite); static void chunk_set_frames_invert(UndoStream* stream, UndoChunkSetFrames *chunk, int state); @@ -218,6 +233,9 @@ static UndoAction undo_actions[] = { DECL_UNDO_ACTION(add_palette), DECL_UNDO_ACTION(remove_palette), DECL_UNDO_ACTION(set_mask), + DECL_UNDO_ACTION(set_imgtype), + DECL_UNDO_ACTION(set_size), + DECL_UNDO_ACTION(set_frame), DECL_UNDO_ACTION(set_frames), DECL_UNDO_ACTION(set_frlen), }; @@ -1333,7 +1351,7 @@ static void chunk_set_layer_new(UndoStream* stream, Sprite *sprite) sizeof(UndoChunkSetLayer)); chunk->sprite_id = sprite->id; - chunk->layer_id = sprite->layer ? sprite->layer->id: 0; + chunk->layer_id = sprite->getCurrentLayer() ? sprite->getCurrentLayer()->id: 0; } static void chunk_set_layer_invert(UndoStream* stream, UndoChunkSetLayer* chunk, int state) @@ -1346,7 +1364,7 @@ static void chunk_set_layer_invert(UndoStream* stream, UndoChunkSetLayer* chunk, chunk_set_layer_new(stream, sprite); - sprite->layer = layer; + sprite->setCurrentLayer(layer); } /*********************************************************************** @@ -1391,7 +1409,7 @@ static void chunk_add_palette_invert(UndoStream* stream, UndoChunkAddPalette *ch throw undo_exception("chunk_add_palette_invert"); chunk_remove_palette_new(stream, sprite, palette); - sprite_delete_palette(sprite, palette); + sprite->deletePalette(palette); } /*********************************************************************** @@ -1436,7 +1454,7 @@ static void chunk_remove_palette_invert(UndoStream* stream, UndoChunkRemovePalet Palette* palette = read_raw_palette(chunk->data); chunk_add_palette_new(stream, sprite, palette); - sprite_set_palette(sprite, palette, true); + sprite->setPalette(palette, true); delete palette; } @@ -1468,10 +1486,10 @@ static void chunk_set_mask_new(UndoStream* stream, Sprite *sprite) UndoChunkSetMask* chunk = (UndoChunkSetMask* ) undo_chunk_new(stream, UNDO_TYPE_SET_MASK, - sizeof(UndoChunkSetMask)+get_raw_mask_size(sprite->mask)); + sizeof(UndoChunkSetMask)+get_raw_mask_size(sprite->getMask())); chunk->sprite_id = sprite->id; - write_raw_mask(chunk->data, sprite->mask); + write_raw_mask(chunk->data, sprite->getMask()); } static void chunk_set_mask_invert(UndoStream* stream, UndoChunkSetMask* chunk, int state) @@ -1482,12 +1500,144 @@ static void chunk_set_mask_invert(UndoStream* stream, UndoChunkSetMask* chunk, i Mask* mask = read_raw_mask(chunk->data); chunk_set_mask_new(stream, sprite); - mask_copy(sprite->mask, mask); + mask_copy(sprite->getMask(), mask); mask_free(mask); } } +/*********************************************************************** + + "set_imgtype" + + DWORD sprite ID + DWORD imgtype + +***********************************************************************/ + +struct UndoChunkSetImgType +{ + UndoChunk head; + ase_uint32 sprite_id; + ase_uint32 imgtype; +}; + +void undo_set_imgtype(Undo* undo, Sprite* sprite) +{ + chunk_set_imgtype_new(undo->undo_stream, sprite); + update_undo(undo); +} + +static void chunk_set_imgtype_new(UndoStream* stream, Sprite* sprite) +{ + UndoChunkSetImgType* chunk = (UndoChunkSetImgType*) + undo_chunk_new(stream, + UNDO_TYPE_SET_IMGTYPE, + sizeof(UndoChunkSetImgType)); + + chunk->sprite_id = sprite->id; + chunk->imgtype = sprite->getImgType(); +} + +static void chunk_set_imgtype_invert(UndoStream* stream, UndoChunkSetImgType *chunk, int state) +{ + Sprite *sprite = (Sprite *)gfxobj_find(chunk->sprite_id); + + if (sprite) { + chunk_set_imgtype_new(stream, sprite); + sprite->setImgType(chunk->imgtype); + } +} + +/*********************************************************************** + + "set_size" + + DWORD sprite ID + DWORD width + DWORD height + +***********************************************************************/ + +struct UndoChunkSetSize +{ + UndoChunk head; + ase_uint32 sprite_id; + ase_uint32 width; + ase_uint32 height; +}; + +void undo_set_size(Undo* undo, Sprite* sprite) +{ + chunk_set_size_new(undo->undo_stream, sprite); + update_undo(undo); +} + +static void chunk_set_size_new(UndoStream* stream, Sprite* sprite) +{ + UndoChunkSetSize* chunk = (UndoChunkSetSize*) + undo_chunk_new(stream, + UNDO_TYPE_SET_SIZE, + sizeof(UndoChunkSetSize)); + + chunk->sprite_id = sprite->id; + chunk->width = sprite->getWidth(); + chunk->height = sprite->getHeight(); +} + +static void chunk_set_size_invert(UndoStream* stream, UndoChunkSetSize *chunk, int state) +{ + Sprite *sprite = (Sprite *)gfxobj_find(chunk->sprite_id); + + if (sprite) { + chunk_set_size_new(stream, sprite); + sprite->setSize(chunk->width, chunk->height); + } +} + +/*********************************************************************** + + "set_frame" + + DWORD sprite ID + DWORD frame + +***********************************************************************/ + +struct UndoChunkSetFrame +{ + UndoChunk head; + ase_uint32 sprite_id; + ase_uint32 frame; +}; + +void undo_set_frame(Undo* undo, Sprite* sprite) +{ + chunk_set_frame_new(undo->undo_stream, sprite); + update_undo(undo); +} + +static void chunk_set_frame_new(UndoStream* stream, Sprite* sprite) +{ + UndoChunkSetFrame* chunk = (UndoChunkSetFrame*) + undo_chunk_new(stream, + UNDO_TYPE_SET_FRAME, + sizeof(UndoChunkSetFrame)); + + chunk->sprite_id = sprite->id; + chunk->frame = sprite->getCurrentFrame(); +} + +static void chunk_set_frame_invert(UndoStream* stream, UndoChunkSetFrame *chunk, int state) +{ + Sprite *sprite = (Sprite *)gfxobj_find(chunk->sprite_id); + + if (sprite) { + chunk_set_frame_new(stream, sprite); + sprite->setCurrentFrame(chunk->frame); + } +} + /*********************************************************************** "set_frames" @@ -1518,7 +1668,7 @@ static void chunk_set_frames_new(UndoStream* stream, Sprite *sprite) sizeof(UndoChunkSetFrames)); chunk->sprite_id = sprite->id; - chunk->frames = sprite->frames; + chunk->frames = sprite->getTotalFrames(); } static void chunk_set_frames_invert(UndoStream* stream, UndoChunkSetFrames *chunk, int state) @@ -1527,7 +1677,7 @@ static void chunk_set_frames_invert(UndoStream* stream, UndoChunkSetFrames *chun if (sprite) { chunk_set_frames_new(stream, sprite); - sprite_set_frames(sprite, chunk->frames); + sprite->setTotalFrames(chunk->frames); } } @@ -1537,7 +1687,7 @@ static void chunk_set_frames_invert(UndoStream* stream, UndoChunkSetFrames *chun DWORD sprite ID DWORD frame - DWORD frlen + DWORD duration ***********************************************************************/ @@ -1546,7 +1696,7 @@ struct UndoChunkSetFrlen UndoChunk head; ase_uint32 sprite_id; ase_uint32 frame; - ase_uint32 frlen; + ase_uint32 duration; }; void undo_set_frlen(Undo* undo, Sprite *sprite, int frame) @@ -1557,7 +1707,7 @@ void undo_set_frlen(Undo* undo, Sprite *sprite, int frame) static void chunk_set_frlen_new(UndoStream* stream, Sprite *sprite, int frame) { - assert(frame >= 0 && frame < sprite->frames); + assert(frame >= 0 && frame < sprite->getTotalFrames()); UndoChunkSetFrlen *chunk = (UndoChunkSetFrlen *) undo_chunk_new(stream, @@ -1566,7 +1716,7 @@ static void chunk_set_frlen_new(UndoStream* stream, Sprite *sprite, int frame) chunk->sprite_id = sprite->id; chunk->frame = frame; - chunk->frlen = sprite->frlens[frame]; + chunk->duration = sprite->getFrameDuration(frame); } static void chunk_set_frlen_invert(UndoStream* stream, UndoChunkSetFrlen *chunk, int state) @@ -1575,7 +1725,7 @@ static void chunk_set_frlen_invert(UndoStream* stream, UndoChunkSetFrlen *chunk, if (sprite != NULL) { chunk_set_frlen_new(stream, sprite, chunk->frame); - sprite_set_frlen(sprite, chunk->frame, chunk->frlen); + sprite->setFrameDuration(chunk->frame, chunk->duration); } } @@ -1993,7 +2143,7 @@ static Layer* read_raw_layer(ase_uint8* raw_data) Image* image = read_raw_image(raw_data); raw_data += get_raw_image_size(image); - stock_replace_image(layer->getSprite()->stock, cel->image, image); + stock_replace_image(layer->getSprite()->getStock(), cel->image, image); } } break; @@ -2064,7 +2214,7 @@ static ase_uint8* write_raw_layer(ase_uint8* raw_data, Layer* layer) Cel* cel = *it; raw_data = write_raw_cel(raw_data, cel); - Image* image = layer->getSprite()->stock->image[cel->image]; + Image* image = layer->getSprite()->getStock()->image[cel->image]; assert(image != NULL); write_raw_uint8(1); @@ -2108,7 +2258,7 @@ static int get_raw_layer_size(Layer* layer) size += get_raw_cel_size(cel); size++; // has image? - Image* image = layer->getSprite()->stock->image[cel->image]; + Image* image = layer->getSprite()->getStock()->image[cel->image]; size += get_raw_image_size(image); } break; @@ -2173,7 +2323,7 @@ static ase_uint8* write_raw_palette(ase_uint8* raw_data, Palette* palette) write_raw_uint16(palette->getFrame()); // frame write_raw_uint16(palette->size()); // number of colors - for (int c=0; csize(); c++) { + for (size_t c=0; csize(); c++) { color = palette->getEntry(c); write_raw_uint32(color); } diff --git a/src/raster/undo.h b/src/raster/undo.h index 8b87813f2..5670302bd 100644 --- a/src/raster/undo.h +++ b/src/raster/undo.h @@ -54,6 +54,7 @@ public: Undo(Sprite* sprite); virtual ~Undo(); + }; Undo* undo_new(Sprite* sprite); @@ -98,6 +99,9 @@ void undo_set_layer(Undo* undo, Sprite* sprite); void undo_add_palette(Undo* undo, Sprite* sprite, Palette* palette); void undo_remove_palette(Undo* undo, Sprite* sprite, Palette* palette); void undo_set_mask(Undo* undo, Sprite* sprite); +void undo_set_imgtype(Undo* undo, Sprite* sprite); +void undo_set_size(Undo* undo, Sprite* sprite); +void undo_set_frame(Undo* undo, Sprite* sprite); void undo_set_frames(Undo* undo, Sprite* sprite); void undo_set_frlen(Undo* undo, Sprite* sprite, int frame); diff --git a/src/sprite_wrappers.h b/src/sprite_wrappers.h index a4a2be936..394eb1672 100644 --- a/src/sprite_wrappers.h +++ b/src/sprite_wrappers.h @@ -161,7 +161,7 @@ public: , m_locked(false) { if (m_sprite) { - if (!m_sprite->lock_to_write()) + if (!m_sprite->lockToWrite()) throw locked_sprite_exception(); m_locked = true; @@ -183,7 +183,7 @@ public: if (m_sprite) { m_from_reader = true; - if (!m_sprite->lock_to_write()) + if (!m_sprite->lockToWrite()) throw locked_sprite_exception(); m_locked = true; @@ -198,7 +198,7 @@ protected: { if (m_sprite && m_locked) { if (m_from_reader) - m_sprite->unlock_to_read(); + m_sprite->unlockToRead(); else m_sprite->unlock(); } diff --git a/src/tools/inks.h b/src/tools/inks.h index 798ae8270..249ac1a76 100644 --- a/src/tools/inks.h +++ b/src/tools/inks.h @@ -62,8 +62,8 @@ public: } m_proc = loop->getOpacity() == 255 ? - ink_processing[INK_OPAQUE][MID(0, loop->getSprite()->imgtype, 2)]: - ink_processing[INK_TRANSPARENT][MID(0, loop->getSprite()->imgtype, 2)]; + ink_processing[INK_OPAQUE][MID(0, loop->getSprite()->getImgType(), 2)]: + ink_processing[INK_TRANSPARENT][MID(0, loop->getSprite()->getImgType(), 2)]; } void inkHline(int x1, int y, int x2, IToolLoop* loop) @@ -157,7 +157,7 @@ public: switch (m_type) { case Eraser: - m_proc = ink_processing[INK_OPAQUE][MID(0, loop->getSprite()->imgtype, 2)]; + m_proc = ink_processing[INK_OPAQUE][MID(0, loop->getSprite()->getImgType(), 2)]; // TODO app_get_color_to_clear_layer should receive the context as parameter loop->setPrimaryColor(app_get_color_to_clear_layer(loop->getLayer())); @@ -165,7 +165,7 @@ public: break; case ReplaceFgWithBg: - m_proc = ink_processing[INK_REPLACE][MID(0, loop->getSprite()->imgtype, 2)]; + m_proc = ink_processing[INK_REPLACE][MID(0, loop->getSprite()->getImgType(), 2)]; loop->setPrimaryColor(get_color_for_layer(loop->getLayer(), loop->getContext()->getSettings()->getFgColor())); @@ -174,7 +174,7 @@ public: break; case ReplaceBgWithFg: - m_proc = ink_processing[INK_REPLACE][MID(0, loop->getSprite()->imgtype, 2)]; + m_proc = ink_processing[INK_REPLACE][MID(0, loop->getSprite()->getImgType(), 2)]; loop->setPrimaryColor(get_color_for_layer(loop->getLayer(), loop->getContext()->getSettings()->getBgColor())); @@ -201,7 +201,7 @@ public: void prepareInk(IToolLoop* loop) { - m_proc = ink_processing[INK_BLUR][MID(0, loop->getSprite()->imgtype, 2)]; + m_proc = ink_processing[INK_BLUR][MID(0, loop->getSprite()->getImgType(), 2)]; } void inkHline(int x1, int y, int x2, IToolLoop* loop) @@ -221,7 +221,7 @@ public: void prepareInk(IToolLoop* loop) { - m_proc = ink_processing[INK_JUMBLE][MID(0, loop->getSprite()->imgtype, 2)]; + m_proc = ink_processing[INK_JUMBLE][MID(0, loop->getSprite()->getImgType(), 2)]; } void inkHline(int x1, int y, int x2, IToolLoop* loop) @@ -258,11 +258,11 @@ public: m_modify_selection = state; if (state) { - if (undo_is_enabled(loop->getSprite()->undo)) - undo_set_mask(loop->getSprite()->undo, loop->getSprite()); + if (undo_is_enabled(loop->getSprite()->getUndo())) + undo_set_mask(loop->getSprite()->getUndo(), loop->getSprite()); loop->getMask()->freeze(); - loop->getMask()->reserve(0, 0, loop->getSprite()->w, loop->getSprite()->h); + loop->getMask()->reserve(0, 0, loop->getSprite()->getWidth(), loop->getSprite()->getHeight()); } else { loop->getMask()->unfreeze(); diff --git a/src/ui_context.cpp b/src/ui_context.cpp index cd24256bd..7585856a4 100644 --- a/src/ui_context.cpp +++ b/src/ui_context.cpp @@ -50,7 +50,7 @@ void UIContext::on_add_sprite(Sprite* sprite) // add the tab for this sprite tabs_append_tab(app_get_tabsbar(), - get_filename(sprite->filename), sprite); + get_filename(sprite->getFilename()), sprite); // rebuild the menu list of sprites app_realloc_sprite_list(); diff --git a/src/undoable.cpp b/src/undoable.cpp index 797df3bab..1e5b7349a 100644 --- a/src/undoable.cpp +++ b/src/undoable.cpp @@ -49,11 +49,11 @@ Undoable::Undoable(SpriteWriter& sprite, const char* label) m_sprite = sprite; m_committed = false; - m_enabled_flag = undo_is_enabled(m_sprite->undo); + m_enabled_flag = undo_is_enabled(m_sprite->getUndo()); if (is_enabled()) { - undo_set_label(m_sprite->undo, label); - undo_open(m_sprite->undo); + undo_set_label(m_sprite->getUndo(), label); + undo_open(m_sprite->getUndo()); } } @@ -61,16 +61,16 @@ Undoable::~Undoable() { if (is_enabled()) { // close the undo information - undo_close(m_sprite->undo); + undo_close(m_sprite->getUndo()); // if it isn't committed, we have to rollback all changes if (!m_committed) { // undo the group of operations - undo_do_undo(m_sprite->undo); + undo_do_undo(m_sprite->getUndo()); // clear the redo (sorry to the user, here we lost the old redo // information) - undo_clear_redo(m_sprite->undo); + undo_clear_redo(m_sprite->getUndo()); } } } @@ -91,11 +91,12 @@ void Undoable::set_number_of_frames(int frames) { assert(frames >= 1); - // increment frames counter in the sprite + // Save in undo the current totalFrames property if (is_enabled()) - undo_set_frames(m_sprite->undo, m_sprite); + undo_set_frames(m_sprite->getUndo(), m_sprite); - sprite_set_frames(m_sprite, frames); + // Change the property + m_sprite->setTotalFrames(frames); } void Undoable::set_current_frame(int frame) @@ -103,9 +104,9 @@ void Undoable::set_current_frame(int frame) assert(frame >= 0); if (is_enabled()) - undo_int(m_sprite->undo, m_sprite, &m_sprite->frame); + undo_set_frame(m_sprite->getUndo(), m_sprite); - sprite_set_frame(m_sprite, frame); + m_sprite->setCurrentFrame(frame); } /** @@ -117,9 +118,9 @@ void Undoable::set_current_frame(int frame) void Undoable::set_current_layer(Layer* layer) { if (is_enabled()) - undo_set_layer(m_sprite->undo, m_sprite); + undo_set_layer(m_sprite->getUndo(), m_sprite); - sprite_set_layer(m_sprite, layer); + m_sprite->setCurrentLayer(layer); } void Undoable::set_sprite_size(int w, int h) @@ -127,42 +128,44 @@ void Undoable::set_sprite_size(int w, int h) assert(w > 0); assert(h > 0); - if (is_enabled()) { - undo_int(m_sprite->undo, m_sprite, &m_sprite->w); - undo_int(m_sprite->undo, m_sprite, &m_sprite->h); - } + if (is_enabled()) + undo_set_size(m_sprite->getUndo(), m_sprite); - sprite_set_size(m_sprite, w, h); + m_sprite->setSize(w, h); } void Undoable::crop_sprite(int x, int y, int w, int h, int bgcolor) { set_sprite_size(w, h); - displace_layers(m_sprite->get_folder(), -x, -y); + displace_layers(m_sprite->getFolder(), -x, -y); - Layer *background_layer = sprite_get_background_layer(m_sprite); + Layer *background_layer = m_sprite->getBackgroundLayer(); if (background_layer) - crop_layer(background_layer, 0, 0, m_sprite->w, m_sprite->h, bgcolor); + crop_layer(background_layer, 0, 0, m_sprite->getWidth(), m_sprite->getHeight(), bgcolor); - if (!m_sprite->mask->is_empty()) - set_mask_position(m_sprite->mask->x-x, m_sprite->mask->y-y); + if (!m_sprite->getMask()->is_empty()) + set_mask_position(m_sprite->getMask()->x-x, m_sprite->getMask()->y-y); } void Undoable::autocrop_sprite(int bgcolor) { - int old_frame = m_sprite->frame; + int old_frame = m_sprite->getCurrentFrame(); int x1, y1, x2, y2; int u1, v1, u2, v2; x1 = y1 = INT_MAX; x2 = y2 = INT_MIN; - Image* image = image_new(m_sprite->imgtype, m_sprite->w, m_sprite->h); + Image* image = image_new(m_sprite->getImgType(), + m_sprite->getWidth(), + m_sprite->getHeight()); + + for (int frame=0; framegetTotalFrames(); ++frame) { + m_sprite->setCurrentFrame(frame); - for (m_sprite->frame=0; m_sprite->frameframes; m_sprite->frame++) { image_clear(image, 0); - sprite_render(m_sprite, image, 0, 0); + m_sprite->render(image, 0, 0); // TODO configurable (what color pixel to use as "refpixel", // here we are using the top-left pixel by default) @@ -174,7 +177,7 @@ void Undoable::autocrop_sprite(int bgcolor) y2 = MAX(y2, v2); } } - m_sprite->frame = old_frame; + m_sprite->setCurrentFrame(old_frame); image_free(image); @@ -194,41 +197,40 @@ void Undoable::set_imgtype(int new_imgtype, int dithering_method) Image *new_image; int c; - if (m_sprite->imgtype == new_imgtype) + if (m_sprite->getImgType() == new_imgtype) return; /* change imgtype of the stock of images */ if (is_enabled()) - undo_int(m_sprite->undo, (GfxObj *)m_sprite->stock, &m_sprite->stock->imgtype); + undo_int(m_sprite->getUndo(), m_sprite->getStock(), &m_sprite->getStock()->imgtype); - m_sprite->stock->imgtype = new_imgtype; + m_sprite->getStock()->imgtype = new_imgtype; - for (c=0; cstock->nimage; c++) { - old_image = stock_get_image(m_sprite->stock, c); + for (c=0; cgetStock()->nimage; c++) { + old_image = stock_get_image(m_sprite->getStock(), c); if (!old_image) continue; new_image = image_set_imgtype(old_image, new_imgtype, dithering_method, rgb_map, - /* TODO check this out */ - sprite_get_palette(m_sprite, - m_sprite->frame)); + // TODO check this out + m_sprite->getCurrentPalette()); if (!new_image) return; /* TODO error handling: not enough memory! we should undo all work done */ if (is_enabled()) - undo_replace_image(m_sprite->undo, m_sprite->stock, c); + undo_replace_image(m_sprite->getUndo(), m_sprite->getStock(), c); image_free(old_image); - stock_replace_image(m_sprite->stock, c, new_image); + stock_replace_image(m_sprite->getStock(), c, new_image); } /* change "sprite.imgtype" field */ if (is_enabled()) - undo_int(m_sprite->undo, m_sprite, &m_sprite->imgtype); + undo_set_imgtype(m_sprite->getUndo(), m_sprite); - m_sprite->imgtype = new_imgtype; + m_sprite->setImgType(new_imgtype); // change "sprite.palette" if (new_imgtype == IMAGE_GRAYSCALE) { @@ -237,16 +239,16 @@ void Undoable::set_imgtype(int new_imgtype, int dithering_method) JLink link; // Save all palettes - JI_LIST_FOR_EACH(m_sprite->palettes, link) { + JI_LIST_FOR_EACH(m_sprite->getPalettes(), link) { palette = reinterpret_cast(link->data); - undo_remove_palette(m_sprite->undo, m_sprite, palette); + undo_remove_palette(m_sprite->getUndo(), m_sprite, palette); } } std::auto_ptr graypal(Palette::createGrayscale()); - sprite_reset_palettes(m_sprite); - sprite_set_palette(m_sprite, graypal.get(), true); + m_sprite->resetPalettes(); + m_sprite->setPalette(graypal.get(), true); } } @@ -261,10 +263,10 @@ int Undoable::add_image_in_stock(Image* image) assert(image); // add the image in the stock - int image_index = stock_add_image(m_sprite->stock, image); + int image_index = stock_add_image(m_sprite->getStock(), image); if (is_enabled()) - undo_add_image(m_sprite->undo, m_sprite->stock, image_index); + undo_add_image(m_sprite->getUndo(), m_sprite->getStock(), image_index); return image_index; } @@ -276,27 +278,27 @@ void Undoable::remove_image_from_stock(int image_index) { assert(image_index >= 0); - Image* image = stock_get_image(m_sprite->stock, image_index); + Image* image = stock_get_image(m_sprite->getStock(), image_index); assert(image); if (is_enabled()) - undo_remove_image(m_sprite->undo, m_sprite->stock, image_index); + undo_remove_image(m_sprite->getUndo(), m_sprite->getStock(), image_index); - stock_remove_image(m_sprite->stock, image); + stock_remove_image(m_sprite->getStock(), image); image_free(image); } void Undoable::replace_stock_image(int image_index, Image* new_image) { // get the current image in the 'image_index' position - Image* old_image = stock_get_image(m_sprite->stock, image_index); + Image* old_image = stock_get_image(m_sprite->getStock(), image_index); assert(old_image); // replace the image in the stock if (is_enabled()) - undo_replace_image(m_sprite->undo, m_sprite->stock, image_index); + undo_replace_image(m_sprite->getUndo(), m_sprite->getStock(), image_index); - stock_replace_image(m_sprite->stock, image_index, new_image); + stock_replace_image(m_sprite->getStock(), image_index, new_image); // destroy the old image image_free(old_image); @@ -315,9 +317,9 @@ Layer* Undoable::new_layer() // add the layer in the sprite set if (is_enabled()) - undo_add_layer(m_sprite->undo, m_sprite->get_folder(), layer); + undo_add_layer(m_sprite->getUndo(), m_sprite->getFolder(), layer); - m_sprite->get_folder()->add_layer(layer); + m_sprite->getFolder()->add_layer(layer); // select the new layer set_current_layer(layer); @@ -335,7 +337,7 @@ void Undoable::remove_layer(Layer* layer) LayerFolder* parent = layer->get_parent(); // if the layer to be removed is the selected layer - if (layer == m_sprite->layer) { + if (layer == m_sprite->getCurrentLayer()) { Layer* layer_select = NULL; // select: previous layer, or next layer, or parent(if it is not the @@ -344,7 +346,7 @@ void Undoable::remove_layer(Layer* layer) layer_select = layer->get_prev(); else if (layer->get_next()) layer_select = layer->get_next(); - else if (parent != m_sprite->get_folder()) + else if (parent != m_sprite->getFolder()) layer_select = parent; // select other layer @@ -353,7 +355,7 @@ void Undoable::remove_layer(Layer* layer) // remove the layer if (is_enabled()) - undo_remove_layer(m_sprite->undo, layer); + undo_remove_layer(m_sprite->getUndo(), layer); parent->remove_layer(layer); @@ -364,7 +366,7 @@ void Undoable::remove_layer(Layer* layer) void Undoable::move_layer_after(Layer* layer, Layer* after_this) { if (is_enabled()) - undo_move_layer(m_sprite->undo, layer); + undo_move_layer(m_sprite->getUndo(), layer); layer->get_parent()->move_layer(layer, after_this); } @@ -418,11 +420,13 @@ void Undoable::background_from_layer(LayerImage* layer, int bgcolor) assert(layer->is_readable()); assert(layer->is_writable()); assert(layer->getSprite() == m_sprite); - assert(sprite_get_background_layer(m_sprite) == NULL); + assert(m_sprite->getBackgroundLayer() == NULL); // create a temporary image to draw each frame of the new // `Background' layer - std::auto_ptr bg_image_wrap(image_new(m_sprite->imgtype, m_sprite->w, m_sprite->h)); + std::auto_ptr bg_image_wrap(image_new(m_sprite->getImgType(), + m_sprite->getWidth(), + m_sprite->getHeight())); Image* bg_image = bg_image_wrap.get(); CelIterator it = layer->get_cel_begin(); @@ -431,10 +435,10 @@ void Undoable::background_from_layer(LayerImage* layer, int bgcolor) for (; it != end; ++it) { Cel* cel = *it; assert((cel->image > 0) && - (cel->image < m_sprite->stock->nimage)); + (cel->image < m_sprite->getStock()->nimage)); // get the image from the sprite's stock of images - Image* cel_image = stock_get_image(m_sprite->stock, cel->image); + Image* cel_image = stock_get_image(m_sprite->getStock(), cel->image); assert(cel_image); image_clear(bg_image, bgcolor); @@ -451,7 +455,7 @@ void Undoable::background_from_layer(LayerImage* layer, int bgcolor) if (bg_image->w == cel_image->w && bg_image->h == cel_image->h) { if (is_enabled()) - undo_image(m_sprite->undo, cel_image, 0, 0, cel_image->w, cel_image->h); + undo_image(m_sprite->getUndo(), cel_image, 0, 0, cel_image->w, cel_image->h); image_copy(cel_image, bg_image, 0, 0); } @@ -461,10 +465,10 @@ void Undoable::background_from_layer(LayerImage* layer, int bgcolor) } // Fill all empty cels with a flat-image filled with bgcolor - for (int frame=0; frameframes; frame++) { + for (int frame=0; framegetTotalFrames(); frame++) { Cel* cel = layer->get_cel(frame); if (!cel) { - Image* cel_image = image_new(m_sprite->imgtype, m_sprite->w, m_sprite->h); + Image* cel_image = image_new(m_sprite->getImgType(), m_sprite->getWidth(), m_sprite->getHeight()); image_clear(cel_image, bgcolor); // Add the new image in the stock @@ -481,25 +485,25 @@ void Undoable::background_from_layer(LayerImage* layer, int bgcolor) void Undoable::layer_from_background() { - assert(sprite_get_background_layer(m_sprite) != NULL); - assert(m_sprite->layer != NULL); - assert(m_sprite->layer->is_image()); - assert(m_sprite->layer->is_readable()); - assert(m_sprite->layer->is_writable()); - assert(m_sprite->layer->is_background()); + assert(m_sprite->getBackgroundLayer() != NULL); + assert(m_sprite->getCurrentLayer() != NULL); + assert(m_sprite->getCurrentLayer()->is_image()); + assert(m_sprite->getCurrentLayer()->is_readable()); + assert(m_sprite->getCurrentLayer()->is_writable()); + assert(m_sprite->getCurrentLayer()->is_background()); if (is_enabled()) { - undo_data(m_sprite->undo, - m_sprite->layer, - m_sprite->layer->flags_addr(), - sizeof(*m_sprite->layer->flags_addr())); + undo_data(m_sprite->getUndo(), + m_sprite->getCurrentLayer(), + m_sprite->getCurrentLayer()->flags_addr(), + sizeof(*m_sprite->getCurrentLayer()->flags_addr())); - undo_set_layer_name(m_sprite->undo, m_sprite->layer); + undo_set_layer_name(m_sprite->getUndo(), m_sprite->getCurrentLayer()); } - m_sprite->layer->set_background(false); - m_sprite->layer->set_moveable(true); - m_sprite->layer->set_name("Layer 0"); + m_sprite->getCurrentLayer()->set_background(false); + m_sprite->getCurrentLayer()->set_moveable(true); + m_sprite->getCurrentLayer()->set_name("Layer 0"); } void Undoable::flatten_layers(int bgcolor) @@ -509,42 +513,44 @@ void Undoable::flatten_layers(int bgcolor) int frame; // create a temporary image - std::auto_ptr image_wrap(image_new(m_sprite->imgtype, m_sprite->w, m_sprite->h)); + std::auto_ptr image_wrap(image_new(m_sprite->getImgType(), + m_sprite->getWidth(), + m_sprite->getHeight())); Image* image = image_wrap.get(); /* get the background layer from the sprite */ - LayerImage* background = sprite_get_background_layer(m_sprite); + LayerImage* background = m_sprite->getBackgroundLayer(); if (!background) { /* if there aren't a background layer we must to create the background */ background = new LayerImage(m_sprite); if (is_enabled()) - undo_add_layer(m_sprite->undo, m_sprite->get_folder(), background); + undo_add_layer(m_sprite->getUndo(), m_sprite->getFolder(), background); - m_sprite->get_folder()->add_layer(background); + m_sprite->getFolder()->add_layer(background); if (is_enabled()) - undo_move_layer(m_sprite->undo, background); + undo_move_layer(m_sprite->getUndo(), background); background->configure_as_background(); } /* copy all frames to the background */ - for (frame=0; frameframes; frame++) { + for (frame=0; framegetTotalFrames(); frame++) { /* clear the image and render this frame */ image_clear(image, bgcolor); - layer_render(m_sprite->get_folder(), image, 0, 0, frame); + layer_render(m_sprite->getFolder(), image, 0, 0, frame); cel = background->get_cel(frame); if (cel) { - cel_image = m_sprite->stock->image[cel->image]; + cel_image = m_sprite->getStock()->image[cel->image]; assert(cel_image != NULL); /* we have to save the current state of `cel_image' in the undo */ if (is_enabled()) { Dirty* dirty = dirty_new_from_differences(cel_image, image); dirty_save_image_data(dirty); - undo_dirty(m_sprite->undo, dirty); + undo_dirty(m_sprite->getUndo(), dirty); } } else { @@ -554,7 +560,7 @@ void Undoable::flatten_layers(int bgcolor) /* TODO error handling: if (!cel_image) { ... } */ /* here we create the new cel (with the new image `cel_image') */ - cel = cel_new(frame, stock_add_image(m_sprite->stock, cel_image)); + cel = cel_new(frame, stock_add_image(m_sprite->getStock(), cel_image)); /* TODO error handling: if (!cel) { ... } */ /* and finally we add the cel in the background */ @@ -565,15 +571,15 @@ void Undoable::flatten_layers(int bgcolor) } /* select the background */ - if (m_sprite->layer != background) { + if (m_sprite->getCurrentLayer() != background) { if (is_enabled()) - undo_set_layer(m_sprite->undo, m_sprite); + undo_set_layer(m_sprite->getUndo(), m_sprite); - sprite_set_layer(m_sprite, background); + m_sprite->setCurrentLayer(background); } /* remove old layers */ - LayerList layers = m_sprite->get_folder()->get_layers_list(); + LayerList layers = m_sprite->getFolder()->get_layers_list(); LayerIterator it = layers.begin(); LayerIterator end = layers.end(); @@ -583,9 +589,9 @@ void Undoable::flatten_layers(int bgcolor) // remove the layer if (is_enabled()) - undo_remove_layer(m_sprite->undo, old_layer); + undo_remove_layer(m_sprite->getUndo(), old_layer); - m_sprite->get_folder()->remove_layer(old_layer); + m_sprite->getFolder()->remove_layer(old_layer); // destroy the layer delete old_layer; @@ -596,9 +602,9 @@ void Undoable::flatten_layers(int bgcolor) void Undoable::configure_layer_as_background(LayerImage* layer) { if (is_enabled()) { - undo_data(m_sprite->undo, layer, layer->flags_addr(), sizeof(*layer->flags_addr())); - undo_set_layer_name(m_sprite->undo, layer); - undo_move_layer(m_sprite->undo, layer); + undo_data(m_sprite->getUndo(), layer, layer->flags_addr(), sizeof(*layer->flags_addr())); + undo_set_layer_name(m_sprite->getUndo(), layer); + undo_move_layer(m_sprite->getUndo(), layer); } layer->configure_as_background(); @@ -607,14 +613,14 @@ void Undoable::configure_layer_as_background(LayerImage* layer) void Undoable::new_frame() { // add a new cel to every layer - new_frame_for_layer(m_sprite->get_folder(), - m_sprite->frame+1); + new_frame_for_layer(m_sprite->getFolder(), + m_sprite->getCurrentFrame()+1); // increment frames counter in the sprite - set_number_of_frames(m_sprite->frames+1); + set_number_of_frames(m_sprite->getTotalFrames()+1); // go to next frame (the new one) - set_current_frame(m_sprite->frame+1); + set_current_frame(m_sprite->getCurrentFrame()+1); } void Undoable::new_frame_for_layer(Layer* layer, int frame) @@ -626,7 +632,7 @@ void Undoable::new_frame_for_layer(Layer* layer, int frame) case GFXOBJ_LAYER_IMAGE: // displace all cels in '>=frame' to the next frame - for (int c=m_sprite->frames-1; c>=frame; --c) { + for (int c=m_sprite->getTotalFrames()-1; c>=frame; --c) { Cel* cel = static_cast(layer)->get_cel(c); if (cel) set_cel_frame_position(cel, cel->frame+1); @@ -651,23 +657,19 @@ void Undoable::remove_frame(int frame) { assert(frame >= 0); - // remove cels from this frame (and displace one position backward + // Remove cels from this frame (and displace one position backward // all next frames) - remove_frame_of_layer(m_sprite->get_folder(), frame); + remove_frame_of_layer(m_sprite->getFolder(), frame); - /* decrement frames counter in the sprite */ - if (is_enabled()) - undo_set_frames(m_sprite->undo, m_sprite); + // New value for totalFrames propety + int newTotalFrames = m_sprite->getTotalFrames()-1; - sprite_set_frames(m_sprite, m_sprite->frames-1); + // Move backward if we will be outside the range of frames + if (m_sprite->getCurrentFrame() >= newTotalFrames) + set_current_frame(newTotalFrames-1); - /* move backward if we are outside the range of frames */ - if (m_sprite->frame >= m_sprite->frames) { - if (is_enabled()) - undo_int(m_sprite->undo, m_sprite, &m_sprite->frame); - - sprite_set_frame(m_sprite, m_sprite->frames-1); - } + // Decrement frames counter in the sprite + set_number_of_frames(newTotalFrames); } void Undoable::remove_frame_of_layer(Layer* layer, int frame) @@ -681,7 +683,7 @@ void Undoable::remove_frame_of_layer(Layer* layer, int frame) if (Cel* cel = static_cast(layer)->get_cel(frame)) remove_cel(static_cast(layer), cel); - for (++frame; frameframes; ++frame) + for (++frame; framegetTotalFrames(); ++frame) if (Cel* cel = static_cast(layer)->get_cel(frame)) set_cel_frame_position(cel, cel->frame-1); break; @@ -708,7 +710,7 @@ void Undoable::copy_previous_frame(Layer* layer, int frame) // create a copy of the previous cel Cel* src_cel = static_cast(layer)->get_cel(frame-1); - Image* src_image = src_cel ? stock_get_image(m_sprite->stock, + Image* src_image = src_cel ? stock_get_image(m_sprite->getStock(), src_cel->image): NULL; @@ -737,7 +739,7 @@ void Undoable::add_cel(LayerImage* layer, Cel* cel) assert(cel); if (is_enabled()) - undo_add_cel(m_sprite->undo, layer, cel); + undo_add_cel(m_sprite->getUndo(), layer, cel); layer->add_cel(cel); } @@ -750,7 +752,7 @@ void Undoable::remove_cel(LayerImage* layer, Cel* cel) // find if the image that use the cel to remove, is used by // another cels bool used = false; - for (int frame=0; frameframes; ++frame) { + for (int frame=0; framegetTotalFrames(); ++frame) { Cel* it = layer->get_cel(frame); if (it && it != cel && it->image == cel->image) { used = true; @@ -764,7 +766,7 @@ void Undoable::remove_cel(LayerImage* layer, Cel* cel) remove_image_from_stock(cel->image); if (is_enabled()) - undo_remove_cel(m_sprite->undo, layer, cel); + undo_remove_cel(m_sprite->getUndo(), layer, cel); // remove the cel from the layer layer->remove_cel(cel); @@ -779,7 +781,7 @@ void Undoable::set_cel_frame_position(Cel* cel, int frame) assert(frame >= 0); if (is_enabled()) - undo_int(m_sprite->undo, cel, &cel->frame); + undo_int(m_sprite->getUndo(), cel, &cel->frame); cel->frame = frame; } @@ -789,8 +791,8 @@ void Undoable::set_cel_position(Cel* cel, int x, int y) assert(cel); if (is_enabled()) { - undo_int(m_sprite->undo, cel, &cel->x); - undo_int(m_sprite->undo, cel, &cel->y); + undo_int(m_sprite->getUndo(), cel, &cel->x); + undo_int(m_sprite->getUndo(), cel, &cel->y); } cel->x = x; @@ -800,53 +802,49 @@ void Undoable::set_cel_position(Cel* cel, int x, int y) void Undoable::set_frame_duration(int frame, int msecs) { if (is_enabled()) - undo_set_frlen(m_sprite->undo, m_sprite, frame); + undo_set_frlen(m_sprite->getUndo(), m_sprite, frame); - sprite_set_frlen(m_sprite, frame, msecs); + m_sprite->setFrameDuration(frame, msecs); } void Undoable::set_constant_frame_rate(int msecs) { if (is_enabled()) { - for (int fr=0; frframes; ++fr) - undo_set_frlen(m_sprite->undo, m_sprite, fr); + for (int fr=0; frgetTotalFrames(); ++fr) + undo_set_frlen(m_sprite->getUndo(), m_sprite, fr); } - sprite_set_speed(m_sprite, msecs); + m_sprite->setDurationForAllFrames(msecs); } void Undoable::move_frame_before(int frame, int before_frame) { if (frame != before_frame && frame >= 0 && - frame < m_sprite->frames && + frame < m_sprite->getTotalFrames() && before_frame >= 0 && - before_frame < m_sprite->frames) { + before_frame < m_sprite->getTotalFrames()) { // change the frame-lengths... - int frlen_aux = m_sprite->frlens[frame]; + int frlen_aux = m_sprite->getFrameDuration(frame); // moving the frame to the future if (frame < before_frame) { - frlen_aux = m_sprite->frlens[frame]; - for (int c=frame; cfrlens[c+1]); + set_frame_duration(c, m_sprite->getFrameDuration(c+1)); set_frame_duration(before_frame-1, frlen_aux); } // moving the frame to the past else if (before_frame < frame) { - frlen_aux = m_sprite->frlens[frame]; - for (int c=frame; c>before_frame; c--) - set_frame_duration(c, m_sprite->frlens[c-1]); + set_frame_duration(c, m_sprite->getFrameDuration(c-1)); set_frame_duration(before_frame, frlen_aux); } // change the cels of position... - move_frame_before_layer(m_sprite->get_folder(), frame, before_frame); + move_frame_before_layer(m_sprite->getFolder(), frame, before_frame); } } @@ -905,15 +903,15 @@ void Undoable::move_frame_before_layer(Layer* layer, int frame, int before_frame Cel* Undoable::get_current_cel() { - if (m_sprite->layer && m_sprite->layer->is_image()) - return static_cast(m_sprite->layer)->get_cel(m_sprite->frame); + if (m_sprite->getCurrentLayer() && m_sprite->getCurrentLayer()->is_image()) + return static_cast(m_sprite->getCurrentLayer())->get_cel(m_sprite->getCurrentFrame()); else return NULL; } void Undoable::crop_cel(Cel* cel, int x, int y, int w, int h, int bgcolor) { - Image* cel_image = stock_get_image(m_sprite->stock, cel->image); + Image* cel_image = stock_get_image(m_sprite->getStock(), cel->image); assert(cel_image); // create the new image through a crop @@ -928,8 +926,8 @@ void Undoable::crop_cel(Cel* cel, int x, int y, int w, int h, int bgcolor) Image* Undoable::get_cel_image(Cel* cel) { - if (cel && cel->image >= 0 && cel->image < m_sprite->stock->nimage) - return m_sprite->stock->image[cel->image]; + if (cel && cel->image >= 0 && cel->image < m_sprite->getStock()->nimage) + return m_sprite->getStock()->image[cel->image]; else return NULL; } @@ -947,11 +945,11 @@ void Undoable::clear_mask(int bgcolor) // if the mask is empty then we have to clear the entire image // in the cel - if (m_sprite->mask->is_empty()) { + if (m_sprite->getMask()->is_empty()) { // if the layer is the background then we clear the image - if (m_sprite->layer->is_background()) { + if (m_sprite->getCurrentLayer()->is_background()) { if (is_enabled()) - undo_image(m_sprite->undo, image, 0, 0, image->w, image->h); + undo_image(m_sprite->getUndo(), image, 0, 0, image->w, image->h); // clear all image_clear(image, bgcolor); @@ -959,32 +957,32 @@ void Undoable::clear_mask(int bgcolor) // if the layer is transparent we can remove the cel (and its // associated image) else { - remove_cel(static_cast(m_sprite->layer), cel); + remove_cel(static_cast(m_sprite->getCurrentLayer()), cel); } } else { int u, v, putx, puty; - int x1 = MAX(0, m_sprite->mask->x); - int y1 = MAX(0, m_sprite->mask->y); - int x2 = MIN(image->w-1, m_sprite->mask->x+m_sprite->mask->w-1); - int y2 = MIN(image->h-1, m_sprite->mask->y+m_sprite->mask->h-1); + int x1 = MAX(0, m_sprite->getMask()->x); + int y1 = MAX(0, m_sprite->getMask()->y); + int x2 = MIN(image->w-1, m_sprite->getMask()->x+m_sprite->getMask()->w-1); + int y2 = MIN(image->h-1, m_sprite->getMask()->y+m_sprite->getMask()->h-1); // do nothing if (x1 > x2 || y1 > y2) return; if (is_enabled()) - undo_image(m_sprite->undo, image, x1, y1, x2-x1+1, y2-y1+1); + undo_image(m_sprite->getUndo(), image, x1, y1, x2-x1+1, y2-y1+1); // clear the masked zones - for (v=0; vmask->h; v++) { + for (v=0; vgetMask()->h; v++) { div_t d = div(0, 8); - ase_uint8* address = ((ase_uint8 **)m_sprite->mask->bitmap->line)[v]+d.quot; + ase_uint8* address = ((ase_uint8 **)m_sprite->getMask()->bitmap->line)[v]+d.quot; - for (u=0; umask->w; u++) { + for (u=0; ugetMask()->w; u++) { if ((*address & (1<mask->x - cel->x; - puty = v + m_sprite->mask->y - cel->y; + putx = u + m_sprite->getMask()->x - cel->x; + puty = v + m_sprite->getMask()->y - cel->y; image_putpixel(image, putx, puty, bgcolor); } @@ -1000,10 +998,10 @@ void Undoable::flip_image(Image* image, int x1, int y1, int x2, int y2, // insert the undo operation if (is_enabled()) { if (flip_horizontal) - undo_flip(m_sprite->undo, image, x1, y1, x2, y2, true); + undo_flip(m_sprite->getUndo(), image, x1, y1, x2, y2, true); if (flip_vertical) - undo_flip(m_sprite->undo, image, x1, y1, x2, y2, false); + undo_flip(m_sprite->getUndo(), image, x1, y1, x2, y2, false); } // flip the portion of the bitmap @@ -1022,45 +1020,45 @@ void Undoable::flip_image(Image* image, int x1, int y1, int x2, int y2, void Undoable::copy_to_current_mask(Mask* mask) { - assert(m_sprite->mask); + assert(m_sprite->getMask()); assert(mask); if (is_enabled()) - undo_set_mask(m_sprite->undo, m_sprite); + undo_set_mask(m_sprite->getUndo(), m_sprite); - mask_copy(m_sprite->mask, mask); + mask_copy(m_sprite->getMask(), mask); } void Undoable::set_mask_position(int x, int y) { - assert(m_sprite->mask); + assert(m_sprite->getMask()); if (is_enabled()) { - undo_int(m_sprite->undo, m_sprite->mask, &m_sprite->mask->x); - undo_int(m_sprite->undo, m_sprite->mask, &m_sprite->mask->y); + undo_int(m_sprite->getUndo(), m_sprite->getMask(), &m_sprite->getMask()->x); + undo_int(m_sprite->getUndo(), m_sprite->getMask(), &m_sprite->getMask()->y); } - m_sprite->mask->x = x; - m_sprite->mask->y = y; + m_sprite->getMask()->x = x; + m_sprite->getMask()->y = y; } void Undoable::deselect_mask() { // Destroy the *deselected* mask - Mask* mask = sprite_request_mask(m_sprite, "*deselected*"); + Mask* mask = m_sprite->requestMask("*deselected*"); if (mask) { - sprite_remove_mask(m_sprite, mask); + m_sprite->removeMask(mask); mask_free(mask); } // Save the selection in the repository - mask = mask_new_copy(m_sprite->mask); + mask = mask_new_copy(m_sprite->getMask()); mask_set_name(mask, "*deselected*"); - sprite_add_mask(m_sprite, mask); + m_sprite->addMask(mask); - if (undo_is_enabled(m_sprite->undo)) - undo_set_mask(m_sprite->undo, m_sprite); + if (undo_is_enabled(m_sprite->getUndo())) + undo_set_mask(m_sprite->getUndo(), m_sprite); /// Deselect the mask - mask_none(m_sprite->mask); + mask_none(m_sprite->getMask()); } diff --git a/src/util/celmove.cpp b/src/util/celmove.cpp index 894f22fe3..f8af0cac5 100644 --- a/src/util/celmove.cpp +++ b/src/util/celmove.cpp @@ -60,8 +60,8 @@ void move_cel(SpriteWriter& sprite) assert(src_layer != NULL); assert(dst_layer != NULL); - assert(src_frame >= 0 && src_frame < sprite->frames); - assert(dst_frame >= 0 && dst_frame < sprite->frames); + assert(src_frame >= 0 && src_frame < sprite->getTotalFrames()); + assert(dst_frame >= 0 && dst_frame < sprite->getTotalFrames()); if (src_layer->is_background()) { copy_cel(sprite); @@ -71,16 +71,16 @@ void move_cel(SpriteWriter& sprite) src_cel = static_cast(src_layer)->get_cel(src_frame); dst_cel = static_cast(dst_layer)->get_cel(dst_frame); - if (undo_is_enabled(sprite->undo)) { - undo_set_label(sprite->undo, "Move Cel"); - undo_open(sprite->undo); + if (undo_is_enabled(sprite->getUndo())) { + undo_set_label(sprite->getUndo(), "Move Cel"); + undo_open(sprite->getUndo()); - undo_set_layer(sprite->undo, sprite); - undo_int(sprite->undo, sprite, &sprite->frame); + undo_set_layer(sprite->getUndo(), sprite); + undo_set_frame(sprite->getUndo(), sprite); } - sprite_set_layer(sprite, dst_layer); - sprite_set_frame(sprite, dst_frame); + sprite->setCurrentLayer(dst_layer); + sprite->setCurrentFrame(dst_frame); /* remove the 'dst_cel' (if it exists) because it must be replaced with 'src_cel' */ @@ -90,15 +90,15 @@ void move_cel(SpriteWriter& sprite) /* move the cel in the same layer */ if (src_cel != NULL) { if (src_layer == dst_layer) { - if (undo_is_enabled(sprite->undo)) - undo_int(sprite->undo, (GfxObj *)src_cel, &src_cel->frame); + if (undo_is_enabled(sprite->getUndo())) + undo_int(sprite->getUndo(), (GfxObj *)src_cel, &src_cel->frame); src_cel->frame = dst_frame; } /* move the cel in different layers */ else { - if (undo_is_enabled(sprite->undo)) - undo_remove_cel(sprite->undo, src_layer, src_cel); + if (undo_is_enabled(sprite->getUndo())) + undo_remove_cel(sprite->getUndo(), src_layer, src_cel); static_cast(src_layer)->remove_cel(src_cel); src_cel->frame = dst_frame; @@ -108,18 +108,18 @@ void move_cel(SpriteWriter& sprite) image */ if (!src_layer->is_background() && dst_layer->is_background()) { - Image *src_image = stock_get_image(sprite->stock, src_cel->image); + Image *src_image = stock_get_image(sprite->getStock(), src_cel->image); Image *dst_image = image_crop(src_image, -src_cel->x, -src_cel->y, - sprite->w, - sprite->h, 0); + sprite->getWidth(), + sprite->getHeight(), 0); - if (undo_is_enabled(sprite->undo)) { - undo_replace_image(sprite->undo, sprite->stock, src_cel->image); - undo_int(sprite->undo, (GfxObj *)src_cel, &src_cel->x); - undo_int(sprite->undo, (GfxObj *)src_cel, &src_cel->y); - undo_int(sprite->undo, (GfxObj *)src_cel, &src_cel->opacity); + if (undo_is_enabled(sprite->getUndo())) { + undo_replace_image(sprite->getUndo(), sprite->getStock(), src_cel->image); + undo_int(sprite->getUndo(), (GfxObj *)src_cel, &src_cel->x); + undo_int(sprite->getUndo(), (GfxObj *)src_cel, &src_cel->y); + undo_int(sprite->getUndo(), (GfxObj *)src_cel, &src_cel->opacity); } image_clear(dst_image, app_get_color_to_clear_layer(dst_layer)); @@ -129,19 +129,19 @@ void move_cel(SpriteWriter& sprite) src_cel->y = 0; src_cel->opacity = 255; - stock_replace_image(sprite->stock, src_cel->image, dst_image); + stock_replace_image(sprite->getStock(), src_cel->image, dst_image); image_free(src_image); } - if (undo_is_enabled(sprite->undo)) - undo_add_cel(sprite->undo, dst_layer, src_cel); + if (undo_is_enabled(sprite->getUndo())) + undo_add_cel(sprite->getUndo(), dst_layer, src_cel); static_cast(dst_layer)->add_cel(src_cel); } } - if (undo_is_enabled(sprite->undo)) - undo_close(sprite->undo); + if (undo_is_enabled(sprite->getUndo())) + undo_close(sprite->getUndo()); set_frame_to_handle(NULL, 0, NULL, 0); } @@ -152,22 +152,22 @@ void copy_cel(SpriteWriter& sprite) assert(src_layer != NULL); assert(dst_layer != NULL); - assert(src_frame >= 0 && src_frame < sprite->frames); - assert(dst_frame >= 0 && dst_frame < sprite->frames); + assert(src_frame >= 0 && src_frame < sprite->getTotalFrames()); + assert(dst_frame >= 0 && dst_frame < sprite->getTotalFrames()); src_cel = static_cast(src_layer)->get_cel(src_frame); dst_cel = static_cast(dst_layer)->get_cel(dst_frame); - if (undo_is_enabled(sprite->undo)) { - undo_set_label(sprite->undo, "Move Cel"); - undo_open(sprite->undo); + if (undo_is_enabled(sprite->getUndo())) { + undo_set_label(sprite->getUndo(), "Move Cel"); + undo_open(sprite->getUndo()); - undo_set_layer(sprite->undo, sprite); - undo_int(sprite->undo, sprite, &sprite->frame); + undo_set_layer(sprite->getUndo(), sprite); + undo_set_frame(sprite->getUndo(), sprite); } - sprite_set_layer(sprite, dst_layer); - sprite_set_frame(sprite, dst_frame); + sprite->setCurrentLayer(dst_layer); + sprite->setCurrentFrame(dst_frame); /* remove the 'dst_cel' (if it exists) because it must be replaced with 'src_cel' */ @@ -176,7 +176,7 @@ void copy_cel(SpriteWriter& sprite) /* move the cel in the same layer */ if (src_cel != NULL) { - Image *src_image = stock_get_image(sprite->stock, src_cel->image); + Image *src_image = stock_get_image(sprite->getStock(), src_cel->image); Image *dst_image; int image_index; int dst_cel_x; @@ -191,8 +191,8 @@ void copy_cel(SpriteWriter& sprite) dst_image = image_crop(src_image, -src_cel->x, -src_cel->y, - sprite->w, - sprite->h, 0); + sprite->getWidth(), + sprite->getHeight(), 0); image_clear(dst_image, app_get_color_to_clear_layer(dst_layer)); image_merge(dst_image, src_image, src_cel->x, src_cel->y, 255, BLEND_MODE_NORMAL); @@ -209,23 +209,23 @@ void copy_cel(SpriteWriter& sprite) } /* add the image in the stock */ - image_index = stock_add_image(sprite->stock, dst_image); - if (undo_is_enabled(sprite->undo)) - undo_add_image(sprite->undo, sprite->stock, image_index); + image_index = stock_add_image(sprite->getStock(), dst_image); + if (undo_is_enabled(sprite->getUndo())) + undo_add_image(sprite->getUndo(), sprite->getStock(), image_index); /* create the new cel */ dst_cel = cel_new(dst_frame, image_index); cel_set_position(dst_cel, dst_cel_x, dst_cel_y); cel_set_opacity(dst_cel, dst_cel_opacity); - if (undo_is_enabled(sprite->undo)) - undo_add_cel(sprite->undo, dst_layer, dst_cel); + if (undo_is_enabled(sprite->getUndo())) + undo_add_cel(sprite->getUndo(), dst_layer, dst_cel); static_cast(dst_layer)->add_cel(dst_cel); } - if (undo_is_enabled(sprite->undo)) - undo_close(sprite->undo); + if (undo_is_enabled(sprite->getUndo())) + undo_close(sprite->getUndo()); set_frame_to_handle(NULL, 0, NULL, 0); } @@ -241,7 +241,7 @@ static void remove_cel(Sprite* sprite, LayerImage *layer, Cel *cel) /* find if the image that use the cel to remove, is used by another cels */ used = false; - for (frame=0; frameframes; ++frame) { + for (frame=0; framegetTotalFrames(); ++frame) { it = layer->get_cel(frame); if (it != NULL && it != cel && it->image == cel->image) { used = true; @@ -249,24 +249,24 @@ static void remove_cel(Sprite* sprite, LayerImage *layer, Cel *cel) } } - if (undo_is_enabled(sprite->undo)) - undo_open(sprite->undo); + if (undo_is_enabled(sprite->getUndo())) + undo_open(sprite->getUndo()); if (!used) { /* if the image is only used by this cel, we can remove the image from the stock */ - image = stock_get_image(sprite->stock, cel->image); + image = stock_get_image(sprite->getStock(), cel->image); - if (undo_is_enabled(sprite->undo)) - undo_remove_image(sprite->undo, sprite->stock, cel->image); + if (undo_is_enabled(sprite->getUndo())) + undo_remove_image(sprite->getUndo(), sprite->getStock(), cel->image); - stock_remove_image(sprite->stock, image); + stock_remove_image(sprite->getStock(), image); image_free(image); } - if (undo_is_enabled(sprite->undo)) { - undo_remove_cel(sprite->undo, layer, cel); - undo_close(sprite->undo); + if (undo_is_enabled(sprite->getUndo())) { + undo_remove_cel(sprite->getUndo(), layer, cel); + undo_close(sprite->getUndo()); } /* remove the cel */ diff --git a/src/util/clipboard.cpp b/src/util/clipboard.cpp index 104295839..7e39fb6db 100644 --- a/src/util/clipboard.cpp +++ b/src/util/clipboard.cpp @@ -139,7 +139,7 @@ static bool copy_from_sprite(const Sprite* sprite) if (!image) return false; - Palette* pal = sprite_get_palette(sprite, sprite->frame); + const Palette* pal = sprite->getPalette(sprite->getCurrentFrame()); set_clipboard(image, pal ? new Palette(*pal): NULL, true); return true; } @@ -165,7 +165,7 @@ bool clipboard::can_paste() void clipboard::cut(SpriteWriter& sprite) { assert(sprite != NULL); - assert(sprite->layer != NULL); + assert(sprite->getCurrentLayer() != NULL); if (!copy_from_sprite(sprite)) { Console console; @@ -174,11 +174,11 @@ void clipboard::cut(SpriteWriter& sprite) else { { Undoable undoable(sprite, "Cut"); - undoable.clear_mask(app_get_color_to_clear_layer(sprite->layer)); + undoable.clear_mask(app_get_color_to_clear_layer(sprite->getCurrentLayer())); undoable.deselect_mask(); undoable.commit(); } - sprite_generate_mask_boundaries(sprite); + sprite->generateMaskBoundaries(); update_screen_for_sprite(sprite); } } @@ -222,7 +222,7 @@ void clipboard::paste(SpriteWriter& sprite) assert(sprite != NULL); // destination image (where to put this image) - dst_image = GetImage2(sprite, &dst_x, &dst_y, NULL); + dst_image = sprite->getCurrentImage(&dst_x, &dst_y); if (!dst_image) { Console console; console.printf(_("Error: no destination image\n")); @@ -230,13 +230,12 @@ void clipboard::paste(SpriteWriter& sprite) } // source image (clipboard or a converted copy to the destination 'imgtype') - if (clipboard_image->imgtype == sprite->imgtype) + if (clipboard_image->imgtype == sprite->getImgType()) src_image = clipboard_image; else { CurrentSpriteRgbMap rgbmap; - src_image = image_set_imgtype(clipboard_image, sprite->imgtype, DITHERING_NONE, - rgb_map, sprite_get_palette(sprite, - sprite->frame)); + src_image = image_set_imgtype(clipboard_image, sprite->getImgType(), DITHERING_NONE, + rgb_map, sprite->getPalette(sprite->getCurrentFrame())); } // do the interactive-transform loop (where the user can move the floating image) @@ -276,8 +275,8 @@ void clipboard::paste(SpriteWriter& sprite) if (w >= 1 && h >= 1) { /* undo region */ - if (undo_is_enabled(sprite->undo)) - undo_image(sprite->undo, dst_image, u1, v1, w, h); + if (undo_is_enabled(sprite->getUndo())) + undo_image(sprite->getUndo(), dst_image, u1, v1, w, h); /* draw the transformed image */ image_parallelogram(dst_image, src_image, diff --git a/src/util/misc.cpp b/src/util/misc.cpp index d81c46122..4cb723cd6 100644 --- a/src/util/misc.cpp +++ b/src/util/misc.cpp @@ -39,46 +39,6 @@ #include "widgets/editor.h" #include "widgets/statebar.h" -Image *GetImage(const Sprite *sprite) -{ - Image *image = NULL; - - if (sprite && sprite->layer && sprite->layer->is_image()) { - Cel *cel = static_cast(sprite->layer)->get_cel(sprite->frame); - if (cel) { - assert((cel->image >= 0) && - (cel->image < sprite->stock->nimage)); - - image = sprite->stock->image[cel->image]; - } - } - - return image; -} - -Image* GetImage2(const Sprite* sprite, int* x, int* y, int* opacity) -{ - Image* image = NULL; - - if (sprite != NULL && - sprite->layer != NULL && - sprite->layer->is_image()) { - Cel* cel = static_cast(sprite->layer)->get_cel(sprite->frame); - if (cel) { - assert((cel->image >= 0) && - (cel->image < sprite->stock->nimage)); - - image = sprite->stock->image[cel->image]; - - if (x) *x = cel->x; - if (y) *y = cel->y; - if (opacity) *opacity = MID(0, cel->opacity, 255); - } - } - - return image; -} - void LoadPalette(Sprite* sprite, const char *filename) { assert(sprite != NULL); @@ -100,8 +60,8 @@ void LoadPalette(Sprite* sprite, const char *filename) set_current_palette(pal, false); /* just one palette */ - sprite_reset_palettes(sprite); - sprite_set_palette(sprite, pal, 0); + sprite->resetPalettes(); + sprite->setPalette(pal, 0); /* redraw the entire screen */ jmanager_refresh_screen(); @@ -115,19 +75,20 @@ void LoadPalette(Sprite* sprite, const char *filename) Image* NewImageFromMask(const Sprite* src_sprite) { - ase_uint8 *address; + const ase_uint8* address; int x, y, u, v, getx, gety; - Image *dst, *src = GetImage2(src_sprite, &x, &y, NULL); + Image *dst; + const Image *src = src_sprite->getCurrentImage(&x, &y); div_t d; assert(src_sprite); - assert(src_sprite->mask); - assert(src_sprite->mask->bitmap); + assert(src_sprite->getMask()); + assert(src_sprite->getMask()->bitmap); assert(src); - dst = image_new(src_sprite->imgtype, - src_sprite->mask->w, - src_sprite->mask->h); + dst = image_new(src_sprite->getImgType(), + src_sprite->getMask()->w, + src_sprite->getMask()->h); if (!dst) return NULL; @@ -135,14 +96,14 @@ Image* NewImageFromMask(const Sprite* src_sprite) image_clear(dst, 0); /* copy the masked zones */ - for (v=0; vmask->h; v++) { + for (v=0; vgetMask()->h; v++) { d = div(0, 8); - address = ((ase_uint8 **)src_sprite->mask->bitmap->line)[v]+d.quot; + address = ((const ase_uint8 **)src_sprite->getMask()->bitmap->line)[v]+d.quot; - for (u=0; umask->w; u++) { + for (u=0; ugetMask()->w; u++) { if ((*address & (1<mask->x-x; - gety = v+src_sprite->mask->y-y; + getx = u+src_sprite->getMask()->x-x; + gety = v+src_sprite->getMask()->y-y; if ((getx >= 0) && (getx < src->w) && (gety >= 0) && (gety < src->h)) @@ -163,10 +124,10 @@ int interactive_move_layer(int mode, bool use_undo, int (*callback)()) Editor* editor = current_editor; Sprite* sprite = editor->getSprite(); - assert(sprite->layer->is_image()); + assert(sprite->getCurrentLayer()->is_image()); - LayerImage* layer = static_cast(sprite->layer); - Cel *cel = layer->get_cel(sprite->frame); + LayerImage* layer = static_cast(sprite->getCurrentLayer()); + Cel *cel = layer->get_cel(sprite->getCurrentFrame()); int start_x, new_x; int start_y, new_y; int start_b; @@ -227,12 +188,12 @@ int interactive_move_layer(int mode, bool use_undo, int (*callback)()) /* the position was changed */ if (!editor->editor_click_cancel()) { - if (use_undo && undo_is_enabled(sprite->undo)) { - undo_set_label(sprite->undo, "Cel Movement"); - undo_open(sprite->undo); - undo_int(sprite->undo, (GfxObj *)cel, &cel->x); - undo_int(sprite->undo, (GfxObj *)cel, &cel->y); - undo_close(sprite->undo); + if (use_undo && undo_is_enabled(sprite->getUndo())) { + undo_set_label(sprite->getUndo(), "Cel Movement"); + undo_open(sprite->getUndo()); + undo_int(sprite->getUndo(), (GfxObj *)cel, &cel->x); + undo_int(sprite->getUndo(), (GfxObj *)cel, &cel->y); + undo_close(sprite->getUndo()); } cel_set_position(cel, new_x, new_y); diff --git a/src/util/misc.h b/src/util/misc.h index c8be52255..23a702aef 100644 --- a/src/util/misc.h +++ b/src/util/misc.h @@ -28,9 +28,6 @@ class Layer; class Sprite; class Undo; -Image* GetImage(const Sprite* sprite); -Image* GetImage2(const Sprite* sprite, int *x, int *y, int *opacity); - void LoadPalette(Sprite* sprite, const char* filename); Image* NewImageFromMask(const Sprite* src); diff --git a/src/util/quantize.cpp b/src/util/quantize.cpp index a8ea5504f..a5567643c 100644 --- a/src/util/quantize.cpp +++ b/src/util/quantize.cpp @@ -37,8 +37,8 @@ void sprite_quantize(Sprite *sprite) sprite_quantize_ex(sprite, palette); // Just one palette - sprite_reset_palettes(sprite); - sprite_set_palette(sprite, palette, false); + sprite->resetPalettes(); + sprite->setPalette(palette, false); delete palette; } @@ -55,9 +55,9 @@ void sprite_quantize_ex(Sprite *sprite, Palette *palette) TARGET_ALL_FRAMES, false); if (images != NULL) { /* add a flat image with the current sprite's frame rendered */ - flat_image = image_new(sprite->imgtype, sprite->w, sprite->h); + flat_image = image_new(sprite->getImgType(), sprite->getWidth(), sprite->getHeight()); image_clear(flat_image, 0); - sprite_render(sprite, flat_image, 0, 0); + sprite->render(flat_image, 0, 0); /* count images in the 'images' list */ c = 0; diff --git a/src/util/render.cpp b/src/util/render.cpp index a62a82f9d..23e28a1e6 100644 --- a/src/util/render.cpp +++ b/src/util/render.cpp @@ -278,12 +278,12 @@ Image* RenderEngine::renderSprite(Sprite* sprite, int frame, int zoom) { void (*zoomed_func)(Image *, Image *, int, int, int, int, int); - LayerImage* background = sprite_get_background_layer(sprite); + LayerImage* background = sprite->getBackgroundLayer(); bool need_grid = (background != NULL ? !background->is_readable(): true); int depth; Image *image; - switch (sprite->imgtype) { + switch (sprite->getImgType()) { case IMAGE_RGB: depth = 32; @@ -305,7 +305,7 @@ Image* RenderEngine::renderSprite(Sprite* sprite, } /* create a temporary bitmap to draw all to it */ - image = image_new(sprite->imgtype, width, height); + image = image_new(sprite->getImgType(), width, height); if (!image) return NULL; @@ -371,26 +371,26 @@ Image* RenderEngine::renderSprite(Sprite* sprite, color_map = NULL; global_opacity = 255; - renderLayer(sprite, sprite->get_folder(), image, source_x, source_y, + renderLayer(sprite, sprite->getFolder(), image, source_x, source_y, frame, zoom, zoomed_func, true, false); // Draw transparent layers of the previous frame with opacity=128 color_map = orig_trans_map; global_opacity = 128; - renderLayer(sprite, sprite->get_folder(), image, source_x, source_y, + renderLayer(sprite, sprite->getFolder(), image, source_x, source_y, frame-1, zoom, zoomed_func, false, true); // Draw transparent layers of the current frame with opacity=255 color_map = NULL; global_opacity = 255; - renderLayer(sprite, sprite->get_folder(), image, source_x, source_y, + renderLayer(sprite, sprite->getFolder(), image, source_x, source_y, frame, zoom, zoomed_func, false, true); } // Just draw the current frame else { - renderLayer(sprite, sprite->get_folder(), image, source_x, source_y, + renderLayer(sprite, sprite->getFolder(), image, source_x, source_y, frame, zoom, zoomed_func, true, true); } @@ -420,15 +420,15 @@ void RenderEngine::renderLayer(Sprite *sprite, Layer *layer, Image *image, Image* src_image; /* is the 'rastering_image' setted to be used with this layer? */ - if ((frame == sprite->frame) && + if ((frame == sprite->getCurrentFrame()) && (selected_layer == layer) && (rastering_image != NULL)) { src_image = rastering_image; } /* if not, we use the original cel-image from the images' stock */ else if ((cel->image >= 0) && - (cel->image < layer->getSprite()->stock->nimage)) - src_image = layer->getSprite()->stock->image[cel->image]; + (cel->image < layer->getSprite()->getStock()->nimage)) + src_image = layer->getSprite()->getStock()->image[cel->image]; else src_image = NULL; @@ -473,17 +473,17 @@ void RenderEngine::renderLayer(Sprite *sprite, Layer *layer, Image *image, } // Draw extras - if (layer == sprite->layer && sprite->get_extras() != NULL) { - int opacity = sprite->get_extras_opacity(); + if (layer == sprite->getCurrentLayer() && sprite->getExtras() != NULL) { + int opacity = sprite->getExtrasOpacity(); if (zoom == 0) { - image_merge(image, sprite->get_extras(), + image_merge(image, sprite->getExtras(), -source_x, -source_y, opacity, BLEND_MODE_NORMAL); } else { - (*zoomed_func)(image, sprite->get_extras(), + (*zoomed_func)(image, sprite->getExtras(), -source_x, -source_y, opacity, BLEND_MODE_NORMAL, zoom); diff --git a/src/util/thmbnail.cpp b/src/util/thmbnail.cpp index daab6e5bd..0e7eed7c0 100644 --- a/src/util/thmbnail.cpp +++ b/src/util/thmbnail.cpp @@ -49,7 +49,7 @@ static JList thumbnails = NULL; static Thumbnail* thumbnail_new(const Cel *cel, BITMAP* bmp); static void thumbnail_free(Thumbnail* thumbnail); -static void thumbnail_render(BITMAP* bmp, Image* image, bool has_alpha); +static void thumbnail_render(BITMAP* bmp, const Image* image, bool has_alpha); void destroy_thumbnails() { @@ -85,7 +85,7 @@ BITMAP* generate_thumbnail(const Layer* layer, const Cel* cel, const Sprite *spr return NULL; thumbnail_render(bmp, - stock_get_image(sprite->stock, cel->image), + stock_get_image(sprite->getStock(), cel->image), !layer->is_background()); thumbnail = thumbnail_new(cel, bmp); @@ -118,7 +118,7 @@ static void thumbnail_free(Thumbnail* thumbnail) jfree(thumbnail); } -static void thumbnail_render(BITMAP* bmp, Image* image, bool has_alpha) +static void thumbnail_render(BITMAP* bmp, const Image* image, bool has_alpha) { register int c, x, y; int w, h, x1, y1; @@ -179,9 +179,9 @@ static void thumbnail_render(BITMAP* bmp, Image* image, bool has_alpha) for (x=0; x= 0 && c < pal->size()); + assert(c >= 0 && (size_t)c < pal->size()); - c = pal->getEntry(MID(0, c, pal->size()-1)); + c = pal->getEntry(MID(0, (size_t)c, pal->size()-1)); putpixel(bmp, x1+x, y1+y, makecol(_rgba_getr(c), _rgba_getg(c), _rgba_getb(c))); @@ -221,9 +221,9 @@ static void thumbnail_render(BITMAP* bmp, Image* image, bool has_alpha) for (x=0; x= 0 && c < pal->size()); + assert(c >= 0 && (size_t)c < pal->size()); - c = pal->getEntry(MID(0, c, pal->size()-1)); + c = pal->getEntry(MID(0, (size_t)c, pal->size()-1)); putpixel(bmp, x1+x, y1+y, makecol(_rgba_getr(c), _rgba_getg(c), _rgba_getb(c))); diff --git a/src/widgets/colbut.cpp b/src/widgets/colbut.cpp index 6fc69b05e..49c1d0457 100644 --- a/src/widgets/colbut.cpp +++ b/src/widgets/colbut.cpp @@ -176,8 +176,8 @@ static bool colorbutton_msg_proc(JWidget widget, JMessage msg) x = msg->mouse.x; y = msg->mouse.y; editor->screen_to_editor(x, y, &x, &y); - imgcolor = sprite_getpixel(sprite, x, y); - tmp = color_from_image(sprite->imgtype, imgcolor); + imgcolor = sprite->getPixel(x, y); + tmp = color_from_image(sprite->getImgType(), imgcolor); if (color_type(tmp) != COLOR_TYPE_MASK) color = tmp; diff --git a/src/widgets/editor/cursor.cpp b/src/widgets/editor/cursor.cpp index ebc6640de..57da5a0ea 100644 --- a/src/widgets/editor/cursor.cpp +++ b/src/widgets/editor/cursor.cpp @@ -274,21 +274,21 @@ void Editor::editor_draw_cursor(int x, int y, bool refresh) Pen* pen = editor_get_current_pen(); // Set the opacity for the 'extra' layer used to show the cursor preview - m_sprite->set_extras_opacity(tool_settings->getOpacity()); + m_sprite->setExtrasOpacity(tool_settings->getOpacity()); // Create the 'extra' image/layer - m_sprite->prepare_extra(); + m_sprite->prepareExtra(); // In 'indexed' images, if the current color is 0, we have to use // a different mask color (different from 0) to draw the extra layer - if (m_sprite->imgtype == IMAGE_INDEXED && pen_color == 0) { + if (m_sprite->getImgType() == IMAGE_INDEXED && pen_color == 0) { new_mask_color = 1; } else { new_mask_color = 0; } - Image* extras = m_sprite->get_extras(); + Image* extras = m_sprite->getExtras(); if (extras->mask_color != new_mask_color) image_clear(extras, extras->mask_color = new_mask_color); image_putpen(extras, pen, x, y, pen_color, extras->mask_color); @@ -405,10 +405,10 @@ void Editor::editor_clean_cursor(bool refresh) m_state != EDITOR_STATE_DRAWING) { Pen* pen = editor_get_current_pen(); - m_sprite->prepare_extra(); - image_putpen(m_sprite->get_extras(), pen, x, y, - m_sprite->get_extras()->mask_color, - m_sprite->get_extras()->mask_color); + m_sprite->prepareExtra(); + image_putpen(m_sprite->getExtras(), pen, x, y, + m_sprite->getExtras()->mask_color, + m_sprite->getExtras()->mask_color); if (refresh) { editors_draw_sprite(m_sprite, diff --git a/src/widgets/editor/editor.cpp b/src/widgets/editor/editor.cpp index cba753dc4..fde3590b6 100644 --- a/src/widgets/editor/editor.cpp +++ b/src/widgets/editor/editor.cpp @@ -135,11 +135,12 @@ void Editor::editor_set_sprite(Sprite* sprite) m_sprite = sprite; if (m_sprite) { - m_zoom = m_sprite->preferred.zoom; + PreferredEditorSettings preferred = m_sprite->getPreferredEditorSettings(); + m_zoom = preferred.zoom; editor_update(); - editor_set_scroll(m_offset_x + m_sprite->preferred.scroll_x, - m_offset_y + m_sprite->preferred.scroll_y, + editor_set_scroll(m_offset_x + preferred.scroll_x, + m_offset_y + preferred.scroll_y, false); } else { @@ -169,9 +170,13 @@ void Editor::editor_set_scroll(int x, int y, int use_refresh_region) jview_set_scroll(view, x, y); if (m_sprite) { - m_sprite->preferred.scroll_x = x - m_offset_x; - m_sprite->preferred.scroll_y = y - m_offset_y; - m_sprite->preferred.zoom = m_zoom; + PreferredEditorSettings preferred; + + preferred.scroll_x = x - m_offset_x; + preferred.scroll_y = y - m_offset_y; + preferred.zoom = m_zoom; + + m_sprite->setPreferredEditorSettings(preferred); } if (use_refresh_region) { @@ -285,12 +290,12 @@ void Editor::editor_draw_sprite(int x1, int y1, int x2, int y2) source_y = 0; } - if (source_x+width > (m_sprite->w << m_zoom)) { - width = (m_sprite->w << m_zoom) - source_x; + if (source_x+width > (m_sprite->getWidth() << m_zoom)) { + width = (m_sprite->getWidth() << m_zoom) - source_x; } - if (source_y+height > (m_sprite->h << m_zoom)) { - height = (m_sprite->h << m_zoom) - source_y; + if (source_y+height > (m_sprite->getHeight() << m_zoom)) { + height = (m_sprite->getHeight() << m_zoom) - source_y; } /* draw the sprite */ @@ -300,7 +305,7 @@ void Editor::editor_draw_sprite(int x1, int y1, int x2, int y2) Image* rendered = RenderEngine::renderSprite(m_sprite, source_x, source_y, width, height, - m_sprite->frame, + m_sprite->getCurrentFrame(), m_zoom); if (rendered) { @@ -323,8 +328,7 @@ void Editor::editor_draw_sprite(int x1, int y1, int x2, int y2) } else { PALETTE rgbpal; - Palette *pal = sprite_get_palette(m_sprite, - m_sprite->frame); + Palette *pal = m_sprite->getPalette(m_sprite->getCurrentFrame()); pal->toAllegro(rgbpal); select_palette(rgbpal); @@ -384,7 +388,6 @@ void Editor::editor_draw_mask() JRect vp = jview_get_viewport_position(view); int scroll_x, scroll_y; int x1, y1, x2, y2; - BoundSeg *seg; int c, x, y; jview_get_scroll(view, &scroll_x, &scroll_y); @@ -394,17 +397,18 @@ void Editor::editor_draw_mask() x = vp->x1 - scroll_x + m_offset_x; y = vp->y1 - scroll_y + m_offset_y; - for (c=0; cbound.nseg; c++) { - seg = &m_sprite->bound.seg[c]; + int nseg = m_sprite->getBoundariesSegmentsCount(); + const _BoundSeg* seg = m_sprite->getBoundariesSegments(); + for (c=0; cx1<y1<x2<y2<open) -#else /* bounds outside mask */ +#else // Bounds outside mask if (seg->open) #endif { @@ -439,7 +443,7 @@ void Editor::editor_draw_mask() void Editor::editor_draw_mask_safe() { - if ((m_sprite) && (m_sprite->bound.seg)) { + if ((m_sprite) && (m_sprite->getBoundariesSegments())) { int thick = m_cursor_thick; JRegion region = jwidget_get_drawable_region(this, JI_GDR_CUTTOPWINDOWS); @@ -538,9 +542,9 @@ void Editor::turnOnSelectionModifiers() int x1, y1, x2, y2; - editor_to_screen(m_sprite->mask->x, m_sprite->mask->y, &x1, &y1); - editor_to_screen(m_sprite->mask->x+m_sprite->mask->w-1, - m_sprite->mask->y+m_sprite->mask->h-1, &x2, &y2); + editor_to_screen(m_sprite->getMask()->x, m_sprite->getMask()->y, &x1, &y1); + editor_to_screen(m_sprite->getMask()->x+m_sprite->getMask()->w-1, + m_sprite->getMask()->y+m_sprite->getMask()->h-1, &x2, &y2); // TODO addDecorator m_decorators.push_back(new Decorator(Decorator::SELECTION_NW, Rect(x1-8, y1-8, 8, 8))); @@ -610,11 +614,11 @@ void Editor::editor_update_statusbar_for_standby() /* for eye-dropper */ if (m_alt_pressed) { - color_t color = color_from_image(m_sprite->imgtype, - sprite_getpixel(m_sprite, x, y)); + color_t color = color_from_image(m_sprite->getImgType(), + m_sprite->getPixel(x, y)); if (color_type(color) != COLOR_TYPE_MASK) { usprintf(buf, "%s ", _("Color")); - color_to_formalstring(m_sprite->imgtype, + color_to_formalstring(m_sprite->getImgType(), color, buf+ustrlen(buf), sizeof(buf)-ustrlen(buf), true); @@ -631,13 +635,13 @@ void Editor::editor_update_statusbar_for_standby() (0, "%s %3d %3d (%s %3d %3d) [%s %d] %s", _("Pos"), x, y, _("Size"), - ((m_sprite->mask->bitmap)? - m_sprite->mask->w: - m_sprite->w), - ((m_sprite->mask->bitmap)? - m_sprite->mask->h: - m_sprite->h), - _("Frame"), m_sprite->frame+1, + ((m_sprite->getMask()->bitmap)? + m_sprite->getMask()->w: + m_sprite->getWidth()), + ((m_sprite->getMask()->bitmap)? + m_sprite->getMask()->h: + m_sprite->getHeight()), + _("Frame"), m_sprite->getCurrentFrame()+1, buf); } @@ -751,8 +755,8 @@ bool Editor::msg_proc(JMessage msg) /* draw the background outside of image */ x1 = this->rc->x1 + m_offset_x; y1 = this->rc->y1 + m_offset_y; - x2 = x1 + (m_sprite->w << m_zoom) - 1; - y2 = y1 + (m_sprite->h << m_zoom) - 1; + x2 = x1 + (m_sprite->getWidth() << m_zoom) - 1; + y2 = y1 + (m_sprite->getHeight() << m_zoom) - 1; jrectexclude(ji_screen, this->rc->x1, this->rc->y1, @@ -760,14 +764,14 @@ bool Editor::msg_proc(JMessage msg) x1-1, y1-1, x2+1, y2+2, theme->get_editor_face_color()); /* draw the sprite in the editor */ - editor_draw_sprite(0, 0, m_sprite->w-1, m_sprite->h-1); + editor_draw_sprite(0, 0, m_sprite->getWidth()-1, m_sprite->getHeight()-1); - /* draw the sprite boundary */ + // Draw the sprite boundary rect(ji_screen, x1-1, y1-1, x2+1, y2+1, theme->get_editor_sprite_border()); hline(ji_screen, x1-1, y2+2, x2+1, theme->get_editor_sprite_bottom_edge()); - /* draw the mask */ - if (m_sprite->bound.seg) { + // Draw the mask boundaries + if (m_sprite->getBoundariesSegments()) { editor_draw_mask(); jmanager_start_timer(m_mask_timer_id); } @@ -869,15 +873,15 @@ bool Editor::msg_proc(JMessage msg) } /* move frames position */ else if (m_ctrl_pressed) { - if ((m_sprite->layer) && - (m_sprite->layer->type == GFXOBJ_LAYER_IMAGE)) { + if ((m_sprite->getCurrentLayer()) && + (m_sprite->getCurrentLayer()->type == GFXOBJ_LAYER_IMAGE)) { /* TODO you can move the `Background' with tiled mode */ - if (m_sprite->layer->is_background()) { + if (m_sprite->getCurrentLayer()->is_background()) { jalert(_(PACKAGE "<layer->is_moveable()) { + else if (!m_sprite->getCurrentLayer()->is_moveable()) { jalert(_(PACKAGE "<layer) { + else if (m_sprite->getCurrentLayer()) { assert(m_toolLoopManager == NULL); IToolLoop* toolLoop = createToolLoopImpl(UIContext::instance(), msg); @@ -1046,7 +1050,7 @@ bool Editor::msg_proc(JMessage msg) screen_to_editor(jmouse_x(0), jmouse_y(0), &x, &y); app_get_statusbar()->setStatusText (0, "Pos %3d %3d (Size %3d %3d)", x, y, - m_sprite->w, m_sprite->h); + m_sprite->getWidth(), m_sprite->getHeight()); } } return true; @@ -1256,8 +1260,8 @@ void Editor::editor_request_size(int *w, int *h) m_offset_x = jrect_w(vp)/2 - 1; m_offset_y = jrect_h(vp)/2 - 1; - *w = (m_sprite->w << m_zoom) + m_offset_x*2; - *h = (m_sprite->h << m_zoom) + m_offset_y*2; + *w = (m_sprite->getWidth() << m_zoom) + m_offset_x*2; + *h = (m_sprite->getHeight() << m_zoom) + m_offset_y*2; jrect_free(vp); } @@ -1320,7 +1324,7 @@ void Editor::editor_setcursor(int x, int y) screen_to_editor(jmouse_x(0), jmouse_y(0), &x, &y); // Move selection - if (m_sprite->mask->contains_point(x, y)) { + if (m_sprite->getMask()->contains_point(x, y)) { hide_drawing_cursor(); jmouse_set_cursor(JI_CURSOR_MOVE); @@ -1372,10 +1376,10 @@ void Editor::editor_update_candraw() { m_cursor_candraw = (m_sprite != NULL && - m_sprite->layer != NULL && - m_sprite->layer->is_image() && - m_sprite->layer->is_readable() && - m_sprite->layer->is_writable() /* && */ + m_sprite->getCurrentLayer() != NULL && + m_sprite->getCurrentLayer()->is_image() && + m_sprite->getCurrentLayer()->is_readable() && + m_sprite->getCurrentLayer()->is_writable() /* && */ /* layer_get_cel(m_sprite->layer, m_sprite->frame) != NULL */ ); } @@ -1493,19 +1497,19 @@ public: // Get cel and image where we can draw if (m_layer->is_image()) { - m_cel = static_cast(sprite->layer)->get_cel(sprite->frame); + m_cel = static_cast(sprite->getCurrentLayer())->get_cel(sprite->getCurrentFrame()); if (m_cel) - m_cel_image = sprite->stock->image[m_cel->image]; + m_cel_image = sprite->getStock()->image[m_cel->image]; } if (m_cel == NULL) { // create the image - m_cel_image = image_new(sprite->imgtype, sprite->w, sprite->h); + m_cel_image = image_new(sprite->getImgType(), sprite->getWidth(), sprite->getHeight()); image_clear(m_cel_image, 0); // create the cel - m_cel = cel_new(sprite->frame, 0); - static_cast(sprite->layer)->add_cel(m_cel); + m_cel = cel_new(sprite->getCurrentFrame(), 0); + static_cast(sprite->getCurrentLayer())->add_cel(m_cel); m_cel_created = true; } @@ -1520,14 +1524,14 @@ public: if (m_tiled_mode == TILED_NONE) { x1 = MIN(m_cel->x, 0); y1 = MIN(m_cel->y, 0); - x2 = MAX(m_cel->x+m_cel_image->w, m_sprite->w); - y2 = MAX(m_cel->y+m_cel_image->h, m_sprite->h); + x2 = MAX(m_cel->x+m_cel_image->w, m_sprite->getWidth()); + y2 = MAX(m_cel->y+m_cel_image->h, m_sprite->getHeight()); } else { // tiled x1 = 0; y1 = 0; - x2 = m_sprite->w; - y2 = m_sprite->h; + x2 = m_sprite->getWidth(); + y2 = m_sprite->getHeight(); } // create two copies of the image region which we'll modify with the tool @@ -1536,7 +1540,7 @@ public: y1-m_cel->y, x2-x1, y2-y1, 0); m_dst_image = image_new_copy(m_src_image); - m_mask = m_sprite->mask; + m_mask = m_sprite->getMask(); m_maskOrigin = (!m_mask->is_empty() ? Point(m_mask->x-x1, m_mask->y-y1): Point(0, 0)); @@ -1552,8 +1556,8 @@ public: m_offset.y = -y1; // Set undo label for any kind of undo used in the whole loop - if (undo_is_enabled(m_sprite->undo)) - undo_set_label(m_sprite->undo, m_tool->getText().c_str()); + if (undo_is_enabled(m_sprite->getUndo())) + undo_set_label(m_sprite->getUndo(), m_tool->getText().c_str()); } ~ToolLoopImpl() @@ -1575,34 +1579,34 @@ public: image_copy(m_cel_image, m_dst_image, 0, 0); /* add the 'cel_image' in the images' stock of the sprite */ - m_cel->image = stock_add_image(m_sprite->stock, m_cel_image); + m_cel->image = stock_add_image(m_sprite->getStock(), m_cel_image); /* is the undo enabled? */ - if (undo_is_enabled(m_sprite->undo)) { + if (undo_is_enabled(m_sprite->getUndo())) { /* we can temporary remove the cel */ - static_cast(m_sprite->layer)->remove_cel(m_cel); + static_cast(m_sprite->getCurrentLayer())->remove_cel(m_cel); /* we create the undo information (for the new cel_image in the stock and the new cel in the layer)... */ - undo_open(m_sprite->undo); - undo_add_image(m_sprite->undo, m_sprite->stock, m_cel->image); - undo_add_cel(m_sprite->undo, m_sprite->layer, m_cel); - undo_close(m_sprite->undo); + undo_open(m_sprite->getUndo()); + undo_add_image(m_sprite->getUndo(), m_sprite->getStock(), m_cel->image); + undo_add_cel(m_sprite->getUndo(), m_sprite->getCurrentLayer(), m_cel); + undo_close(m_sprite->getUndo()); /* and finally we add the cel again in the layer */ - static_cast(m_sprite->layer)->add_cel(m_cel); + static_cast(m_sprite->getCurrentLayer())->add_cel(m_cel); } } else { /* undo the dirty region */ - if (undo_is_enabled(m_sprite->undo)) { + if (undo_is_enabled(m_sprite->getUndo())) { Dirty* dirty = dirty_new_from_differences(m_cel_image, m_dst_image); // TODO error handling dirty_save_image_data(dirty); if (dirty != NULL) - undo_dirty(m_sprite->undo, dirty); + undo_dirty(m_sprite->getUndo(), dirty); dirty_free(dirty); } @@ -1614,28 +1618,28 @@ public: /* if the size of both images are different, we have to replace the entire image */ else { - if (undo_is_enabled(m_sprite->undo)) { - undo_open(m_sprite->undo); + if (undo_is_enabled(m_sprite->getUndo())) { + undo_open(m_sprite->getUndo()); if (m_cel->x != m_old_cel_x) { int x = m_cel->x; m_cel->x = m_old_cel_x; - undo_int(m_sprite->undo, (GfxObj*)m_cel, &m_cel->x); + undo_int(m_sprite->getUndo(), (GfxObj*)m_cel, &m_cel->x); m_cel->x = x; } if (m_cel->y != m_old_cel_y) { int y = m_cel->y; m_cel->y = m_old_cel_y; - undo_int(m_sprite->undo, (GfxObj*)m_cel, &m_cel->y); + undo_int(m_sprite->getUndo(), (GfxObj*)m_cel, &m_cel->y); m_cel->y = y; } - undo_replace_image(m_sprite->undo, m_sprite->stock, m_cel->image); - undo_close(m_sprite->undo); + undo_replace_image(m_sprite->getUndo(), m_sprite->getStock(), m_cel->image); + undo_close(m_sprite->getUndo()); } /* replace the image in the stock */ - stock_replace_image(m_sprite->stock, m_cel->image, m_dst_image); + stock_replace_image(m_sprite->getStock(), m_cel->image, m_dst_image); /* destroy the old cel image */ image_free(m_cel_image); @@ -1647,7 +1651,7 @@ public: // Selection ink if (getInk()->isSelection()) - sprite_generate_mask_boundaries(m_sprite); + m_sprite->generateMaskBoundaries(); } // If the trace was not canceled or it is not a 'paint' ink... @@ -1733,9 +1737,9 @@ IToolLoop* Editor::createToolLoopImpl(Context* context, JMessage msg) return NULL; Sprite* sprite = getSprite(); - Layer* layer = sprite->layer; + Layer* layer = sprite->getCurrentLayer(); - if (!sprite->layer) { + if (!layer) { jalert(_(PACKAGE "<sprite; else { /* the palette to convert the Image to a BITMAP */ - sprite_get_palette(sprite, 0)->toAllegro(data->rgbpal); + sprite->getPalette(0)->toAllegro(data->rgbpal); /* render the 'sprite' in one plain 'image' */ - image = image_new(sprite->imgtype, sprite->w, sprite->h); + image = image_new(sprite->getImgType(), sprite->getWidth(), sprite->getHeight()); image_clear(image, 0); - sprite_render(sprite, image, 0, 0); + sprite->render(image, 0, 0); delete sprite; /* calculate the thumbnail size */ diff --git a/src/widgets/preview.cpp b/src/widgets/preview.cpp index c2966a63c..50fdebebe 100644 --- a/src/widgets/preview.cpp +++ b/src/widgets/preview.cpp @@ -97,7 +97,7 @@ static bool preview_msg_proc(JWidget widget, JMessage msg) break; case JM_OPEN: - RenderEngine::setPreviewImage(effect->sprite->layer, effect->dst); + RenderEngine::setPreviewImage(effect->sprite->getCurrentLayer(), effect->dst); break; case JM_CLOSE: diff --git a/src/widgets/statebar.cpp b/src/widgets/statebar.cpp index 15001d8c1..fe483b5ae 100644 --- a/src/widgets/statebar.cpp +++ b/src/widgets/statebar.cpp @@ -338,16 +338,16 @@ bool StatusBar::msg_proc(JMessage msg) try { const CurrentSpriteReader sprite(UIContext::instance()); if (sprite) { - LayerFolder* folder = sprite->get_folder(); - LayerIterator it = folder->get_layer_begin(); - LayerIterator end = folder->get_layer_end(); + const LayerFolder* folder = sprite->getFolder(); + LayerConstIterator it = folder->get_layer_begin(); + LayerConstIterator end = folder->get_layer_end(); size_t count = folder->get_layers_count(); char buf[256]; for (size_t c=0; it != end; ++it, ++c) { int x1 = rc->x2-width + c*width/count; int x2 = rc->x2-width + (c+1)*width/count; - bool hot = (*it == sprite->layer); + bool hot = (*it == sprite->getCurrentLayer()); { BITMAP* old_ji_screen = ji_screen; // TODO fix this ugly hack @@ -463,9 +463,9 @@ static bool slider_change_hook(JWidget widget, void *data) try { CurrentSpriteWriter sprite(UIContext::instance()); if (sprite) { - if ((sprite->layer) && - (sprite->layer->is_image())) { - Cel* cel = ((LayerImage*)sprite->layer)->get_cel(sprite->frame); + if ((sprite->getCurrentLayer()) && + (sprite->getCurrentLayer()->is_image())) { + Cel* cel = ((LayerImage*)sprite->getCurrentLayer())->get_cel(sprite->getCurrentFrame()); if (cel) { // update the opacity cel->opacity = jslider_get_value(widget); @@ -507,10 +507,10 @@ void StatusBar::updateFromLayer() /* opacity layer */ if (sprite && - sprite->layer && - sprite->layer->is_image() && - !sprite->layer->is_background() && - (cel = ((LayerImage*)sprite->layer)->get_cel(sprite->frame))) { + sprite->getCurrentLayer() && + sprite->getCurrentLayer()->is_image() && + !sprite->getCurrentLayer()->is_background() && + (cel = ((LayerImage*)sprite->getCurrentLayer())->get_cel(sprite->getCurrentFrame()))) { jslider_set_value(m_slider, MID(0, cel->opacity, 255)); jwidget_enable(m_slider); }