Finish implementing actual msdfgen API functions

This commit is contained in:
KitsuneAlex 2024-05-02 05:02:44 +02:00
parent ac81d2dc1b
commit 130f6ffaaf
No known key found for this signature in database
GPG Key ID: 6B0CE864BB69B7D0
2 changed files with 86 additions and 6 deletions

View File

@ -562,18 +562,50 @@ MSDF_API void msdf_segment_free(msdf_segment_t* segment) {
// Main msdfgen APIs
int msdf_generate_sdf(msdf_bitmap_t* output, msdf_shape_handle shape, const msdf_transform_t* transform) {
if(output == nullptr || shape == nullptr || transform == nullptr) {
return MSDF_ERR_INVALID_ARG;
}
const msdfgen::Projection projection(*reinterpret_cast<const msdfgen::Vector2*>(&transform->scale),
*reinterpret_cast<const msdfgen::Vector2*>(&transform->translation));
const msdfgen::Range dist_mapping(transform->distance_mapping.lower, transform->distance_mapping.upper);
const msdfgen::SDFTransformation actual_transform(projection, dist_mapping);
msdfgen::generateSDF(*static_cast<SDFBitmap*>(output->handle), *reinterpret_cast<const msdfgen::Shape*>(shape), actual_transform);
return MSDF_SUCCESS;
}
int msdf_generate_psdf(msdf_bitmap_t* output, msdf_shape_handle shape, const msdf_transform_t* transform) {
if(output == nullptr || shape == nullptr || transform == nullptr) {
return MSDF_ERR_INVALID_ARG;
}
const msdfgen::Projection projection(*reinterpret_cast<const msdfgen::Vector2*>(&transform->scale),
*reinterpret_cast<const msdfgen::Vector2*>(&transform->translation));
const msdfgen::Range dist_mapping(transform->distance_mapping.lower, transform->distance_mapping.upper);
const msdfgen::SDFTransformation actual_transform(projection, dist_mapping);
msdfgen::generatePSDF(*static_cast<PSDFBitmap*>(output->handle), *reinterpret_cast<const msdfgen::Shape*>(shape), actual_transform);
return MSDF_SUCCESS;
}
int msdf_generate_msdf(msdf_bitmap_t* output, msdf_shape_handle shape, const msdf_transform_t* transform) {
if(output == nullptr || shape == nullptr || transform == nullptr) {
return MSDF_ERR_INVALID_ARG;
}
const msdfgen::Projection projection(*reinterpret_cast<const msdfgen::Vector2*>(&transform->scale),
*reinterpret_cast<const msdfgen::Vector2*>(&transform->translation));
const msdfgen::Range dist_mapping(transform->distance_mapping.lower, transform->distance_mapping.upper);
const msdfgen::SDFTransformation actual_transform(projection, dist_mapping);
msdfgen::generateMSDF(*static_cast<MSDFBitmap*>(output->handle), *reinterpret_cast<const msdfgen::Shape*>(shape), actual_transform);
return MSDF_SUCCESS;
}
int msdf_generate_mtsdf(msdf_bitmap_t* output, msdf_shape_handle shape, const msdf_transform_t* transform) {
if(output == nullptr || shape == nullptr || transform == nullptr) {
return MSDF_ERR_INVALID_ARG;
}
const msdfgen::Projection projection(*reinterpret_cast<const msdfgen::Vector2*>(&transform->scale),
*reinterpret_cast<const msdfgen::Vector2*>(&transform->translation));
const msdfgen::Range dist_mapping(transform->distance_mapping.lower, transform->distance_mapping.upper);
const msdfgen::SDFTransformation actual_transform(projection, dist_mapping);
msdfgen::generateMTSDF(*static_cast<MTSDFBitmap*>(output->handle), *reinterpret_cast<const msdfgen::Shape*>(shape), actual_transform);
return MSDF_SUCCESS;
}
@ -581,6 +613,16 @@ int msdf_generate_sdf_with_config(msdf_bitmap_t* output,
msdf_shape_handle shape,
const msdf_transform_t* transform,
const msdf_config_t* config) {
if(output == nullptr || shape == nullptr || transform == nullptr || config == nullptr) {
return MSDF_ERR_INVALID_ARG;
}
const msdfgen::Projection projection(*reinterpret_cast<const msdfgen::Vector2*>(&transform->scale),
*reinterpret_cast<const msdfgen::Vector2*>(&transform->translation));
const msdfgen::Range dist_mapping(transform->distance_mapping.lower, transform->distance_mapping.upper);
const msdfgen::SDFTransformation actual_transform(projection, dist_mapping);
const msdfgen::GeneratorConfig actual_config(config->overlap_support == MSDF_TRUE);
msdfgen::generateSDF(*static_cast<SDFBitmap*>(output->handle), *reinterpret_cast<const msdfgen::Shape*>(shape), actual_transform,
actual_config);
return MSDF_SUCCESS;
}
@ -588,6 +630,16 @@ int msdf_generate_psdf_with_config(msdf_bitmap_t* output,
msdf_shape_handle shape,
const msdf_transform_t* transform,
const msdf_config_t* config) {
if(output == nullptr || shape == nullptr || transform == nullptr || config == nullptr) {
return MSDF_ERR_INVALID_ARG;
}
const msdfgen::Projection projection(*reinterpret_cast<const msdfgen::Vector2*>(&transform->scale),
*reinterpret_cast<const msdfgen::Vector2*>(&transform->translation));
const msdfgen::Range dist_mapping(transform->distance_mapping.lower, transform->distance_mapping.upper);
const msdfgen::SDFTransformation actual_transform(projection, dist_mapping);
const msdfgen::GeneratorConfig actual_config(config->overlap_support == MSDF_TRUE);
msdfgen::generatePSDF(*static_cast<PSDFBitmap*>(output->handle), *reinterpret_cast<const msdfgen::Shape*>(shape), actual_transform,
actual_config);
return MSDF_SUCCESS;
}
@ -595,6 +647,20 @@ int msdf_generate_msdf_with_config(msdf_bitmap_t* output,
msdf_shape_handle shape,
const msdf_transform_t* transform,
const msdf_multichannel_config_t* config) {
if(output == nullptr || shape == nullptr || transform == nullptr || config == nullptr) {
return MSDF_ERR_INVALID_ARG;
}
const msdfgen::Projection projection(*reinterpret_cast<const msdfgen::Vector2*>(&transform->scale),
*reinterpret_cast<const msdfgen::Vector2*>(&transform->translation));
const msdfgen::Range dist_mapping(transform->distance_mapping.lower, transform->distance_mapping.upper);
const msdfgen::SDFTransformation actual_transform(projection, dist_mapping);
const msdfgen::ErrorCorrectionConfig error_correction_config(
static_cast<msdfgen::ErrorCorrectionConfig::Mode>(config->mode),
static_cast<msdfgen::ErrorCorrectionConfig::DistanceCheckMode>(config->distance_check_mode), config->min_deviation_ratio,
config->min_improve_ratio);
const msdfgen::MSDFGeneratorConfig actual_config(config->overlap_support == MSDF_TRUE, error_correction_config);
msdfgen::generateMSDF(*static_cast<MSDFBitmap*>(output->handle), *reinterpret_cast<const msdfgen::Shape*>(shape), actual_transform,
actual_config);
return MSDF_SUCCESS;
}
@ -602,6 +668,20 @@ int msdf_generate_mtsdf_with_config(msdf_bitmap_t* output,
msdf_shape_handle shape,
const msdf_transform_t* transform,
const msdf_multichannel_config_t* config) {
if(output == nullptr || shape == nullptr || transform == nullptr || config == nullptr) {
return MSDF_ERR_INVALID_ARG;
}
const msdfgen::Projection projection(*reinterpret_cast<const msdfgen::Vector2*>(&transform->scale),
*reinterpret_cast<const msdfgen::Vector2*>(&transform->translation));
const msdfgen::Range dist_mapping(transform->distance_mapping.lower, transform->distance_mapping.upper);
const msdfgen::SDFTransformation actual_transform(projection, dist_mapping);
const msdfgen::ErrorCorrectionConfig error_correction_config(
static_cast<msdfgen::ErrorCorrectionConfig::Mode>(config->mode),
static_cast<msdfgen::ErrorCorrectionConfig::DistanceCheckMode>(config->distance_check_mode), config->min_deviation_ratio,
config->min_improve_ratio);
const msdfgen::MSDFGeneratorConfig actual_config(config->overlap_support == MSDF_TRUE, error_correction_config);
msdfgen::generateMTSDF(*static_cast<MTSDFBitmap*>(output->handle), *reinterpret_cast<const msdfgen::Shape*>(shape), actual_transform,
actual_config);
return MSDF_SUCCESS;
}
}

View File

@ -84,6 +84,11 @@ typedef struct msdf_vector2 {
double y;
} msdf_vector2_t;
typedef struct msdf_range {
double lower;
double upper;
} msdf_range_t;
typedef struct msdf_bounds {
double l;
double b;
@ -96,15 +101,10 @@ typedef struct msdf_projection {
msdf_vector2_t translation;
} msdf_projection_t;
typedef struct msdf_distance_mapping {
double scale;
double translation;
} msdf_distance_mapping_t;
typedef struct msdf_transform {
msdf_vector2_t scale;
msdf_vector2_t translation;
msdf_distance_mapping_t distance_mapping;
msdf_range_t distance_mapping;
} msdf_transform_t;
typedef struct msdf_config {