Este processo comecei a pensar quando um cliente meu não tinha a fonte Arial instalada e tudo que dependia dela não aparecia. A segunda utilidade é economizar banda, pois as fontes normalmente consomem muito espaço do SWF quando embutidas. para que carregar uma fonte se a mesma já esta no Cliente?
Então, um pouco de pesquisa montei a classe FontUtil, que possui somente um método, registerFont que invocamos para passar a fonte, e o caminho da conte compilada.
Então primeiro vou criar um arquivo CSS com o nome de Calibri.css com o seguinte conteúdo.
/* CSS file */ @font-face { fontFamily: Calibri; fontWeight: bold; fontStyle: normal; src: local("Calibri"); }A fonte Calibri esta presente em todas as maquinas Vista ou superior.
Agora marcaque este css para ser compilada como swf, conforme imagem abaixo.
Agora na pasta bin-debug foi gerado um arquivo Calibri.swf. Então vamos verificar se a fonte esta ou não instalada no computador, antes de importar. Para isso criei a classe FontUtil conforme abaixo.
package com.eduardokraus.text { import flash.text.Font; import mx.styles.StyleManager; public class FontUtil { public static function registerFont( font:String, src:String ):void { var fonts:Array=Font.enumerateFonts( true ) for ( var i:uint=0; i < fonts.length; i++ ) { if (( fonts[ i ] as Font ).fontName == font ) return; } StyleManager.loadStyleDeclarations( src ); } } }
Agora no createComplete do Application chamamos assim
FontUtil.registerFont( "Calibri", "assets/Calibri.swf" );
A classe irá fazer o seguinte. Varrer todas as fontes instaladas e se não achar a mesma instalada, irá fazer o download do SWF.
Veja abaixo uma aplicação funcionando com esta classe Util.
Código fonte aqui.