created mirror
This commit is contained in:
122
Java/ScalableFont.java
Normal file
122
Java/ScalableFont.java
Normal file
@@ -0,0 +1,122 @@
|
||||
/*
|
||||
ScalableFont.java
|
||||
*
|
||||
* You may use and distribute under the terms of either the GNU Lesser
|
||||
* General Public License, either version 2 of the license or,
|
||||
* at your choice, any later version. Alternatively, you may use and
|
||||
* distribute under the terms of the XPL.
|
||||
*
|
||||
* See the LICENSE.lgpl and LICENSE.xpl files for the specific terms of
|
||||
* the licenses.
|
||||
*
|
||||
* This software 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 README
|
||||
* file for more details.
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* Written by Rauli Ruohonen
|
||||
*/
|
||||
|
||||
package org.gzigzag;
|
||||
import java.awt.*;
|
||||
import java.util.*;
|
||||
|
||||
/** A font object from which it is easy to obtain
|
||||
* instances and metrics scaled to requested multiplications.
|
||||
*/
|
||||
|
||||
public class ScalableFont {
|
||||
public static final String rcsid = "$Id: ScalableFont.java,v 1.3 2001/01/01 01:20:22 raulir Exp $";
|
||||
public static boolean dbg=false;
|
||||
private static final void p(String s) { if(dbg) ZZLogger.log(s); }
|
||||
|
||||
/** If set, font metrics will not be cached.
|
||||
*/
|
||||
public static boolean dontCache=false;
|
||||
|
||||
/** Used to get FontMetrics for a Font.
|
||||
* Should be set in e.g. main().
|
||||
*/
|
||||
public static Component fmComp;
|
||||
|
||||
/** The font and font metrics caches.
|
||||
*/
|
||||
private static Hashtable fCache=new Hashtable(),fmCache=new Hashtable();
|
||||
|
||||
/** The font family.
|
||||
*/
|
||||
private String fam;
|
||||
|
||||
/** The font style.
|
||||
*/
|
||||
private int st;
|
||||
|
||||
/** The point size when scaling factor is 1.
|
||||
*/
|
||||
private int defPt;
|
||||
|
||||
/** Constructor similar to Java's Font(f,s,p).
|
||||
* @param pointsize Point size when scaling factor is 1.
|
||||
*/
|
||||
public ScalableFont(String family,int style,int pointsize) {
|
||||
fam=family;
|
||||
st=style;
|
||||
defPt=pointsize;
|
||||
}
|
||||
|
||||
/** Get a scaled instance of the font.
|
||||
* @param scale Scaling factor is (scale/1000).
|
||||
* @return May not return null.
|
||||
*/
|
||||
public Font getFont(int scale) {
|
||||
int pt=scale2pt(scale);
|
||||
return getFontPtId(pt,fam+"/"+st+"/"+pt); // XXX I dislike the ID -tjl
|
||||
}
|
||||
|
||||
/** Get font metrics for a scaled instance of the font.
|
||||
* @param scale Scaling factor is (scale/1000).
|
||||
* @return May not return null.
|
||||
*/
|
||||
public FontMetrics getFontMetrics(int scale) {
|
||||
int pt=scale2pt(scale);
|
||||
String id=fam+"/"+st+"/"+pt;
|
||||
Font f=getFontPtId(pt,id);
|
||||
|
||||
if(dontCache) return fmComp.getFontMetrics(f);
|
||||
|
||||
FontMetrics fm=(FontMetrics)fmCache.get(id);
|
||||
|
||||
if(fm==null) {
|
||||
p("FontMetrics cache miss: "+id);
|
||||
fm=fmComp.getFontMetrics(f);
|
||||
fmCache.put(id,fm);
|
||||
}
|
||||
return fm;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static Font lastFont;
|
||||
private static String lastId="";
|
||||
|
||||
private synchronized Font getFontPtId(int pt,String id) {
|
||||
if(lastId.equals(id)) return lastFont;
|
||||
lastId=id;
|
||||
if(dontCache) lastFont=new Font(fam,st,pt);
|
||||
else {
|
||||
lastFont=(Font)fCache.get(id);
|
||||
if(lastFont==null) {
|
||||
p("Font cache miss: "+id);
|
||||
lastFont=new Font(fam,st,pt);
|
||||
fCache.put(id,lastFont);
|
||||
}
|
||||
}
|
||||
return lastFont;
|
||||
}
|
||||
private int scale2pt(int scale) {
|
||||
return (defPt*scale+500)/1000;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user