diff --git a/src/app/script/image_class.cpp b/src/app/script/image_class.cpp index a5ab77e11..804510ff2 100644 --- a/src/app/script/image_class.cpp +++ b/src/app/script/image_class.cpp @@ -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(L, image, nullptr); return 1; } @@ -76,7 +78,9 @@ int Image_clear(lua_State* L) { auto obj = get_obj(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); diff --git a/src/doc/image.cpp b/src/doc/image.cpp index 4eb6c4a80..dcfa8bf89 100644 --- a/src/doc/image.cpp +++ b/src/doc/image.cpp @@ -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(width, height, buffer); - case IMAGE_GRAYSCALE: return new ImageImpl(width, height, buffer); - case IMAGE_INDEXED: return new ImageImpl(width, height, buffer); - case IMAGE_BITMAP: return new ImageImpl(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(spec, buffer); + case ColorMode::GRAYSCALE: return new ImageImpl(spec, buffer); + case ColorMode::INDEXED: return new ImageImpl(spec, buffer); + case ColorMode::BITMAP: return new ImageImpl(spec, buffer); + } + return nullptr; } // static diff --git a/src/doc/image.h b/src/doc/image.h index 04aaf28f6..c95587f99 100644 --- a/src/doc/image.h +++ b/src/doc/image.h @@ -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; diff --git a/src/doc/image_impl.h b/src/doc/image_impl.h index bc0240085..0a8304fc5 100644 --- a/src/doc/image_impl.h +++ b/src/doc/image_impl.h @@ -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(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