10#define TABLESIZE 65536
12#define pow2(i) ((i)*(i))
14#define add(i) if(next[(i)]==(i)&&last!=(i)) {if(last!=-1) next[last]=(i),last=(i); else last=first=(i);}
15#define dist(i1,i2,i3,i4,i5,y1,y2,y3,y4,y5) (2*(pow2((int)(i1)-(int)(y1))+pow2((int)(i2)-(int)(y2))+(pow2((int)(i3)-(int)(y3))+pow2((int)(i4)-(int)(y4))))+1*pow2((int)(i5)-(int)(y5)))
16#define dist1(i1,i2,i3,i4,i5,y1,y2,y3,y4,y5) ((pow2((int)(i1)-(int)(y1))+pow2((int)(i2)-(int)(y2))+(pow2((int)(i3)-(int)(y3))+pow2((int)(i4)-(int)(y4))))+2*pow2((int)(i5)-(int)(y5)))
17#define pos(i1,i2,i3,i4) (((int)(i1)<<12)+((int)(i2)<<8)+((int)(i3)<<4)+(int)(i4))
19#define postoparams(pos,i1,i2,i3,i4) \
20 ((i1)=(pos)>>12),((i2)=((pos)>>8)&15),((i3)=((pos)>>4)&15),((i4)=((pos))&15)
22int priority[]={4,5,3,2,1};
29 struct aa_font *currfont = c->params.font;
30 int supported = c->params.supported;
34 unsigned short *table;
35 unsigned short *filltable;
37 next = (
unsigned short *) malloc(
sizeof(*next) * TABLESIZE);
39 table = (
unsigned short *) calloc(1, TABLESIZE *
sizeof(*table));
40 filltable = (
unsigned short *) calloc(1, 256 *
sizeof(*filltable));
43 for (i = 0; i < TABLESIZE; i++)
44 next[i] = i, table[i] = 0;
45 aa_calcparams(currfont,
parameters, supported,c->params.dimmul, c->params.boldmul);
47 for (i = 0; i < NCHARS; i++) {
48 if (ALOWED(i, supported)) {
64 pos = pos(p1, p2, p3, p4);
71 sum = p1 + p2 + p3 + p4;
77 p1, p2, p3, p4, sum)) >=
83 p1, p2, p3, p4, sum))&&(p1!=p2||priority[i/256]<=priority[table[pos]/256]))
92 for (pos = 0; pos < 256; pos++) {
93 int mindist = INT_MAX, d1;
94 for (i = 0; i < NCHARS; i++) {
95 if (ALOWED(i, supported)) {
101 pos, pos, pos, pos, pos*4)) <= mindist&&(d1!=mindist||priority[i/256]>priority[filltable[pos]/256]))
102 filltable[pos] = i, mindist = d1;
118 int m1, m2, m3, m4, ii, dm;
119 unsigned short c = table[i];
121 postoparams(i, m1, m2, m3, m4);
122 for (dm = 0; dm < 4; dm++)
123 for (ii = -1; ii <= 1; ii += 2) {
124 int dist, dist1, index;
133 if (i1 < 0 || i1 >= 16)
138 if (i2 < 0 || i2 >= 16)
143 if (i3 < 0 || i3 >= 16)
148 if (i4 < 0 || i4 >= 16)
153 index = pos(i1, i2, i3, i4);
155 if (ch == c || index == blocked)
158 int ii1 = (i1 << 4) + i1;
159 int ii2 = (i2 << 4) + i2;
160 int ii3 = (i3 << 4) + i3;
161 int ii4 = (i4 << 4) + i4;
162 int iisum = ii1 + ii2 + ii3 + ii4;
164 ii1, ii2, ii3, ii4, iisum,
171 ii1, ii2, ii3, ii4, iisum,
178 if (!ch || dist < dist1) {
191 c->filltable = filltable;