/* * Copyright (C) 2010-2016 JPEXS, All rights reserved. * * 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 3.0 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. */ package com.jpexs.decompiler.flash.types.gfx; import com.jpexs.decompiler.flash.types.RECT; import com.jpexs.decompiler.flash.types.SHAPE; import com.jpexs.decompiler.flash.types.shaperecords.EndShapeRecord; import com.jpexs.decompiler.flash.types.shaperecords.SHAPERECORD; import com.jpexs.decompiler.flash.types.shaperecords.StyleChangeRecord; import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.List; /** * * @author JPEXS */ public class GlyphType implements Serializable { public int[] boundingBox; public ContourType[] contours; public GlyphType(List<SHAPERECORD> records) { RECT bounds = SHAPERECORD.getBounds(records); boundingBox = new int[4]; boundingBox[0] = bounds.Xmin; boundingBox[1] = bounds.Ymin; boundingBox[2] = bounds.Xmax; boundingBox[3] = bounds.Ymax; List<SHAPERECORD> cont = new ArrayList<>(); List<ContourType> contoursList = new ArrayList<>(); for (int i = 0; i < records.size(); i++) { SHAPERECORD r = records.get(i); if ((r instanceof StyleChangeRecord) && ((StyleChangeRecord) r).stateMoveTo) { if (!cont.isEmpty()) { contoursList.add(new ContourType(cont)); cont.clear(); } } cont.add(r); } if (!cont.isEmpty()) { contoursList.add(new ContourType(cont)); cont.clear(); } contours = contoursList.toArray(new ContourType[contoursList.size()]); } public GlyphType(GFxInputStream sis, long fontOffset) throws IOException { boundingBox = new int[4]; for (int i = 0; i < 4; i++) { boundingBox[i] = sis.readSI15("boundingBox"); } int numContours = sis.readUI15("numContours"); contours = new ContourType[numContours]; for (int i = 0; i < numContours; i++) { sis.newDumpLevel("contourType", "ContourType"); contours[i] = new ContourType(sis, fontOffset); sis.endDumpLevel(); } } public SHAPE toSHAPE() { SHAPE shp = new SHAPE(); shp.numFillBits = 1; shp.numLineBits = 0; List<SHAPERECORD> recs = new ArrayList<>(); StyleChangeRecord scr = new StyleChangeRecord(); scr.fillStyle0 = 0; scr.fillStyle1 = 1; scr.stateFillStyle1 = true; scr.stateFillStyle0 = false; recs.add(scr); for (ContourType cnt : contours) { recs.addAll(cnt.toSHAPERECORDS()); } recs.add(new EndShapeRecord()); shp.shapeRecords = recs; return shp; } public void write(GFxOutputStream sos) throws IOException { for (int b : boundingBox) { sos.writeSI15(b); } sos.writeUI15(contours.length); for (ContourType cnt : contours) { cnt.write(sos); } } }