mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-15 08:56:02 +08:00
Using unit per em instead of ascent
This commit is contained in:
parent
7208fc571e
commit
bed5232a22
@ -38,7 +38,7 @@ public:
|
|||||||
/// <returns>ExPolygons with only unique points</returns>
|
/// <returns>ExPolygons with only unique points</returns>
|
||||||
static ExPolygons dilate_to_unique_points(ExPolygons &expolygons);
|
static ExPolygons dilate_to_unique_points(ExPolygons &expolygons);
|
||||||
|
|
||||||
// scale and convert flota to int coordinate
|
// scale and convert float to int coordinate
|
||||||
static Point to_point(const stbtt__point &point);
|
static Point to_point(const stbtt__point &point);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -118,6 +118,9 @@ std::optional<Emboss::Glyph> Private::get_glyph(stbtt_fontinfo &font_info, int u
|
|||||||
}
|
}
|
||||||
// fix for bad defined fonts
|
// fix for bad defined fonts
|
||||||
glyph.shape = Slic3r::union_ex(glyph_polygons);
|
glyph.shape = Slic3r::union_ex(glyph_polygons);
|
||||||
|
|
||||||
|
BoundingBox bb(glyph.shape.front().contour.points);
|
||||||
|
|
||||||
// inner cw - hole
|
// inner cw - hole
|
||||||
// outer ccw - contour
|
// outer ccw - contour
|
||||||
return glyph;
|
return glyph;
|
||||||
@ -481,8 +484,12 @@ std::unique_ptr<Emboss::FontFile> Emboss::load_font(
|
|||||||
// load information about line gap
|
// load information about line gap
|
||||||
int ascent, descent, linegap;
|
int ascent, descent, linegap;
|
||||||
stbtt_GetFontVMetrics(info, &ascent, &descent, &linegap);
|
stbtt_GetFontVMetrics(info, &ascent, &descent, &linegap);
|
||||||
|
|
||||||
|
float pixels = 1000.; // value is irelevant
|
||||||
|
float em_pixels = stbtt_ScaleForMappingEmToPixels(info, pixels);
|
||||||
|
int units_per_em = static_cast<int>(std::round(pixels / em_pixels));
|
||||||
return std::make_unique<Emboss::FontFile>(
|
return std::make_unique<Emboss::FontFile>(
|
||||||
std::move(data), collection_size, ascent, descent, linegap);
|
std::move(data), collection_size, ascent, descent, linegap, units_per_em);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<Emboss::FontFile> Emboss::load_font(const char *file_path)
|
std::unique_ptr<Emboss::FontFile> Emboss::load_font(const char *file_path)
|
||||||
|
@ -45,7 +45,11 @@ public:
|
|||||||
// description of one letter
|
// description of one letter
|
||||||
struct Glyph
|
struct Glyph
|
||||||
{
|
{
|
||||||
|
// NOTE: shape is scaled by SHAPE_SCALE
|
||||||
|
// to be able store points without floating points
|
||||||
ExPolygons shape;
|
ExPolygons shape;
|
||||||
|
|
||||||
|
// values are in font points
|
||||||
int advance_width=0, left_side_bearing=0;
|
int advance_width=0, left_side_bearing=0;
|
||||||
};
|
};
|
||||||
// cache for glyph by unicode
|
// cache for glyph by unicode
|
||||||
@ -68,19 +72,25 @@ public:
|
|||||||
// vertical position is "scale*(ascent - descent + lineGap)"
|
// vertical position is "scale*(ascent - descent + lineGap)"
|
||||||
const int ascent, descent, linegap;
|
const int ascent, descent, linegap;
|
||||||
|
|
||||||
|
// for convert font units to pixel
|
||||||
|
int unit_per_em;
|
||||||
|
|
||||||
Emboss::Glyphs cache; // cache of glyphs
|
Emboss::Glyphs cache; // cache of glyphs
|
||||||
|
|
||||||
FontFile(std::vector<unsigned char> &&buffer,
|
FontFile(std::vector<unsigned char> &&buffer,
|
||||||
unsigned int count,
|
unsigned int count,
|
||||||
int ascent,
|
int ascent,
|
||||||
int descent,
|
int descent,
|
||||||
int linegap)
|
int linegap,
|
||||||
|
int unit_per_em
|
||||||
|
)
|
||||||
: buffer(std::move(buffer))
|
: buffer(std::move(buffer))
|
||||||
, index(0) // select default font on index 0
|
, index(0) // select default font on index 0
|
||||||
, count(count)
|
, count(count)
|
||||||
, ascent(ascent)
|
, ascent(ascent)
|
||||||
, descent(descent)
|
, descent(descent)
|
||||||
, linegap(linegap)
|
, linegap(linegap)
|
||||||
|
, unit_per_em(unit_per_em)
|
||||||
{}
|
{}
|
||||||
bool operator==(const FontFile &other) const {
|
bool operator==(const FontFile &other) const {
|
||||||
return index == other.index &&
|
return index == other.index &&
|
||||||
|
@ -41,7 +41,8 @@
|
|||||||
#ifdef ALLOW_DEBUG_MODE
|
#ifdef ALLOW_DEBUG_MODE
|
||||||
#define ALLOW_ADD_FONT_BY_FILE
|
#define ALLOW_ADD_FONT_BY_FILE
|
||||||
#define ALLOW_ADD_FONT_BY_OS_SELECTOR
|
#define ALLOW_ADD_FONT_BY_OS_SELECTOR
|
||||||
#define SHOW_WX_FONT_DESCRIPTOR
|
#define SHOW_WX_FONT_DESCRIPTOR // OS specific descriptor | file path
|
||||||
|
#define SHOW_FONT_FILE_PROPERTY // ascent, descent, line gap, cache
|
||||||
#define SHOW_IMGUI_ATLAS
|
#define SHOW_IMGUI_ATLAS
|
||||||
#define SHOW_ICONS_TEXTURE
|
#define SHOW_ICONS_TEXTURE
|
||||||
#define SHOW_FINE_POSITION
|
#define SHOW_FINE_POSITION
|
||||||
@ -51,6 +52,7 @@
|
|||||||
#endif // ALLOW_DEBUG_MODE
|
#endif // ALLOW_DEBUG_MODE
|
||||||
|
|
||||||
#define SHOW_WX_FONT_DESCRIPTOR
|
#define SHOW_WX_FONT_DESCRIPTOR
|
||||||
|
#define SHOW_FONT_FILE_PROPERTY
|
||||||
#define ALLOW_ADD_FONT_BY_FILE
|
#define ALLOW_ADD_FONT_BY_FILE
|
||||||
#define ALLOW_ADD_FONT_BY_OS_SELECTOR
|
#define ALLOW_ADD_FONT_BY_OS_SELECTOR
|
||||||
#define ALLOW_REVERT_ALL_STYLES
|
#define ALLOW_REVERT_ALL_STYLES
|
||||||
@ -200,10 +202,9 @@ bool GLGizmoEmboss::on_mouse_for_rotation(const wxMouseEvent &mouse_event)
|
|||||||
// propagate angle into property
|
// propagate angle into property
|
||||||
angle_opt = static_cast<float>(*start_angle + angle);
|
angle_opt = static_cast<float>(*start_angle + angle);
|
||||||
// move to range <-M_PI, M_PI>
|
// move to range <-M_PI, M_PI>
|
||||||
if (*angle_opt > M_PI) {
|
if (*angle_opt > M_PI || *angle_opt < -M_PI) {
|
||||||
*angle_opt -= 2 * M_PI;
|
int count = static_cast<int>(std::round(*angle_opt / (2 * M_PI)));
|
||||||
} else if (*angle_opt < -M_PI) {
|
*angle_opt -= static_cast<float>(count * 2 * M_PI);
|
||||||
*angle_opt += 2 * M_PI;
|
|
||||||
}
|
}
|
||||||
// do not store zero
|
// do not store zero
|
||||||
if (std::fabs(*angle_opt) < std::numeric_limits<float>::epsilon())
|
if (std::fabs(*angle_opt) < std::numeric_limits<float>::epsilon())
|
||||||
@ -1341,6 +1342,19 @@ void GLGizmoEmboss::draw_advanced()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SHOW_FONT_FILE_PROPERTY
|
||||||
|
ImGui::SameLine();
|
||||||
|
std::string ff_property =
|
||||||
|
"ascent=" + std::to_string(font_file->ascent) +
|
||||||
|
", descent=" + std::to_string(font_file->descent) +
|
||||||
|
", lineGap=" + std::to_string(font_file->linegap) +
|
||||||
|
", unitPerEm=" + std::to_string(font_file->unit_per_em) +
|
||||||
|
", cache(" + std::to_string(font_file->cache.size()) + " glyphs)";
|
||||||
|
if (font_file->count > 1) ff_property +=
|
||||||
|
", collect=" + std::to_string(font_file->index + 1) + "/" + std::to_string(font_file->count);
|
||||||
|
m_imgui->text_colored(ImGuiWrapper::COL_GREY_DARK, ff_property);
|
||||||
|
#endif // SHOW_FONT_FILE_PROPERTY
|
||||||
|
|
||||||
FontProp &font_prop = m_font_manager.get_font_item().prop;
|
FontProp &font_prop = m_font_manager.get_font_item().prop;
|
||||||
bool exist_change = false;
|
bool exist_change = false;
|
||||||
|
|
||||||
|
@ -242,7 +242,7 @@ TriangleMesh EmbossCreateJob::create_mesh(const char * text,
|
|||||||
if (shapes.empty()) return {};
|
if (shapes.empty()) return {};
|
||||||
if (ctl.was_canceled()) return {};
|
if (ctl.was_canceled()) return {};
|
||||||
|
|
||||||
float scale = font_prop.size_in_mm / font.ascent;
|
float scale = font_prop.size_in_mm / font.unit_per_em;
|
||||||
float depth = font_prop.emboss / scale;
|
float depth = font_prop.emboss / scale;
|
||||||
auto projectZ = std::make_unique<Emboss::ProjectZ>(depth);
|
auto projectZ = std::make_unique<Emboss::ProjectZ>(depth);
|
||||||
Emboss::ProjectScale project(std::move(projectZ), scale);
|
Emboss::ProjectScale project(std::move(projectZ), scale);
|
||||||
|
@ -437,7 +437,7 @@ void FontManager::init_style_images(int max_width) {
|
|||||||
// dot per inch for monitor
|
// dot per inch for monitor
|
||||||
int dpi = get_dpi_for_window(mf);
|
int dpi = get_dpi_for_window(mf);
|
||||||
double ppm = dpi / 25.4; // pixel per milimeter
|
double ppm = dpi / 25.4; // pixel per milimeter
|
||||||
double scale = font_prop.size_in_mm / font_file->ascent * Emboss::SHAPE_SCALE * ppm;
|
double scale = font_prop.size_in_mm / font_file->unit_per_em * Emboss::SHAPE_SCALE * ppm;
|
||||||
scales[index] = scale;
|
scales[index] = scale;
|
||||||
|
|
||||||
//double scale = font_prop.size_in_mm * SCALING_FACTOR;
|
//double scale = font_prop.size_in_mm * SCALING_FACTOR;
|
||||||
@ -494,9 +494,6 @@ void FontManager::init_style_images(int max_width) {
|
|||||||
sla::Resolution resolution(image.tex_size.x, image.tex_size.y);
|
sla::Resolution resolution(image.tex_size.x, image.tex_size.y);
|
||||||
|
|
||||||
size_t index = &item - &m_font_list.front();
|
size_t index = &item - &m_font_list.front();
|
||||||
//double scale = item.font_item.prop.size_in_mm / SCALING_FACTOR / item.font_file->ascent;
|
|
||||||
//double scale = item.font_item.prop.size_in_mm;
|
|
||||||
//sla::PixelDim dim(1 / scale, 1 / scale);
|
|
||||||
double pixel_dim = SCALING_FACTOR / scales[index];
|
double pixel_dim = SCALING_FACTOR / scales[index];
|
||||||
sla::PixelDim dim(pixel_dim, pixel_dim);
|
sla::PixelDim dim(pixel_dim, pixel_dim);
|
||||||
double gamma = 1.;
|
double gamma = 1.;
|
||||||
@ -567,7 +564,9 @@ ImFont * FontManager::load_imgui_font(size_t index, const std::string &text)
|
|||||||
|
|
||||||
const FontProp &font_prop = item.font_item.prop;
|
const FontProp &font_prop = item.font_item.prop;
|
||||||
|
|
||||||
float c1 = (font_file.ascent - font_file.descent + font_file.linegap) / (float)font_file.ascent;
|
// coeficient for convert line height to font size
|
||||||
|
float c1 = (font_file.ascent - font_file.descent + font_file.linegap) / (float) font_file.unit_per_em;
|
||||||
|
|
||||||
// The point size is defined as 1/72 of the Anglo-Saxon inch (25.4 mm):
|
// The point size is defined as 1/72 of the Anglo-Saxon inch (25.4 mm):
|
||||||
// it is approximately 0.0139 inch or 352.8 um.
|
// it is approximately 0.0139 inch or 352.8 um.
|
||||||
// But it is too small, so I decide use point size as mm for emboss
|
// But it is too small, so I decide use point size as mm for emboss
|
||||||
@ -581,11 +580,11 @@ ImFont * FontManager::load_imgui_font(size_t index, const std::string &text)
|
|||||||
// TODO: start using merge mode
|
// TODO: start using merge mode
|
||||||
//font_config.MergeMode = true;
|
//font_config.MergeMode = true;
|
||||||
if (font_prop.char_gap.has_value()) {
|
if (font_prop.char_gap.has_value()) {
|
||||||
float coef = font_size / (double) font_file.ascent;
|
float coef = font_size / (double) font_file.unit_per_em;
|
||||||
font_config.GlyphExtraSpacing.x = coef * (*font_prop.char_gap);
|
font_config.GlyphExtraSpacing.x = coef * (*font_prop.char_gap);
|
||||||
}
|
}
|
||||||
if (font_prop.line_gap.has_value()) {
|
if (font_prop.line_gap.has_value()) {
|
||||||
float coef = font_size / (double) font_file.ascent;
|
float coef = font_size / (double) font_file.unit_per_em;
|
||||||
font_config.GlyphExtraSpacing.y = coef * (*font_prop.line_gap);
|
font_config.GlyphExtraSpacing.y = coef * (*font_prop.line_gap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user