/*
* JSwiff is an open source Java API for Macromedia Flash file generation
* and manipulation
*
* Copyright (C) 2004-2006 Ralf Terdic (contact@jswiff.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.jswiff.swfrecords.tags;
import com.jswiff.io.InputBitStream;
import com.jswiff.swfrecords.Shape;
import org.apache.log4j.Logger;
import java.io.IOException;
/**
* This tag's structure is identical to <code>DefineFont2</code>. The
* difference is in the precision of the glyph definition within
* glyphShapeTable: all EM square coordinates are multiplied by 20 before
* being added to the tag, thus enabling substantial resolution increase.
*
* @since SWF 8.
*/
public final class DefineFont3 extends DefineFont2 {
private static Logger logger = Logger.getLogger(DefineFont3.class);
/**
* @see DefineFont2#DefineFont2(int, String, Shape[], char[])
*/
public DefineFont3(
int characterId, String fontName, Shape[] glyphShapeTable, char[] codeTable) {
super(characterId, fontName, glyphShapeTable, codeTable);
code = TagConstants.DEFINE_FONT_3;
}
DefineFont3() {
// empty
}
protected void readOnHandlingWideOffsets(InputBitStream inStream, boolean wideOffsets) throws IOException {
if (wideOffsets) {
// skip offsetTable, UI32
inStream.readBytes(numGlyphs * 4);
// skip codeTableOffset, UI32
inStream.readBytes(4);
} else {
// skip offsetTable, UI16
inStream.readBytes(numGlyphs * 2);
if (numGlyphs == 0) {
// We need to resolve an edge case for DefineFont3 now
// the codeTableOffset could be optional if the number
// of glyphs is zero. This happens when you want to
// refer to the system font in some specific way.
// since i couldnt find a proper rule to handle this
// exception we're going to do it the hard way.
// so if it turns out that this tag failed to parse
// due to an underflow and it has no glyphs we catch the read error.
// TODO improve
// skip CodeTableOffset, UI16
try {
inStream.readBytes(2);
} catch (IOException e) {
logger.debug("DefineFont3 edge case caught.");
}
} else {
// skip CodeTableOffset, UI16
inStream.readBytes(2);
}
}
}
}