private void writeTag()

in compiler/src/main/java/org/apache/royale/swf/io/SWFWriter.java [1253:1466]


    private void writeTag(ITag tag, IOutputBitStream tagData, IOutputBitStream out)
    {
        assert tag != null;
        assert tagData != null;
        assert out != null;
        assert tagData != out;

        if (tag == SWFReader.INVALID_TAG)
            return;

        // redirect tag buffer to "tagData"
        IOutputBitStream swfTagBuffer = null;
        if (tagData != this.tagBuffer)
        {
            swfTagBuffer = this.tagBuffer;
            this.tagBuffer = tagData;
        }

        boolean skipRawTag = false;
        Collection<ITag> extraTags = new LinkedList<ITag>();
        if (tag instanceof RawTag)
        {
            skipRawTag = writeRawTag((RawTag)tag);
        }
        else
        {
            switch (tag.getTagType())
            {
                case DoABC:
                    writeDoABC((DoABCTag)tag);
                    break;
                case FileAttributes:
                    writeFileAttributes((FileAttributesTag) tag);
                    break;
                case SymbolClass:
                    writeSymbolClass((SymbolClassTag) tag);
                    break;
                case ShowFrame:
                    writeShowFrame();
                    break;
                case SetBackgroundColor:
                    writeSetBackgroundColor((SetBackgroundColorTag) tag);
                    break;
                case EnableDebugger2:
                    writeEnableDebugger2((EnableDebugger2Tag) tag);
                    break;
                case EnableTelemetry:
                    writeEnableTelemetry((EnableTelemetryTag) tag);
                    break;
                case ScriptLimits:
                    writeScriptLimits((ScriptLimitsTag)tag);
                    break;
                case ProductInfo:
                    writeProductInfo((ProductInfoTag)tag);
                    break;
                case Metadata:
                    writeMetadata((MetadataTag)tag);
                    break;
                case DefineBits:
                    writeDefineBits((DefineBitsTag)tag);
                    break;
                case DefineBitsJPEG2:
                    writeDefineBitsJPEG2((DefineBitsJPEG2Tag)tag);
                    break;
                case DefineBitsJPEG3:
                    writeDefineBitsJPEG3((DefineBitsJPEG3Tag)tag);
                    break;
                case DefineBitsLossless:
                case DefineBitsLossless2:
                    writeDefineBitsLossless((DefineBitsLosslessTag)tag);
                    break;
                case DefineBinaryData:
                    writeDefineBinaryData((DefineBinaryDataTag)tag);
                    break;
                case DefineShape:
                    writeDefineShape((DefineShapeTag)tag);
                    break;
                case DefineShape2:
                    writeDefineShape2((DefineShape2Tag)tag);
                    break;
                case DefineShape3:
                    writeDefineShape3((DefineShape3Tag)tag);
                    break;
                case DefineShape4:
                    writeDefineShape4((DefineShape4Tag)tag);
                    break;
                case DefineSprite:
                    writeDefineSprite((DefineSpriteTag)tag);
                    break;
                case ExportAssets:
                    writeExportAssets((ExportAssetsTag)tag);
                    break;
                case DefineScalingGrid:
                    writeDefineScalingGrid((DefineScalingGridTag)tag);
                    break;
                case DefineFont:
                    writeDefineFont((DefineFontTag)tag, extraTags);
                    break;
                case DefineFont2:
                    writeDefineFont2((DefineFont2Tag)tag, extraTags);
                    break;
                case DefineFont3:
                    writeDefineFont3((DefineFont3Tag)tag, extraTags);
                    break;
                case DefineFont4:
                    writeDefineFont4((DefineFont4Tag)tag, extraTags);
                    break;
                case DefineFontInfo:
                    writeDefineFontInfo((IFontInfo)tag);
                    break;
                case DefineFontInfo2:
                    writeDefineFontInfo2((DefineFontInfo2Tag)tag);
                    break;
                case DefineFontAlignZones:
                    writeDefineFontAlignZones((DefineFontAlignZonesTag)tag);
                    break;
                case DefineFontName:
                    writeDefineFontName((DefineFontNameTag)tag);
                    break;
                case DefineText:
                    writeDefineText((DefineTextTag)tag, extraTags);
                    break;
                case DefineText2:
                    writeDefineText2((DefineText2Tag)tag, extraTags);
                    break;
                case DefineEditText:
                    writeDefineEditText((DefineEditTextTag)tag, extraTags);
                    break;
                case DefineSound:
                    writeDefineSound((DefineSoundTag)tag);
                    break;
                case DefineVideoStream:
                    writeDefineVideoStream((DefineVideoStreamTag)tag);
                    break;
                case VideoFrame:
                    writeVideoFrame((VideoFrameTag)tag);
                    break;
                case StartSound:
                    writeStartSound((StartSoundTag)tag);
                    break;
                case StartSound2:
                    writeStartSound2((StartSound2Tag)tag);
                    break;
                case SoundStreamHead:
                    writeSoundStreamHead((SoundStreamHeadTag)tag);
                    break;
                case SoundStreamHead2:
                    writeSoundStreamHead((SoundStreamHead2Tag)tag);
                    break;
                case SoundStreamBlock:
                    writeSoundStreamBlock((SoundStreamBlockTag)tag);
                    break;
                case DefineButton:
                    writeDefineButton((DefineButtonTag)tag);
                    break;
                case DefineButton2:
                    writeDefineButton2((DefineButton2Tag)tag);
                    break;
                case DefineButtonSound:
                    writeDefineButtonSound((DefineButtonSoundTag)tag);
                    break;
                case CSMTextSettings:
                    writeCSMTextSettings((CSMTextSettingsTag)tag);
                    break;
                case End:
                    writeEnd();
                    break;
                case JPEGTables:
                    writeJPEGTables(((JPEGTablesTag)tag));
                    break;
                case DefineMorphShape:
                    writeDefineMorphShape((DefineMorphShapeTag)tag);
                    break;
                case DefineMorphShape2:
                    writeDefineMorphShape2((DefineMorphShape2Tag)tag);
                    break;
                case PlaceObject:
                    writePlaceObject((PlaceObjectTag)tag);
                    break;
                case PlaceObject2:
                    writePlaceObject2((PlaceObject2Tag)tag);
                    break;
                case PlaceObject3:
                    writePlaceObject3((PlaceObject3Tag)tag);
                    break;
                case RemoveObject:
                    writeRemoveObject((RemoveObjectTag)tag);
                    break;
                case RemoveObject2:
                    writeRemoveObject2((RemoveObject2Tag)tag);
                    break;
                case SetTabIndex:
                    writeSetTabIndex((SetTabIndexTag)tag);
                    break;
                case FrameLabel:
                    writeFrameLabel((FrameLabelTag)tag);
                    break;
                default:
                    throw new RuntimeException("Tag not supported: " + tag);
            }
        }

        // reset tag buffer
        if (swfTagBuffer != null)
        {
            this.tagBuffer = swfTagBuffer;
        }

        if (!skipRawTag)
            finishTag(tag, tagData, out);

        for (ITag extraTag : extraTags)
            writeTag(extraTag);
    }