summaryrefslogtreecommitdiff
path: root/Build/source
diff options
context:
space:
mode:
authorKhaled Hosny <khaledhosny@eglug.org>2013-04-04 16:15:32 +0000
committerKhaled Hosny <khaledhosny@eglug.org>2013-04-04 16:15:32 +0000
commit7ae4f3a4bad94230ffba68bceb27b269b8fa04c4 (patch)
tree01b22a668189f35814046e5d67ee467d3d390f81 /Build/source
parent5a7a4e71861fd6c6cc2d03100a0daf7f1c4161de (diff)
XeTeX updates
git-svn-id: svn://tug.org/texlive/trunk@29639 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source')
-rw-r--r--Build/source/texk/web2c/xetexdir/XeTeXFontInst.cpp45
-rw-r--r--Build/source/texk/web2c/xetexdir/XeTeXLayoutInterface.cpp33
2 files changed, 46 insertions, 32 deletions
diff --git a/Build/source/texk/web2c/xetexdir/XeTeXFontInst.cpp b/Build/source/texk/web2c/xetexdir/XeTeXFontInst.cpp
index 676759a0cc4..fd13178e858 100644
--- a/Build/source/texk/web2c/xetexdir/XeTeXFontInst.cpp
+++ b/Build/source/texk/web2c/xetexdir/XeTeXFontInst.cpp
@@ -48,9 +48,6 @@ authorization from the copyright holders.
#include FT_ADVANCES_H
FT_Library gFreeTypeLibrary = 0;
-// FT_LOAD_NO_BITMAP is needed to work around:
-// http://lists.gnu.org/archive/html/freetype/2013-03/msg00009.html
-static int ftLoadFlags = FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP;
XeTeXFontInst::XeTeXFontInst(const char* pathname, int index, float pointSize, int &status)
: fPointSize(pointSize)
@@ -101,7 +98,7 @@ _get_glyph_advance(FT_Face face, FT_UInt gid, bool vertical)
{
FT_Error error;
FT_Fixed advance;
- int flags = ftLoadFlags;
+ int flags = FT_LOAD_NO_SCALE;
if (vertical)
flags |= FT_LOAD_VERTICAL_LAYOUT;
@@ -110,7 +107,7 @@ _get_glyph_advance(FT_Face face, FT_UInt gid, bool vertical)
if (error)
advance = 0;
else
- advance = advance >> 10;
+ advance = advance;
/* FreeType's vertical metrics grows downward */
if (vertical)
@@ -134,16 +131,26 @@ _get_glyph_v_advance(hb_font_t*, void *font_data, hb_codepoint_t gid, void*)
static hb_bool_t
_get_glyph_h_origin(hb_font_t*, void *font_data, hb_codepoint_t gid, hb_position_t *x, hb_position_t *y, void*)
{
+ // horizontal origin is (0, 0)
return true;
}
static hb_bool_t
_get_glyph_v_origin(hb_font_t*, void *font_data, hb_codepoint_t gid, hb_position_t *x, hb_position_t *y, void*)
{
+ // vertical origin is (0, 0) for now
+ return true;
+
+ // TODO
+ // Keep the code below for reference, for now we want to keep vertical
+ // origin at (0, 0) for compatibility with pre-0.9999.
+ // Reconsider this (e.g. using BASE table) when we get around overhauling
+ // the text directionality model and implementing real vertical typesetting.
+
FT_Face face = (FT_Face) font_data;
FT_Error error;
- error = FT_Load_Glyph (face, gid, ftLoadFlags);
+ error = FT_Load_Glyph (face, gid, FT_LOAD_NO_SCALE);
if (!error) {
*x = face->glyph->metrics.horiBearingX - face->glyph->metrics.vertBearingX;
*y = face->glyph->metrics.horiBearingY - (-face->glyph->metrics.vertBearingY);
@@ -181,7 +188,7 @@ _get_glyph_extents(hb_font_t*, void *font_data, hb_codepoint_t gid, hb_glyph_ext
FT_Face face = (FT_Face) font_data;
FT_Error error;
- error = FT_Load_Glyph (face, gid, ftLoadFlags);
+ error = FT_Load_Glyph (face, gid, FT_LOAD_NO_SCALE);
if (!error) {
extents->x_bearing = face->glyph->metrics.horiBearingX;
extents->y_bearing = face->glyph->metrics.horiBearingY;
@@ -199,7 +206,7 @@ _get_glyph_contour_point(hb_font_t*, void *font_data, hb_codepoint_t gid, unsign
FT_Error error;
bool ret = false;
- error = FT_Load_Glyph (face, gid, ftLoadFlags);
+ error = FT_Load_Glyph (face, gid, FT_LOAD_NO_SCALE);
if (!error) {
if (face->glyph->format == FT_GLYPH_FORMAT_OUTLINE) {
if (point_index < (unsigned int) face->glyph->outline.n_points) {
@@ -213,6 +220,19 @@ _get_glyph_contour_point(hb_font_t*, void *font_data, hb_codepoint_t gid, unsign
return ret;
}
+static hb_bool_t
+_get_glyph_name(hb_font_t *, void *font_data, hb_codepoint_t gid, char *name, unsigned int size, void *)
+{
+ FT_Face face = (FT_Face) font_data;
+ bool ret = false;
+
+ ret = !FT_Get_Glyph_Name (face, gid, name, size);
+ if (ret && (size && !*name))
+ ret = false;
+
+ return ret;
+}
+
static hb_font_funcs_t *
_get_font_funcs(void)
{
@@ -227,6 +247,7 @@ _get_font_funcs(void)
hb_font_funcs_set_glyph_v_kerning_func (funcs, _get_glyph_v_kerning, NULL, NULL);
hb_font_funcs_set_glyph_extents_func (funcs, _get_glyph_extents, NULL, NULL);
hb_font_funcs_set_glyph_contour_point_func (funcs, _get_glyph_contour_point, NULL, NULL);
+ hb_font_funcs_set_glyph_name_func (funcs, _get_glyph_name, NULL, NULL);
return funcs;
}
@@ -296,8 +317,6 @@ XeTeXFontInst::initialize(const char* pathname, int index, int &status)
delete[] afm;
}
- FT_Set_Char_Size(ftFace, fPointSize * 64, 0, 0, 0);
-
char buf[20];
if (index > 0)
sprintf(buf, ":%d", index);
@@ -328,9 +347,7 @@ XeTeXFontInst::initialize(const char* pathname, int index, int &status)
hb_face_destroy(hbFace);
hb_font_set_funcs(hbFont, _get_font_funcs(), ftFace, NULL);
- hb_font_set_scale(hbFont,
- ((uint64_t) ftFace->size->metrics.x_scale * (uint64_t) fUnitsPerEM) >> 16,
- ((uint64_t) ftFace->size->metrics.y_scale * (uint64_t) fUnitsPerEM) >> 16);
+ hb_font_set_scale(hbFont, fUnitsPerEM, fUnitsPerEM);
// We don’t want device tables adjustments
hb_font_set_ppem(hbFont, 0, 0);
@@ -414,7 +431,7 @@ XeTeXFontInst::getNumGlyphs() const
float
XeTeXFontInst::getGlyphWidth(GlyphID gid)
{
- return _get_glyph_advance(ftFace, gid, false) / 64.0;
+ return unitsToPoints(_get_glyph_advance(ftFace, gid, false));
}
void
diff --git a/Build/source/texk/web2c/xetexdir/XeTeXLayoutInterface.cpp b/Build/source/texk/web2c/xetexdir/XeTeXLayoutInterface.cpp
index 0788ee19d3e..c87b84416d1 100644
--- a/Build/source/texk/web2c/xetexdir/XeTeXLayoutInterface.cpp
+++ b/Build/source/texk/web2c/xetexdir/XeTeXLayoutInterface.cpp
@@ -708,7 +708,7 @@ layoutChars(XeTeXLayoutEngine engine, uint16_t chars[], int32_t offset, int32_t
printf ("shaper: %s\n", engine->shaper);
hb_buffer_serialize_flags_t flags = HB_BUFFER_SERIALIZE_FLAGS_DEFAULT;
- hb_buffer_serialize_format_t format = HB_BUFFER_SERIALIZE_FORMAT_TEXT;
+ hb_buffer_serialize_format_t format = HB_BUFFER_SERIALIZE_FORMAT_JSON;
hb_buffer_serialize_glyphs (engine->hbBuffer, 0, glyphCount, buf, sizeof(buf), &consumed, hbFont, format, flags);
if (consumed)
@@ -736,9 +736,9 @@ getGlyphAdvances(XeTeXLayoutEngine engine, float advances[])
for (int i = 0; i < glyphCount; i++) {
if (engine->font->getLayoutDirVertical())
- advances[i] = hbPositions[i].y_advance / 64.0;
+ advances[i] = engine->font->unitsToPoints(hbPositions[i].y_advance);
else
- advances[i] = hbPositions[i].x_advance / 64.0;
+ advances[i] = engine->font->unitsToPoints(hbPositions[i].x_advance);
}
}
@@ -752,26 +752,23 @@ getGlyphPositions(XeTeXLayoutEngine engine, float positions[])
float x = 0, y = 0;
if (engine->font->getLayoutDirVertical()) {
- /* XXX I'm not sure about the code below, but it seems to math the
- * behaviour of old code */
- x += hbPositions[0].y_offset / 64.0; /* hack to compensate offset of 1st glyph */
for (i = 0; i < glyphCount; i++) {
- positions[2*i] = -(x - (hbPositions[i].y_offset / 64.0)); /* negative is forwards */
- positions[2*i+1] = hbPositions[i].x_advance / 64.0;
- x += hbPositions[i].y_advance / 64.0;
+ positions[2*i] = - engine->font->unitsToPoints(x + hbPositions[i].y_offset); /* negative is forwards */
+ positions[2*i+1] = engine->font->unitsToPoints(y - hbPositions[i].x_offset);
+ x += hbPositions[i].y_advance;
+ y += hbPositions[i].x_advance;
}
- x -= hbPositions[glyphCount-1].y_offset / 64.0;
- positions[2*i] = -x;
- positions[2*i+1] = y;
+ positions[2*i] = - engine->font->unitsToPoints(x);
+ positions[2*i+1] = engine->font->unitsToPoints(y);
} else {
for (i = 0; i < glyphCount; i++) {
- positions[2*i] = x + hbPositions[i].x_offset / 64.0;
- positions[2*i+1] = -(y + hbPositions[i].y_offset / 64.0); /* negative is upwards */
- x += hbPositions[i].x_advance / 64.0;
- y += hbPositions[i].y_advance / 64.0;
+ positions[2*i] = engine->font->unitsToPoints(x + hbPositions[i].x_offset);
+ positions[2*i+1] = - engine->font->unitsToPoints(y + hbPositions[i].y_offset); /* negative is upwards */
+ x += hbPositions[i].x_advance;
+ y += hbPositions[i].y_advance;
}
- positions[2*i] = x;
- positions[2*i+1] = -y;
+ positions[2*i] = engine->font->unitsToPoints(x);
+ positions[2*i+1] = - engine->font->unitsToPoints(y);
}
if (engine->extend != 1.0 || engine->slant != 0.0)