0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-12-26 15:33:54 +01:00

modules/media/magick: Add composite thumbcropper for matrix.

This commit is contained in:
Jason Volk 2019-05-30 06:07:39 -07:00
parent c2dc298304
commit a651952eda
2 changed files with 71 additions and 0 deletions

View file

@ -20,10 +20,24 @@ namespace ircd::magick
struct shave;
struct scale;
struct thumbnail;
struct thumbcrop;
std::tuple<ulong, string_view> version();
}
/// Composite thumbnailer to resize close to the requested dimension but
/// preserving original aspect ratio; then crop to requested dimension.
struct ircd::magick::thumbcrop
{
using dimensions = std::pair<size_t, size_t>; // x, y
using result_closure = std::function<void (const const_buffer &)>;
thumbcrop(const const_buffer &in,
const dimensions &,
const result_closure &);
};
/// Fast thumbnailer
struct ircd::magick::thumbnail
{
using dimensions = std::pair<size_t, size_t>; // x, y

View file

@ -156,6 +156,63 @@ ircd::magick::version()
return { number, string };
}
//
// thumbcrop
//
ircd::magick::thumbcrop::thumbcrop(const const_buffer &in,
const dimensions &req,
const result_closure &out)
{
crop::offset offset;
const auto scaler{[&req, &offset]
(const auto &image)
{
const auto &img_p
{
std::get<const ::Image *>(image)
};
const auto &req_x(req.first);
const auto &req_y(req.second);
const auto &img_x(img_p->columns);
const auto &img_y(img_p->rows);
const bool aspect
{
req_x * img_y < req_y * img_x
};
const dimensions scaled
{
aspect? req_y * img_x / img_y : req_x,
aspect? req_y : req_x * img_y / img_x,
};
offset =
{
aspect? (scaled.first - req_x) / 2.0 : 0,
aspect? 0 : (scaled.second - req_y) / 2.0,
};
return callex<::Image *>(::ThumbnailImage, img_p, scaled.first, scaled.second);
}};
const auto cropper{[&req, &out, &offset]
(const const_buffer &in)
{
crop
{
in, req, offset, out
};
}};
transform
{
in, cropper, scaler
};
}
//
// thumbnail
//