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

View File

@ -1,4 +1,5 @@
// Aseprite Document Library
// Copyright (c) 2018 Igara Studio S.A.
// Copyright (c) 2001-2016 David Capello
//
// This file is released under the terms of the MIT license.
@ -19,9 +20,9 @@
namespace doc {
Image::Image(PixelFormat format, int width, int height)
Image::Image(const ImageSpec& spec)
: 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,
const ImageBufferPtr& buffer)
{
switch (format) {
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;
return Image::create(ImageSpec((ColorMode)format, width, height, 0), buffer);
}
// static
Image* Image::create(const ImageSpec& spec,
const ImageBufferPtr& buffer)
{
return Image::create((PixelFormat)spec.colorMode(),
spec.width(), spec.height(), buffer);
switch (spec.colorMode()) {
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

View File

@ -1,4 +1,5 @@
// Aseprite Document Library
// Copyright (c) 2018 Igara Studio S.A.
// Copyright (c) 2001-2016 David Capello
//
// 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;
protected:
Image(PixelFormat format, int width, int height);
Image(const ImageSpec& spec);
private:
ImageSpec m_spec;

View File

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