Rigorously treat font scale factors.

The old values were chosen without a good understanding of font
metrics.
pull/4/head
whitequark 2016-04-12 13:38:09 +00:00
parent e7057418df
commit 0f304b4c64
4 changed files with 21 additions and 11 deletions

View File

@ -83,7 +83,7 @@ void Constraint::DoLabel(Vector ref, Vector *labelPos, Vector gr, Vector gu) {
std::string s = Label(); std::string s = Label();
double swidth = ssglStrWidth(s, th), double swidth = ssglStrWidth(s, th),
sheight = ssglStrHeight(th); sheight = ssglStrCapHeight(th);
// By default, the reference is from the center; but the style could // By default, the reference is from the center; but the style could
// specify otherwise if one is present, and it could also specify a // specify otherwise if one is present, and it could also specify a
@ -157,7 +157,7 @@ int Constraint::DoLineTrimmedAgainstBox(Vector ref, Vector a, Vector b) {
double pixels = 1.0 / SS.GW.scale; double pixels = 1.0 / SS.GW.scale;
std::string s = Label(); std::string s = Label();
double swidth = ssglStrWidth(s, th) + 4*pixels, double swidth = ssglStrWidth(s, th) + 4*pixels,
sheight = ssglStrHeight(th) + 8*pixels; sheight = ssglStrCapHeight(th) + 8*pixels;
struct { struct {
Vector n; Vector n;
@ -371,7 +371,7 @@ void Constraint::DoArcForAngle(Vector a0, Vector da, Vector b0, Vector db,
*ref = (*ref).ScaledBy(0.5).Plus(disp.offset); *ref = (*ref).ScaledBy(0.5).Plus(disp.offset);
gu = gu.WithMagnitude(1); gu = gu.WithMagnitude(1);
Vector trans = Vector trans =
(*ref).Plus(gu.ScaledBy(-1.5*ssglStrHeight(Style::DefaultTextHeight()))); (*ref).Plus(gu.ScaledBy(-1.5*ssglStrCapHeight(Style::DefaultTextHeight())));
ssglWriteTextRefCenter("angle between skew lines", Style::DefaultTextHeight(), ssglWriteTextRefCenter("angle between skew lines", Style::DefaultTextHeight(),
trans, gr, gu, LineCallback, this); trans, gr, gu, LineCallback, this);
} }

View File

@ -679,7 +679,7 @@ void Entity::DrawOrGetDistance(void) {
ssglWriteText(str, th, mm2, u, v, NULL, NULL); ssglWriteText(str, th, mm2, u, v, NULL, NULL);
} else { } else {
Vector pos = mm2.Plus(u.ScaledBy(ssglStrWidth(str, th)/2)).Plus( Vector pos = mm2.Plus(u.ScaledBy(ssglStrWidth(str, th)/2)).Plus(
v.ScaledBy(ssglStrHeight(th)/2)); v.ScaledBy(ssglStrCapHeight(th)/2));
Point2d pp = SS.GW.ProjectPoint(pos); Point2d pp = SS.GW.ProjectPoint(pos);
dogd.dmin = min(dogd.dmin, pp.DistanceTo(dogd.mp) - 10); dogd.dmin = min(dogd.dmin, pp.DistanceTo(dogd.mp) - 10);
// If a line lies in a plane, then select the line, not // If a line lies in a plane, then select the line, not

View File

@ -36,7 +36,21 @@ static const VectorGlyph &GetVectorGlyph(char32_t chr) {
return GetVectorGlyph(0xfffd); // replacement character return GetVectorGlyph(0xfffd); // replacement character
} }
// The internal font metrics are as follows:
// * Cap height (measured on "A"): 87
// * Ascender (measured on "h"): 87
// * Descender (measured on "p"): -30
// * Font size (ascender+descender): 126
// Internally and in the UI, the vector font is sized using cap height.
#define FONT_SCALE(h) ((h)/87.0) #define FONT_SCALE(h) ((h)/87.0)
double ssglStrCapHeight(double h)
{
return /*cap height*/87.0 * FONT_SCALE(h) / SS.GW.scale;
}
double ssglStrFontSize(double h)
{
return /*font size*/126.0 * FONT_SCALE(h) / SS.GW.scale;
}
double ssglStrWidth(const std::string &str, double h) double ssglStrWidth(const std::string &str, double h)
{ {
int width = 0; int width = 0;
@ -51,11 +65,6 @@ double ssglStrWidth(const std::string &str, double h)
} }
return width * FONT_SCALE(h) / SS.GW.scale; return width * FONT_SCALE(h) / SS.GW.scale;
} }
double ssglStrHeight(double h)
{
// The characters have height ~90, as they appear in the table.
return 90.0 * FONT_SCALE(h) / SS.GW.scale;
}
void ssglWriteTextRefCenter(const std::string &str, double h, Vector t, Vector u, Vector v, void ssglWriteTextRefCenter(const std::string &str, double h, Vector t, Vector u, Vector v,
ssglLineFn *fn, void *fndata) ssglLineFn *fn, void *fndata)
{ {
@ -63,7 +72,7 @@ void ssglWriteTextRefCenter(const std::string &str, double h, Vector t, Vector u
v = v.WithMagnitude(1); v = v.WithMagnitude(1);
double scale = FONT_SCALE(h)/SS.GW.scale; double scale = FONT_SCALE(h)/SS.GW.scale;
double fh = ssglStrHeight(h); double fh = ssglStrCapHeight(h);
double fw = ssglStrWidth(str, h); double fw = ssglStrWidth(str, h);
t = t.Plus(u.ScaledBy(-fw/2)); t = t.Plus(u.ScaledBy(-fw/2));

View File

@ -355,8 +355,9 @@ void ssglWriteText(const std::string &str, double h, Vector t, Vector u, Vector
ssglLineFn *fn, void *fndata); ssglLineFn *fn, void *fndata);
void ssglWriteTextRefCenter(const std::string &str, double h, Vector t, Vector u, Vector v, void ssglWriteTextRefCenter(const std::string &str, double h, Vector t, Vector u, Vector v,
ssglLineFn *fn, void *fndata); ssglLineFn *fn, void *fndata);
double ssglStrCapHeight(double h);
double ssglStrFontSize(double h);
double ssglStrWidth(const std::string &str, double h); double ssglStrWidth(const std::string &str, double h);
double ssglStrHeight(double h);
void ssglLockColorTo(RgbaColor rgb); void ssglLockColorTo(RgbaColor rgb);
void ssglStippledLine(Vector a, Vector b, double width, void ssglStippledLine(Vector a, Vector b, double width,
int stippleType, double stippleScale, bool maybeFat); int stippleType, double stippleScale, bool maybeFat);