/* ======================== 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 ); } }; }
/* ======================== idSWFShapeParser::ParseShapes ======================== */ void idSWFShapeParser::ParseShapes( idSWFBitStream& bitstream1, idSWFBitStream* bitstream2, bool swap ) { int32 pen1X = 0; int32 pen1Y = 0; int32 pen2X = 0; int32 pen2Y = 0; uint8 fillStyle0 = 0; uint8 fillStyle1 = 0; uint8 lineStyle = 0; uint16 baseFillStyle = 0; uint16 baseLineStyle = 0; uint8 numBits = bitstream1.ReadU8(); uint8 numFillBits1 = numBits >> 4; uint8 numLineBits1 = numBits & 0xF; uint8 numFillBits2 = 0; uint8 numLineBits2 = 0; if( bitstream2 ) { numBits = bitstream2->ReadU8(); numFillBits2 = numBits >> 4; numLineBits2 = numBits & 0xF; } while( true ) { if( !bitstream1.ReadBool() ) { bool stateNewStyles = bitstream1.ReadBool(); bool stateLineStyle = bitstream1.ReadBool(); bool stateFillStyle1 = bitstream1.ReadBool(); bool stateFillStyle0 = bitstream1.ReadBool(); bool stateMoveTo = bitstream1.ReadBool(); if( ( stateNewStyles || stateLineStyle || stateFillStyle1 || stateFillStyle0 || stateMoveTo ) == false ) { // end record if( bitstream2 ) { uint8 flags = bitstream2->ReadU( 6 ); if( flags != 0 ) { idLib::Warning( "idSWFShapeParser: morph stream 1 ends before 2" ); break; } } break; } if( stateMoveTo ) { uint8 moveBits = bitstream1.ReadU( 5 ); pen1X = bitstream1.ReadS( moveBits ); pen1Y = bitstream1.ReadS( moveBits ); } if( stateFillStyle0 ) { fillStyle0 = bitstream1.ReadU( numFillBits1 ); } if( stateFillStyle1 ) { fillStyle1 = bitstream1.ReadU( numFillBits1 ); } if( stateLineStyle ) { lineStyle = bitstream1.ReadU( numLineBits1 ); } if( stateNewStyles ) { baseFillStyle = fillDraws.Num(); baseLineStyle = lineDraws.Num(); ReadFillStyle( bitstream1 ); numBits = bitstream1.ReadU8(); numFillBits1 = numBits >> 4; numLineBits1 = numBits & 0xF; } if( bitstream2 ) { bool isEdge = bitstream2->ReadBool(); if( isEdge ) { idLib::Warning( "idSWFShapeParser: morph stream 1 defines style change, but stream 2 does not" ); break; } bool stateNewStyles = bitstream2->ReadBool(); bool stateLineStyle = bitstream2->ReadBool(); bool stateFillStyle1 = bitstream2->ReadBool(); bool stateFillStyle0 = bitstream2->ReadBool(); bool stateMoveTo = bitstream2->ReadBool(); if( stateMoveTo ) { uint8 moveBits = bitstream2->ReadU( 5 ); pen2X = bitstream2->ReadS( moveBits ); pen2Y = bitstream2->ReadS( moveBits ); } if( stateFillStyle0 ) { if( bitstream2->ReadU( numFillBits2 ) != fillStyle0 ) { idLib::Warning( "idSWFShapeParser: morph stream 2 defined a different fillStyle0 from stream 1" ); break; } } if( stateFillStyle1 ) { if( bitstream2->ReadU( numFillBits2 ) != fillStyle1 ) { idLib::Warning( "idSWFShapeParser: morph stream 2 defined a different fillStyle1 from stream 1" ); break; } } if( stateLineStyle ) { if( bitstream2->ReadU( numLineBits2 ) != lineStyle ) { idLib::Warning( "idSWFShapeParser: morph stream 2 defined a different lineStyle from stream 1" ); break; } } if( stateNewStyles ) { idLib::Warning( "idSWFShapeParser: morph stream 2 defines new styles" ); break; } } } else {