File:  [LON-CAPA] / loncom / html / adm / jsMath / plugins / spriteImageFonts.js
Revision 1.1: download - view: text, annotated - select for diffs
Wed May 17 22:23:23 2006 UTC (18 years, 1 month ago) by albertel
Branches: MAIN
CVS tags: version_2_5_X, version_2_5_2, version_2_5_1, version_2_5_0, version_2_4_X, version_2_4_99_0, version_2_4_2, version_2_4_1, version_2_4_0, version_2_3_X, version_2_3_99_0, version_2_3_2, version_2_3_1, version_2_3_0, version_2_2_X, version_2_2_99_1, version_2_2_99_0, version_2_2_2, version_2_2_1, version_2_2_0, version_2_1_X, version_2_1_99_3, version_2_1_99_2, version_2_1_99_1, version_2_1_99_0, HEAD
- adding new jsMath 3.3 files

    1: /*
    2:  *  plugins/spriteImageFonts.js
    3:  *  
    4:  *  Part of the jsMath package for mathematics on the web.
    5:  *
    6:  *  This file makes jsMath use single files for the image fonts
    7:  *  rather than individual images for each character.
    8:  *
    9:  *  ---------------------------------------------------------------------
   10:  *
   11:  *  Copyright 2006 by Davide P. Cervone
   12:  * 
   13:  *  Licensed under the Apache License, Version 2.0 (the "License");
   14:  *  you may not use this file except in compliance with the License.
   15:  *  You may obtain a copy of the License at
   16:  * 
   17:  *      http://www.apache.org/licenses/LICENSE-2.0
   18:  * 
   19:  *  Unless required by applicable law or agreed to in writing, software
   20:  *  distributed under the License is distributed on an "AS IS" BASIS,
   21:  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   22:  *  See the License for the specific language governing permissions and
   23:  *  limitations under the License.
   24:  */
   25: 
   26: if (!window.jsMath) {window.jsMath = {}}
   27: if (!jsMath.styles) {jsMath.styles = []}
   28: 
   29: jsMath.styles['.typeset .img']     = 'position:relative; display:inline-block; overflow:hidden; background-repeat: no-repeat';
   30: jsMath.styles['.typeset .img .xy'] = 'position:relative; left:0px; top:0px';
   31: 
   32: // for Mozilla
   33: jsMath.styles['.typeset .mimg']       = 'position:relative';
   34: jsMath.styles['.typeset .mimg .size'] = 'display:-moz-inline-box';
   35: jsMath.styles['.typeset .mimg .wh']   = 'position:absolute; left:0px; top:0px; overflow:hidden';
   36: jsMath.styles['.typeset .mimg .xy']   = 'position:relative; left:0px; top:0px';
   37: // for MSIE
   38: jsMath.styles['.typeset .mimg .h']    = 'position:relative; display:inline-block; width:0px';
   39: 
   40: /*
   41:  *  Replace the TeXIMG function with one that uses the sprite fonts
   42:  */
   43: if (!jsMath.Box) {jsMath.Box = {}}
   44:   jsMath.Box.TeXIMG = function (font,C,size) {
   45:     var c = jsMath.TeX[font][C];
   46:     if (c.img.reload && jsMath.Img[c.img.reload][font].loaded == 1)
   47:       {delete c.img.reload; c.img.size = null}
   48:     if (c.img.size != null && c.img.size == size &&
   49:         c.img.best != null && c.img.best == jsMath.Img.best) return;
   50:     var mustScale = (jsMath.Img.scale != 1);
   51:     var id = jsMath.Img.best + size - 4;
   52:     if (id < 0) {id = 0; mustScale = 1} else
   53:     if (id >= jsMath.Img.fonts.length) {id = jsMath.Img.fonts.length-1; mustScale = 1}
   54:     var imgFont = jsMath.Img[jsMath.Img.fonts[id]][font];
   55:     if (!imgFont.loaded && jsMath.Browser.waitForImages) {
   56:       // store information so several fonts can be loaded at once
   57:       jsMath.Img.mustLoad[jsMath.Img.mustLoad.length] = [font,jsMath.Img.fonts[id]];
   58:       imgFont.loaded = -1;
   59:     }
   60:     var img = imgFont[C];
   61:     var scale = 1/jsMath.Img.w[jsMath.Img.fonts[id]];
   62:     if (id != jsMath.Img.best + size - 4) {
   63:       if (c.w != null) {scale = c.w/img[0]} else {
   64:         scale *= jsMath.Img.fonts[size]/jsMath.Img.fonts[4]
   65:               *  jsMath.Img.fonts[jsMath.Img.best]/jsMath.Img.fonts[id];
   66:       }
   67:     }
   68: 
   69:     // get the metrics for the character glyph
   70:     var bScale = jsMath.Browser.imgScale;
   71:     if (img[3] == null) {img[3] = 0}
   72:     var w = (img[0]-img[3])*scale; var h = img[1]*scale; var d = -img[2]*scale;
   73:     var x = img[3]-imgFont.x[C%16]; var y = img[1]-img[2]-imgFont.y[Math.floor(C/16)];
   74:     var wh; var xy; var v;
   75:     var ladjust = ""; var resize = ""; var vadjust; var wadjust;
   76: 
   77:     if ((mustScale || jsMath.Controls.cookie.scaleImg) && !jsMath.Browser.operaImageFonts) {
   78:       w += 2/jsMath.em; h += 2/jsMath.em; d -= 1/jsMath.em; y += 1; x += 1; // try to adjust for rounding errors
   79:       resize = "width:"+jsMath.HTML.Em(imgFont.wh[0]*scale*bScale)+";";
   80:       wh = "width:"+jsMath.HTML.Em(w*bScale)+";height:"+jsMath.HTML.Em(h*bScale)+";";
   81:       xy = "left:"+jsMath.HTML.Em(x*scale*bScale)+";top:"+jsMath.HTML.Em(y*scale*bScale)+";";
   82:       vadjust = "vertical-align:"+jsMath.HTML.Em(d*bScale)+";";
   83:       v = jsMath.HTML.Em(h+d);
   84:       if (img[3]) {ladjust = "margin-left:"+jsMath.HTML.Em(-img[3]*scale*bScale)+";"}
   85:     } else {
   86:       if (jsMath.Browser.msieAlphaBug && jsMath.Controls.cookie.alpha) {
   87:         resize = "height:"+(imgFont.wh[1]*jsMath.Browser.imgScale)+"px;"
   88:                + "width:"+(imgFont.wh[0]*jsMath.Browser.imgScale)+"px;";
   89:       }
   90:       wh = "width:"+img[0]+"px; height:"+img[1]+"px;";
   91:       xy = "left:"+x+"px; top:"+y+"px;";
   92:       vadjust = "vertical-align:"+(-img[2])+"px;"; v = (img[1]-img[2])+"px";
   93:       if (img[3]) {ladjust = "margin-left:"+(-img[3])+"px;"}
   94:     }
   95: 
   96:     wadjust = (c.w == null || Math.abs(c.w-w) < .01)? "" : " margin-right:"+jsMath.HTML.Em(c.w-w)+';';
   97:     if (img[2] == 0 || jsMath.Browser.valignBug) {vadjust = ""}
   98: 
   99:     // get the image
  100:     var URL = jsMath.Img.URL(font,jsMath.Img.fonts[id],C); var IMG;
  101:     if (jsMath.Browser.msieAlphaBug && jsMath.Controls.cookie.alpha) {
  102:       IMG = '<span class="xy" style="'+xy+'">'
  103:           +   '<img src="'+jsMath.blank+'" style="' + resize
  104:           +      'filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='
  105:           +      "'" + URL + "', sizingMethod='scale'" + ');" />'
  106:           + '</span>';
  107:     } else {
  108:       IMG = '<img src="'+URL+'" class="xy" style="'+xy+resize+'" />';
  109:     }
  110:     if (imgFont.loaded == -1) {IMG = ""; c.img.reload = jsMath.Img.fonts[id]}
  111: 
  112:     // get the HTML for cropping the image
  113:     c.c = this.IMG(IMG,wh,vadjust,wadjust,ladjust,v,x,y,URL);
  114:     c.tclass = "normal";
  115:     c.img.bh = h+d; c.img.bd = -d;
  116:     c.img.size = size; c.img.best = jsMath.Img.best;
  117:   };
  118: 
  119:   /*
  120:    *  Default uses inline-box containing an image
  121:    */
  122:   jsMath.Box.IMG = function (IMG,wh,vadjust,wadjust,ladjust,v,x,y,URL) {
  123:     return '<span class="img" style="'+wh+vadjust+wadjust+ladjust+'">'
  124:              + IMG + '</span>' + jsMath.Browser.msieImgFontBBoxFix;
  125:   };
  126: 
  127:   /*
  128:    *  Opera bug in inline-block alignment forces use of background image
  129:    */
  130:   jsMath.Box.IMG_opera = function (IMG,wh,vadjust,wadjust,ladjust,v,x,y,URL) {
  131:     var html = '<span class="img" style="background-image: url('+URL+');'
  132:              +    wh + vadjust + 'background-position: '+x+'px '+y+'px"></span>';
  133:     if (wadjust || ladjust)
  134:       {html = '<span style="'+wadjust+ladjust+'">' + html + '</span>'}
  135:     return html;
  136:   };
  137: 
  138:   /*
  139:    *  Mozilla's -moz-inline-box has top aligned with baseline, so adjust
  140:    */
  141:   jsMath.Box.IMG_mozilla = function (IMG,wh,vadjust,wadjust,ladjust,v,x,y,URL) {
  142:     vadjust = "vertical-align:"+v+";";
  143:     var html = '<span class="mimg" style="'+vadjust+'">'
  144:              +   '<span class="size" style="'+wh+'"></span>'
  145:              +   '<span class="wh" style="'+wh+'">' + IMG + '</span>'
  146:              + '</span>';
  147:     if (wadjust || ladjust)
  148:       {html = '<span style="'+wadjust+ladjust+'">' + html + '</span>'}
  149:     return html;
  150:   };
  151: 
  152:   /*
  153:    *  MSIE screws up vadjust on inline-box elements, so use absolute
  154:    *  positioning and an extra span to set the width and height
  155:    */
  156:   jsMath.Box.IMG_msie = function (IMG,wh,vadjust,wadjust,ladjust,v,x,y,URL) {
  157:     var html = '<span class="mimg">'
  158:              +   '<span class="h" style="height:'+v+'">'
  159:              +     '<span class="wh" style="'+wh+'">' + IMG + '</span>'
  160:              +   '</span>'
  161:              +   '<span class="img" style="'+wh+vadjust+'"></span>'
  162:              + '</span>';
  163:     if (wadjust || ladjust) {
  164:       html = jsMath.Browser.msieSpaceFix
  165:            +    '<span style="'+wadjust+ladjust+'">' + html + '</span>';
  166:     }
  167:     return html;
  168:   };
  169: 
  170: if (!jsMath.Img) {jsMath.Img = {}}
  171: 
  172:   /*
  173:    *  Called by the exta-font definition files to add an image font
  174:    *  into the mix (save offset data and image size)
  175:    */
  176:   jsMath.Img.AddFont = function (size,def) {
  177:     if (!jsMath.Img[size]) {jsMath.Img[size] = {}};
  178:     for (var font in def) {
  179:       def[font].x = def[font][128]; def[font].y = def[font][129];
  180:       def[font].wh = def[font][130];
  181:       delete def[font][128]; delete def[font][129]; delete def[font][130];
  182:     }
  183:     jsMath.Add(jsMath.Img[size],def);
  184:   };
  185: 
  186:   /*
  187:    *  Get URL to directory for given font and size, based on the
  188:    *  user's alpha/plain setting
  189:    */
  190:   jsMath.Img.URL = function (name,size) {
  191:     if (size == null) {return this.root+name+'/font.js'}
  192:     var type = (jsMath.Controls.cookie.alpha) ? '/alpha/': '/plain/';
  193:     return this.root+name+type+size+'.png';
  194:   };
  195: 
  196:   /*
  197:    *  Laod the data for an image font
  198:    */
  199:   jsMath.Img.LoadFont = function (name) {
  200:     if (jsMath.browser == 'OmniWeb' && !jsMath.Browser.hasInlineBlock) {
  201:       jsMath.noImgFonts = 1;
  202:       jsMath.Font.Check();
  203:       return;
  204:     }
  205:     if (!this.loaded) this.Init();
  206:     jsMath.Setup.Script(this.URL(name));
  207:   };
  208:   
  209:   /*
  210:    *  Setup for print mode
  211:    */
  212:   jsMath.Img.Init = function () {
  213:     if ((jsMath.Controls.cookie.print || jsMath.Controls.cookie.stayhires) && !jsMath.Browser.operaImgFonts) {
  214:       jsMath.Controls.cookie.print = jsMath.Controls.cookie.stayhires;
  215:       this.factor *= 3;
  216:       if (!jsMath.Controls.isLocalCookie || !jsMath.Global.isLocal) {jsMath.Controls.SetCookie(0)}
  217:       if (jsMath.Browser.alphaPrintBug) {jsMath.Controls.cookie.alpha = 0}
  218:     }
  219:     this.loaded = 1;
  220:     jsMath.Browser.ImgFontInit();
  221:     jsMath.Img.root = jsMath.root + "fonts-sprite/";
  222:   };
  223: 
  224: 
  225: if (!jsMath.Browser) {jsMath.Browser = {}}
  226:   /*
  227:    *  These should be part of the regular browser
  228:    *  test functions
  229:    */
  230:   jsMath.Browser.ImgFontInit = function () {
  231:     this.msieImgFontBBoxFix = '';
  232:     if (jsMath.browser == 'Mozilla') {
  233:       jsMath.Box.IMG = jsMath.Box.IMG_mozilla;
  234:     } else if (jsMath.browser == 'Opera')   {
  235:       this.operaImageFonts = 1;
  236:       jsMath.Box.IMG = jsMath.Box.IMG_opera;
  237:     } else if (jsMath.browser == 'MSIE') {
  238:       if (navigator.platform == 'MacPPC') {
  239:         this.msieImgFontBBoxFix = '<span style="display:none">x</span>'
  240:       } else {
  241:         jsMath.Parser.prototype.oldTypeset = jsMath.Parser.prototype.Typeset;
  242:         jsMath.Parser.prototype.Typeset = jsMath.Parser.prototype.msieTypeset;
  243:         jsMath.Img.mustLoad = [];
  244:         this.msieImageFonts = 1;
  245:         jsMath.Controls.defaults.alpha = 0;
  246:         if (!jsMath.Controls.userSet.alpha) {jsMath.Controls.cookie.alpha = 0}
  247:         jsMath.Box.IMG = jsMath.Box.IMG_msie;
  248:       }
  249:     }
  250:     jsMath.version += "-sp1.0";
  251:   };
  252: 
  253: 
  254: if (!jsMath.Parser) {jsMath.Parser = {}}
  255: if (!jsMath.Parser.prototype) {jsMath.Parser.prototype = {}}
  256:   /*
  257:    *  Handle loading of image files needed for this equation
  258:    *  (avoids MSIE bug where it will request the image more
  259:    *  than once if it is used more than once before it is
  260:    *  loaded.)
  261:    */
  262:   jsMath.Parser.prototype.msieTypeset = function () {
  263:     var HTML = this.oldTypeset();
  264:     if (jsMath.Img.mustLoad.length > 0) {
  265:       for (var i = 0; i < jsMath.Img.mustLoad.length; i++) {
  266:         var IMG = jsMath.Img.URL(jsMath.Img.mustLoad[i][0],jsMath.Img.mustLoad[i][1]);
  267:         jsMath.Script.WaitForImage(IMG);
  268:         jsMath.Img[jsMath.Img.mustLoad[i][1]][jsMath.Img.mustLoad[i][0]].loaded = 1;
  269:       }
  270:       jsMath.Img.mustLoad = [];
  271:       jsMath.Translate.restart = 1;
  272:       throw "restart";
  273:     }
  274:     return HTML;
  275:   };
  276: 
  277: /*
  278:  *  Override the control panel calls in order to
  279:  *  disable scaling in Opera.
  280:  */
  281: if (!jsMath.Controls) {jsMath.Controls = {}}
  282:   /*
  283:    *  Add Opera calls to loading of control panel
  284:    */
  285:   jsMath.Controls.Panel = function () {
  286:     jsMath.Translate.Cancel();
  287:     if (this.loaded) {
  288:       this.Main();
  289:     } else {
  290:       jsMath.Script.delayedLoad(jsMath.root+"jsMath-controls.html");
  291:       jsMath.Script.Push(this,"OperaInit");
  292:     }
  293:   };
  294:   
  295:   /*
  296:    *  Disable hi-res fonts and image scaling in Opera
  297:    */
  298:   jsMath.Controls.OperaMain = function (init) {
  299:     if (!init) {this.OldMain()}
  300:     jsMath.Element("_resolution").disabled = true;
  301:   };
  302:   
  303:   jsMath.Controls.OperaOptions = function () {
  304:     this.OldOptions();
  305:     jsMath.Element("_scaleImg").disabled = true;
  306:     jsMath.Element("_scaleImgText").className = "disabled";
  307:   };
  308:   
  309:   jsMath.Controls.OperaInit = function () {
  310:     if (!jsMath.Browser.operaImageFonts) return;
  311:     this.OldMain = this.Main; this.Main = this.OperaMain;
  312:     this.OldOptions = this.Options; this.Options = this.OperaOptions;
  313:     this.OperaMain(1);
  314:   };

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>