PDA

Просмотр полной версии : Проблема с отображением подгружаемых в runtime шрифтов


PainKiller
05.07.2012, 20:01
Бьюсь над этим уже довольно долго, поэтому решил написать сюда т.к. собственные идеи иссякли. Я делаю приложение в котором пользователь может задавать шрифт текста выбирая его из комбобокса. Каждый шрифт подгружается в виде отдельной SWF, в которую он заэмбедден следующим образом:

package
{

import flash.display.MovieClip;

public class Journal extends MovieClip
{
[Embed(source = "Journal/JournalC.otf", fontName="JournalC", fontStyle="normal", fontWeight="normal", mimeType="application/x-font", advancedAntiAliasing="true", embedAsCFF="false")]
public var JournalC:Class;

[Embed(source = "Journal/JournalC-Bold.otf", fontName="JournalC", fontStyle="normal", fontWeight="bold", mimeType="application/x-font", advancedAntiAliasing="true", embedAsCFF="false")]
public var JournalCBold:Class;

[Embed(source = "Journal/JournalC-Italic.otf", fontName="JournalC", fontStyle="italic", fontWeight="normal", mimeType="application/x-font", advancedAntiAliasing="true", embedAsCFF="false")]
public var JournalCItalic:Class;

public function Journal()
{
Font.registerFont (JournalC);
Font.registerFont (JournalCBold);
Font.registerFont (JournalCItalic);

}
}

}


В основной флешке шрифты загружаются следующим образом (стараюсь приводить только относящийся к делу код, а вообще там все сложно):

fontsLoader = new Loader ();
fontsLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, fontLoaded);
fontsLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onIOERROR);


// это естественно в цикле
var path:String = Global.URL_PATH + Global.FONTS_PATH + fontsInfo.fonts.font[fontsCounter].lib.@src;
fontsCounter++;
fontsLoadedPathes.push(path);
var context:LoaderContext = new LoaderContext();
//context.securityDomain = SecurityDomain.currentDomain;
context.applicationDomain = ApplicationDomain.currentDomain;
fontsLoader.load(new URLRequest(path), context);

//здесь обрабатывается событие загрузки
private function fontLoaded(ev:Event):void
{
var target:LoaderInfo = ev.target as LoaderInfo;
var mc:MovieClip = target.content as MovieClip;
fonts.push(mc);
addChild(mc);
}



Теперь описание проблемы. Никаких ошибок не выкидывается, но при локальном запуске флешки на моем компьютере - шрифты не меняются, при выборе шрифта из комбобокса текст изчезает.
Загружаю флешку на сервер (тот же домен, где лежат и SWFки со шрифтами), запускаю флешку с сайта - все работает, НО ТОЛЬКО НА МОЕЙ МАШИНЕ!!
Если же зайти на сайт с любого другого компа, текст при переключении шрифта пропадает.
Сперва я подумал. что это проблемы с безопасностью, песочницами, ApplicationDomain и тому подобным. Но вдумчивое изучение доков на эту тему ничего не дало, ведь все грузится с одного домена.
Буду благодарен за помощь, если кому то нужна ссылка на приложение, дам в личку.

in4core
05.07.2012, 20:09
Простой совет, после загрузки выведи Font List ( думаю с enumerateFonts работал, если нет найди ). И увидишь какие шрифты реально встроились, а какие нет и ожидают

PainKiller
05.07.2012, 20:18
забыл сказать - я это делал, локально загружаемые шрифты не выводятся, с севера вывожу фонтлист в консоль, вижу все загруженные шрифты. На других машинах посмотреть с сервера список шрифтов пока нет возможности, но я думаю результат будет очевиден. Найти корень проблемы мне это не помогло.

Wolsh
05.07.2012, 20:35
http://flasher.ru/forum/showthread.php?t=169912

PainKiller
05.07.2012, 20:42
Wolsh, спасибо за помощь, но эту ветку я внимательно читал и перечитывал еще когда организовывал смену шрифтов, ни нашел там ничего, что помогло бы мне решить проблему, хотя конечно экспериментировать я продолжу, в том числе и с рецептами описанными там.

Wolsh
05.07.2012, 23:12
1. Не хочу обидеть, но действительно самая распространенная ошибка — забыть указать текстовому полю embedFonts = true; Обязательно проверьте.
2. Попробуйте регистрировать шрифты не в конструкторе, а "после", отдельным методом.

in4core
05.07.2012, 23:27
Да ни нужно ниче регестрировать вообще.
Есть флешка в айде рисуем так текстовое поле, делаем нужный формат, встриваем символы.
Далее грузим ( и даже на сцену добавлять не надо ) - все шрифты на месте.

package com.in4core.edenSite.utils
{
import flash.text.Font;
/**
* ...
* @author in4core lab
*/
public final class FontManager
{
public static const SharedLibrary:SharedFonts = new SharedFonts();

public static function getFontsListing():void
{
var fontsListing:String="";
var fontArray:Array = Font.enumerateFonts(false);
fontArray.sortOn(['fontName']);

for (var i:int = 0; i < fontArray.length; i++)
{
var thisFont:Font = fontArray[i];
fontsListing += thisFont.fontName+ " " + thisFont.fontStyle +"\n";
}
trace('Shared fonts : \n' + fontsListing + '---------------');
}
}

}

Добавлено через 1 минуту
Тут тупо инициализация для embed
public static const SharedLibrary:SharedFonts = new SharedFonts();
В ваше случае будет инициализатором просто лоадер

PainKiller
06.07.2012, 00:05
Спасибо всем за помощь. embedFonts = true; - стоит, я тоже об этом сперва подумал. Добрался до машины, на которой проверил трейсы фонтлиста с сервера - все шрифты выводятся, возможно проблема и не в этом. Так что буду ковыряться :-)

Добавлено через 14 часов 26 минут
после некоторых манипуляций с кодом обнаружил, что если закомментировать строчку embedFonts = true; шрифты показываются как надо (но они у меня установлены в системе, поэтому это не удивительно). Если оставить эту строчку шрифты не показываются ни локально ни с сервера НО список зарегистрированных шрифтов показывает что нужные шрифты зарегистрированы в системе!!!! В консоли видно, что шрифт присваивается текстформату, а тот в свою очередь присваивается текстфилду, т.е. каких то сторонних проблем по присвоению шрифта в ходе исполнения кода нет.

Добавлено через 14 часов 55 минут
нет, соврал. Трейсы приходят из подгружаемых флешек. Шрифты из фонт листа главной флешки показывают что нужные шрифты не заэмбедены.

Добавлено через 15 часов 10 минут
похоже проблема с SWF со шрифтами попробую перекомпилить в чем нибудь