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.TTGlyphFX 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-2015 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
*
* ---------------
* TTGlyphFX.java
* ---------------
*/
package org.jpedal.fonts.tt;
import javafx.scene.shape.*;
import org.jpedal.fonts.glyph.PdfGlyph;
import org.jpedal.fonts.tt.hinting.TTVM;
import java.io.Serializable;
import javafx.collections.ObservableList;
/**
*
*/
public class TTGlyphFX extends BaseTTGlyph implements PdfGlyph, Serializable{
/**
* Unhinted constructor
*/
public TTGlyphFX(final Glyf currentGlyf, final FontFile2 glyfTable, final Hmtx currentHmtx, final int idx, final float unitsPerEm, final String baseFontName){
super(currentGlyf, glyfTable, currentHmtx, idx, unitsPerEm, baseFontName);
}
/**
* Hinted constructor
*/
public TTGlyphFX(final Glyf currentGlyf, final FontFile2 glyfTable, final Hmtx currentHmtx, final int idx, final float unitsPerEm, final TTVM vm){
super(currentGlyf, glyfTable, currentHmtx, idx, unitsPerEm, vm);
}
@Override
void clearPaths() {
// pathsFX=null;
}
/**create the actual shape*/
@Override
public void createPaths(final int[] pX, final int[] pY, final boolean[] onCurve, final boolean[] endOfContour, final int endIndex){
//allow for bum data
if(endOfContour==null) {
return;
}
/**
* scan data and adjust glyfs after first if do not end in contour
*/
final int ptCount=endOfContour.length;
int start=0, firstPt=-1;
for(int ii=0;iiii) {
newPos -= (ii - start + 1);
}
pX[oldPos]=old_pX[newPos];
pY[oldPos]=old_pY[newPos];
onCurve[oldPos]=old_onCurve[newPos];
}
}
//reset values
start=ii+1;
firstPt=-1;
}else if(onCurve[ii] && firstPt==-1){ //track first point
firstPt=ii;
}
}
boolean isFirstDraw=true;
if(pathsFX==null){
pathsFX =new Path();
pathsFX.setFillRule(FillRule.NON_ZERO);
}
final int c= pX.length;
int fc=-1;
//find first end contour
for(int jj=0;jj elements = pathsFX.getElements();
elements.add(new MoveTo(x1,y1));
if(debug){
System.out.println("first contour="+fc+"===================================="+pX[0]+ ' ' +pY[0]);
//System.out.println("start="+x1+ ' ' +y1+" unitsPerEm="+unitsPerEm);
//for (int i = 0; i 1 || fc==lc)){
boolean checkEnd=false;
if(onCurve[p] && !onCurve[p1] && onCurve[p2] ){ //2 points + control
x1=pX[p];
y1=pY[p];
x2=pX[p1];
y2=pY[p1];
x3=pX[p2];
y3=pY[p2];
j++;
checkEnd=true;
if(debug) {
System.out.println(p + " pt,cv,pt " + x1 + ' ' + y1 + ' ' + x2 + ' ' + y2 + ' ' + x3 + ' ' + y3);
}
}else if(onCurve[p] && !onCurve[p1] && !onCurve[p2]){ //1 point + 2 control
x1=pX[p];
y1=pY[p];
x2=pX[p1];
y2=pY[p1];
x3=midPt(pX[p1], pX[p2]);
y3=midPt(pY[p1], pY[p2]);
j++;
checkEnd=true;
if(debug) {
System.out.println(p + " pt,cv,cv " + x1 + ' ' + y1 + ' ' + x2 + ' ' + y2 + ' ' + x3 + ' ' + y3);
}
}else if(!onCurve[p] && !onCurve[p1] && (!endOfContour[p2] ||fc-p2==1)){ // 2 control + 1 point (final check allows for last point to complete loop
x1=midPt(pX[pm1], pX[p]);
y1=midPt(pY[pm1], pY[p]);
x2=pX[p];
y2=pY[p];
x3=midPt(pX[p], pX[p1]);
y3=midPt(pY[p], pY[p1]);
if(debug) {
System.out.println(p + " cv,cv1 " + x1 + ' ' + y1 + ' ' + x2 + ' ' + y2 + ' ' + x3 + ' ' + y3);
}
}else if(!onCurve[p] && onCurve[p1]){ // 1 control + 2 point
x1=midPt(pX[pm1], pX[p]);
y1=midPt(pY[pm1], pY[p]);
x2=pX[p];
y2=pY[p];
x3=pX[p1];
y3=pY[p1];
if(debug) {
System.out.println(p + " cv,pt " + x1 + ' ' + y1 + ' ' + x2 + ' ' + y2 + ' ' + x3 + ' ' + y3);
}
}
if(isFirstDraw){
elements.add(new MoveTo(x1,y1));
isFirstDraw=false;
if(debug) {
System.out.println("first draw move to " + x1 + ' ' + y1);
}
}
if (!(endOfContour[p] && p > 0 && endOfContour[p-1])) {
elements.add(new CubicCurveTo(x1, y1, x2, y2, x3, y3));
}
if(debug) {
System.out.println("curveto " + x1 + ' ' + y1 + ' ' + x2 + ' ' + y2 + ' ' + x3 + ' ' + y3);
}
/**if end after curve, roll back so we pick up the end*/
if( checkEnd && endOfContour[j]){
isEnd=true;
xs=pX[fc];
ys=pY[fc];
//remmeber start point
lc=fc;
//find next contour
for(int jj=j+1;jj© 2015 - 2025 Weber Informatics LLC | Privacy Policy