Frustrerande fonthantering i Flash/Flex
Jag har skrivit tidigare om att bädda in fonter, men känner att jag skulle vilja belysa detta oerhört frustrerande område ännu mer.
Jag kompilerar mina swffiler genom Flex SDK (laddas ner hos adobe gratis), det innebär att jag har tillgång till Flexramverket och dess lite mer utökade metoder. Bland annat den enormt värdefulla [Embed]-taggen! Detta går att använda i Flash IDE också, men kräver att man har Flex SDK installerat. Alla som använt den taggen någon gång för att bädda in fonter vet hur lätt det är. Man har full kontroll över vilka tecken som skall bäddas in och det är enkelt att sätta stilar etc...
Embed-taggens olika attribut
Jag är inte så kunnig i området typsnitt, hur de byggs upp och förpackas. Någon direkt standard verkar det dock inte finnas. När man använder [Embed]-taggen kan man ge den några olika attribut:
- source eller systemFont
- fontName
- mimeType
- unicodeRange
- fontStyle
- fontWeight
- fontFamily
Bilderna nedan visar på likheterna i Flashs egna dialogrutor som jag refererar till i texten.
Använder man source, refererar man direkt till källan, ex source="C:\Windows\Fonts\Arial.ttf". Fonten måste vara av typen true type. Jag upptäckte även att source kan användas på ett annat sätt, vilket jag återkommer till längre ner.
systemFont däremot, refererar till någon som ditt system känner till. Här skriver man fontens fullständiga namn och det brukar jag ha problem med då vissa fonter inte funkar av någon anledning. Men för att göra detta exemplet enkelt tar vi Georgia som exemepel. systemFont="Georgia". Då fattar systemet att det är Georgia som skall bäddas in och hämtar själv fonten.
fontName är att jämföra med "Namn" i Flash dialogruta som kommer om du tar "new Font" i biblioteket. Här skriver du in vad som helst, det är ett alias för fontens riktiga namn. ex fontName="georiga_normal", namnet bör dock inte skrivas exakt så som fontens riktiga namn.
mimeType beskriver vad det är och jag antar att det har med optimering för själva kompilatorn att göra. ex. mimeType="application/x-font".
unicodeRange är det attribut du använder för att begränsa antalet tecken, anger du inget här bäddas hela fonten in. Här kan man antingen ange ett omfång eller en kommaseparerad lista. Tecknen ska anges i unicode, ex "0xBBEF". unicodeRange är att jämföra med Flashs dialogruta "Character embedding" som man når om man klickar på knappen "Character embedding" i properties paletten med textverktyget valt. De förinställda teckenomfången som Flash använder definieras i en xmlfil som heter "UnicodeTable.xml" och du hittar den under "C:\Users\{user}\AppData\Local\Adobe\Flash CS4\en\Configuration\FontEmbedding\". I denna kan man även skapa egna teckenomfång för Flash font embedding i Flash, men det är en annan historia. Du kan med fördel använda den för att se vilka omfång du ska ange i unicodeRange. Andra alternativ är att använda dig av Renzo's Flash unicode table generator page, om du vet exakt vilka tecken som skall bäddas in. Ytterligare annat alternativ är Ishidas Unicode Code Converter v7.0.1, här är det "Hexadecimal code points" du ska hålla koll på samt att du får lägga till "0x" före varje hexadecimala värde och kommaseparera dem.fontStyle anger en stil på fonten. Fonten måste ha stöd för detta och det är här det brukar börja trilskas för mig när jag använder mig av systemFont. fontStyle kan exempelvis vara: fontStyle="italic".
fontWeight anger vikten på fonten, alltså bold. Fonten måste ha stöd för det. Ex: fontWeight="bold".
Problemet med transcoding, unable to build font...
Nu är det bara ett attribut kvar i listan och det här hittade jag av misstag. Säg att man som jag inte lyckas bädda in fonten med:
Denna kod returnerar felmeddelandet:
exception during transcoding:och
Font for alias 'avenir_medium' with plain weight and style was not
found by family name 'Avenir LT Std 65 Medium'
unable to build font 'avenir_medium'
Lösningen:
Skapa ett nytt tomt dokument i Flash och lägg ett tomt dynamiskt textfält på scenen. I properties paletten klicka på knappen "Character Embedding" och välj de character sets du vill bädda in.
Spara din källfil och exportera ut din swf (vi kallar den fonten.swf i detta exemplet) till samma katalog som din huvudsakliga.fla-fil ligger (den där du har ditt innehåll alltså). På första framen i din huvudsakliga .fla-fil, första raden skriver du:
Jag kan ha fel, men det verkar som om metoden kräver att du använder CSS på ditt textfält. Så här gjorde jag:
Fördelen med denna lösningen är att du begränsar fonten med Flashs inbyggda gränssnitt för att hantera teckentabellerna, vilket säkert för många underlättar mycket! Personligen föredrar jag att använda swc bibliotek, men i just detta fallet fungerar inte det.
















Kommentarer
Apropå Rishida konventerare... är det bara jag eller fler som får ingen kod i unicode fältet efter konventering ? har använt rishida tidigare och då också stött på samma problem.
Jag trodde inte att det gick att köra med open type, är det kanske något som finns med i Flex SDK 4 betan? Själv håller jag mig än så länge till Flex SDK 3.
Citerar Danel Kirch:
Den gamla, version 6 funkade inte när jag provade igår, men den nya som jag länkar till fungerade fint. Prova i en annan browser.
Skumt med browser, hade förr problem med FF och nu kör jag Chrome och det funkar inte heller, kanske den nya har problem med Chrome då :/ ska prova det sen...
Citerar Patric Jonsson:
RSS-flöde för kommentarer på denna post.