Показать сообщение отдельно
Старый 18.01.2008, 01:21
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 2  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
На самом деле вопрос не простой.
Легальным способом в IDE этого не добиться (лично я не знаю ). Хотя возможно и есть варианты с всякими фокусами, типа BitmapData, но я расскажу про вариант с редактированием swf.

В архиве два swf:
bt-original.swf - обычное поведение.
bt-hack.swf - поведение как у статичного поля.

Как этого добиться?
Для начала нужен hex-редактор или хотя бы вьювер. Я пользуюсь Far и плагином к нему "HEX редактор"

SWF состоит из блоков тегов с данными, за шрифты отвечают три тега DefineFont, DefineFont2 и DefineFont3.
DefineFont - для шрифта который используется только в статичных полях.
Если этот же фонт используется и для динамического, то уже нужен тег DefineFont2, а для 8-ки DefineFont3 (у него более точное позиционирование вершин глифа), но оба имеют одинаковую структуру:
Код:
RECORDHEADER Header

UI16  FontID

UB[1] FontFlagsHasLayout
UB[1] FontFlagsShiftJIS
UB[1] FontFlagsSmallText <-то что нам нужно
UB[1] FontFlagsANSI
UB[1] FontFlagsWideOffsets
UB[1] FontFlagsWideCodes
UB[1] FontFlagsItalic
UB[1] FontFlagsBold

UI8 LanguageCode
UI8 FontNameLen
UI8[FontNameLen] FontName
...
и далее
Header имеет переменную длину, поэтому рассказать про него не буду, зайдем лучше с конца.
А именно с FontName. Если взять любой из swf в аттаче, и посмотреть содержимое в hex виде, то легко можно найти запись "Verdana_14pt_st" (для этого надо отключить галочку Compress Movie в настройках публикации swf, а потом лучше сжать с помощью flasm), это и есть FontName.
Перед ним идет байт FontNameLen определяющий число байтов отводимых под FontName. В нашем случаи там стоит 0x10 (то есть в 16 dec, хотя длина строки 15, просто число отводимых байт может быть больше, поэтому после "Verdana_14pt_st" стоит 0x00).
Дальше, то есть впереди, байт LanguageCode 0x01.
А вот впереди стоящий байт, то, что нам нужно. Каждый бит этого байт - флаг, что видно из таблицы выше.
В bt-original.swf там
Код:
0xA4 10100100
А в bt-hack.swf
Код:
0x84 10000100
Флаг FontFlagsSmallText отвечает за то, как будет вести себя вершины глифа в динамическом текстовом поле (в статичном поле вершины отображаются, как есть).
Если - 1, то вершины привязываются с размерам пикселя, что и давало - скачкообразное движение.
Если - 0, то так же, как и в статичном поле.

Поэтому, если надо добиться плавного движения, надо взять 3-ий байт перед именем шрифта, разложить его на биты и заменить третий бит на 0.
Вложения
Тип файла: zip BitmapText.zip (5.9 Кб, 134 просмотров)
__________________
(и)Нильс.ru | Плагины для FlashDevelop


Последний раз редактировалось iNils; 18.01.2008 в 01:30.