/* ======================== idSWF::DefineTextX ======================== */ void idSWF::DefineTextX( idSWFBitStream & bitstream, bool rgba ) { uint16 characterID = bitstream.ReadU16(); idSWFDictionaryEntry * entry = AddDictionaryEntry( characterID, SWF_DICT_TEXT ); if ( entry == NULL ) { return; } idSWFText * text = entry->text; bitstream.ReadRect( text->bounds ); bitstream.ReadMatrix( text->matrix ); uint8 glyphBits = bitstream.ReadU8(); uint8 advanceBits = bitstream.ReadU8(); while ( true ) { uint8 flags = bitstream.ReadU8(); if ( flags == 0 ) { break; } idSWFTextRecord & textRecord = text->textRecords.Alloc(); if ( flags & BIT( 3 ) ) { textRecord.fontID = bitstream.ReadU16(); } if ( flags & BIT( 2 ) ) { if ( rgba ) { bitstream.ReadColorRGBA( textRecord.color ); } else { bitstream.ReadColorRGB( textRecord.color ); } } if ( flags & BIT( 0 ) ) { textRecord.xOffset = bitstream.ReadS16(); } if ( flags & BIT( 1 ) ) { textRecord.yOffset = bitstream.ReadS16(); } if ( flags & BIT( 3 ) ) { textRecord.textHeight = bitstream.ReadU16(); } textRecord.firstGlyph = text->glyphs.Num(); textRecord.numGlyphs = bitstream.ReadU8(); for ( int i = 0; i < textRecord.numGlyphs; i++ ) { swfGlyphEntry_t & glyph = text->glyphs.Alloc(); glyph.index = bitstream.ReadU( glyphBits ); glyph.advance = bitstream.ReadS( advanceBits ); } }; }
/* ======================== idSWF::DefineEditText ======================== */ void idSWF::DefineEditText( idSWFBitStream & bitstream ) { uint16 characterID = bitstream.ReadU16(); idSWFDictionaryEntry * entry = AddDictionaryEntry( characterID, SWF_DICT_EDITTEXT ); if ( entry == NULL ) { return; } idSWFEditText * edittext = entry->edittext; bitstream.ReadRect( edittext->bounds ); bitstream.ResetBits(); bool hasText = bitstream.ReadBool(); bool wordWrap = bitstream.ReadBool(); bool multiline = bitstream.ReadBool(); bool password = bitstream.ReadBool(); bool readonly = bitstream.ReadBool(); bool hasTextColor = bitstream.ReadBool(); bool hasMaxLength = bitstream.ReadBool(); bool hasFont = bitstream.ReadBool(); bool hasFontClass = bitstream.ReadBool(); bool autoSize = bitstream.ReadBool(); bool hasLayout = bitstream.ReadBool(); bool noSelect = bitstream.ReadBool(); bool border = bitstream.ReadBool(); bool wasStatic = bitstream.ReadBool(); bool html = bitstream.ReadBool(); bool useOutlines = bitstream.ReadBool(); if ( hasFont ) { edittext->fontID = bitstream.ReadU16(); edittext->fontHeight = bitstream.ReadU16(); } if ( hasFontClass ) { idStr fontClass = bitstream.ReadString(); } if ( hasTextColor ) { bitstream.ReadColorRGBA( edittext->color ); } if ( hasMaxLength ) { edittext->maxLength = bitstream.ReadU16(); } if ( hasLayout ) { edittext->align = (swfEditTextAlign_t)bitstream.ReadU8(); edittext->leftMargin = bitstream.ReadU16(); edittext->rightMargin = bitstream.ReadU16(); edittext->indent = bitstream.ReadU16(); edittext->leading = bitstream.ReadS16(); } edittext->variable = bitstream.ReadString(); if ( hasText ) { const char * text = bitstream.ReadString(); idStr initialText; // convert html tags if necessary for ( int i = 0; text[i] != 0; i++ ) { if ( text[i] == '<' ) { if ( i != 0 && text[i+1] == 'p' ) { initialText.Append( '\n' ); } for ( ; text[i] != 0 && text[i] != '>'; i++ ) { } continue; } byte tc = (byte)text[i]; if ( tc == '&' ) { idStr special; for ( i++; text[i] != 0 && text[i] != ';'; i++ ) { special.Append( text[i] ); } if ( special.Icmp( "amp" ) == 0 ) { tc = '&'; } else if ( special.Icmp( "apos" ) == 0 ) { tc = '\''; } else if ( special.Icmp( "lt" ) == 0 ) { tc = '<'; } else if ( special.Icmp( "gt" ) == 0 ) { tc = '>'; } else if ( special.Icmp( "quot" ) == 0 ) { tc = '\"'; } } initialText.Append( tc ); } edittext->initialText = initialText; } edittext->flags |= wordWrap ? SWF_ET_WORDWRAP : 0; edittext->flags |= multiline ? SWF_ET_MULTILINE : 0; edittext->flags |= password ? SWF_ET_PASSWORD : 0; edittext->flags |= readonly ? SWF_ET_READONLY : 0; edittext->flags |= autoSize ? SWF_ET_AUTOSIZE : 0; edittext->flags |= border ? SWF_ET_BORDER : 0; }