2016-07-25 12:51:58 +00:00
|
|
|
// Aseprite
|
2020-06-09 22:56:25 +00:00
|
|
|
// Copyright (C) 2019-2020 Igara Studio S.A.
|
2018-08-08 20:27:26 +00:00
|
|
|
// Copyright (C) 2018 David Capello
|
2016-07-25 12:51:58 +00:00
|
|
|
// Copyright (C) 2016 Carlo Caputo
|
|
|
|
//
|
2016-09-26 14:39:40 +00:00
|
|
|
// This program is distributed under the terms of
|
|
|
|
// the End-User License Agreement for Aseprite.
|
2016-07-25 12:51:58 +00:00
|
|
|
|
2019-04-11 17:29:20 +00:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
|
|
|
|
2020-06-09 22:56:25 +00:00
|
|
|
#include "app/util/conversion_to_surface.h"
|
2019-04-11 17:29:20 +00:00
|
|
|
#include "doc/blend_mode.h"
|
2016-07-25 12:51:58 +00:00
|
|
|
#include "doc/cel.h"
|
2019-04-11 17:29:20 +00:00
|
|
|
#include "doc/layer.h"
|
|
|
|
#include "doc/sprite.h"
|
2018-08-09 15:58:43 +00:00
|
|
|
#include "os/surface.h"
|
|
|
|
#include "os/system.h"
|
2019-04-11 17:29:20 +00:00
|
|
|
#include "render/render.h"
|
2016-07-25 12:51:58 +00:00
|
|
|
|
|
|
|
namespace app {
|
2016-09-26 15:56:52 +00:00
|
|
|
namespace thumb {
|
|
|
|
|
2020-07-07 22:06:48 +00:00
|
|
|
os::SurfaceRef get_cel_thumbnail(const doc::Cel* cel,
|
|
|
|
const gfx::Size& fitInSize)
|
2016-09-26 15:56:52 +00:00
|
|
|
{
|
2019-04-11 17:29:20 +00:00
|
|
|
gfx::Size newSize;
|
|
|
|
|
|
|
|
if (cel->bounds().w > fitInSize.w ||
|
|
|
|
cel->bounds().h > fitInSize.h)
|
|
|
|
newSize = gfx::Rect(cel->bounds()).fitIn(gfx::Rect(fitInSize)).size();
|
|
|
|
else
|
|
|
|
newSize = cel->bounds().size();
|
|
|
|
|
|
|
|
if (newSize.w < 1 ||
|
|
|
|
newSize.h < 1)
|
|
|
|
return nullptr;
|
|
|
|
|
|
|
|
doc::ImageRef thumbnailImage(
|
|
|
|
doc::Image::create(
|
|
|
|
doc::IMAGE_RGB, newSize.w, newSize.h));
|
|
|
|
|
|
|
|
render::Render render;
|
|
|
|
render::Projection proj(cel->sprite()->pixelRatio(),
|
2019-04-12 02:09:51 +00:00
|
|
|
render::Zoom(newSize.w, cel->bounds().w));
|
2019-04-11 17:29:20 +00:00
|
|
|
render.setProjection(proj);
|
|
|
|
|
|
|
|
const doc::Palette* palette = cel->sprite()->palette(cel->frame());
|
|
|
|
render.renderCel(
|
|
|
|
thumbnailImage.get(),
|
2020-11-04 19:54:12 +00:00
|
|
|
cel,
|
2019-04-11 17:29:20 +00:00
|
|
|
cel->sprite(),
|
|
|
|
cel->image(),
|
|
|
|
cel->layer(),
|
|
|
|
palette,
|
|
|
|
gfx::Rect(gfx::Point(0, 0), cel->bounds().size()),
|
|
|
|
gfx::Clip(gfx::Rect(gfx::Point(0, 0), newSize)),
|
|
|
|
255, doc::BlendMode::NORMAL);
|
|
|
|
|
2020-07-07 22:06:48 +00:00
|
|
|
if (os::SurfaceRef thumbnail = os::instance()->makeRgbaSurface(
|
2019-04-11 17:29:20 +00:00
|
|
|
thumbnailImage->width(),
|
|
|
|
thumbnailImage->height())) {
|
|
|
|
convert_image_to_surface(
|
2020-07-07 22:06:48 +00:00
|
|
|
thumbnailImage.get(), palette, thumbnail.get(),
|
2019-04-11 17:29:20 +00:00
|
|
|
0, 0, 0, 0, thumbnailImage->width(), thumbnailImage->height());
|
|
|
|
return thumbnail;
|
2016-09-26 15:56:52 +00:00
|
|
|
}
|
2019-04-11 17:29:20 +00:00
|
|
|
else
|
|
|
|
return nullptr;
|
2016-09-26 15:56:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
} // thumb
|
2016-07-25 12:51:58 +00:00
|
|
|
} // app
|