All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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 - 2024 Weber Informatics LLC | Privacy Policy