2005-07-02, 01:04
hi all,
i have the code for implementing font shaping. it is a simple method of "lookup and replace". the function the do the font shaping takes a string as an argument and returns the string with the proper font shape. can someone give me a few pointer on how subtitles are displayed. this was mint to be a helper function for fribidi. as fribidi does not support font shaping and the developers are working on that issue for version 2.
the code for the function
thanks in advance for any help
ps : orginal coder mohamed abdel-monem
i have the code for implementing font shaping. it is a simple method of "lookup and replace". the function the do the font shaping takes a string as an argument and returns the string with the proper font shape. can someone give me a few pointer on how subtitles are displayed. this was mint to be a helper function for fribidi. as fribidi does not support font shaping and the developers are working on that issue for version 2.
the code for the function
Quote:#define n_distinct_characters 36
//////////////////////////////////////////////////////////////////////
isfromtheset1(wchar ch)
{
static wchar theset1[22]={
0x62c, 0x62d, 0x62e, 0x647, 0x639, 0x63a, 0x641, 0x642,
0x62b, 0x635, 0x636, 0x637, 0x643, 0x645, 0x646, 0x62a,
0x644, 0x628, 0x64a, 0x633, 0x634, 0x638};
int i = 0;
while (i < 22)
{
if(ch == theset1[i])
return true;
++i;
}
return false;
}
//////////////////////////////////////////////////////////////////////
isfromtheset2(wchar ch)
{
static wchar theset2[12]={
0x627, 0x623, 0x625, 0x622, 0x62f, 0x630, 0x631, 0x632,
0x648, 0x624, 0x629, 0x649};
int i = 0;
while (i < 12)
{
if(ch == theset2[i])
return true;
++i;
}
return false;
}
//////////////////////////////////////////////////////////////////////
cstdstringw arabicfontshaping (lpctstr in)
{
static struct
{
wchar character;
wchar endglyph;
wchar iniglyph;
wchar midglyph;
wchar isoglyph;
}a[n_distinct_characters]=
{
{0x630, 0xfeac, 0xfeab, 0xfeac, 0xfeab},
{0x62f, 0xfeaa, 0xfea9, 0xfeaa, 0xfea9},
{0x62c, 0xfe9e, 0xfe9f, 0xfea0, 0xfe9d},
{0x62d, 0xfea2, 0xfea3, 0xfea4, 0xfea1},
{0x62e, 0xfea6, 0xfea7, 0xfea8, 0xfea5},
{0x647, 0xfeea, 0xfeeb, 0xfeec, 0xfee9},
{0x639, 0xfeca, 0xfecb, 0xfecc, 0xfec9},
{0x63a, 0xfece, 0xfecf, 0xfed0, 0xfecd},
{0x641, 0xfed2, 0xfed3, 0xfed4, 0xfed1},
{0x642, 0xfed6, 0xfed7, 0xfed8, 0xfed5},
{0x62b, 0xfe9a, 0xfe9b, 0xfe9c, 0xfe99},
{0x635, 0xfeba, 0xfebb, 0xfebc, 0xfeb9},
{0x636, 0xfebe, 0xfebf, 0xfec0, 0xfebd},
{0x637, 0xfec2, 0xfec3, 0xfec4, 0xfec1},
{0x643, 0xfeda, 0xfedb, 0xfedc, 0xfed9},
{0x645, 0xfee2, 0xfee3, 0xfee4, 0xfee1},
{0x646, 0xfee6, 0xfee7, 0xfee8, 0xfee5},
{0x62a, 0xfe96, 0xfe97, 0xfe98, 0xfe95},
{0x627, 0xfe8e, 0xfe8d, 0xfe8e, 0xfe8d},
{0x644, 0xfede, 0xfedf, 0xfee0, 0xfedd},
{0x628, 0xfe90, 0xfe91, 0xfe92, 0xfe8f},
{0x64a, 0xfef2, 0xfef3, 0xfef4, 0xfef1},
{0x633, 0xfeb2, 0xfeb3, 0xfeb4, 0xfeb1},
{0x634, 0xfeb6, 0xfeb7, 0xfeb8, 0xfeb5},
{0x638, 0xfec6, 0xfec7, 0xfec8, 0xfec5},
{0x632, 0xfeb0, 0xfeaf, 0xfeb0, 0xfeaf},
{0x648, 0xfeee, 0xfeed, 0xfeee, 0xfeed},
{0x629, 0xfe94, 0xfe93, 0xfe93, 0xfe93},
{0x649, 0xfef0, 0xfeef, 0xfef0, 0xfeef},
{0x631, 0xfeae, 0xfead, 0xfeae, 0xfead},
{0x624, 0xfe86, 0xfe85, 0xfe86, 0xfe85},
{0x621, 0xfe80, 0xfe80, 0xfe80, 0xfe7f},
{0x626, 0xfe8a, 0xfe8b, 0xfe8c, 0xfe89},
{0x623, 0xfe84, 0xfe83, 0xfe84, 0xfe83},
{0x622, 0xfe82, 0xfe81, 0xfe82, 0xfe81},
{0x625, 0xfe88, 0xfe87, 0xfe88, 0xfe87}
};
bool linkbefore, linkafter;
cstdstringw out;
out=in;
for(uint i=0; i<_tcslen(in); i++)
{
wchar ch=in[i];
if((ch>=0x0621 && ch<=0x064a)) // is an arabic character?
{
int idx = 0;
while (idx < n_distinct_characters)
{
if (a[idx].character == in[i])
break;
++idx;
}
if(i == _tcslen(in) - 1)
linkafter=0;
else
linkafter = (isfromtheset1(in[i+1]) ||
isfromtheset2(in[i+1]));
if(i == 0)
linkbefore=0;
else
linkbefore=isfromtheset1(in[i-1]);
if(linkbefore && linkafter)
out.setat(i, a[idx].midglyph);
if(linkbefore && !linkafter)
out.setat(i, a[idx].endglyph);
if(!linkbefore && linkafter)
out.setat(i, a[idx].iniglyph);
if(!linkbefore && !linkafter)
out.setat(i, a[idx].isoglyph);
}
}
return out;
}
thanks in advance for any help
ps : orginal coder mohamed abdel-monem