lua: image:clear() without args must clear w/image.spec.transparentColor

This commit is contained in:
David Capello 2018-11-13 21:38:03 -03:00
parent c91d4b1430
commit 5bba827924
4 changed files with 27 additions and 19 deletions

View File

@ -1,4 +1,5 @@
// Aseprite // Aseprite
// Copyright (C) 2018 Igara Studio S.A.
// Copyright (C) 2015-2018 David Capello // Copyright (C) 2015-2018 David Capello
// //
// This program is distributed under the terms of // This program is distributed under the terms of
@ -54,6 +55,7 @@ int Image_new(lua_State* L)
spec.setColorMode((doc::ColorMode)colorMode); spec.setColorMode((doc::ColorMode)colorMode);
} }
doc::ImageRef image(doc::Image::create(spec)); doc::ImageRef image(doc::Image::create(spec));
doc::clear_image(image.get(), spec.maskColor());
push_new<ImageObj>(L, image, nullptr); push_new<ImageObj>(L, image, nullptr);
return 1; return 1;
} }
@ -76,7 +78,9 @@ int Image_clear(lua_State* L)
{ {
auto obj = get_obj<ImageObj>(L, 1); auto obj = get_obj<ImageObj>(L, 1);
doc::color_t color; doc::color_t color;
if (lua_isinteger(L, 2)) if (lua_isnone(L, 2))
color = obj->image.get()->maskColor();
else if (lua_isinteger(L, 2))
color = lua_tointeger(L, 2); color = lua_tointeger(L, 2);
else else
color = convert_args_into_pixel_color(L, 2); color = convert_args_into_pixel_color(L, 2);

View File

@ -1,4 +1,5 @@
// Aseprite Document Library // Aseprite Document Library
// Copyright (c) 2018 Igara Studio S.A.
// Copyright (c) 2001-2016 David Capello // Copyright (c) 2001-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.
@ -19,9 +20,9 @@
namespace doc { namespace doc {
Image::Image(PixelFormat format, int width, int height) Image::Image(const ImageSpec& spec)
: Object(ObjectType::Image) : Object(ObjectType::Image)
, m_spec((ColorMode)format, width, height, 0) , m_spec(spec)
{ {
} }
@ -48,21 +49,20 @@ int Image::getRowStrideSize(int pixels_per_row) const
Image* Image::create(PixelFormat format, int width, int height, Image* Image::create(PixelFormat format, int width, int height,
const ImageBufferPtr& buffer) const ImageBufferPtr& buffer)
{ {
switch (format) { return Image::create(ImageSpec((ColorMode)format, width, height, 0), buffer);
case IMAGE_RGB: return new ImageImpl<RgbTraits>(width, height, buffer);
case IMAGE_GRAYSCALE: return new ImageImpl<GrayscaleTraits>(width, height, buffer);
case IMAGE_INDEXED: return new ImageImpl<IndexedTraits>(width, height, buffer);
case IMAGE_BITMAP: return new ImageImpl<BitmapTraits>(width, height, buffer);
}
return NULL;
} }
// static // static
Image* Image::create(const ImageSpec& spec, Image* Image::create(const ImageSpec& spec,
const ImageBufferPtr& buffer) const ImageBufferPtr& buffer)
{ {
return Image::create((PixelFormat)spec.colorMode(), switch (spec.colorMode()) {
spec.width(), spec.height(), buffer); case ColorMode::RGB: return new ImageImpl<RgbTraits>(spec, buffer);
case ColorMode::GRAYSCALE: return new ImageImpl<GrayscaleTraits>(spec, buffer);
case ColorMode::INDEXED: return new ImageImpl<IndexedTraits>(spec, buffer);
case ColorMode::BITMAP: return new ImageImpl<BitmapTraits>(spec, buffer);
}
return nullptr;
} }
// static // static

View File

@ -1,4 +1,5 @@
// Aseprite Document Library // Aseprite Document Library
// Copyright (c) 2018 Igara Studio S.A.
// Copyright (c) 2001-2016 David Capello // Copyright (c) 2001-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.
@ -85,7 +86,7 @@ namespace doc {
virtual void blendRect(int x1, int y1, int x2, int y2, color_t color, int opacity) = 0; virtual void blendRect(int x1, int y1, int x2, int y2, color_t color, int opacity) = 0;
protected: protected:
Image(PixelFormat format, int width, int height); Image(const ImageSpec& spec);
private: private:
ImageSpec m_spec; ImageSpec m_spec;

View File

@ -1,4 +1,5 @@
// Aseprite Document Library // Aseprite Document Library
// Copyright (c) 2018 Igara Studio S.A.
// Copyright (c) 2001-2016 David Capello // Copyright (c) 2001-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.
@ -55,14 +56,16 @@ namespace doc {
return (address_t)(m_rows[y] + x / (Traits::pixels_per_byte == 0 ? 1 : Traits::pixels_per_byte)); return (address_t)(m_rows[y] + x / (Traits::pixels_per_byte == 0 ? 1 : Traits::pixels_per_byte));
} }
ImageImpl(int width, int height, ImageImpl(const ImageSpec& spec,
const ImageBufferPtr& buffer) const ImageBufferPtr& buffer)
: Image(static_cast<PixelFormat>(Traits::pixel_format), width, height) : Image(spec)
, m_buffer(buffer) , m_buffer(buffer)
{ {
std::size_t for_rows = sizeof(address_t) * height; ASSERT(Traits::color_mode == spec.colorMode());
std::size_t rowstride_bytes = Traits::getRowStrideBytes(width);
std::size_t required_size = for_rows + rowstride_bytes*height; std::size_t for_rows = sizeof(address_t) * spec.height();
std::size_t rowstride_bytes = Traits::getRowStrideBytes(spec.width());
std::size_t required_size = for_rows + rowstride_bytes*spec.height();
if (!m_buffer) if (!m_buffer)
m_buffer.reset(new ImageBuffer(required_size)); m_buffer.reset(new ImageBuffer(required_size));
@ -73,7 +76,7 @@ namespace doc {
m_bits = (address_t)(m_buffer->buffer() + for_rows); m_bits = (address_t)(m_buffer->buffer() + for_rows);
address_t addr = m_bits; address_t addr = m_bits;
for (int y=0; y<height; ++y) { for (int y=0; y<spec.height(); ++y) {
m_rows[y] = addr; m_rows[y] = addr;
addr = (address_t)(((uint8_t*)addr) + rowstride_bytes); addr = (address_t)(((uint8_t*)addr) + rowstride_bytes);
} }