1// Aseprite
2// Copyright (C) 2018-2019 Igara Studio S.A.
3// Copyright (C) 2001-2018 David Capello
4//
5// This program is distributed under the terms of
6// the End-User License Agreement for Aseprite.
7
8#ifdef HAVE_CONFIG_H
9#include "config.h"
10#endif
11
12#include "app/commands/command.h"
13#include "app/context.h"
14#include "app/doc.h"
15#include "app/site.h"
16#include "app/util/new_image_from_mask.h"
17#include "base/fs.h"
18#include "doc/cel.h"
19#include "doc/document.h"
20#include "doc/layer.h"
21#include "doc/mask.h"
22#include "doc/palette.h"
23#include "doc/sprite.h"
24
25#include <cstdio>
26
27namespace app {
28
29using namespace doc;
30
31class NewSpriteFromSelectionCommand : public Command {
32public:
33 NewSpriteFromSelectionCommand();
34
35protected:
36 bool onEnabled(Context* context) override;
37 void onExecute(Context* context) override;
38};
39
40NewSpriteFromSelectionCommand::NewSpriteFromSelectionCommand()
41 : Command(CommandId::NewSpriteFromSelection(), CmdUIOnlyFlag)
42{
43}
44
45bool NewSpriteFromSelectionCommand::onEnabled(Context* context)
46{
47 return context->checkFlags(ContextFlags::ActiveDocumentIsReadable |
48 ContextFlags::HasVisibleMask);
49}
50
51void NewSpriteFromSelectionCommand::onExecute(Context* context)
52{
53 const Site site = context->activeSite();
54 const Doc* doc = site.document();
55 const Sprite* sprite = site.sprite();
56 const Mask* mask = doc->mask();
57 ImageRef image(
58 new_image_from_mask(site, mask, true));
59 if (!image)
60 return;
61
62 Palette* palette = sprite->palette(site.frame());
63
64 std::unique_ptr<Sprite> dstSprite(
65 Sprite::MakeStdSprite(
66 ImageSpec((ColorMode)image->pixelFormat(),
67 image->width(),
68 image->height(),
69 sprite->transparentColor(),
70 sprite->colorSpace()),
71 palette->size()));
72
73 palette->copyColorsTo(dstSprite->palette(frame_t(0)));
74
75 LayerImage* dstLayer = static_cast<LayerImage*>(dstSprite->root()->firstLayer());
76 if (site.layer()->isBackground())
77 dstLayer->configureAsBackground(); // Configure layer name as background
78 dstLayer->setFlags(site.layer()->flags()); // Copy all flags
79 copy_image(dstLayer->cel(frame_t(0))->image(), image.get());
80
81 std::unique_ptr<Doc> dstDoc(new Doc(dstSprite.get()));
82 dstSprite.release();
83 char buf[1024];
84 std::sprintf(buf, "%s-%dx%d-%dx%d",
85 base::get_file_title(doc->filename()).c_str(),
86 mask->bounds().x, mask->bounds().y,
87 mask->bounds().w, mask->bounds().h);
88 dstDoc->setFilename(buf);
89 dstDoc->setContext(context);
90 dstDoc.release();
91}
92
93Command* CommandFactory::createNewSpriteFromSelectionCommand()
94{
95 return new NewSpriteFromSelectionCommand();
96}
97
98} // namespace app
99