void DocumentApi::cropSprite(Sprite* sprite, const gfx::Rect& bounds, int bgcolor) { setSpriteSize(sprite, bounds.w, bounds.h); displaceLayers(sprite->getFolder(), -bounds.x, -bounds.y); Layer *background_layer = sprite->getBackgroundLayer(); if (background_layer) cropLayer(background_layer, 0, 0, sprite->getWidth(), sprite->getHeight(), bgcolor); if (!m_document->getMask()->isEmpty()) setMaskPosition(m_document->getMask()->getBounds().x-bounds.x, m_document->getMask()->getBounds().y-bounds.y); }
/** * Moves every frame in @a layer with the offset (@a dx, @a dy). */ void UndoTransaction::displaceLayers(Layer* layer, int dx, int dy) { switch (layer->getType()) { case GFXOBJ_LAYER_IMAGE: { CelIterator it = ((LayerImage*)layer)->getCelBegin(); CelIterator end = ((LayerImage*)layer)->getCelEnd(); for (; it != end; ++it) { Cel* cel = *it; setCelPosition(cel, cel->getX()+dx, cel->getY()+dy); } break; } case GFXOBJ_LAYER_FOLDER: { LayerIterator it = ((LayerFolder*)layer)->get_layer_begin(); LayerIterator end = ((LayerFolder*)layer)->get_layer_end(); for (; it != end; ++it) displaceLayers(*it, dx, dy); break; } } }