MCPcopy Create free account
hub / github.com/LibreSprite/LibreSprite / copyLayerContent

Method copyLayerContent

src/app/document.cpp:272–359  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

270// Copying
271
272void Document::copyLayerContent(const Layer* sourceLayer0, Document* destDoc, Layer* destLayer0) const
273{
274 LayerFlags dstFlags = sourceLayer0->flags();
275
276 // Remove the "background" flag if the destDoc already has a background layer.
277 if (((int)dstFlags & (int)LayerFlags::Background) == (int)LayerFlags::Background &&
278 (destDoc->sprite()->backgroundLayer())) {
279 dstFlags = (LayerFlags)((int)dstFlags & ~(int)(LayerFlags::BackgroundLayerFlags));
280 }
281
282 // Copy the layer name/flags/user data
283 destLayer0->setName(sourceLayer0->name());
284 destLayer0->setFlags(dstFlags);
285 destLayer0->setUserData(sourceLayer0->userData());
286
287 if (sourceLayer0->isImage() && destLayer0->isImage()) {
288 const LayerImage* sourceLayer = static_cast<const LayerImage*>(sourceLayer0);
289 LayerImage* destLayer = static_cast<LayerImage*>(destLayer0);
290
291 // Copy blend mode and opacity
292 destLayer->setBlendMode(sourceLayer->blendMode());
293 destLayer->setOpacity(sourceLayer->opacity());
294
295 // Copy cels
296 CelConstIterator it = sourceLayer->getCelBegin();
297 CelConstIterator end = sourceLayer->getCelEnd();
298
299 std::map<ObjectId, Cel*> linked;
300
301 for (; it != end; ++it) {
302 auto sourceCel = *it;
303 if (sourceCel->frame() > destLayer->sprite()->lastFrame())
304 break;
305
306 std::shared_ptr<Cel> newCel;
307
308 auto it = linked.find(sourceCel->data()->id());
309 if (it != linked.end()) {
310 newCel = Cel::createLink(std::static_pointer_cast<Cel>(it->second->shared_from_this()));
311 newCel->setFrame(sourceCel->frame());
312 } else {
313 newCel = create_cel_copy(sourceCel,
314 destLayer->sprite(),
315 sourceCel->frame());
316 linked.insert(std::make_pair(sourceCel->data()->id(), newCel.get()));
317 }
318
319 destLayer->addCel(newCel);
320 }
321 }
322 else if (sourceLayer0->isFolder() && destLayer0->isFolder()) {
323 const LayerFolder* sourceLayer = static_cast<const LayerFolder*>(sourceLayer0);
324 LayerFolder* destLayer = static_cast<LayerFolder*>(destLayer0);
325
326 LayerConstIterator it = sourceLayer->getLayerBegin();
327 LayerConstIterator end = sourceLayer->getLayerEnd();
328
329 for (; it != end; ++it) {

Callers 2

duplicateLayerAfterMethod · 0.80
pasteFunction · 0.80

Calls 15

create_cel_copyFunction · 0.85
backgroundLayerMethod · 0.80
setUserDataMethod · 0.80
isImageMethod · 0.80
getCelBeginMethod · 0.80
getCelEndMethod · 0.80
getLayerBeginMethod · 0.80
getLayerEndMethod · 0.80
getLastLayerMethod · 0.80
stackLayerMethod · 0.80
flagsMethod · 0.45
spriteMethod · 0.45

Tested by

no test coverage detected