Re: Some rookie questions about GUI
T J <[email protected]> Mon, 15 Jul 2019 11:45:31 +0000
| Newsgroups | gmane.comp.fonts.fontforge.devel |
|---|---|
| Message-ID | <SYAPR01MB3040833E55C8F7A0AADD0263C2CF0@SYAPR01MB3040.ausprd01.prod.outlook.com> |
--===============1499409796628532336==
Content-Language: en-AU
Content-Type: multipart/alternative;
boundary="_000_SYAPR01MB3040833E55C8F7A0AADD0263C2CF0SYAPR01MB3040ausp_"
--_000_SYAPR01MB3040833E55C8F7A0AADD0263C2CF0SYAPR01MB3040ausp_
Content-Type: text/plain; charset="Windows-1252"
Content-Transfer-Encoding: quoted-printable
Regarding your questions:
1. gdraw
2. Not really, no. Most of the time it=92s just inspecting code to figur=
e out what=92s going on. But if you have some understanding of how gui tool=
kits work, it=92s not too bad. The gist of it is:
gdraw exposes a public interface, which allows you to:
* Create toplevel and child windows
* Draw and render text to that window (usually using Pango and Cairo=
, unless you=92ve somehow managed to disable that, in which case it uses st=
raight X/Xlib calls)
* Receive events on that window (mouse/keyboard events, expose/rende=
r events, resize events etc)
There=92s then some indirection, because behind that interface may be one o=
f three implementations, an X backend (gxdraw), which works directly with X=
lib, a GDK backend (ggdkdraw), which uses GDK to create/manage windows, and=
a Postscript backend (gpsdraw), which is mostly not functional.
From there, there=92s a somewhat functional, mostly broken toolkit of widge=
ts (ggadget/gwidget), which you can use, so you don=92t completely have to =
implement everything from scratch.
1. Painfully. But in brief, you set up some state and desired attributes=
, then either call GDrawCreateTopWindow (toplevel windows) or GDrawCreateSu=
bWindow (child windows). You then probably use some of the widgets from gwi=
dget/ggadget, which involves setting up a lot more state and some event han=
dlers.
2. When a window is constructed, it passes in an event handler, in the s=
ource you=92ll often find it called *_e_h, e.g. splash_e_h. This receives i=
nformation about things like mouse click/key events, expose (paint) events =
etc. When you use premade widgets, you can sometimes pass in a callback to =
one of those as well, which just builds on that aforementioned event handle=
r.
Jeremy
From: Thor Christopher<mailto:[email protected]>
Sent: Monday, 8 July 2019 10:45 PM
To: [email protected]<mailto:[email protected]=
ceforge.net>
Subject: [fontforge-devel] Some rookie questions about GUI
Hi, this might seem like some very basic stuff here, but I've been skimming=
through the code just to get an overview on how FontForge is built and som=
e really basic stuff just seems difficult to discern from the code and docu=
mentation alone.
I think this project could learn a lot from InkScape when it comes to docum=
entation and code structure.
Anyway, the first thing I do when I try and understand code is to look for =
the GUI code so I can see how the UI fits with the functionality of the pro=
gram. For FontForge this has been rather difficult, all I could find about =
the GUI from the docs is this part from the FAQ:
"Why doesn't it use the native MS Windows or Mac windowing system?
=B7 FontForge is not a commercial product and is not bound by the c=
onstraints of the market.
=B7 Doing that port doesn't interest me.
=B7 I don't have time nor do I have the skill to take that task on.
=B7 I'd like to encourage people to use Linux/unix
Of course, if I were to use either gtk or qt<https://fontforge.github.io/fa=
q.html#widget-set> some of the difficulties of porting would vanish. But un=
fortunately I don't like either of those widget sets.
Now... if you would like to do the port, that would be wonderful. I encoura=
ge you to do so.
Why is FontForge based on a non-standard widget set? ..."
None of this information explains what this widget set is or how it draws i=
ts GUI, the only hint I've found is that it uses Cairo, somewhere in the co=
de it looks like it draws the GUI pixel by pixel, and there's a GDraw direc=
tory with some datatypes such as GWindow and GWidget that seem to be relate=
d to the UI, but trying to follow the function calls and see where it ends =
it's very difficult to get an idea on how the GUI code works.
Since I'm still confused about this, I think this is probably something a l=
ot of other people might have a problem understanding as well when they fir=
st start looking into the FontForge source code. I'd say it increases the l=
earning curve and reduces the possibility of more developers contributing t=
o this project.
Maybe you should have a more in depth overview on which libraries are used =
and how they work in the docs?
Some of my questions are:
1. What is the name of this non-standard widget set?
2. Is there any documentation for how it works?
3. How is a window created using this widget set?
4. Where do I find the event listeners? Is it a signal/slot pattern, or som=
ething else?
Hope I'm not spamming with too basic stuff here, but I've been trying to ge=
t into the code without any luck several times now, and I'm starting to thi=
nk this is something other people might want to know about as well.
- Thor Arisland
--_000_SYAPR01MB3040833E55C8F7A0AADD0263C2CF0SYAPR01MB3040ausp_
Content-Type: text/html; charset="Windows-1252"
Content-Transfer-Encoding: quoted-printable
<html xmlns:o=3D"urn:schemas-microsoft-com:office:office" xmlns:w=3D"urn:sc=
hemas-microsoft-com:office:word" xmlns:m=3D"http://schemas.microsoft.com/of=
fice/2004/12/omml" xmlns=3D"http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3DWindows-1=
252">
<meta name=3D"Generator" content=3D"Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:"Yu Gothic";
panose-1:2 11 4 0 0 0 0 0 0 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:"\@Yu Gothic";
panose-1:2 11 4 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:#954F72;
text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
{mso-style-priority:34;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:36.0pt;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
.MsoChpDefault
{mso-style-type:export-only;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
{page:WordSection1;}
/* List Definitions */
@list l0
{mso-list-id:160971631;
mso-list-type:hybrid;
mso-list-template-ids:2122881762 -1 134807577 134807579 134807567 13480757=
7 134807579 134807567 134807577 134807579;}
@list l0:level1
{mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;
font-family:"Times New Roman",serif;
mso-ascii-font-family:Calibri;
mso-fareast-font-family:"Yu Gothic";
mso-hansi-font-family:Calibri;
mso-bidi-font-family:"Times New Roman";
color:windowtext;}
@list l0:level2
{mso-level-number-format:alpha-lower;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level3
{mso-level-number-format:roman-lower;
mso-level-tab-stop:none;
mso-level-number-position:right;
text-indent:-9.0pt;}
@list l0:level4
{mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level5
{mso-level-number-format:alpha-lower;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level6
{mso-level-number-format:roman-lower;
mso-level-tab-stop:none;
mso-level-number-position:right;
text-indent:-9.0pt;}
@list l0:level7
{mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level8
{mso-level-number-format:alpha-lower;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;}
@list l0:level9
{mso-level-number-format:roman-lower;
mso-level-tab-stop:none;
mso-level-number-position:right;
text-indent:-9.0pt;}
@list l1
{mso-list-id:465437809;
mso-list-template-ids:-1;}
@list l1:level1
{mso-level-number-format:bullet;
mso-level-text:\F0B7;
mso-level-tab-stop:36.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l1:level2
{mso-level-number-format:bullet;
mso-level-text:o;
mso-level-tab-stop:72.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:"Courier New";
mso-bidi-font-family:"Times New Roman";}
@list l1:level3
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:108.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1:level4
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:144.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1:level5
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:180.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1:level6
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:216.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1:level7
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:252.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1:level8
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:288.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1:level9
{mso-level-number-format:bullet;
mso-level-text:\F0A7;
mso-level-tab-stop:324.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
--></style>
</head>
<body lang=3D"EN-AU" link=3D"blue" vlink=3D"#954F72">
<div class=3D"WordSection1">
<p class=3D"MsoNormal">Regarding your questions:</p>
<ol style=3D"margin-top:0cm" start=3D"1" type=3D"1">
<li class=3D"MsoListParagraph" style=3D"color:black;margin-left:0cm;mso-lis=
t:l0 level1 lfo2">
<span style=3D"color:windowtext">gdraw</span><span style=3D"font-family:&qu=
ot;Arial",sans-serif"><o:p></o:p></span></li><li class=3D"MsoListParag=
raph" style=3D"color:black;margin-left:0cm;mso-list:l0 level1 lfo2">
<span style=3D"font-family:"Arial",sans-serif">Not really, no. Mo=
st of the time it=92s just inspecting code to figure out what=92s going on.=
But if you have some understanding of how gui toolkits work, it=92s not to=
o bad. The gist of it is:<br>
gdraw exposes a public interface, which allows you to:<o:p></o:p></span></l=
i><ol style=3D"margin-top:0cm" start=3D"1" type=3D"a">
<li class=3D"MsoListParagraph" style=3D"color:black;margin-left:0cm;mso-lis=
t:l0 level2 lfo2">
<span style=3D"font-family:"Arial",sans-serif">Create toplevel an=
d child windows<o:p></o:p></span></li><li class=3D"MsoListParagraph" style=
=3D"color:black;margin-left:0cm;mso-list:l0 level2 lfo2">
<span style=3D"font-family:"Arial",sans-serif">Draw and render te=
xt to that window (usually using Pango and Cairo, unless you=92ve somehow m=
anaged to disable that, in which case it uses straight X/Xlib calls)<o:p></=
o:p></span></li><li class=3D"MsoListParagraph" style=3D"color:black;margin-=
left:0cm;mso-list:l0 level2 lfo2">
<span style=3D"font-family:"Arial",sans-serif">Receive events on =
that window (mouse/keyboard events, expose/render events, resize events etc=
)<o:p></o:p></span></li></ol>
</ol>
<p class=3D"MsoNormal" style=3D"margin-left:36.0pt"><span style=3D"font-fam=
ily:"Arial",sans-serif;color:black">There=92s then some indirecti=
on, because behind that interface may be one of three implementations, an X=
backend (gxdraw), which works directly with Xlib,
a GDK backend (ggdkdraw), which uses GDK to create/manage windows, and a P=
ostscript backend (gpsdraw), which is mostly not functional.<br>
<br>
From there, there=92s a somewhat functional, mostly broken toolkit of widge=
ts (ggadget/gwidget), which you can use, so you don=92t
<i>completely</i> have to implement everything from scratch.<o:p></o:p></sp=
an></p>
<ol style=3D"margin-top:0cm" start=3D"3" type=3D"1">
<li class=3D"MsoListParagraph" style=3D"color:black;margin-left:0cm;mso-lis=
t:l0 level1 lfo2">
<span style=3D"font-family:"Arial",sans-serif">Painfully. But in =
brief, you set up some state and desired attributes, then either call GDraw=
CreateTopWindow (toplevel windows) or GDrawCreateSubWindow (child windows).=
You then probably use some of the widgets from
gwidget/ggadget, which involves setting up a lot more state and some event=
handlers.<o:p></o:p></span></li><li class=3D"MsoListParagraph" style=3D"co=
lor:black;margin-left:0cm;mso-list:l0 level1 lfo2">
<span style=3D"font-family:"Arial",sans-serif">When a window is c=
onstructed, it passes in an event handler, in the source you=92ll often fin=
d it called *_e_h, e.g. splash_e_h. This receives information about things =
like mouse click/key events, expose (paint) events
etc. When you use premade widgets, you can sometimes pass in a callback to=
one of those as well, which just builds on that aforementioned event handl=
er.<o:p></o:p></span></li></ol>
<p class=3D"MsoNormal"><span style=3D"font-family:"Arial",sans-se=
rif;color:black"><o:p> </o:p></span></p>
<p class=3D"MsoNormal"><span style=3D"font-family:"Arial",sans-se=
rif;color:black">Jeremy<o:p></o:p></span></p>
<p class=3D"MsoNormal"><o:p> </o:p></p>
<p class=3D"MsoNormal"><o:p> </o:p></p>
<div style=3D"mso-element:para-border-div;border:none;border-top:solid #E1E=
1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class=3D"MsoNormal" style=3D"border:none;padding:0cm"><b>From: </b><a hr=
ef=3D"mailto:[email protected]">Thor Christopher</a><br>
<b>Sent: </b>Monday, 8 July 2019 10:45 PM<br>
<b>To: </b><a href=3D"mailto:[email protected]">fontfor=
[email protected]</a><br>
<b>Subject: </b>[fontforge-devel] Some rookie questions about GUI</p>
</div>
<p class=3D"MsoNormal"><o:p> </o:p></p>
<p class=3D"MsoNormal"><span style=3D"font-family:"Arial",sans-se=
rif">Hi, this might seem like some very basic stuff here, but I've been ski=
mming through the code just to get an overview on how FontForge is built an=
d some really basic stuff just seems difficult
to discern from the code and documentation alone.<br>
<br>
I think this project could learn a lot from InkScape when it comes to docum=
entation and code structure.<br>
<br>
Anyway, the first thing I do when I try and understand code is to look for =
the GUI code so I can see how the UI fits with the functionality of the pro=
gram. For FontForge this has been rather difficult, all I could find about =
the GUI from the docs is this part
from the FAQ:<br>
<i><br>
"<span style=3D"color:black">Why doesn't it use the <a name=
=3D"m_5755080053323772208_m_3795060750477440">native MS Windows or Mac=
windowing system?</a></span></i></span><span style=3D"mso-bookmark:m_57550=
80053323772208_m_3795060750477440">
<o:p></o:p></span></p>
<p class=3D"MsoNormal" style=3D"mso-margin-top-alt:auto;mso-margin-bottom-a=
lt:auto;margin-left:72.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo1">
<span style=3D"mso-bookmark:m_5755080053323772208_m_3795060750477440"><![if=
!supportLists]><span style=3D"font-size:10.0pt;font-family:Symbol;color:bl=
ack"><span style=3D"mso-list:Ignore">=B7<span style=3D"font:7.0pt "Tim=
es New Roman"">
</span></span></span><![endif]><i><span style=3D"font-family:"Arial&qu=
ot;,sans-serif;color:black">FontForge is not a commercial product and is no=
t bound by the constraints of the market.</span></i></span><span style=3D"m=
so-bookmark:m_5755080053323772208_m_3795060750477440"><span style=3D"color:=
black"><o:p></o:p></span></span></p>
<p class=3D"MsoNormal" style=3D"mso-margin-top-alt:auto;mso-margin-bottom-a=
lt:auto;margin-left:72.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo1">
<span style=3D"mso-bookmark:m_5755080053323772208_m_3795060750477440"><![if=
!supportLists]><span style=3D"font-size:10.0pt;font-family:Symbol;color:bl=
ack"><span style=3D"mso-list:Ignore">=B7<span style=3D"font:7.0pt "Tim=
es New Roman"">
</span></span></span><![endif]><i><span style=3D"font-family:"Arial&qu=
ot;,sans-serif;color:black">Doing that port doesn't interest me.</span></i>=
</span><span style=3D"mso-bookmark:m_5755080053323772208_m_3795060750477440=
"><span style=3D"color:black"><o:p></o:p></span></span></p>
<p class=3D"MsoNormal" style=3D"mso-margin-top-alt:auto;mso-margin-bottom-a=
lt:auto;margin-left:72.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo1">
<span style=3D"mso-bookmark:m_5755080053323772208_m_3795060750477440"><![if=
!supportLists]><span style=3D"font-size:10.0pt;font-family:Symbol;color:bl=
ack"><span style=3D"mso-list:Ignore">=B7<span style=3D"font:7.0pt "Tim=
es New Roman"">
</span></span></span><![endif]><i><span style=3D"font-family:"Arial&qu=
ot;,sans-serif;color:black">I don't have time nor do I have the skill to ta=
ke that task on.</span></i></span><span style=3D"mso-bookmark:m_57550800533=
23772208_m_3795060750477440"><span style=3D"color:black"><o:p></o:p></span>=
</span></p>
<p class=3D"MsoNormal" style=3D"mso-margin-top-alt:auto;mso-margin-bottom-a=
lt:auto;margin-left:72.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo1">
<span style=3D"mso-bookmark:m_5755080053323772208_m_3795060750477440"><![if=
!supportLists]><span style=3D"font-size:10.0pt;font-family:Symbol;color:bl=
ack"><span style=3D"mso-list:Ignore">=B7<span style=3D"font:7.0pt "Tim=
es New Roman"">
</span></span></span><![endif]><i><span style=3D"font-family:"Arial&qu=
ot;,sans-serif;color:black">I'd like to encourage people to use Linux/unix<=
/span></i></span><span style=3D"mso-bookmark:m_5755080053323772208_m_379506=
0750477440"><span style=3D"color:black"><o:p></o:p></span></span></p>
<p style=3D"margin-left:36.0pt"><span style=3D"mso-bookmark:m_5755080053323=
772208_m_3795060750477440"><i><span style=3D"font-family:"Arial",=
sans-serif;color:black">Of course, if I were to use either </span></i>=
</span><a href=3D"https://fontforge.github.io/faq.html#widget-set" target=
=3D"_blank"><span style=3D"mso-bookmark:m_5755080053323772208_m_37950607504=
77440"><i><span style=3D"font-family:"Arial",sans-serif;color:#33=
3333">gtk
or qt</span></i></span><span style=3D"mso-bookmark:m_5755080053323772208_m=
_3795060750477440"></span></a><span style=3D"mso-bookmark:m_575508005332377=
2208_m_3795060750477440"><i><span style=3D"font-family:"Arial",sa=
ns-serif;color:black"> some of the difficulties
of porting would vanish. But unfortunately I don't like either of those wi=
dget sets.</span></i><span style=3D"color:black"><o:p></o:p></span></span><=
/p>
<p style=3D"margin-left:36.0pt"><span style=3D"mso-bookmark:m_5755080053323=
772208_m_3795060750477440"><i><span style=3D"font-family:"Arial",=
sans-serif;color:black">Now... if you would like to do the port, =
that would be wonderful. I encourage you to do so.</span></i><span style=3D=
"color:black"><o:p></o:p></span></span></p>
<p class=3D"MsoNormal"><span style=3D"mso-bookmark:m_5755080053323772208_m_=
3795060750477440"><i><span style=3D"font-family:"Arial",sans-seri=
f;color:black"> Why is FontForge based on a non-standard widget set? .=
.."</span></i></span><span style=3D"mso-bookmark:m_5755080053323772208=
_m_3795060750477440"></span><span style=3D"color:black"><o:p></o:p></span><=
/p>
<p class=3D"MsoNormal"><span style=3D"color:black"><o:p> </o:p></span>=
</p>
<p class=3D"MsoNormal"><span style=3D"font-family:"Arial",sans-se=
rif;color:black">None of this information explains what this widget set is =
or how it draws its GUI, the only hint I've found is that it uses Cairo, so=
mewhere in the code it looks like it draws the
GUI pixel by pixel, and there's a GDraw directory with some datatypes such=
as GWindow and GWidget that seem to be related to the UI, but trying to fo=
llow the function calls and see where it ends it's very difficult to get an=
idea on how the GUI code works.</span><span style=3D"color:black"><o:p></o=
:p></span></p>
<p class=3D"MsoNormal"><span style=3D"color:black"><o:p> </o:p></span>=
</p>
<p class=3D"MsoNormal"><span style=3D"font-family:"Arial",sans-se=
rif;color:black">Since I'm still confused about this, I think this is proba=
bly something a lot of other people might have a problem understanding as w=
ell when they first start looking into the FontForge
source code. I'd say it increases the learning curve and reduces the possi=
bility of more developers contributing to this project.<br>
<br>
Maybe you should have a more in depth overview on which libraries are used =
and how they work in the docs?<br>
<br>
Some of my questions are:</span><span style=3D"color:black"><o:p></o:p></sp=
an></p>
<p class=3D"MsoNormal"><span style=3D"font-family:"Arial",sans-se=
rif;color:black"><br>
1. What is the name of this non-standard widget set? </span><span styl=
e=3D"color:black"><o:p></o:p></span></p>
<p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"font-f=
amily:"Arial",sans-serif;color:black">2. Is there any documentati=
on for how it works?<br>
3. How is a window created using this widget set?<br>
4. Where do I find the event listeners? Is it a signal/slot pattern, or som=
ething else?</span><span style=3D"color:black"><o:p></o:p></span></p>
<p class=3D"MsoNormal"><span style=3D"font-family:"Arial",sans-se=
rif;color:black">Hope I'm not spamming with too basic stuff here, but I've =
been trying to get into the code without any luck several times now, and I'=
m starting to think this is something other people
might want to know about as well.</span><span style=3D"color:black"><o:p><=
/o:p></span></p>
<p class=3D"MsoNormal"><span style=3D"color:black"><o:p> </o:p></span>=
</p>
<p class=3D"MsoNormal"><span style=3D"font-family:"Arial",sans-se=
rif;color:black"> - Thor Arisland</span><span style=3D"color:black"><o=
:p></o:p></span></p>
<p class=3D"MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>
--_000_SYAPR01MB3040833E55C8F7A0AADD0263C2CF0SYAPR01MB3040ausp_--
--===============1499409796628532336==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
--===============1499409796628532336==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
_______________________________________________
fontforge-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/fontforge-devel
http://fontforge.10959.n7.nabble.com/Developer-f3.html
--===============1499409796628532336==--