PDA

Просмотр полной версии : Грузим FontFamily из отдельного swf


AlexCooper
16.10.2013, 17:17
Здравствуйте.
Имеем отдельную swf с кодом
package me.inpictures.data {

import flash.text.Font;
import flash.text.TextField;
import flash.text.TextFormat;

import flash.display.Sprite;

public class FontEmbed extends Sprite{

/* REGULAR */
[Embed(source="../../../lib/MyriadPro-Regular.otf"
,fontFamily= 'MB'
,fontStyle = 'normal'
,fontWeight = 'normal'
,mimeType="application/x-font"
,embedAsCFF = 'false'
)]
public static var Myriad2Pro:Class;


/* BOLD */
[Embed(source="../../../lib/MyriadPro-Bold.otf"
,fontFamily= 'MB'
,fontStyle = 'normal'
,fontWeight = 'bold'
,mimeType="application/x-font"
,embedAsCFF = 'false'
)]
public static var Myriad2ProBold:Class;

/* ITALIC */
[Embed(source="../../../lib/MyriadPro-It.otf"
,fontFamily='MB'
,fontStyle = 'italic'
,fontWeight = 'normal'
,mimeType="application/x-font"
,embedAsCFF = 'false'
)]
public static var Myriad2ProIT:Class;/*!!!*/

/* BOLD + ITALIC */
[Embed(source="../../../lib/MyriadPro-BoldIt.otf"
,fontFamily= 'MB'
,fontStyle = 'italic'
,fontWeight = 'bold'
,mimeType= 'application/x-font'
,embedAsCFF = 'false'
)]
public static var Myriad2ProBoldIT:Class;

/* CONDENSED */
[Embed(source="../../../lib/MyriadPro-Cond.otf"
,fontFamily="MC"
,fontStyle = 'normal'
,fontWeight = 'normal'
,mimeType="application/x-font"
,embedAsCFF = 'false'
)]
public static var Myriad2ProC:Class;

/* CONDENSED BOLD */
[Embed(source="../../../lib/MyriadPro-BoldCond.otf"
,fontFamily= 'MC'
,fontStyle = 'normal'
,fontWeight = 'bold'
,mimeType="application/x-font"
,embedAsCFF = 'false'
)]
public static var Myriad2ProCondBold:Class;

/* CONDENSED ITALIC */
[Embed(source="../../../lib/MyriadPro-CondIt.otf"
,fontFamily='MC'
,fontStyle = 'italic'
,fontWeight = 'normal'
,mimeType="application/x-font"
,embedAsCFF = 'false'
)]
public static var Myriad2ProCondIT:Class;/*!!!*/

/* CONDENSED BOLD + ITALIC */
[Embed(source="../../../lib/MyriadPro-BoldCondIt.otf"
,fontFamily= 'MC'
,fontStyle = 'italic'
,fontWeight = 'bold'
,mimeType= 'application/x-font'
,embedAsCFF = 'false'
)]
public static var Myriad2ProCondBoldIT:Class;

public function FontEmbed() {

}

public static function setStyle(textField:TextField, fontName:String, size:uint=16):void {

textField.embedFonts = true;
textField.defaultTextFormat = new TextFormat(fontName);
}

private function fontInit():void {
var _arr :Array = Font.enumerateFonts();
for each( var i:Font in _arr){
trace(i.fontName);
}
}
}
}
Здесь всё ок, шрифт подтягивается.

Пробую заатачить через загрузку
_loader = new Loader();
var urlRequest:URLRequest = new URLRequest("http:/site.dom/app/font/MyriadPro.swf?"+Math.random());
_loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, _loader_onIoError);
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _loader_onComplete);
_loader.load(urlRequest);


}

protected function _loader_onIoError(event:IOErrorEvent):void
{
_loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, _loader_onIoError);
trace("failed to load the .swf file");
}
protected function _loader_onComplete(event:Event):void
{
_loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, _loader_onComplete);

_fontLibrary = event.target.applicationDomain.getDefinition("me.inpictures.data.FontEmbed_Myriad2Pro") as Class;

traceFontRegister();

Font.registerFont(_fontLibrary);

}
Ругается
ArgumentError: Error #1508: Указано недопустимое значение для аргумента font.
at flash.text::Font$/registerFont()
at me.inpictures.data::DynamicFont/_loader_onComplete()

_fontLibrary = event.target.applicationDomain.getDefinition("me.inpictures.data.FontEmbed.Myriad2Pro") as Class;
ReferenceError: Error #1065: Переменная Myriad2Pro не определена.
at flash.system::ApplicationDomain/getDefinition()
at me.inpictures.data::DynamicFont/_loader_onComplete()

Что не так не пойму.

Добавлено через 19 минут
_fontLibrary=event.target.applicationDomain.getDefinition("me.inpictures.data.FontEmbed") as Class;

traceFontRegister();

trace( _fontLibrary.Myriad2Pro ); // [class FontEmbed_Myriad2Pro]

Font.registerFont(_fontLibrary.Myriad2Pro); // всё прежний аргумент эррор

Wolsh
16.10.2013, 17:36
Может все-таки так?_fontLibrary = event.target.applicationDomain.getDefinition("me.inpictures.data::FontEmbed")["Myriad2Pro"] as Class;
или
_fontLibrary = event.target.applicationDomain.getDefinition("FontEmbed_Myriad2Pro") as Class;
В первом случае Вы обращаетесь к свойству класса FontEmbed. Свойству! При чем тут getDefinition..
Во втором случае Вы обращаетесь к классу-ассету из библиотеки, который не принадлежит никакому пакету. При чем тут me.inpictures.data? ;)

AlexCooper
16.10.2013, 17:43
Может все-таки так?_fontLibrary = event.target.applicationDomain.getDefinition("me.inpictures.data::FontEmbed")["Myriad2Pro"] as Class;
всё как и прежде
ArgumentError: Error #1508: Указано недопустимое значение для аргумента font.
at flash.text::Font$/registerFont()
at me.inpictures.data::DynamicFont/_loader_onComplete()

http://inpictures.me/app/font/MyriadPro.swf - для тестов.

Добавлено через 2 минуты
_fontLibrary = event.target.applicationDomain.getDefinition("FontEmbed_Myriad2Pro") as Class;
если не указывать пакет который указан как документ класс
ReferenceError: Error #1065: Переменная FontEmbed_Myriad2Pro не определена.
at flash.system::ApplicationDomain/getDefinition()
at me.inpictures.data::DynamicFont/_loader_onComplete()

Добавлено через 41 минуту
Пока что получилось сделать через фабрику на удалённом swf. Но всё же как зарегистрировать шрифт

Wolsh
16.10.2013, 19:41
У меня локально работает и Ваш первый вариант, и мой первый. Так что проблема, видимо, в доменах.
Эту тему (http://flasher.ru/forum/showthread.php?t=169912&page=4) перечитывали?

AlexCooper
16.10.2013, 22:27
Да спасибо разобрался)
Что б я делал с шрифтами если бы не Wolsh, спасибо Вам

Wolsh
16.10.2013, 23:42
Поделитесь решением со всеми и Вам тоже будет спасибо))

AlexCooper
17.10.2013, 15:31
Поделитесь решением со всеми и Вам тоже будет спасибо))

Собственно вот более детальное описание (http://www.flasher.ru/forum/blog.php?b=665)