sdk-world v2026.11.05
PS2 SDK - world tier (copyleft-allowed, non-essential packages)
Loading...
Searching...
No Matches
aamktabl.c
1#include <stdio.h>
2#include <limits.h>
3#include <ctype.h>
4#include <stdlib.h>
5#include <string.h>
6#include "aalib.h"
7#include "aaint.h"
8#include "aamktabl.h"
9#include "config.h"
10#define TABLESIZE 65536
11
12#define pow2(i) ((i)*(i))
13/*#define pow2(i) (abs(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))
18
19#define postoparams(pos,i1,i2,i3,i4) \
20 ((i1)=(pos)>>12),((i2)=((pos)>>8)&15),((i3)=((pos)>>4)&15),((i4)=((pos))&15)
21
22int priority[]={4,5,3,2,1};
23
24unsigned short *aa_mktable(aa_context * c)
25{
26 int i;
27 int i1, i2, i3, i4;
28 int sum, pos;
29 struct aa_font *currfont = c->params.font;
30 int supported = c->params.supported;
31 unsigned short *next;
32 int first = -1;
33 int last = -1;
34 unsigned short *table;
35 unsigned short *filltable;
36 static struct parameters *parameters;
37 next = (unsigned short *) malloc(sizeof(*next) * TABLESIZE);
38 parameters = (struct parameters *) calloc(1, sizeof(struct parameters) * (NCHARS + 1));
39 table = (unsigned short *) calloc(1, TABLESIZE * sizeof(*table));
40 filltable = (unsigned short *) calloc(1, 256 * sizeof(*filltable));
41 first = -1;
42 last = -1;
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);
46
47 for (i = 0; i < NCHARS; i++) {
48 if (ALOWED(i, supported)) {
49 int p1, p2, p3, p4;
50 i1 = parameters[i].p[0];
51 i2 = parameters[i].p[1];
52 i3 = parameters[i].p[2];
53 i4 = parameters[i].p[3];
54 p1 = i1 >> 4;
55 p2 = i2 >> 4;
56 p3 = i3 >> 4;
57 p4 = i4 >> 4;
58 /*
59 if(p1>15) p1=15;
60 if(p2>15) p2=15;
61 if(p3>15) p3=15;
62 if(p4>15) p4=15; */
63 sum = parameters[i].p[4];
64 pos = pos(p1, p2, p3, p4);
65 if (table[pos]) {
66 int sum;
67 p1 = (p1 << 4) + p1;
68 p2 = (p2 << 4) + p2;
69 p3 = (p3 << 4) + p3;
70 p4 = (p4 << 4) + p4;
71 sum = p1 + p2 + p3 + p4;
72 if ((p1=dist(parameters[i].p[0],
73 parameters[i].p[1],
74 parameters[i].p[2],
75 parameters[i].p[3],
76 parameters[i].p[4],
77 p1, p2, p3, p4, sum)) >=
78 (p1=dist(parameters[table[pos]].p[0],
79 parameters[table[pos]].p[1],
80 parameters[table[pos]].p[2],
81 parameters[table[pos]].p[3],
82 parameters[table[pos]].p[4],
83 p1, p2, p3, p4, sum))&&(p1!=p2||priority[i/256]<=priority[table[pos]/256]))
84 goto skip;
85 }
86 table[pos] = i;
87 add(pos);
88 skip:;
89
90 }
91 }
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)) {
96 if ((d1 = dist1(parameters[i].p[0],
97 parameters[i].p[1],
98 parameters[i].p[2],
99 parameters[i].p[3],
100 parameters[i].p[4],
101 pos, pos, pos, pos, pos*4)) <= mindist&&(d1!=mindist||priority[i/256]>priority[filltable[pos]/256]))
102 filltable[pos] = i, mindist = d1;
103 }
104 }
105 }
106 do {
107 int blocked;
108 if (last != -1)
109 next[last] = last;
110 else
111 break;
112 blocked = last;
113 i = first;
114 if (i == -1)
115 break;
116 first = last = -1;
117 do {
118 int m1, m2, m3, m4, ii, dm;
119 unsigned short c = table[i];
120 /* printf ("%c\n", c); */
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;
125 unsigned short ch;
126 i1 = m1;
127 i2 = m2;
128 i3 = m3;
129 i4 = m4;
130 switch (dm) {
131 case 0:
132 i1 += ii;
133 if (i1 < 0 || i1 >= 16)
134 continue;
135 break;
136 case 1:
137 i2 += ii;
138 if (i2 < 0 || i2 >= 16)
139 continue;
140 break;
141 case 2:
142 i3 += ii;
143 if (i3 < 0 || i3 >= 16)
144 continue;
145 break;
146 case 3:
147 i4 += ii;
148 if (i4 < 0 || i4 >= 16)
149 continue;
150 break;
151
152 }
153 index = pos(i1, i2, i3, i4);
154 ch = table[index];
155 if (ch == c || index == blocked)
156 continue;
157 if (ch) {
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;
163 dist = dist(
164 ii1, ii2, ii3, ii4, iisum,
165 parameters[c].p[0],
166 parameters[c].p[1],
167 parameters[c].p[2],
168 parameters[c].p[3],
169 parameters[c].p[4]);
170 dist1 = dist(
171 ii1, ii2, ii3, ii4, iisum,
172 parameters[ch].p[0],
173 parameters[ch].p[1],
174 parameters[ch].p[2],
175 parameters[ch].p[3],
176 parameters[ch].p[4]);
177 }
178 if (!ch || dist < dist1) {
179 table[index] = c;
180 add(index);
181 }
182 }
183 i1 = i;
184 i = next[i];
185 next[i1] = i1;
186 }
187 while (i != i1);
188 }
189 while (last != -1);
190 c->table = table;
191 c->filltable = filltable;
192 c->parameters = parameters;
193 free(next);
194 return (table);
195}