2019-05-29 07:08:46 +02:00
|
|
|
// Matrix Construct
|
|
|
|
//
|
|
|
|
// Copyright (C) Matrix Construct Developers, Authors & Contributors
|
|
|
|
// Copyright (C) 2016-2019 Jason Volk <jason@zemos.net>
|
|
|
|
//
|
|
|
|
// Permission to use, copy, modify, and/or distribute this software for any
|
|
|
|
// purpose with or without fee is hereby granted, provided that the above
|
|
|
|
// copyright notice and this permission notice is present in all copies. The
|
|
|
|
// full license for this software is available in the LICENSE file.
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
#define HAVE_IRCD_MAGICK_H
|
|
|
|
|
|
|
|
/// GraphicsMagick Library Interface
|
|
|
|
namespace ircd::magick
|
|
|
|
{
|
|
|
|
IRCD_EXCEPTION(ircd::error, error)
|
|
|
|
|
2019-07-06 00:32:10 +02:00
|
|
|
struct job;
|
2019-05-30 09:51:50 +02:00
|
|
|
struct crop;
|
2019-05-30 10:29:07 +02:00
|
|
|
struct shave;
|
2019-05-30 11:11:31 +02:00
|
|
|
struct scale;
|
2019-05-29 08:25:03 +02:00
|
|
|
struct thumbnail;
|
2019-05-30 15:07:39 +02:00
|
|
|
struct thumbcrop;
|
2020-08-24 10:35:15 +02:00
|
|
|
struct init;
|
2019-05-29 08:25:03 +02:00
|
|
|
|
2019-06-01 01:06:55 +02:00
|
|
|
extern const info::versions version_api, version_abi;
|
2019-05-29 07:08:46 +02:00
|
|
|
}
|
2019-05-29 08:25:03 +02:00
|
|
|
|
2019-05-30 15:07:39 +02:00
|
|
|
/// 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
|
2019-05-29 08:25:03 +02:00
|
|
|
struct ircd::magick::thumbnail
|
|
|
|
{
|
2019-05-30 02:04:24 +02:00
|
|
|
using dimensions = std::pair<size_t, size_t>; // x, y
|
|
|
|
using result_closure = std::function<void (const const_buffer &)>;
|
|
|
|
|
2019-05-29 08:25:03 +02:00
|
|
|
thumbnail(const const_buffer &in,
|
2019-05-30 02:04:24 +02:00
|
|
|
const dimensions &,
|
|
|
|
const result_closure &);
|
2019-05-29 08:25:03 +02:00
|
|
|
};
|
2019-05-30 09:51:50 +02:00
|
|
|
|
2019-05-30 12:44:41 +02:00
|
|
|
/// Basic resize (library selected algorithm)
|
2019-05-30 11:11:31 +02:00
|
|
|
struct ircd::magick::scale
|
|
|
|
{
|
|
|
|
using dimensions = std::pair<size_t, size_t>; // x, y
|
|
|
|
using result_closure = std::function<void (const const_buffer &)>;
|
|
|
|
|
|
|
|
scale(const const_buffer &in,
|
|
|
|
const dimensions &,
|
|
|
|
const result_closure &);
|
|
|
|
};
|
|
|
|
|
2019-05-30 12:44:41 +02:00
|
|
|
/// Shave off sides (center-crop to dimensions)
|
2019-05-30 10:29:07 +02:00
|
|
|
struct ircd::magick::shave
|
|
|
|
{
|
|
|
|
using offset = std::pair<ssize_t, ssize_t>; // x, y
|
|
|
|
using dimensions = std::pair<size_t, size_t>; // x, y
|
|
|
|
using result_closure = std::function<void (const const_buffer &)>;
|
|
|
|
|
|
|
|
shave(const const_buffer &in,
|
|
|
|
const dimensions &,
|
|
|
|
const offset &,
|
|
|
|
const result_closure &);
|
|
|
|
};
|
|
|
|
|
2019-05-30 12:44:41 +02:00
|
|
|
/// Crop to dimensions at offset
|
2019-05-30 09:51:50 +02:00
|
|
|
struct ircd::magick::crop
|
|
|
|
{
|
|
|
|
using offset = std::pair<ssize_t, ssize_t>; // x, y
|
|
|
|
using dimensions = std::pair<size_t, size_t>; // x, y
|
|
|
|
using result_closure = std::function<void (const const_buffer &)>;
|
|
|
|
|
|
|
|
crop(const const_buffer &in,
|
|
|
|
const dimensions &,
|
|
|
|
const offset &,
|
|
|
|
const result_closure &);
|
|
|
|
};
|
2019-07-06 00:32:10 +02:00
|
|
|
|
|
|
|
struct ircd::magick::job
|
|
|
|
{
|
|
|
|
struct state;
|
|
|
|
|
|
|
|
static thread_local struct job cur, tot; // current job, total for all jobs
|
|
|
|
static thread_local struct state state; // internal state
|
|
|
|
|
|
|
|
uint64_t id {0}; // monotonic
|
|
|
|
int64_t tick {0}; // quantum
|
|
|
|
uint64_t ticks {0}; // span
|
|
|
|
uint64_t cycles {0}; // rdtsc reference
|
|
|
|
uint64_t yields {0}; // ircd::ctx relinquish count for large jobs
|
|
|
|
uint64_t intrs {0}; // ircd::ctx interrupt count
|
|
|
|
uint64_t errors {0}; // exception/error count
|
|
|
|
string_view description; // only valid for current job duration
|
|
|
|
std::exception_ptr eptr; // apropos exception reference
|
|
|
|
};
|
2020-09-06 00:36:55 +02:00
|
|
|
|
2022-05-26 21:28:28 +02:00
|
|
|
struct [[gnu::visibility("hidden")]]
|
|
|
|
ircd::magick::init
|
|
|
|
{
|
|
|
|
init();
|
|
|
|
~init() noexcept;
|
|
|
|
};
|
|
|
|
|
2020-09-06 00:36:55 +02:00
|
|
|
// inline stubs when magick disabled/unavailable.
|
|
|
|
#if !IRCD_USE_MAGICK
|
|
|
|
|
|
|
|
inline
|
|
|
|
ircd::magick::init::init()
|
|
|
|
{}
|
|
|
|
|
|
|
|
inline
|
|
|
|
ircd::magick::init::~init()
|
|
|
|
noexcept
|
|
|
|
{}
|
|
|
|
|
|
|
|
#endif IRCD_USE_MAGICK
|