Bädda in fonter för Flash player 10, embedAsCFF

Att bädda in(Tackar Patric :) ) fonter i sin SWF är något man kunnat göra väldigt länge, men det har ändrats sig lite i och med Flash player 10.
För att bädda in en font skriver man bara:

[Embed(source = '../lib/GOTHIC.TTF',
	fontFamily = "minFont",
	mimeType = "application/x-font-truetype")]
private static const GothicFont:Class;

Och för att senare använda det i ett textfält så använder man sig bara av fontFamily namnet:

var format:TextFormat = new TextFormat();
// Här väljer jag vilken font jag ska använda
// Använder mig av fontFamily värdet
format.font = "minFont";
format.size = 50;
format.color = 0x000000;

var tf:TextField = new TextField();
tf.embedFonts = true;
tf.defaultTextFormat = format;
tf.text = "The quick brown fox jumped over the lazy dog. 0123456798";

Alternativt hämtar man värdet från en instans av teckensnittet:

// Skapar en ny instans av fonten
var myGothic:Object = new GothicFont();

var format:TextFormat = new TextFormat();
// Hämtar ut värdet av fontFamily
// från instansen
format = myGothic["fontName"];
format.size = 50;
format.color = 0x000000;

var tf:TextField = new TextField();
tf.embedFonts = true;
tf.defaultTextFormat = format;
tf.text = "The quick brown fox jumped over the lazy dog. 0123456798";

Fram till och med Flash player 10 funkar detta jättebra, men om du väljer att kompilera mot FP10 istället så får du problem.
Helt plötsligt syns inga bokstäver i textfältet.

Anledningen till detta är det nya text ramverket (som bygger på deras nya text motor) som Adobe släppte med Flash player 10.
http://labs.adobe.com/technologies/textlayout/

TLF = Text Layout Framework. Har bytt namn massvis med gånger, bl.a. text component library och ännu tidigare Vellum.
FTE = Flash Text Engine, den nya text motorn

Innan vi går vidare bör vi gå igenom CFF!

Du behöver inte veta detta, om du bara vill ha en lösning finns det längst ner!

Så vad är då CFF?
CFF står för Compact Font Format och är ett PostScript teckensnitts filformat som tillåter “icke-förstörande” (lossless) komprimering av teckensnitt.
Saxat från wikipedia:

Compact Font Format (also known as CFF font format, Type 2 font format, or CFF/Type 2 font format) is a lossless compaction of the Type 1 format using Type 2 charstrings. It is designed to use less storage space than Type 1 fonts, by using operators with multiple arguments, various pre-defined default values, more efficient allotment of encoding values and shared subroutines within a FontSet (family of fonts).

Wow! Nu vet vi det! :P
Nu till det riktiga problemet: textfields stödjer inte CFF fonter, men TLF stödjer endast CFF fonter.

Om vi verkligen ska nörda ner oss. SWF som filformat innehåller en massa taggar. Varje tagg definerar saker i SWF:en som senare används vid uppspelning. Det kan vara allt från ljud, grafik till logik (kod). Textfields behöver taggen DefineFont3 och TFL behöver taggen DefineFont4.

När TLF kom och behövde CFF fonter så valde Adobe (av någon, enligt mig, väldigt konstig anledning) att använda CFF fonter som stöd.
Pg.a. detta måste vi berätta för kompilatorn att den inte ska kompilera in fonter som CFF fonter (som nu är standard) utan som “DefineFont3” fonter (vet inte på filformatet på DefineFont3).

För att göra det använder vi attributen embedAsCFF, och sätta denna till false. Alltså, om vi bara ändrar vår kod till:

// Detta skulle få kompilatorn att bädda in teckensnittet som CFF (default = true)
//[Embed(source = '../lib/GOTHIC.TTF',
//	fontFamily = "minFont",
//	mimeType = "application/x-font-truetype")]
// Detta skulle få kompilatorn att bädda in teckensnittet som CFF
//[Embed(source = '../lib/GOTHIC.TTF',
//	fontFamily = "minFont",
//	mimeType = "application/x-font-truetype
//	embedAsCFF = "true")]

// Detta säger till kompilatorn att inte bädda in som CFF
// (att använda DefineFont3 och inte DefineFont4)
[Embed(source = '../lib/GOTHIC.TTF',
	fontFamily = "minFont",
	mimeType = "application/x-font-truetype",
	embedAsCFF="false")]
private static const GothicFont:Class;

Det löser biffen!
Vet någon vad det är för filformat på DefineFonts3?

4 comments

  1. Cornelius says:

    Cenare krabben,

    En liten rättelse på rad 16.
    Kompilatorn strejkar om vi inte skriver

    embedAsCFF="false")]

    istället för


    embedAsCff="false")]

    Nu skall jag sluta gnälla. :)
    Må väl.

  2. embed på svenska heter bädda in, eftersom du undrade :)

Leave a Reply

Your email address will not be published. Required fields are marked *

*