summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/font/dofont.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/font/dofont.c')
-rw-r--r--Build/source/texk/web2c/luatexdir/font/dofont.c275
1 files changed, 139 insertions, 136 deletions
diff --git a/Build/source/texk/web2c/luatexdir/font/dofont.c b/Build/source/texk/web2c/luatexdir/font/dofont.c
index fbe44c29ba9..14d785b8a9f 100644
--- a/Build/source/texk/web2c/luatexdir/font/dofont.c
+++ b/Build/source/texk/web2c/luatexdir/font/dofont.c
@@ -1,183 +1,186 @@
-/*
-Copyright (c) 1996-2006 Taco Hoekwater <taco@luatex.org>
+/* dofont.c
+
+ Copyright 2006-2008 Taco Hoekwater <taco@luatex.org>
-This file is part of LuaTeX.
+ This file is part of LuaTeX.
-LuaTeX is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+ LuaTeX is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
-LuaTeX is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
+ LuaTeX is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ License for more details.
-You should have received a copy of the GNU General Public License
-along with LuaTeX; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-$Id: dofont.c 1013 2008-02-14 00:09:02Z oneiros $
-*/
+ You should have received a copy of the GNU General Public License along
+ with LuaTeX; if not, see <http://www.gnu.org/licenses/>. */
#include "ptexlib.h"
#include "luatex-api.h"
+static const char _svn_version[] =
+ "$Id: dofont.c 2086 2009-03-22 15:32:08Z oneiros $ $URL: http://scm.foundry.supelec.fr/svn/luatex/trunk/src/texk/web2c/luatexdir/font/dofont.c $";
+
#define TIMERS 0
#if TIMERS
-#include <sys/time.h>
+# include <sys/time.h>
#endif
/* a bit more interfacing is needed for proper error reporting */
-static char *
-font_error_message (pointer u, char *nom, scaled s) {
- char *str = xmalloc(256);
- char *c = makecstring(zget_cs_text(u));
- char *extra = "metric data not found or bad";
- if (s>=0 ) {
- snprintf(str,255,"Font \\%s=%s at %gpt not loadable: %s", c, nom, (double)s/65536, extra);
- } else if (s!=-1000) {
- snprintf(str,255,"Font \\%s=%s scaled %d not loadable: %s", c, nom, (int)(-s), extra);
- } else {
- snprintf(str,255,"Font \\%s=%s not loadable: %s", c, nom, extra);
- }
- return str;
+static char *font_error_message(pointer u, char *nom, scaled s)
+{
+ char *str = xmalloc(256);
+ char *c = makecstring(zget_cs_text(u));
+ char *extra = "metric data not found or bad";
+ if (s >= 0) {
+ snprintf(str, 255, "Font \\%s=%s at %gpt not loadable: %s", c, nom,
+ (double) s / 65536, extra);
+ } else if (s != -1000) {
+ snprintf(str, 255, "Font \\%s=%s scaled %d not loadable: %s", c, nom,
+ (int) (-s), extra);
+ } else {
+ snprintf(str, 255, "Font \\%s=%s not loadable: %s", c, nom, extra);
+ }
+ return str;
}
static int
-do_define_font (integer f, char *cnom, char *caire, scaled s, integer natural_dir) {
+do_define_font(integer f, char *cnom, char *caire, scaled s,
+ integer natural_dir)
+{
- boolean res; /* was the callback successful? */
- integer callback_id;
- char *cnam;
+ boolean res; /* was the callback successful? */
+ integer callback_id;
+ char *cnam;
#if TIMERS
struct timeval tva;
struct timeval tvb;
double tvdiff;
#endif
- int r;
- res = 0;
-
- callback_id=callback_defined(define_font_callback);
- if (callback_id>0) {
- if (caire == NULL || strlen(caire)==0) {
- cnam = xstrdup(cnom);
- } else {
- cnam = xmalloc(strlen(cnom)+strlen(caire)+2);
- sprintf(cnam,"%s/%s",caire,cnom);
- }
+ int r;
+ res = 0;
+
+ callback_id = callback_defined(define_font_callback);
+ if (callback_id > 0) {
+ if (caire == NULL || strlen(caire) == 0) {
+ cnam = xstrdup(cnom);
+ } else {
+ cnam = xmalloc(strlen(cnom) + strlen(caire) + 2);
+ sprintf(cnam, "%s/%s", caire, cnom);
+ }
#if TIMERS
- gettimeofday(&tva,NULL);
+ gettimeofday(&tva, NULL);
#endif
- callback_id = run_and_save_callback(callback_id,"Sdd->",cnam,s,f);
+ callback_id = run_and_save_callback(callback_id, "Sdd->", cnam, s, f);
#if TIMERS
- gettimeofday(&tvb,NULL);
- tvdiff = tvb.tv_sec*1000000.0;
- tvdiff += (double)tvb.tv_usec;
- tvdiff -= (tva.tv_sec*1000000.0);
- tvdiff -= (double)tva.tv_usec;
- tvdiff /= 1000000;
- fprintf(stdout,"\ncallback('define_font',%s,%i): %f seconds\n", cnam,f,tvdiff);
+ gettimeofday(&tvb, NULL);
+ tvdiff = tvb.tv_sec * 1000000.0;
+ tvdiff += (double) tvb.tv_usec;
+ tvdiff -= (tva.tv_sec * 1000000.0);
+ tvdiff -= (double) tva.tv_usec;
+ tvdiff /= 1000000;
+ fprintf(stdout, "\ncallback('define_font',%s,%i): %f seconds\n", cnam,
+ f, tvdiff);
#endif
- free(cnam);
- if (callback_id>0) { /* success */
- luaL_checkstack(Luas[0],1,"out of stack space");
- lua_rawgeti(Luas[0],LUA_REGISTRYINDEX, callback_id);
- if (lua_istable(Luas[0],-1)) {
+ free(cnam);
+ if (callback_id > 0) { /* success */
+ luaL_checkstack(Luas, 1, "out of stack space");
+ lua_rawgeti(Luas, LUA_REGISTRYINDEX, callback_id);
+ if (lua_istable(Luas, -1)) {
#if TIMERS
- gettimeofday(&tva,NULL);
+ gettimeofday(&tva, NULL);
#endif
- res = font_from_lua(Luas[0],f);
- destroy_saved_callback (callback_id);
+ res = font_from_lua(Luas, f);
+ destroy_saved_callback(callback_id);
#if TIMERS
- gettimeofday(&tvb,NULL);
- tvdiff = tvb.tv_sec*1000000.0;
- tvdiff += (double)tvb.tv_usec;
- tvdiff -= (tva.tv_sec*1000000.0);
- tvdiff -= (double)tva.tv_usec;
- tvdiff /= 1000000;
- fprintf(stdout,"font_from_lua(%s,%i): %f seconds\n", font_name(f),f,tvdiff);
+ gettimeofday(&tvb, NULL);
+ tvdiff = tvb.tv_sec * 1000000.0;
+ tvdiff += (double) tvb.tv_usec;
+ tvdiff -= (tva.tv_sec * 1000000.0);
+ tvdiff -= (double) tva.tv_usec;
+ tvdiff /= 1000000;
+ fprintf(stdout, "font_from_lua(%s,%i): %f seconds\n",
+ font_name(f), f, tvdiff);
#endif
- lua_pop(Luas[0],1);
- } else if (lua_isnumber(Luas[0],-1)) {
- r = lua_tonumber(Luas[0],-1);
- destroy_saved_callback (callback_id);
- delete_font(f);
- lua_pop(Luas[0],1);
- return r;
- } else {
- lua_pop(Luas[0],1);
- delete_font(f);
- return 0;
- }
+ /* lua_pop(Luas, 1); *//* done by font_from_lua */
+ } else if (lua_isnumber(Luas, -1)) {
+ r = lua_tonumber(Luas, -1);
+ destroy_saved_callback(callback_id);
+ delete_font(f);
+ lua_pop(Luas, 1);
+ return r;
+ } else {
+ lua_pop(Luas, 1);
+ delete_font(f);
+ return 0;
+ }
+ }
+ } else {
+ res = read_tfm_info(f, cnom, caire, s);
+ if (res) {
+ set_hyphen_char(f, get_default_hyphen_char());
+ set_skew_char(f, get_default_skew_char());
+ }
}
- } else {
- res = read_tfm_info(f,cnom,caire,s);
if (res) {
- set_hyphen_char(f,get_default_hyphen_char());
- set_skew_char(f,get_default_skew_char());
+ if (font_type(f) != virtual_font_type) { /* implies lua */
+ do_vf(f);
+ set_font_natural_dir(f, natural_dir);
+ }
+ return f;
+ } else {
+ delete_font(f);
+ return 0;
}
- }
- if (res) {
- do_vf(f);
- set_font_natural_dir(f,natural_dir);
- return f;
- } else {
- delete_font(f);
- return 0;
- }
}
-int
-read_font_info(pointer u, strnumber nom, strnumber aire, scaled s,
- integer natural_dir) {
- integer f;
- char *cnom, *caire = NULL;
- char *msg;
- cnom = xstrdup(makecstring(nom));
- if (aire != 0)
- caire = xstrdup(makecstring(aire));
-
- f = new_font();
- if ((f = do_define_font(f, cnom,caire,s,natural_dir))) {
- if (caire != NULL) free(caire);
- free(cnom);
- return f;
- } else {
- char *help[] = {"I wasn't able to read the size data for this font,",
- "so I will ignore the font specification.",
- "[Wizards can fix TFM files using TFtoPL/PLtoTF.]",
- "You might try inserting a different font spec;",
- "e.g., type `I\font<same font id>=<substitute font name>'.",
- NULL } ;
- if(!get_suppress_fontnotfound_error()) {
- msg = font_error_message(u, cnom, s);
- tex_error(msg,help);
- free(msg);
- }
- if (caire != NULL) free(caire);
- free(cnom);
- return 0;
- }
+int read_font_info(pointer u, strnumber nom, scaled s, integer natural_dir)
+{
+ integer f;
+ char *cnom;
+ char *msg;
+ cnom = xstrdup(makecstring(nom));
+
+ f = new_font();
+ if ((f = do_define_font(f, cnom, NULL, s, natural_dir))) {
+ free(cnom);
+ return f;
+ } else {
+ char *help[] = { "I wasn't able to read the size data for this font,",
+ "so I will ignore the font specification.",
+ "[Wizards can fix TFM files using TFtoPL/PLtoTF.]",
+ "You might try inserting a different font spec;",
+ "e.g., type `I\font<same font id>=<substitute font name>'.",
+ NULL
+ };
+ if (!get_suppress_fontnotfound_error()) {
+ msg = font_error_message(u, cnom, s);
+ tex_error(msg, help);
+ free(msg);
+ }
+ free(cnom);
+ return 0;
+ }
}
/* TODO This function is a placeholder. There can easily appears holes in
the |font_tables| array, and we could attempt to reuse those
*/
-int
-find_font_id (char *nom, char *aire, scaled s) {
- integer f;
- f = new_font();
- if ((f = do_define_font(f, nom, aire,s,-1))) {
- return f;
- } else {
- return 0;
- }
+int find_font_id(char *nom, char *aire, scaled s)
+{
+ integer f;
+ f = new_font();
+ if ((f = do_define_font(f, nom, aire, s, -1))) {
+ return f;
+ } else {
+ return 0;
+ }
}
-