Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   [flash8] Нюанс по сглаживанию текста (http://www.flasher.ru/forum/showthread.php?t=106677)

: hr : 16.01.2008 16:26

[flash8] Нюанс по сглаживанию текста
 
Вложений: 1
Друзья, вопрос пожалуй прост, но ответа для себя найти не смог :umnik2:

Можно ли сделать, чтобы динамическое текстовое поле со внедренным шрифтом типа bitmap text вело себя при анимации также как статическое текстовое поле с этим же шрифтом? Т.е. в моменты нахождения поля в целочисленных координатах текст отображался без сглаживания, а когда поле в дробных координатах - срабатывало сглаживание.

Пример во вложении.

iNils 18.01.2008 01:21

Вложений: 1
На самом деле вопрос не простой.
Легальным способом в IDE этого не добиться (лично я не знаю :D). Хотя возможно и есть варианты с всякими фокусами, типа 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 имеет переменную длину, поэтому рассказать про него не буду, зайдем лучше с конца. :D
А именно с 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.

etc 18.01.2008 10:52

Замучаешься каждый раз при компиляции это ваять :)
Может быть проще использовать заточенный под флеш пиксельный шрифт и не париться?

iNils 18.01.2008 16:29

Цитата:

Сообщение от __etc
Может быть проще использовать заточенный под флеш пиксельный шрифт и не париться?

Быстрее прочитать про короткий/длиный заголовок тега, научиться определять тип тега и его длину, и написать программу, которая ищет DefineFont2 или DefineFont3 и меняет в байте нужный бит.

Но еще быстрее, это взять ASV, открыть свою флешку и сформировать из файл ttf с готовым пикслеподобным шрифтом, который сделал флеш при компиляции swf (в примере Verdana_14pt_st). Установить его, и вместо связки Verdana + Bitmap text, выставить Verdana_14pt_st + Anti-alias for animation.

: hr : 18.01.2008 16:35

iNils, __etc, спасибо!

etc 19.01.2008 03:33

Цитата:

Сообщение от iNils
Быстрее прочитать про короткий/длиный заголовок тега, научиться определять тип тега и его длину, и написать программу, которая ищет DefineFont2 или DefineFont3 и меняет в байте нужный бит.

Но еще быстрее, это взять ASV, открыть свою флешку и сформировать из файл ttf с готовым пикслеподобным шрифтом, который сделал флеш при компиляции swf (в примере Verdana_14pt_st). Установить его, и вместо связки Verdana + Bitmap text, выставить Verdana_14pt_st + Anti-alias for animation.

И все равно, использовать нормальный пиксельный шрифт гораздо проще и быстрее :victory:

iNils 19.01.2008 03:40

Цитата:

Сообщение от __etc
И все равно, использовать нормальный пиксельный шрифт гораздо проще и быстрее :victory:

Если у тебя есть все нужные размеры.

etc 19.01.2008 03:41

Там обычно один размер используется. На то он и пиксельный.

iNils 19.01.2008 03:44

Цитата:

Сообщение от __etc
Там обычно один размер используется. На то он и пиксельный.

У тебя есть шрифт с размеров 10, а теперь надо тебе с размеров 14. Где возьмешь? Или 15?

etc 19.01.2008 14:26

Пиксельные шрифты фиксированного размера. А то, что делает флеш в качестве пиксельного, врядли сойдет.


Часовой пояс GMT +4, время: 09:33.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.