| 270 | // Copying |
| 271 | |
| 272 | void 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) { |
no test coverage detected