Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
org.jpedal.fonts.tt.BaseTTGlyph Maven / Gradle / Ivy
/*
* ===========================================
* Java Pdf Extraction Decoding Access Library
* ===========================================
*
* Project Info: http://www.idrsolutions.com
* Help section for developers at http://www.idrsolutions.com/support/
*
* (C) Copyright 1997-2016 IDRsolutions and Contributors.
*
* This file is part of JPedal/JPDF2HTML5
*
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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 Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* ---------------
* BaseTTGlyph.java
* ---------------
*/
package org.jpedal.fonts.tt;
import java.util.HashSet;
import org.jpedal.fonts.glyph.PdfGlyph;
import org.jpedal.fonts.tt.hinting.TTVM;
import org.jpedal.utils.LogWriter;
import org.jpedal.utils.repositories.*;
public abstract class BaseTTGlyph extends PdfGlyph {
boolean hasHintingApplied;
/**paths for the letter, marked as transient so it wont be serialized */
transient Vector_Path paths=new Vector_Path(10);
protected boolean ttHintingRequired;
public static boolean useHinting = true;
protected boolean containsBrokenGlyfData;
protected short compMinX, compMinY, compMaxX, compMaxY;
protected short minX,minY,maxX,maxY;
protected int[] scaledX, scaledY;
protected int BPoint1, BPoint2;
protected final Vector_Int xtranslateValues=new Vector_Int(5);
protected final Vector_Int ytranslateValues=new Vector_Int(5);
protected final short leftSideBearing;
protected final Vector_Double xscaleValues=new Vector_Double(5);
protected final Vector_Double yscaleValues=new Vector_Double(5);
protected final Vector_Double scale01Values=new Vector_Double(5);
protected final Vector_Double scale10Values=new Vector_Double(5);
protected double xscale=1,yscale=1,scale01,scale10;
protected int[] instructions;
protected int xtranslate,ytranslate;
protected int currentInstructionDepth=Integer.MAX_VALUE;
protected final Vector_Object glyfX=new Vector_Object(5);
protected final Vector_Object glyfY=new Vector_Object(5);
protected final Vector_Object curves=new Vector_Object(5);
protected final Vector_Object contours=new Vector_Object(5);
protected final Vector_Int endPtIndices=new Vector_Int(5);
protected int contourCount;
protected float unitsPerEm=64;
public static boolean debug;
//used to track which glyf for complex glyph
protected int compCount=1;
protected boolean isComposite;
protected double pixelSize;
/**Variables used by the constructor**/
private static final HashSet testedFonts = new HashSet();
int BP1x=-1,BP2x=-1,BP1y=-1,BP2y=-1;
//Track translations for recursion
int existingXTranslate;
int existingYTranslate;
int depth;
static {
final String value = System.getProperty("org.jpedal.useTTFontHinting");
if (value != null) {
useHinting = value.equalsIgnoreCase("true");
}
}
public static boolean redecodePage;
boolean isHinted;
private TTVM vm;
private String baseFontName;
/**
* Hinted constructor
*/
public BaseTTGlyph(final Glyf currentGlyf, final FontFile2 glyfTable, final Hmtx currentHmtx, final int idx, final float unitsPerEm, final TTVM vm){
setGlyphNumber(idx+1);
isHinted=true;
//this.glyfName=glyfName;
//this.idx=idx;
this.leftSideBearing =currentHmtx.getLeftSideBearing(idx);
//this.advanceWidth = currentHmtx.getAdvanceWidth(idx);
this.unitsPerEm=unitsPerEm;
final int p=currentGlyf.getCharString(idx);
glyfTable.setPointer(p);
if(glyfTable.getBytesLeft()>4){
readGlyph(currentGlyf,glyfTable);
this.vm=vm;
//if(!useFX)
createGlyph(isHinted);
}
}
/**
* Unhinted constructor
*/
public BaseTTGlyph(final Glyf currentGlyf, final FontFile2 glyfTable, final Hmtx currentHmtx, final int idx, final float unitsPerEm, final String baseFontName){
//debug=idx==2246;
setGlyphNumber(idx+1);
// this.glyfName=glyfName;
//this.idx=idx;
this.leftSideBearing =currentHmtx.getLeftSideBearing(idx);
//this.advanceWidth = currentHmtx.getAdvanceWidth(idx);
this.unitsPerEm=unitsPerEm;
this.baseFontName=baseFontName;
final int p=currentGlyf.getCharString(idx);
glyfTable.setPointer(p);
if(glyfTable.getBytesLeft()>4){
readGlyph(currentGlyf,glyfTable);
//if(!useFX)
createGlyph(false);
}
}
void createGlyph(final boolean isHinted){
if(isHinted){
createHintedGlyph();
}else{
createUnhintedGlyph();
}
}
void createUnhintedGlyph() {
/**create glyphs the first time*/
for(int i=0;imaxX || minY>maxY){
return;
}
if(debug){
System.out.println("------------------------------------------------------------");
System.out.println("min="+minX+ ' ' +minY+" max="+maxX+' '+maxY+" contourCount="+contourCount);
}
if(contourCount!=65535){
if(contourCount>0){
readSimpleGlyph(currentFontFile);
}
}else{
compMinX=minX;
compMinY=minY;
compMaxX=maxX;
compMaxY=maxY;
if(debug) {
System.out.println("XXmain=" + minX + ' ' + minY + ' ' + maxX + ' ' + maxY);
}
readComplexGlyph(currentGlyf,currentFontFile);
}
}
/**
* @return Whether the font requires hinting in order to correctly arrange its subglyphs
*/
public boolean isTTHintingRequired(){
return ttHintingRequired;
}
public void createPaths(final int[] pX, final int[] pY, final boolean[] onCurve, final boolean[] endOfContour, final int endIndex) {
throw new UnsupportedOperationException("createPaths Not supported yet.");
}
void clearPaths() {
throw new UnsupportedOperationException("clearPaths Not supported yet.");
}
public int getFontBB(final int type) {
if(isComposite){
switch (type) {
case PdfGlyph.FontBB_X:
return compMinX;
case PdfGlyph.FontBB_Y:
return compMinY;
case PdfGlyph.FontBB_WIDTH:
return compMaxX;
case PdfGlyph.FontBB_HEIGHT:
return compMaxY;
default:
return 0;
}
}else{
switch (type) {
case PdfGlyph.FontBB_X:
return minX;
case PdfGlyph.FontBB_Y:
return minY;
case PdfGlyph.FontBB_WIDTH:
return maxX;
case PdfGlyph.FontBB_HEIGHT:
return maxY;
default:
return 0;
}
}
}
//use by TT to handle broken TT fonts
@Override
public boolean containsBrokenData() {
return this.containsBrokenGlyfData;
}
void createHintedGlyph() {
/**create glyphs the first time*/
for(int i=0;i© 2015 - 2025 Weber Informatics LLC | Privacy Policy