📄 fsdefinefont2.java
字号:
if (containsLayoutInfo())
{
result = result && ascent == typedObject.ascent;
result = result && descent == typedObject.descent;
result = result && leading == typedObject.leading;
if (advances != null)
result = result && advances.equals(typedObject.advances);
else
result = result && advances == typedObject.advances;
if (bounds != null)
result = result && bounds.equals(typedObject.bounds);
else
result = result && bounds == typedObject.bounds;
if (kernings != null)
result = result && kernings.equals(typedObject.kernings);
else
result = result && kernings == typedObject.kernings;
}
}
return result;
}
public void appendDescription(StringBuffer buffer, int depth)
{
buffer.append(name());
if (depth > 0)
{
buffer.append(": { ");
Transform.append(buffer, "encoding", encoding);
// Flash 7
Transform.append(buffer, "small", small);
// End Flash 7
Transform.append(buffer, "italic", italic);
Transform.append(buffer, "bold", bold);
// Flash 6
Transform.append(buffer, "language", language);
// End Flash 6
Transform.append(buffer, "name", name);
Transform.append(buffer, "shapes", shapes, depth);
Transform.append(buffer, "codes", codes, depth);
Transform.append(buffer, "ascent", ascent);
Transform.append(buffer, "descent", descent);
Transform.append(buffer, "leading", leading);
Transform.append(buffer, "advances", advances, depth);
Transform.append(buffer, "bounds", bounds, depth);
Transform.append(buffer, "kernings", kernings, depth);
buffer.append("}");
}
}
public int length(FSCoder coder)
{
boolean wideOffsets = wideOffsetsForIndexedArray(shapes, coder);
int wideCodes = 0;
if (coder.context[FSCoder.Version] > 5)
wideCodes = 1;
else
wideCodes = (encoding != FSText.ANSI) ? 1 : 0;
super.length(coder);
coder.context[FSCoder.NumberOfFillBits] = 1;
coder.context[FSCoder.NumberOfLineBits] = 0;
coder.context[FSCoder.WideCodes] = wideCodes;
length += 3;
length += coder.strlen(name, false);
length += 2;
length += shapes.size()*(wideOffsets ? 4 : 2);
length += wideOffsets ? 4 : 2;
for (Iterator shapeIterator = shapes.iterator(); shapeIterator.hasNext();)
length += ((FSTransformObject)shapeIterator.next()).length(coder);
length += shapes.size()*((wideCodes == 1) ? 2 : 1);
if (containsLayoutInfo())
{
length += 6;
length += shapes.size()*2;
for (Iterator boundsIterator = bounds.iterator(); boundsIterator.hasNext();)
length += ((FSTransformObject)boundsIterator.next()).length(coder);
length += 2;
length += kernings.size()*((wideCodes == 1) ? 6 : 4);
}
coder.context[FSCoder.NumberOfFillBits] = 0;
coder.context[FSCoder.NumberOfLineBits] = 0;
coder.context[FSCoder.WideCodes] = 0;
return length;
}
public void encode(FSCoder coder)
{
boolean wideOffsets = wideOffsetsForIndexedArray(shapes, coder);
int wideCodes = 0;
int format = 0;
if (coder.context[FSCoder.Version] > 5)
wideCodes = 1;
else
wideCodes = (encoding != FSText.ANSI) ? 1 : 0;
if (encoding == FSText.ANSI)
format = 1;
// Flash 7
else if (small)
format = 2;
// End Flash 7
else if (encoding == FSText.SJIS)
format = 4;
super.encode(coder);
coder.context[FSCoder.NumberOfFillBits] = 1;
coder.context[FSCoder.NumberOfLineBits] = 0;
coder.context[FSCoder.WideCodes] = wideCodes;
coder.writeBits(containsLayoutInfo() ? 1 : 0, 1);
coder.writeBits(format, 3);
coder.writeBits(wideOffsets ? 1 : 0, 1);
coder.writeBits(wideCodes, 1);
coder.writeBits(italic ? 1 : 0, 1);
coder.writeBits(bold ? 1 : 0, 1);
coder.writeWord(coder.context[FSCoder.Version] > 5 ? language : 0, 1);
coder.writeWord(coder.strlen(name, false), 1);
coder.writeString(name);
coder.writeWord(shapes.size(), 2);
int currentLocation;
int offset;
int tableStart = coder.getPointer();
int tableEntry = tableStart;
int entrySize = wideOffsets ? 4 : 2;
for (int i=0; i<=shapes.size(); i++)
coder.writeWord(0, entrySize);
for (Iterator i=shapes.iterator(); i.hasNext(); tableEntry += entrySize << 3)
{
currentLocation = coder.getPointer();
offset = (coder.getPointer() - tableStart) >> 3;
coder.setPointer(tableEntry);
coder.writeWord(offset, entrySize);
coder.setPointer(currentLocation);
((FSTransformObject)i.next()).encode(coder);
}
currentLocation = coder.getPointer();
offset = (coder.getPointer() - tableStart) >> 3;
coder.setPointer(tableEntry);
coder.writeWord(offset, entrySize);
coder.setPointer(currentLocation);
for (Iterator codesIterator = codes.iterator(); codesIterator.hasNext();)
coder.writeWord(((Integer)codesIterator.next()).intValue(), (wideCodes == 1) ? 2 : 1);
if (containsLayoutInfo())
{
coder.writeWord(ascent, 2);
coder.writeWord(descent, 2);
coder.writeWord(leading, 2);
for (Iterator advancesIterator = advances.iterator(); advancesIterator.hasNext();)
coder.writeWord(((Integer)advancesIterator.next()).intValue(), 2);
for (Iterator boundsIterator = bounds.iterator(); boundsIterator.hasNext();)
((FSTransformObject)boundsIterator.next()).encode(coder);
coder.writeWord(kernings.size(), 2);
for (Iterator kerningIterator = kernings.iterator(); kerningIterator.hasNext();)
((FSTransformObject)kerningIterator.next()).encode(coder);
}
coder.context[FSCoder.NumberOfFillBits] = 0;
coder.context[FSCoder.NumberOfLineBits] = 0;
coder.context[FSCoder.WideCodes] = 0;
coder.endObject(name());
}
public void decode(FSCoder coder)
{
boolean containsWideOffsets = false;
boolean containsWideCodes = false;
boolean containsLayout = false;
int glyphCount = 0;
int kerningCount = 0;
int nameLength = 0;
super.decode(coder);
containsLayout = coder.readBits(1, false) != 0 ? true : false;
int format = coder.readBits(3, false);
encoding = FSText.Unicode;
if (format == 1)
encoding = FSText.ANSI;
// Flash 7
else if (format == 2)
small = true;
// End Flash 7
else if (format == 4)
encoding = FSText.SJIS;
containsWideOffsets = coder.readBits(1, false) != 0 ? true : false;
containsWideCodes = coder.readBits(1, false) != 0 ? true : false;
coder.context[FSCoder.WideCodes] = containsWideCodes ? 1 : 0;
italic = coder.readBits(1, false) != 0 ? true : false;
bold = coder.readBits(1, false) != 0 ? true : false;
language = coder.readBits(8, false);
nameLength = coder.readWord(1, false);
name = coder.readString(nameLength);
glyphCount = coder.readWord(2, false);
int offsetStart = coder.getPointer();
int[] offset = new int[glyphCount+1];
for (int i=0; i<glyphCount; i++)
offset[i] = coder.readWord((containsWideOffsets) ? 4 : 2, false);
offset[glyphCount] = coder.readWord((containsWideOffsets) ? 4 : 2, false);
for (int i=0; i<glyphCount; i++)
{
coder.setPointer(offsetStart+(offset[i]<<3));
if (coder.context[FSCoder.DecodeGlyphs] == 1)
shapes.add(new FSShape(coder));
else
shapes.add(new FSShape(coder, offset[i+1]-offset[i]));
}
for (int i=0; i<glyphCount; i++)
codes.add(new Integer(coder.readWord((containsWideCodes) ? 2 : 1, false)));
if (containsLayout)
{
ascent = coder.readWord(2, true);
descent = coder.readWord(2, true);
leading = coder.readWord(2, true);
advances = new ArrayList();
bounds = new ArrayList();
kernings = new ArrayList();
for (int i=0; i<glyphCount; i++)
advances.add(new Integer(coder.readWord(2, true)));
for (int i=0; i<glyphCount; i++)
bounds.add(new FSBounds(coder));
kerningCount = coder.readWord(2, false);
for (int i=0; i<kerningCount; i++)
kernings.add(new FSKerning(coder));
}
coder.context[FSCoder.WideCodes] = 0;
coder.endObject(name());
}
private boolean containsLayoutInfo()
{
boolean layout = false;
layout = layout || ascent != 0;
layout = layout || descent != 0;
layout = layout || leading != 0;
layout = layout || ((advances != null) && advances.size() > 0);
layout = layout || ((bounds != null) && bounds.size() > 0);
layout = layout || ((kernings != null) && kernings.size() > 0);
return layout;
}
private boolean wideOffsetsForIndexedArray(ArrayList anArray, FSCoder coder)
{
boolean wideOffsets = false;
int glyphLength = 0;
for (Iterator i=anArray.iterator(); i.hasNext();)
glyphLength += ((FSTransformObject)i.next()).length(coder);
if ((anArray.size()*2 + glyphLength) > 65535)
wideOffsets = true;
return wideOffsets;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -