aseprite/src/app/thumbnails.cpp

75 lines
1.9 KiB
C++
Raw Normal View History

// Aseprite
// Copyright (C) 2019-2020 Igara Studio S.A.
// Copyright (C) 2018 David Capello
// Copyright (C) 2016 Carlo Caputo
//
// This program is distributed under the terms of
// the End-User License Agreement for Aseprite.
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "app/util/conversion_to_surface.h"
#include "doc/blend_mode.h"
#include "doc/cel.h"
#include "doc/layer.h"
#include "doc/sprite.h"
2018-08-09 15:58:43 +00:00
#include "os/surface.h"
#include "os/system.h"
#include "render/render.h"
namespace app {
namespace thumb {
2020-07-07 22:06:48 +00:00
os::SurfaceRef get_cel_thumbnail(const doc::Cel* cel,
const gfx::Size& fitInSize)
{
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));
render.setProjection(proj);
const doc::Palette* palette = cel->sprite()->palette(cel->frame());
render.renderCel(
thumbnailImage.get(),
cel,
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(
thumbnailImage->width(),
thumbnailImage->height())) {
convert_image_to_surface(
2020-07-07 22:06:48 +00:00
thumbnailImage.get(), palette, thumbnail.get(),
0, 0, 0, 0, thumbnailImage->width(), thumbnailImage->height());
return thumbnail;
}
else
return nullptr;
}
} // thumb
} // app