⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fsdefinefont2.java

📁 利用opensource的开源jar实现生成flash文件
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
            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 + -