Fix transparent color for sprites created w/NewSpriteFromSelection

Fixes https://community.aseprite.org/t/3629
This commit is contained in:
David Capello 2019-08-06 16:18:01 -03:00
parent b55d407ac1
commit 744bd36408
12 changed files with 37 additions and 31 deletions

View File

@ -226,7 +226,7 @@ void NewFileCommand::onExecute(Context* ctx)
// Create the new sprite // Create the new sprite
std::unique_ptr<Sprite> sprite( std::unique_ptr<Sprite> sprite(
Sprite::createBasicSprite( Sprite::MakeStdSprite(
ImageSpec(colorMode, width, height, 0, ImageSpec(colorMode, width, height, 0,
get_working_rgb_space_from_preferences()), ncolors)); get_working_rgb_space_from_preferences()), ncolors));

View File

@ -62,11 +62,13 @@ void NewSpriteFromSelectionCommand::onExecute(Context* context)
Palette* palette = sprite->palette(site.frame()); Palette* palette = sprite->palette(site.frame());
std::unique_ptr<Sprite> dstSprite( std::unique_ptr<Sprite> dstSprite(
Sprite::createBasicSprite(ImageSpec((ColorMode)image->pixelFormat(), Sprite::MakeStdSprite(
image->width(), ImageSpec((ColorMode)image->pixelFormat(),
image->height(), image->width(),
palette->size(), image->height(),
sprite->colorSpace()))); sprite->transparentColor(),
sprite->colorSpace()),
palette->size()));
palette->copyColorsTo(dstSprite->palette(frame_t(0))); palette->copyColorsTo(dstSprite->palette(frame_t(0)));

View File

@ -714,9 +714,10 @@ Doc* DocExporter::createEmptyTexture(const Samples& samples) const
gfx::Size textureSize = calculateSheetSize(samples); gfx::Size textureSize = calculateSheetSize(samples);
std::unique_ptr<Sprite> sprite( std::unique_ptr<Sprite> sprite(
Sprite::createBasicSprite( Sprite::MakeStdSprite(
// TODO calculate a proper transparent color for the sprite sheet
ImageSpec(colorMode, textureSize.w, textureSize.h, 0, ImageSpec(colorMode, textureSize.w, textureSize.h, 0,
colorSpace ? colorSpace: gfx::ColorSpace::MakeNone()), (colorSpace ? colorSpace: gfx::ColorSpace::MakeNone())),
maxColors)); maxColors));
if (palette != NULL) if (palette != NULL)

View File

@ -1,5 +1,5 @@
// Aseprite // Aseprite
// Copyright (C) 2018 Igara Studio S.A. // Copyright (C) 2018-2019 Igara Studio S.A.
// Copyright (c) 2001-2018 David Capello // Copyright (c) 2001-2018 David Capello
// //
// This program is distributed under the terms of // This program is distributed under the terms of
@ -50,7 +50,7 @@ Doc* Docs::add(Doc* doc)
Doc* Docs::add(int width, int height, doc::ColorMode colorMode, int ncolors) Doc* Docs::add(int width, int height, doc::ColorMode colorMode, int ncolors)
{ {
std::unique_ptr<Doc> doc( std::unique_ptr<Doc> doc(
new Doc(Sprite::createBasicSprite(ImageSpec(colorMode, width, height), ncolors))); new Doc(Sprite::MakeStdSprite(ImageSpec(colorMode, width, height), ncolors)));
doc->setFilename("Sprite"); doc->setFilename("Sprite");
doc->setContext(m_ctx); // Change the document context to add the doc in this collection doc->setContext(m_ctx); // Change the document context to add the doc in this collection

View File

@ -154,7 +154,7 @@ bool save_palette(const char* filename, const Palette* pal, int columns)
Context tmpContext; Context tmpContext;
Doc* doc = tmpContext.documents().add( Doc* doc = tmpContext.documents().add(
new Doc(Sprite::createBasicSprite( new Doc(Sprite::MakeStdSprite(
ImageSpec((pal->size() <= 256 ? doc::ColorMode::INDEXED: ImageSpec((pal->size() <= 256 ? doc::ColorMode::INDEXED:
doc::ColorMode::RGB), doc::ColorMode::RGB),
w, h), pal->size()))); w, h), pal->size())));

View File

@ -316,7 +316,7 @@ int Image_saveAs(lua_State* L)
return luaL_error(L, "script doesn't have access to write file %s", return luaL_error(L, "script doesn't have access to write file %s",
absFn.c_str()); absFn.c_str());
std::unique_ptr<Sprite> sprite(Sprite::createBasicSprite(img->spec(), 256)); std::unique_ptr<Sprite> sprite(Sprite::MakeStdSprite(img->spec(), 256));
std::vector<Image*> oneImage; std::vector<Image*> oneImage;
sprite->getImages(oneImage); sprite->getImages(oneImage);

View File

@ -113,7 +113,7 @@ int Sprite_new(lua_State* L)
if (spec.height() < 1) if (spec.height() < 1)
return luaL_error(L, "invalid height value = %d in Sprite()", spec.height()); return luaL_error(L, "invalid height value = %d in Sprite()", spec.height());
std::unique_ptr<Sprite> sprite(Sprite::createBasicSprite(spec, 256)); std::unique_ptr<Sprite> sprite(Sprite::MakeStdSprite(spec, 256));
doc.reset(new Doc(sprite.get())); doc.reset(new Doc(sprite.get()));
sprite.release(); sprite.release();
} }

View File

@ -1,5 +1,5 @@
// Aseprite Document Library // Aseprite Document Library
// Copyright (c) 2018 Igara Studio S.A. // Copyright (c) 2018-2019 Igara Studio S.A.
// Copyright (c) 2016 David Capello // Copyright (c) 2016 David Capello
// //
// This file is released under the terms of the MIT license. // This file is released under the terms of the MIT license.
@ -20,10 +20,10 @@ namespace doc {
class ImageSpec { class ImageSpec {
public: public:
ImageSpec(ColorMode colorMode, ImageSpec(const ColorMode colorMode,
int width, const int width,
int height, const int height,
int maskColor = 0, const color_t maskColor = 0,
const gfx::ColorSpacePtr& colorSpace = gfx::ColorSpace::MakeNone()) const gfx::ColorSpacePtr& colorSpace = gfx::ColorSpace::MakeNone())
: m_colorMode(colorMode), : m_colorMode(colorMode),
m_width(width), m_width(width),

View File

@ -1,5 +1,5 @@
// Aseprite Document Library // Aseprite Document Library
// Copyright (c) 2018 Igara Studio S.A. // Copyright (c) 2018-2019 Igara Studio S.A.
// Copyright (c) 2001-2018 David Capello // Copyright (c) 2001-2018 David Capello
// //
// This file is released under the terms of the MIT license. // This file is released under the terms of the MIT license.
@ -89,8 +89,8 @@ Sprite::~Sprite()
} }
// static // static
Sprite* Sprite::createBasicSprite(const ImageSpec& spec, Sprite* Sprite::MakeStdSprite(const ImageSpec& spec,
const int ncolors) const int ncolors)
{ {
// Create the sprite. // Create the sprite.
std::unique_ptr<Sprite> sprite(new Sprite(spec, ncolors)); std::unique_ptr<Sprite> sprite(new Sprite(spec, ncolors));

View File

@ -1,5 +1,5 @@
// Aseprite Document Library // Aseprite Document Library
// Copyright (c) 2018 Igara Studio S.A. // Copyright (c) 2018-2019 Igara Studio S.A.
// Copyright (c) 2001-2018 David Capello // Copyright (c) 2001-2018 David Capello
// //
// This file is released under the terms of the MIT license. // This file is released under the terms of the MIT license.
@ -59,8 +59,10 @@ namespace doc {
Sprite(const ImageSpec& spec, int ncolors = 256); Sprite(const ImageSpec& spec, int ncolors = 256);
virtual ~Sprite(); virtual ~Sprite();
static Sprite* createBasicSprite(const ImageSpec& spec, // Creates a new sprite with one transparent layer and one cel
const int ncolors = 256); // with an image of the size of the sprite.
static Sprite* MakeStdSprite(const ImageSpec& spec,
const int ncolors = 256);
//////////////////////////////////////// ////////////////////////////////////////
// Main properties // Main properties

View File

@ -27,7 +27,7 @@ static void Bm_Render(benchmark::State& state)
const int w = state.range(0); const int w = state.range(0);
const int h = state.range(1); const int h = state.range(1);
Sprite* spr = Sprite::createBasicSprite(ImageSpec(ColorMode::RGB, w, h)); Sprite* spr = Sprite::MakeStdSprite(ImageSpec(ColorMode::RGB, w, h));
LayerImage* lay1 = static_cast<LayerImage*>(spr->root()->firstLayer()); LayerImage* lay1 = static_cast<LayerImage*>(spr->root()->firstLayer());
LayerImage* lay2 = new LayerImage(spr); LayerImage* lay2 = new LayerImage(spr);
LayerImage* lay3 = new LayerImage(spr); LayerImage* lay3 = new LayerImage(spr);

View File

@ -1,4 +1,5 @@
// Aseprite Document Library // Aseprite Document Library
// Copyright (c) 2019 Igara Studio S.A.
// Copyright (c) 2001-2018 David Capello // Copyright (c) 2001-2018 David Capello
// //
// This file is released under the terms of the MIT license. // This file is released under the terms of the MIT license.
@ -66,7 +67,7 @@ TYPED_TEST_CASE(RenderAllModes, ImageAllTraits);
TEST(Render, Basic) TEST(Render, Basic)
{ {
Document* doc = new Document; Document* doc = new Document;
doc->sprites().add(Sprite::createBasicSprite(ImageSpec(ColorMode::INDEXED, 2, 2))); doc->sprites().add(Sprite::MakeStdSprite(ImageSpec(ColorMode::INDEXED, 2, 2)));
Image* src = doc->sprite()->root()->firstLayer()->cel(0)->image(); Image* src = doc->sprite()->root()->firstLayer()->cel(0)->image();
clear_image(src, 2); clear_image(src, 2);
@ -85,7 +86,7 @@ TYPED_TEST(RenderAllModes, CheckDefaultBackgroundMode)
typedef TypeParam ImageTraits; typedef TypeParam ImageTraits;
Document* doc = new Document; Document* doc = new Document;
doc->sprites().add(Sprite::createBasicSprite(ImageSpec(ImageTraits::color_mode, 2, 2))); doc->sprites().add(Sprite::MakeStdSprite(ImageSpec(ImageTraits::color_mode, 2, 2)));
EXPECT_TRUE(!doc->sprite()->root()->firstLayer()->isBackground()); EXPECT_TRUE(!doc->sprite()->root()->firstLayer()->isBackground());
Image* src = doc->sprite()->root()->firstLayer()->cel(0)->image(); Image* src = doc->sprite()->root()->firstLayer()->cel(0)->image();
@ -105,7 +106,7 @@ TYPED_TEST(RenderAllModes, CheckDefaultBackgroundMode)
TEST(Render, DefaultBackgroundModeWithNonzeroTransparentIndex) TEST(Render, DefaultBackgroundModeWithNonzeroTransparentIndex)
{ {
Document* doc = new Document; Document* doc = new Document;
doc->sprites().add(Sprite::createBasicSprite(ImageSpec(ColorMode::INDEXED, 2, 2))); doc->sprites().add(Sprite::MakeStdSprite(ImageSpec(ColorMode::INDEXED, 2, 2)));
doc->sprite()->setTransparentColor(2); // Transparent color is index 2 doc->sprite()->setTransparentColor(2); // Transparent color is index 2
EXPECT_TRUE(!doc->sprite()->root()->firstLayer()->isBackground()); EXPECT_TRUE(!doc->sprite()->root()->firstLayer()->isBackground());
@ -133,7 +134,7 @@ TEST(Render, DefaultBackgroundModeWithNonzeroTransparentIndex)
TEST(Render, CheckedBackground) TEST(Render, CheckedBackground)
{ {
Document* doc = new Document; Document* doc = new Document;
doc->sprites().add(Sprite::createBasicSprite(ImageSpec(ColorMode::INDEXED, 4, 4))); doc->sprites().add(Sprite::MakeStdSprite(ImageSpec(ColorMode::INDEXED, 4, 4)));
std::unique_ptr<Image> dst(Image::create(IMAGE_INDEXED, 4, 4)); std::unique_ptr<Image> dst(Image::create(IMAGE_INDEXED, 4, 4));
clear_image(dst.get(), 0); clear_image(dst.get(), 0);
@ -185,7 +186,7 @@ TEST(Render, ZoomAndDstBounds)
// 0 4 4 // 0 4 4
// 0 4 4 // 0 4 4
Document* doc = new Document; Document* doc = new Document;
doc->sprites().add(Sprite::createBasicSprite(ImageSpec(ColorMode::INDEXED, 3, 3))); doc->sprites().add(Sprite::MakeStdSprite(ImageSpec(ColorMode::INDEXED, 3, 3)));
Image* src = doc->sprite()->root()->firstLayer()->cel(0)->image(); Image* src = doc->sprite()->root()->firstLayer()->cel(0)->image();
clear_image(src, 0); clear_image(src, 0);
fill_rect(src, 1, 1, 2, 2, 4); fill_rect(src, 1, 1, 2, 2, 4);
@ -213,7 +214,7 @@ TEST(Render, ZoomAndDstBounds)
TEST(Render, BugWithMultiplesOf3ZoomFactors) TEST(Render, BugWithMultiplesOf3ZoomFactors)
{ {
Document* doc = new Document; Document* doc = new Document;
doc->sprites().add(Sprite::createBasicSprite(ImageSpec(ColorMode::RGB, 4, 4))); doc->sprites().add(Sprite::MakeStdSprite(ImageSpec(ColorMode::RGB, 4, 4)));
Image* src = doc->sprite()->root()->firstLayer()->cel(0)->image(); Image* src = doc->sprite()->root()->firstLayer()->cel(0)->image();
clear_image(src, 0); clear_image(src, 0);
draw_line(src, 0, 0, 3, 3, rgba(255, 0, 0, 255)); draw_line(src, 0, 0, 3, 3, rgba(255, 0, 0, 255));