mirror of https://github.com/Chlumsky/msdfgen.git
Implement Bitmap/BitmapRef interface
This commit is contained in:
parent
6b32308b8a
commit
cebe5fdab8
|
|
@ -18,16 +18,39 @@
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
using SDFBitmap = msdfgen::Bitmap<float>;
|
||||||
|
using SDFBitmapRef = msdfgen::BitmapRef<float>;
|
||||||
|
using PSDFBitmap = msdfgen::Bitmap<float>;
|
||||||
|
using PSDFBitmapRef = msdfgen::BitmapRef<float>;
|
||||||
|
using MSDFBitmap = msdfgen::Bitmap<float, 3>;
|
||||||
|
using MSDFBitmapRef = msdfgen::BitmapRef<float, 3>;
|
||||||
|
using MTSDFBitmap = msdfgen::Bitmap<float, 4>;
|
||||||
|
using MTSDFBitmapRef = msdfgen::BitmapRef<float, 4>;
|
||||||
|
|
||||||
msdf_allocator_t g_allocator = {malloc, realloc, free};
|
msdf_allocator_t g_allocator = {malloc, realloc, free};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
[[nodiscard]] auto msdf_alloc(const size_t count = 1) noexcept -> T* {
|
||||||
|
return static_cast<T*>(g_allocator.alloc_callback(sizeof(T) * count));
|
||||||
|
}
|
||||||
|
|
||||||
|
auto msdf_free(void* memory) {
|
||||||
|
g_allocator.free_callback(memory);
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T, typename... TArgs>
|
template<typename T, typename... TArgs>
|
||||||
[[nodiscard]] auto _new(TArgs&&... args) noexcept -> T* {
|
[[nodiscard]] auto msdf_new(TArgs&&... args) noexcept -> T* {
|
||||||
auto* memory = static_cast<T*>(g_allocator.alloc_callback(sizeof(T)));
|
auto* memory = static_cast<T*>(g_allocator.alloc_callback(sizeof(T)));
|
||||||
new(memory) T(std::forward<TArgs>(args)...);
|
new(memory) T(std::forward<TArgs>(args)...);
|
||||||
return memory;
|
return memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto _delete(void* memory) noexcept -> void {
|
template<typename T>
|
||||||
|
auto msdf_delete(T* memory) noexcept -> void {
|
||||||
|
if(memory == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
memory->~T();
|
||||||
g_allocator.free_callback(memory);
|
g_allocator.free_callback(memory);
|
||||||
}
|
}
|
||||||
}// namespace
|
}// namespace
|
||||||
|
|
@ -46,31 +69,112 @@ MSDF_API const msdf_allocator_t* msdf_allocator_get() {
|
||||||
|
|
||||||
// msdf_bitmap
|
// msdf_bitmap
|
||||||
|
|
||||||
MSDF_API int msdf_bitmap_alloc(int type, int num_channels, int width, int height, msdf_bitmap_handle* bitmap) {
|
MSDF_API int msdf_bitmap_alloc(const int type, const int width, const int height, msdf_bitmap_t** bitmap) {
|
||||||
|
if(width < 0 || height < 0) {
|
||||||
|
return MSDF_ERR_INVALID_SIZE;
|
||||||
|
}
|
||||||
|
if(bitmap == nullptr) {
|
||||||
|
return MSDF_ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
auto* wrapper = msdf_alloc<msdf_bitmap_t>();
|
||||||
|
wrapper->type = type;
|
||||||
|
wrapper->width = width;
|
||||||
|
wrapper->height = height;
|
||||||
|
switch(type) {
|
||||||
|
case MSDF_BITMAP_TYPE_SDF:
|
||||||
|
wrapper->handle = msdf_new<SDFBitmap>(width, height);
|
||||||
|
break;
|
||||||
|
case MSDF_BITMAP_TYPE_PSDF:
|
||||||
|
wrapper->handle = msdf_new<PSDFBitmap>(width, height);
|
||||||
|
break;
|
||||||
|
case MSDF_BITMAP_TYPE_MSDF:
|
||||||
|
wrapper->handle = msdf_new<MSDFBitmap>(width, height);
|
||||||
|
break;
|
||||||
|
case MSDF_BITMAP_TYPE_MTSDF:
|
||||||
|
wrapper->handle = msdf_new<MTSDFBitmap>(width, height);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return MSDF_ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
*bitmap = wrapper;
|
||||||
return MSDF_SUCCESS;
|
return MSDF_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
MSDF_API int msdf_bitmap_get_type(msdf_bitmap_handle bitmap, int* type) {
|
MSDF_API int msdf_bitmap_get_channel_count(const msdf_bitmap_t* bitmap, int* channel_count) {
|
||||||
|
if(bitmap == nullptr || channel_count == nullptr) {
|
||||||
|
return MSDF_ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
switch(bitmap->type) {
|
||||||
|
case MSDF_BITMAP_TYPE_MSDF:
|
||||||
|
*channel_count = 3;
|
||||||
|
break;
|
||||||
|
case MSDF_BITMAP_TYPE_MTSDF:
|
||||||
|
*channel_count = 4;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
*channel_count = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
return MSDF_SUCCESS;
|
return MSDF_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
MSDF_API int msdf_bitmap_get_channel_count(msdf_bitmap_handle bitmap, int* channel_count) {
|
MSDF_API int msdf_bitmap_get_size(const msdf_bitmap_t* bitmap, size_t* size) {
|
||||||
|
if(bitmap == nullptr || size == nullptr) {
|
||||||
|
return MSDF_ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
int channel_count;
|
||||||
|
if(msdf_bitmap_get_channel_count(bitmap, &channel_count) != MSDF_SUCCESS) {
|
||||||
|
return MSDF_ERR_FAILED;
|
||||||
|
}
|
||||||
|
// << 2 because we only support floats right now, sizeof(float) is always 4
|
||||||
|
*size = static_cast<size_t>(bitmap->width) * static_cast<size_t>(bitmap->height) * static_cast<size_t>(channel_count) << 2;
|
||||||
return MSDF_SUCCESS;
|
return MSDF_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
MSDF_API int msdf_bitmap_get_width(msdf_bitmap_handle bitmap, int* width) {
|
MSDF_API int msdf_bitmap_get_pixels(const msdf_bitmap_t* bitmap, void** pixels) {
|
||||||
|
if(bitmap == nullptr || pixels == nullptr) {
|
||||||
|
return MSDF_ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
switch(bitmap->type) {
|
||||||
|
case MSDF_BITMAP_TYPE_SDF:
|
||||||
|
*pixels = static_cast<SDFBitmapRef>(*static_cast<SDFBitmap*>(bitmap->handle)).pixels;
|
||||||
|
break;
|
||||||
|
case MSDF_BITMAP_TYPE_PSDF:
|
||||||
|
*pixels = static_cast<PSDFBitmapRef>(*static_cast<PSDFBitmap*>(bitmap->handle)).pixels;
|
||||||
|
break;
|
||||||
|
case MSDF_BITMAP_TYPE_MSDF:
|
||||||
|
*pixels = static_cast<MSDFBitmapRef>(*static_cast<MSDFBitmap*>(bitmap->handle)).pixels;
|
||||||
|
break;
|
||||||
|
case MSDF_BITMAP_TYPE_MTSDF:
|
||||||
|
*pixels = static_cast<MTSDFBitmapRef>(*static_cast<MTSDFBitmap*>(bitmap->handle)).pixels;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return MSDF_ERR_INVALID_TYPE;
|
||||||
|
}
|
||||||
return MSDF_SUCCESS;
|
return MSDF_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
MSDF_API int msdf_bitmap_get_height(msdf_bitmap_handle bitmap, int* height) {
|
MSDF_API void msdf_bitmap_free(msdf_bitmap_t* bitmap) {
|
||||||
return MSDF_SUCCESS;
|
if(bitmap == nullptr) {
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
MSDF_API int msdf_bitmap_get_pixels(msdf_bitmap_handle bitmap, void** pixels) {
|
switch(bitmap->type) {
|
||||||
return MSDF_SUCCESS;
|
case MSDF_BITMAP_TYPE_SDF:
|
||||||
}
|
msdf_delete(static_cast<SDFBitmap*>(bitmap->handle));
|
||||||
|
break;
|
||||||
MSDF_API void msdf_bitmap_free(msdf_bitmap_handle bitmap) {
|
case MSDF_BITMAP_TYPE_PSDF:
|
||||||
|
msdf_delete(static_cast<PSDFBitmap*>(bitmap->handle));
|
||||||
|
break;
|
||||||
|
case MSDF_BITMAP_TYPE_MSDF:
|
||||||
|
msdf_delete(static_cast<MSDFBitmap*>(bitmap->handle));
|
||||||
|
break;
|
||||||
|
case MSDF_BITMAP_TYPE_MTSDF:
|
||||||
|
msdf_delete(static_cast<MTSDFBitmap*>(bitmap->handle));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
msdf_free(bitmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
// msdf_shape
|
// msdf_shape
|
||||||
|
|
|
||||||
61
msdfgen_c.h
61
msdfgen_c.h
|
|
@ -30,17 +30,21 @@
|
||||||
#define MSDF_TRUE 1
|
#define MSDF_TRUE 1
|
||||||
|
|
||||||
#define MSDF_SUCCESS 0
|
#define MSDF_SUCCESS 0
|
||||||
#define MSDF_ERR_INVALID_ARG 1
|
#define MSDF_ERR_FAILED 1
|
||||||
#define MSDF_ERR_INVALID_FORMAT 2
|
#define MSDF_ERR_INVALID_ARG 2
|
||||||
|
#define MSDF_ERR_INVALID_TYPE 3
|
||||||
|
#define MSDF_ERR_INVALID_SIZE 4
|
||||||
|
|
||||||
#define MSDF_BITMAP_TYPE_FLOAT 0
|
#define MSDF_BITMAP_TYPE_SDF 0
|
||||||
#define MSDF_BITMAP_TYPE_DOUBLE 1
|
#define MSDF_BITMAP_TYPE_PSDF 1
|
||||||
#define MSDF_BITMAP_TYPE_INT 2
|
#define MSDF_BITMAP_TYPE_MSDF 2
|
||||||
#define MSDF_BITMAP_TYPE_SHORT 3
|
#define MSDF_BITMAP_TYPE_MTSDF 3
|
||||||
|
#define MSDF_BITMAP_TYPE_MAX MSDF_BITMAP_TYPE_MTSDF
|
||||||
|
|
||||||
#define MSDF_SEGMENT_TYPE_LINEAR 0
|
#define MSDF_SEGMENT_TYPE_LINEAR 0
|
||||||
#define MSDF_SEGMENT_TYPE_QUADRATIC 1
|
#define MSDF_SEGMENT_TYPE_QUADRATIC 1
|
||||||
#define MSDF_SEGMENT_TYPE_CUBIC 2
|
#define MSDF_SEGMENT_TYPE_CUBIC 2
|
||||||
|
#define MSDF_SEGMENT_TYPE_MAX MSDF_SEGMENT_TYPE_CUBIC
|
||||||
|
|
||||||
#define MSDF_EDGE_COLOR_BLACK 0
|
#define MSDF_EDGE_COLOR_BLACK 0
|
||||||
#define MSDF_EDGE_COLOR_RED 1
|
#define MSDF_EDGE_COLOR_RED 1
|
||||||
|
|
@ -54,10 +58,10 @@
|
||||||
#define MSDF_DEFINE_HANDLE_TYPE(n) typedef struct n* n##_handle // NOLINT
|
#define MSDF_DEFINE_HANDLE_TYPE(n) typedef struct n* n##_handle // NOLINT
|
||||||
|
|
||||||
// Macros for allocating default MSDF bitmap types
|
// Macros for allocating default MSDF bitmap types
|
||||||
#define MSDF_ALLOC_SDF_BITMAP(w, h) msdf_bitmap_alloc(MSDF_BITMAP_TYPE_FLOAT, 1, w, h)
|
#define MSDF_ALLOC_SDF_BITMAP(w, h) msdf_bitmap_alloc(MSDF_BITMAP_TYPE_SDF, w, h)
|
||||||
#define MSDF_ALLOC_PSDF_BITMAP(w, h) msdf_bitmap_alloc(MSDF_BITMAP_TYPE_FLOAT, 1, w, h)
|
#define MSDF_ALLOC_PSDF_BITMAP(w, h) msdf_bitmap_alloc(MSDF_BITMAP_TYPE_PSDF, w, h)
|
||||||
#define MSDF_ALLOC_MSDF_BITMAP(w, h) msdf_bitmap_alloc(MSDF_BITMAP_TYPE_FLOAT, 3, w, h)
|
#define MSDF_ALLOC_MSDF_BITMAP(w, h) msdf_bitmap_alloc(MSDF_BITMAP_TYPE_MSDF, w, h)
|
||||||
#define MSDF_ALLOC_MTSDF_BITMAP(w, h) msdf_bitmap_alloc(MSDF_BITMAP_TYPE_FLOAT, 4, w, h)
|
#define MSDF_ALLOC_MTSDF_BITMAP(w, h) msdf_bitmap_alloc(MSDF_BITMAP_TYPE_MTSDF, w, h)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
@ -112,11 +116,16 @@ typedef struct msdf_multichannel_config {
|
||||||
int distance_check_mode;
|
int distance_check_mode;
|
||||||
double min_deviation_ratio;
|
double min_deviation_ratio;
|
||||||
double min_improve_ratio;
|
double min_improve_ratio;
|
||||||
char* buffer;
|
|
||||||
} msdf_multichannel_config_t;
|
} msdf_multichannel_config_t;
|
||||||
|
|
||||||
|
typedef struct msdf_bitmap {
|
||||||
|
int type;
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
void* handle;
|
||||||
|
} msdf_bitmap_t;
|
||||||
|
|
||||||
// Opaque handle types
|
// Opaque handle types
|
||||||
MSDF_DEFINE_HANDLE_TYPE(msdf_bitmap);
|
|
||||||
MSDF_DEFINE_HANDLE_TYPE(msdf_shape);
|
MSDF_DEFINE_HANDLE_TYPE(msdf_shape);
|
||||||
MSDF_DEFINE_HANDLE_TYPE(msdf_contour);
|
MSDF_DEFINE_HANDLE_TYPE(msdf_contour);
|
||||||
MSDF_DEFINE_HANDLE_TYPE(msdf_edge_holder);
|
MSDF_DEFINE_HANDLE_TYPE(msdf_edge_holder);
|
||||||
|
|
@ -126,13 +135,11 @@ MSDF_DEFINE_HANDLE_TYPE(msdf_segment);
|
||||||
MSDF_API void msdf_allocator_set(const msdf_allocator_t* allocator);
|
MSDF_API void msdf_allocator_set(const msdf_allocator_t* allocator);
|
||||||
MSDF_API const msdf_allocator_t* msdf_allocator_get();
|
MSDF_API const msdf_allocator_t* msdf_allocator_get();
|
||||||
|
|
||||||
MSDF_API int msdf_bitmap_alloc(int type, int num_channels, int width, int height, msdf_bitmap_handle* bitmap);
|
MSDF_API int msdf_bitmap_alloc(int type, int width, int height, msdf_bitmap_t** bitmap);
|
||||||
MSDF_API int msdf_bitmap_get_type(msdf_bitmap_handle bitmap, int* type);
|
MSDF_API int msdf_bitmap_get_channel_count(const msdf_bitmap_t* bitmap, int* channel_count);
|
||||||
MSDF_API int msdf_bitmap_get_channel_count(msdf_bitmap_handle bitmap, int* channel_count);
|
MSDF_API int msdf_bitmap_get_pixels(const msdf_bitmap_t* bitmap, void** pixels);
|
||||||
MSDF_API int msdf_bitmap_get_width(msdf_bitmap_handle bitmap, int* width);
|
MSDF_API int msdf_bitmap_get_size(const msdf_bitmap_t* bitmap, size_t* size);
|
||||||
MSDF_API int msdf_bitmap_get_height(msdf_bitmap_handle bitmap, int* height);
|
MSDF_API void msdf_bitmap_free(msdf_bitmap_t* bitmap);
|
||||||
MSDF_API int msdf_bitmap_get_pixels(msdf_bitmap_handle bitmap, void** pixels);
|
|
||||||
MSDF_API void msdf_bitmap_free(msdf_bitmap_handle bitmap);
|
|
||||||
|
|
||||||
MSDF_API int msdf_shape_alloc(msdf_shape_handle* shape);
|
MSDF_API int msdf_shape_alloc(msdf_shape_handle* shape);
|
||||||
MSDF_API int msdf_shape_get_bounds(msdf_shape_handle shape, msdf_bounds_t* bounds);
|
MSDF_API int msdf_shape_get_bounds(msdf_shape_handle shape, msdf_bounds_t* bounds);
|
||||||
|
|
@ -181,24 +188,24 @@ MSDF_API int msdf_segment_move_start_point(msdf_segment_handle segment, const ms
|
||||||
MSDF_API int msdf_segment_move_end_point(msdf_segment_handle segment, const msdf_vector2_t* point);
|
MSDF_API int msdf_segment_move_end_point(msdf_segment_handle segment, const msdf_vector2_t* point);
|
||||||
MSDF_API void msdf_segment_free(msdf_segment_handle segment);
|
MSDF_API void msdf_segment_free(msdf_segment_handle segment);
|
||||||
|
|
||||||
MSDF_API int msdf_generate_sdf(msdf_bitmap_handle output, msdf_shape_handle shape, const msdf_transform_t* transform);
|
MSDF_API int msdf_generate_sdf(msdf_bitmap_t* output, msdf_shape_handle shape, const msdf_transform_t* transform);
|
||||||
MSDF_API int msdf_generate_psdf(msdf_bitmap_handle output, msdf_shape_handle shape, const msdf_transform_t* transform);
|
MSDF_API int msdf_generate_psdf(msdf_bitmap_t* output, msdf_shape_handle shape, const msdf_transform_t* transform);
|
||||||
MSDF_API int msdf_generate_msdf(msdf_bitmap_handle output, msdf_shape_handle shape, const msdf_transform_t* transform);
|
MSDF_API int msdf_generate_msdf(msdf_bitmap_t* output, msdf_shape_handle shape, const msdf_transform_t* transform);
|
||||||
MSDF_API int msdf_generate_mtsdf(msdf_bitmap_handle output, msdf_shape_handle shape, const msdf_transform_t* transform);
|
MSDF_API int msdf_generate_mtsdf(msdf_bitmap_t* output, msdf_shape_handle shape, const msdf_transform_t* transform);
|
||||||
|
|
||||||
MSDF_API int msdf_generate_sdf_with_config(msdf_bitmap_handle output,
|
MSDF_API int msdf_generate_sdf_with_config(msdf_bitmap_t* output,
|
||||||
msdf_shape_handle shape,
|
msdf_shape_handle shape,
|
||||||
const msdf_transform_t* transform,
|
const msdf_transform_t* transform,
|
||||||
const msdf_config_t* config);
|
const msdf_config_t* config);
|
||||||
MSDF_API int msdf_generate_psdf_with_config(msdf_bitmap_handle output,
|
MSDF_API int msdf_generate_psdf_with_config(msdf_bitmap_t* output,
|
||||||
msdf_shape_handle shape,
|
msdf_shape_handle shape,
|
||||||
const msdf_transform_t* transform,
|
const msdf_transform_t* transform,
|
||||||
const msdf_config_t* config);
|
const msdf_config_t* config);
|
||||||
MSDF_API int msdf_generate_msdf_with_config(msdf_bitmap_handle output,
|
MSDF_API int msdf_generate_msdf_with_config(msdf_bitmap_t* output,
|
||||||
msdf_shape_handle shape,
|
msdf_shape_handle shape,
|
||||||
const msdf_transform_t* transform,
|
const msdf_transform_t* transform,
|
||||||
const msdf_multichannel_config_t* config);
|
const msdf_multichannel_config_t* config);
|
||||||
MSDF_API int msdf_generate_mtsdf_with_config(msdf_bitmap_handle output,
|
MSDF_API int msdf_generate_mtsdf_with_config(msdf_bitmap_t* output,
|
||||||
msdf_shape_handle shape,
|
msdf_shape_handle shape,
|
||||||
const msdf_transform_t* transform,
|
const msdf_transform_t* transform,
|
||||||
const msdf_multichannel_config_t* config);
|
const msdf_multichannel_config_t* config);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue