00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef _INSTFONT_H
00014 #define _INSTFONT_H
00015
00016 #include <stdlib.h>
00017 #include <stdio.h>
00018
00019
00020
00021
00022
00023
00024 #define FONTTABLEDATA \
00025 0XFFFFFFFF, 0XFFFFFFFF, 0XFFFFFFFF, 0XFFFFFFFF, \
00026 0X817E0000, 0XA58181A5, 0X7E818199, 0X0, \
00027 0XFF7E0000, 0XDBFFFFDB, 0X7EFFFFE7, 0X0, \
00028 0X0, 0X7F7F7F36, 0X81C3E7F, 0X0, \
00029 0X0, 0X7F3E1C08, 0X81C3E, 0X0, \
00030 0X18000000, 0XE7E73C3C, 0X3C1818E7, 0X0, \
00031 0X18000000, 0XFFFF7E3C, 0X3C18187E, 0X0, \
00032 0X0, 0X3C180000, 0X183C, 0X0, \
00033 0XFFFFFFFF, 0XC3E7FFFF, 0XFFFFE7C3, 0XFFFFFFFF, \
00034 0X0, 0X42663C00, 0X3C6642, 0X0, \
00035 0XFFFFFFFF, 0XBD99C3FF, 0XFFC399BD, 0XFFFFFFFF, \
00036 0X60780000, 0X331E5870, 0X1E333333, 0X0, \
00037 0X663C0000, 0X3C666666, 0X18187E18, 0X0, \
00038 0XCCFC0000, 0XC0C0CFC, 0X70F0E0C, 0X0, \
00039 0XC6FE0000, 0XC6C6C6FE, 0X67E7E6C6, 0X3, \
00040 0X18000000, 0XE73CDB18, 0X1818DB3C, 0X0, \
00041 0X7030100, 0X1F7F1F0F, 0X103070F, 0X0, \
00042 0X70604000, 0X7C7F7C78, 0X40607078, 0X0, \
00043 0X3C180000, 0X1818187E, 0X183C7E, 0X0, \
00044 0X66660000, 0X66666666, 0X66660066, 0X0, \
00045 0XDBFE0000, 0XD8DEDBDB, 0XD8D8D8D8, 0X0, \
00046 0X6633E00, 0X6363361C, 0X63301C36, 0X3E, \
00047 0X0, 0X0, 0X7F7F7F7F, 0X0, \
00048 0X3C180000, 0X1818187E, 0X7E183C7E, 0X0, \
00049 0X3C180000, 0X1818187E, 0X18181818, 0X0, \
00050 0X18180000, 0X18181818, 0X183C7E18, 0X0, \
00051 0X0, 0X7F301800, 0X1830, 0X0, \
00052 0X0, 0X7F060C00, 0XC06, 0X0, \
00053 0X0, 0X3030000, 0X7F03, 0X0, \
00054 0X0, 0X7F361400, 0X1436, 0X0, \
00055 0X0, 0X3E1C1C08, 0X7F7F3E, 0X0, \
00056 0X0, 0X3E3E7F7F, 0X81C1C, 0X0, \
00057 0X0, 0X0, 0X0, 0X0, \
00058 0X3C180000, 0X18183C3C, 0X18180018, 0X0, \
00059 0X66666600, 0X24, 0X0, 0X0, \
00060 0X36000000, 0X36367F36, 0X36367F36, 0X0, \
00061 0X633E1818, 0X603E0343, 0X3E636160, 0X1818, \
00062 0X0, 0X18306343, 0X6163060C, 0X0, \
00063 0X361C0000, 0X3B6E1C36, 0X6E333333, 0X0, \
00064 0XC0C0C00, 0X6, 0X0, 0X0, \
00065 0X18300000, 0XC0C0C0C, 0X30180C0C, 0X0, \
00066 0X180C0000, 0X30303030, 0XC183030, 0X0, \
00067 0X0, 0XFF3C6600, 0X663C, 0X0, \
00068 0X0, 0X7E181800, 0X1818, 0X0, \
00069 0X0, 0X0, 0X18181800, 0XC, \
00070 0X0, 0X7F000000, 0X0, 0X0, \
00071 0X0, 0X0, 0X18180000, 0X0, \
00072 0X0, 0X18306040, 0X103060C, 0X0, \
00073 0X361C0000, 0X6B6B6363, 0X1C366363, 0X0, \
00074 0X1C180000, 0X1818181E, 0X7E181818, 0X0, \
00075 0X633E0000, 0XC183060, 0X7F630306, 0X0, \
00076 0X633E0000, 0X603C6060, 0X3E636060, 0X0, \
00077 0X38300000, 0X7F33363C, 0X78303030, 0X0, \
00078 0X37F0000, 0X603F0303, 0X3E636060, 0X0, \
00079 0X61C0000, 0X633F0303, 0X3E636363, 0X0, \
00080 0X637F0000, 0X18306060, 0XC0C0C0C, 0X0, \
00081 0X633E0000, 0X633E6363, 0X3E636363, 0X0, \
00082 0X633E0000, 0X607E6363, 0X1E306060, 0X0, \
00083 0X0, 0X1818, 0X181800, 0X0, \
00084 0X0, 0X1818, 0XC181800, 0X0, \
00085 0X60000000, 0X60C1830, 0X6030180C, 0X0, \
00086 0X0, 0X7E00, 0X7E, 0X0, \
00087 0X6000000, 0X6030180C, 0X60C1830, 0X0, \
00088 0X633E0000, 0X18183063, 0X18180018, 0X0, \
00089 0X3E000000, 0X7B7B6363, 0X3E033B7B, 0X0, \
00090 0X1C080000, 0X7F636336, 0X63636363, 0X0, \
00091 0X663F0000, 0X663E6666, 0X3F666666, 0X0, \
00092 0X663C0000, 0X3030343, 0X3C664303, 0X0, \
00093 0X361F0000, 0X66666666, 0X1F366666, 0X0, \
00094 0X667F0000, 0X161E1646, 0X7F664606, 0X0, \
00095 0X667F0000, 0X161E1646, 0XF060606, 0X0, \
00096 0X663C0000, 0X7B030343, 0X5C666363, 0X0, \
00097 0X63630000, 0X637F6363, 0X63636363, 0X0, \
00098 0X183C0000, 0X18181818, 0X3C181818, 0X0, \
00099 0X30780000, 0X30303030, 0X1E333333, 0X0, \
00100 0X66670000, 0X1E1E3666, 0X67666636, 0X0, \
00101 0X60F0000, 0X6060606, 0X7F664606, 0X0, \
00102 0X77630000, 0X636B7F7F, 0X63636363, 0X0, \
00103 0X67630000, 0X737B7F6F, 0X63636363, 0X0, \
00104 0X633E0000, 0X63636363, 0X3E636363, 0X0, \
00105 0X663F0000, 0X63E6666, 0XF060606, 0X0, \
00106 0X633E0000, 0X63636363, 0X3E7B6B63, 0X7030, \
00107 0X663F0000, 0X363E6666, 0X67666666, 0X0, \
00108 0X633E0000, 0X301C0663, 0X3E636360, 0X0, \
00109 0X7E7E0000, 0X1818185A, 0X3C181818, 0X0, \
00110 0X63630000, 0X63636363, 0X3E636363, 0X0, \
00111 0X63630000, 0X63636363, 0X81C3663, 0X0, \
00112 0X63630000, 0X6B6B6363, 0X36777F6B, 0X0, \
00113 0X63630000, 0X1C1C3E36, 0X6363363E, 0X0, \
00114 0X66660000, 0X183C6666, 0X3C181818, 0X0, \
00115 0X637F0000, 0XC183061, 0X7F634306, 0X0, \
00116 0XC3C0000, 0XC0C0C0C, 0X3C0C0C0C, 0X0, \
00117 0X1000000, 0X1C0E0703, 0X40607038, 0X0, \
00118 0X303C0000, 0X30303030, 0X3C303030, 0X0, \
00119 0X63361C08, 0X0, 0X0, 0X0, \
00120 0X0, 0X0, 0X0, 0XFF00, \
00121 0X180C0C, 0X0, 0X0, 0X0, \
00122 0X0, 0X3E301E00, 0X6E333333, 0X0, \
00123 0X6070000, 0X66361E06, 0X3E666666, 0X0, \
00124 0X0, 0X3633E00, 0X3E630303, 0X0, \
00125 0X30380000, 0X33363C30, 0X6E333333, 0X0, \
00126 0X0, 0X7F633E00, 0X3E630303, 0X0, \
00127 0X361C0000, 0X60F0626, 0XF060606, 0X0, \
00128 0X0, 0X33336E00, 0X3E333333, 0X1E3330, \
00129 0X6070000, 0X666E3606, 0X67666666, 0X0, \
00130 0X18180000, 0X18181C00, 0X3C181818, 0X0, \
00131 0X60600000, 0X60607000, 0X60606060, 0X3C6666, \
00132 0X6070000, 0X1E366606, 0X6766361E, 0X0, \
00133 0X181C0000, 0X18181818, 0X3C181818, 0X0, \
00134 0X0, 0X6B7F3700, 0X636B6B6B, 0X0, \
00135 0X0, 0X66663B00, 0X66666666, 0X0, \
00136 0X0, 0X63633E00, 0X3E636363, 0X0, \
00137 0X0, 0X66663B00, 0X3E666666, 0XF0606, \
00138 0X0, 0X33336E00, 0X3E333333, 0X783030, \
00139 0X0, 0X666E3B00, 0XF060606, 0X0, \
00140 0X0, 0X6633E00, 0X3E63301C, 0X0, \
00141 0XC080000, 0XC0C3F0C, 0X386C0C0C, 0X0, \
00142 0X0, 0X33333300, 0X6E333333, 0X0, \
00143 0X0, 0X66666600, 0X183C6666, 0X0, \
00144 0X0, 0X6B636300, 0X367F6B6B, 0X0, \
00145 0X0, 0X1C366300, 0X63361C1C, 0X0, \
00146 0X0, 0X63636300, 0X7E636363, 0X1F3060, \
00147 0X0, 0X18337F00, 0X7F63060C, 0X0, \
00148 0X18700000, 0X180E1818, 0X70181818, 0X0, \
00149 0X18180000, 0X18001818, 0X18181818, 0X0, \
00150 0X180E0000, 0X18701818, 0XE181818, 0X0, \
00151 0X3B6E0000, 0X0, 0X0, 0X0, \
00152 0X0, 0X63361C08, 0X7F6363, 0X0, \
00153 0X663C0000, 0X3030343, 0X303C6643, 0X3E60, \
00154 0X330000, 0X33333300, 0X6E333333, 0X0, \
00155 0XC183000, 0X7F633E00, 0X3E630303, 0X0, \
00156 0X361C0800, 0X3E301E00, 0X6E333333, 0X0, \
00157 0X330000, 0X3E301E00, 0X6E333333, 0X0, \
00158 0X180C0600, 0X3E301E00, 0X6E333333, 0X0, \
00159 0X1C361C00, 0X3E301E00, 0X6E333333, 0X0, \
00160 0X0, 0X606663C, 0X60303C66, 0X3C, \
00161 0X361C0800, 0X7F633E00, 0X3E630303, 0X0, \
00162 0X630000, 0X7F633E00, 0X3E630303, 0X0, \
00163 0X180C0600, 0X7F633E00, 0X3E630303, 0X0, \
00164 0X660000, 0X18181C00, 0X3C181818, 0X0, \
00165 0X663C1800, 0X18181C00, 0X3C181818, 0X0, \
00166 0X180C0600, 0X18181C00, 0X3C181818, 0X0, \
00167 0X8006300, 0X6363361C, 0X6363637F, 0X0, \
00168 0X1C361C, 0X6363361C, 0X6363637F, 0X0, \
00169 0X60C18, 0X3E06667F, 0X7F660606, 0X0, \
00170 0X0, 0X6C6E3300, 0X761B1B7E, 0X0, \
00171 0X367C0000, 0X337F3333, 0X73333333, 0X0, \
00172 0X361C0800, 0X63633E00, 0X3E636363, 0X0, \
00173 0X630000, 0X63633E00, 0X3E636363, 0X0, \
00174 0X180C0600, 0X63633E00, 0X3E636363, 0X0, \
00175 0X331E0C00, 0X33333300, 0X6E333333, 0X0, \
00176 0X180C0600, 0X33333300, 0X6E333333, 0X0, \
00177 0X630000, 0X63636300, 0X7E636363, 0X1E3060, \
00178 0X3E006300, 0X63636363, 0X3E636363, 0X0, \
00179 0X63006300, 0X63636363, 0X3E636363, 0X0, \
00180 0X3C181800, 0X6060666, 0X18183C66, 0X0, \
00181 0X26361C00, 0X6060F06, 0X3F670606, 0X0, \
00182 0X66660000, 0X187E183C, 0X1818187E, 0X0, \
00183 0X33331F00, 0X7B33231F, 0X63333333, 0X0, \
00184 0X18D87000, 0X187E1818, 0X18181818, 0XE1B, \
00185 0X60C1800, 0X3E301E00, 0X6E333333, 0X0, \
00186 0XC183000, 0X18181C00, 0X3C181818, 0X0, \
00187 0X60C1800, 0X63633E00, 0X3E636363, 0X0, \
00188 0X60C1800, 0X33333300, 0X6E333333, 0X0, \
00189 0X3B6E0000, 0X66663B00, 0X66666666, 0X0, \
00190 0X63003B6E, 0X7B7F6F67, 0X63636373, 0X0, \
00191 0X36363C00, 0X7E007C, 0X0, 0X0, \
00192 0X36361C00, 0X3E001C, 0X0, 0X0, \
00193 0XC0C0000, 0X60C0C00, 0X3E636303, 0X0, \
00194 0X0, 0X37F0000, 0X30303, 0X0, \
00195 0X0, 0X607F0000, 0X606060, 0X0, \
00196 0X43030300, 0XC183363, 0X30613B06, 0X7C18, \
00197 0X43030300, 0XC183363, 0X7C797366, 0X6060, \
00198 0X18180000, 0X18181800, 0X183C3C3C, 0X0, \
00199 0X0, 0X1B366C00, 0X6C36, 0X0, \
00200 0X0, 0X6C361B00, 0X1B36, 0X0, \
00201 0X22882288, 0X22882288, 0X22882288, 0X22882288, \
00202 0X55AA55AA, 0X55AA55AA, 0X55AA55AA, 0X55AA55AA, \
00203 0XEEBBEEBB, 0XEEBBEEBB, 0XEEBBEEBB, 0XEEBBEEBB, \
00204 0X18181818, 0X18181818, 0X18181818, 0X18181818, \
00205 0X18181818, 0X1F181818, 0X18181818, 0X18181818, \
00206 0X18181818, 0X1F181F18, 0X18181818, 0X18181818, \
00207 0X6C6C6C6C, 0X6F6C6C6C, 0X6C6C6C6C, 0X6C6C6C6C, \
00208 0X0, 0X7F000000, 0X6C6C6C6C, 0X6C6C6C6C, \
00209 0X0, 0X1F181F00, 0X18181818, 0X18181818, \
00210 0X6C6C6C6C, 0X6F606F6C, 0X6C6C6C6C, 0X6C6C6C6C, \
00211 0X6C6C6C6C, 0X6C6C6C6C, 0X6C6C6C6C, 0X6C6C6C6C, \
00212 0X0, 0X6F607F00, 0X6C6C6C6C, 0X6C6C6C6C, \
00213 0X6C6C6C6C, 0X7F606F6C, 0X0, 0X0, \
00214 0X6C6C6C6C, 0X7F6C6C6C, 0X0, 0X0, \
00215 0X18181818, 0X1F181F18, 0X0, 0X0, \
00216 0X0, 0X1F000000, 0X18181818, 0X18181818, \
00217 0X18181818, 0XF8181818, 0X0, 0X0, \
00218 0X18181818, 0XFF181818, 0X0, 0X0, \
00219 0X0, 0XFF000000, 0X18181818, 0X18181818, \
00220 0X18181818, 0XF8181818, 0X18181818, 0X18181818, \
00221 0X0, 0XFF000000, 0X0, 0X0, \
00222 0X18181818, 0XFF181818, 0X18181818, 0X18181818, \
00223 0X18181818, 0XF818F818, 0X18181818, 0X18181818, \
00224 0X6C6C6C6C, 0XEC6C6C6C, 0X6C6C6C6C, 0X6C6C6C6C, \
00225 0X6C6C6C6C, 0XFC0CEC6C, 0X0, 0X0, \
00226 0X0, 0XEC0CFC00, 0X6C6C6C6C, 0X6C6C6C6C, \
00227 0X6C6C6C6C, 0XFF00EF6C, 0X0, 0X0, \
00228 0X0, 0XEF00FF00, 0X6C6C6C6C, 0X6C6C6C6C, \
00229 0X6C6C6C6C, 0XEC0CEC6C, 0X6C6C6C6C, 0X6C6C6C6C, \
00230 0X0, 0XFF00FF00, 0X0, 0X0, \
00231 0X6C6C6C6C, 0XEF00EF6C, 0X6C6C6C6C, 0X6C6C6C6C, \
00232 0X18181818, 0XFF00FF18, 0X0, 0X0, \
00233 0X6C6C6C6C, 0XFF6C6C6C, 0X0, 0X0, \
00234 0X0, 0XFF00FF00, 0X18181818, 0X18181818, \
00235 0X0, 0XFF000000, 0X6C6C6C6C, 0X6C6C6C6C, \
00236 0X6C6C6C6C, 0XFC6C6C6C, 0X0, 0X0, \
00237 0X18181818, 0XF818F818, 0X0, 0X0, \
00238 0X0, 0XF818F800, 0X18181818, 0X18181818, \
00239 0X0, 0XFC000000, 0X6C6C6C6C, 0X6C6C6C6C, \
00240 0X6C6C6C6C, 0XFF6C6C6C, 0X6C6C6C6C, 0X6C6C6C6C, \
00241 0X18181818, 0XFF18FF18, 0X18181818, 0X18181818, \
00242 0X18181818, 0X1F181818, 0X0, 0X0, \
00243 0X0, 0XF8000000, 0X18181818, 0X18181818, \
00244 0XFFFFFFFF, 0XFFFFFFFF, 0XFFFFFFFF, 0XFFFFFFFF, \
00245 0X0, 0XFF000000, 0XFFFFFFFF, 0XFFFFFFFF, \
00246 0XF0F0F0F, 0XF0F0F0F, 0XF0F0F0F, 0XF0F0F0F, \
00247 0XF0F0F0F0, 0XF0F0F0F0, 0XF0F0F0F0, 0XF0F0F0F0, \
00248 0XFFFFFFFF, 0XFFFFFF, 0X0, 0X0, \
00249 0X0, 0X1B3B6E00, 0X6E3B1B1B, 0X0, \
00250 0X331E0000, 0X331B3333, 0X33636363, 0X0, \
00251 0X637F0000, 0X3030363, 0X3030303, 0X0, \
00252 0X0, 0X3636367F, 0X36363636, 0X0, \
00253 0X7F000000, 0X180C0663, 0X7F63060C, 0X0, \
00254 0X0, 0X1B1B7E00, 0XE1B1B1B, 0X0, \
00255 0X0, 0X66666666, 0X6063E66, 0X3, \
00256 0X0, 0X18183B6E, 0X18181818, 0X0, \
00257 0X7E000000, 0X66663C18, 0X7E183C66, 0X0, \
00258 0X1C000000, 0X7F636336, 0X1C366363, 0X0, \
00259 0X361C0000, 0X36636363, 0X77363636, 0X0, \
00260 0XC780000, 0X667C3018, 0X3C666666, 0X0, \
00261 0X0, 0XDBDB7E00, 0X7EDB, 0X0, \
00262 0XC0000000, 0XDBDB7E60, 0X3067ECF, 0X0, \
00263 0XC380000, 0X63E0606, 0X380C0606, 0X0, \
00264 0X3E000000, 0X63636363, 0X63636363, 0X0, \
00265 0X0, 0X7F00007F, 0X7F0000, 0X0, \
00266 0X0, 0X187E1818, 0XFF000018, 0X0, \
00267 0XC000000, 0X30603018, 0X7E000C18, 0X0, \
00268 0X30000000, 0XC060C18, 0X7E003018, 0X0, \
00269 0XD8700000, 0X181818D8, 0X18181818, 0X18181818, \
00270 0X18181818, 0X18181818, 0XE1B1B1B, 0X0, \
00271 0X0, 0X7E001818, 0X181800, 0X0, \
00272 0X0, 0X3B6E00, 0X3B6E, 0X0, \
00273 0X36361C00, 0X1C, 0X0, 0X0, \
00274 0X0, 0X18000000, 0X18, 0X0, \
00275 0X0, 0X0, 0X18, 0X0, \
00276 0X3030F000, 0X37303030, 0X383C3636, 0X0, \
00277 0X36361B00, 0X363636, 0X0, 0X0, \
00278 0XC1B0E00, 0X1F1306, 0X0, 0X0, \
00279 0X0, 0X3E3E3E3E, 0X3E3E3E, 0X0, \
00280 0X0, 0X0, 0X0, 0X0,
00281
00282
00283
00284
00285
00286
00287 #define getFontPixel(font, ascii, x, y) \
00288 ({ \
00289 int u = (int) (x); \
00290 int v = (int) (y); \
00291 unsigned char result = 0; \
00292 if (((unsigned char*) font)[((unsigned int)ascii) * 16 + v] & (1UL << u)) result = 255; \
00293 result; \
00294 })
00295
00296
00297
00298
00299 #define getFontBitmap_8_16_mono(font, bitmap, ascii) \
00300 { \
00301 int i; \
00302 for (i = 0; i < 8 * 16; i++) { \
00303 bitmap[i] = getFontPixel(font, ascii, i % 8, i / 8); \
00304 } \
00305 }
00306
00307
00308
00309 #define getFontBitmap_8_16_rgb(font, bitmap, ascii) \
00310 { \
00311 int i; \
00312 for (i = 0; i < 8 * 16 * 3; i += 3) { \
00313 int j = i / 3; \
00314 bitmap[i + 0] = getFontPixel(font, ascii, j % 8, j / 8); \
00315 bitmap[i + 1] = bitmap[i]; \
00316 bitmap[i + 2] = bitmap[i]; \
00317 } \
00318 }
00319
00320
00321
00322
00323 #define getFontBitmap_8_16_rgba(font, bitmap, ascii) \
00324 { \
00325 int i; \
00326 for (i = 0; i < 8 * 16 * 4; i += 4) { \
00327 int j = i >> 2; \
00328 unsigned char mono = getFontPixel(font, ascii, (j & 7), (j >> 3)); \
00329 float r, g, b; \
00330 float c = ((j >> 3) / 16.0f); \
00331 c = (c < 0.5f) ? (c) : (c - 0.5f); \
00332 c = (0.5 + c) * (0.7 + 0.3 * sin((j >> 3) / 16.0f * M_PI)); \
00333 r = g = b = c; \
00334 bitmap[i + 0] = (unsigned char) (r * mono); \
00335 bitmap[i + 1] = (unsigned char) (g * mono); \
00336 bitmap[i + 2] = (unsigned char) (b * mono); \
00337 bitmap[i + 3] = mono; \
00338 } \
00339 }
00340
00341
00342 #include <GL/gl.h>
00343 #include <GL/glu.h>
00344
00345 #define MIPMAPPEDFONT 0
00346
00347
00348 extern unsigned int* gInstantfont;
00349
00350
00351
00352
00353 #define nFONTBINDINC
00354 #if defined(FONTBINDINC)
00355 unsigned int* gInstantfont = NULL;
00356 #endif
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366 #define glUploadFont() \
00367 { \
00368 unsigned long font[] = {FONTTABLEDATA}; \
00369 unsigned int start_ascii = 0; \
00370 unsigned int end_ascii = 256; \
00371 gInstantfont = (unsigned int*) malloc(sizeof (unsigned int) * 256); \
00372 unsigned int* binds = gInstantfont; \
00373 glPushAttrib(GL_TEXTURE_BIT); \
00374 glEnable(GL_TEXTURE_2D); \
00375 glGenTextures(end_ascii - start_ascii, binds); \
00376 unsigned char* rgba = (unsigned char*) malloc(sizeof (char) *8 * 16 * 4); \
00377 unsigned int i; \
00378 for (i = 0; i <= end_ascii; i++) { \
00379 glBindTexture(GL_TEXTURE_2D, binds[i]); \
00380 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); \
00381 unsigned char ascii = (start_ascii + i); \
00382 getFontBitmap_8_16_rgba(font, rgba, ascii); \
00383 if (MIPMAPPEDFONT) { \
00384 gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, 8, 16, GL_RGBA, GL_UNSIGNED_BYTE, (void*) rgba); \
00385 } else { \
00386 glTexImage2D(GL_TEXTURE_2D, 0, 4, 8, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, (void*) rgba); \
00387 } \
00388 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); \
00389 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); \
00390 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); \
00391 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); \
00392 } \
00393 free(rgba); \
00394 glPopAttrib(); \
00395 }
00396
00397
00398
00399
00400
00401 #define glTexturedSquare(bind) \
00402 { \
00403 glBindTexture(GL_TEXTURE_2D, (unsigned int) bind); \
00404 glBegin(GL_QUADS); \
00405 glTexCoord2f(0, 0); \
00406 glVertex3f(0, 0, 0); \
00407 glTexCoord2f(1, 0); \
00408 glVertex3f(1, 0, 0); \
00409 glTexCoord2f(1, 1); \
00410 glVertex3f(1, -1, 0); \
00411 glTexCoord2f(0, 1); \
00412 glVertex3f(0, -1, 0); \
00413 glEnd(); \
00414 }
00415
00416
00417
00418
00419
00420
00421 #define glPrint(buffer) \
00422 { \
00423 int len = strlen(buffer); \
00424 if (gInstantfont == NULL) return; \
00425 unsigned int* asciibinds = gInstantfont; \
00426 glPushAttrib(GL_ENABLE_BIT); \
00427 { \
00428 glDisable(GL_CULL_FACE); \
00429 glEnable(GL_TEXTURE_2D); \
00430 glPushMatrix(); \
00431 { \
00432 int i, col = 0; \
00433 for (i = 0; i < len; i++) { \
00434 if (buffer[i] == '\n') { \
00435 glTranslatef(-col, -1, 0); \
00436 col = 0; \
00437 } else if (buffer[i] == '\t') { \
00438 glTranslatef((col + 1) % 5, 0, 0); \
00439 col += ((col + 1) % 5); \
00440 } else { \
00441 glTexturedSquare(asciibinds[(unsigned char)buffer[i]]); \
00442 glTranslatef(1, 0, 0); \
00443 col++; \
00444 } \
00445 } \
00446 } \
00447 glPopMatrix(); \
00448 } \
00449 glPopAttrib(); \
00450 }
00451
00452 #include <string.h>
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462 #define bnprint(bufferstr, buffersize, bufferwidth, bufferpos, buffer) \
00463 { \
00464 int len = strlen(buffer); \
00465 int p = bufferpos; \
00466 int i; \
00467 for (i = 0; i < len; i++) { \
00468 if (buffer[i] == '\n') { \
00469 p += ((bufferwidth) - (p % (bufferwidth))); \
00470 } else if (buffer[i] == '\t') { \
00471 p += (5 - ((p % (bufferwidth)) % 5)); \
00472 } else { \
00473 bufferstr[p] = buffer[i]; \
00474 p++; \
00475 } \
00476 if (p >= buffersize) { \
00477 memmove(bufferstr, &bufferstr[bufferwidth], buffersize - (bufferwidth)); \
00478 memset(&bufferstr[buffersize - (bufferwidth)], 0, bufferwidth); \
00479 p -= bufferwidth; \
00480 } \
00481 } \
00482 bufferpos = p; \
00483 }
00484
00485
00486 #include <stdarg.h>
00487 #define FORMATBUFFER \
00488 va_list args; \
00489 va_start(args, format); \
00490 char buffer[1024]; \
00491 int len = vsnprintf(buffer, 1023, format, args); \
00492 buffer[len] = '\0'; \
00493 va_end(args);
00494
00495
00496 #define DEFINE_glprintf \
00497 static void glprintf(const char* format, ...) { \
00498 FORMATBUFFER \
00499 glPrint(buffer); \
00500 }
00501
00502 #define DEFINE_bnprintf \
00503 static void bnprintf(char* bufferstr, size_t buffersize, int bufferwidth, int* bufferpos, const char* format, ...) { \
00504 FORMATBUFFER \
00505 bnprint(bufferstr, buffersize, bufferwidth, bufferpos, buffer) \
00506 }
00507
00508
00509
00510
00511
00512 #define glDrawConsole(buffer, buffersize, bufferwidth, bufferpos) \
00513 { \
00514 unsigned char* bufferstr = (unsigned char*) (buffer); \
00515 if (gInstantfont == NULL) return; \
00516 unsigned int* asciibinds = gInstantfont; \
00517 glPushAttrib(GL_ENABLE_BIT); \
00518 { \
00519 glDisable(GL_CULL_FACE); \
00520 glEnable(GL_TEXTURE_2D); \
00521 glPushMatrix(); \
00522 { \
00523 int i, col = 0; \
00524 for (i = 0; i < (buffersize); i++) { \
00525 if ((i % (bufferwidth)) == 0) { \
00526 glTranslatef(-col, -1, 0); \
00527 col = 0; \
00528 } \
00529 if (bufferstr[i] != 0) glTexturedSquare(asciibinds[bufferstr[i]]); \
00530 if (bufferpos == i) glTexturedSquare(asciibinds[0]); \
00531 glTranslatef(1, 0, 0); \
00532 col++; \
00533 } \
00534 } \
00535 glPopMatrix(); \
00536 } \
00537 glPopAttrib(); \
00538 }
00539
00540
00541 typedef struct Console {
00542 char* buffer;
00543 int size;
00544 int width;
00545 int cursor;
00546 } Console;
00547
00548 #define Console_new(size, width) \
00549 ({ \
00550 char* buffer = (char*) malloc(sizeof(char) * size); \
00551 memset(buffer, 0, sizeof(char) * size); \
00552 Console* con = (Console*) malloc(sizeof(Console)); \
00553 Console_init(con, buffer, size, width); \
00554 con; \
00555 })
00556
00557 #define Console_free(itself) \
00558 { \
00559 free(itself->buffer); \
00560 free(itself); \
00561 }
00562
00563 #define Console_init(itself, buffer, buffersize, bufferwidth) \
00564 { \
00565 itself->buffer = buffer; \
00566 itself->size = buffersize; \
00567 itself->width = bufferwidth; \
00568 itself->cursor = 0; \
00569 }
00570
00571 #define Console_draw(itself) \
00572 glDrawConsole(itself->buffer, itself->size, itself->width, itself->cursor)
00573
00574 #define DEFINE_Console_printf \
00575 static void Console_printf(Console* itself, const char* format, ...) { \
00576 FORMATBUFFER \
00577 bnprint(itself->buffer, itself->size, itself->width, itself->cursor, buffer) \
00578 }
00579
00580 #endif
00581
00582
00583
00584
00585
00586
00587 #define nGLUTTESTDRIVER
00588 #if defined(GLUTTESTDRIVER)
00589
00590 #include <GL/glu.h>
00591 #include <GL/glut.h>
00592
00593 unsigned int* gInstantfont = NULL;
00594
00595
00596 Console gCon[4];
00597
00598 void Init() {
00599 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00600 glEnable(GL_BLEND);
00601 glEnable(GL_TEXTURE_2D);
00602 glUploadFont();
00603
00604 Console* con = NULL;
00605
00606 con = &gCon[0];
00607 con->cursor = 0;
00608 con->width = 16;
00609 con->size = con->width * 7;
00610 con->buffer = (char*) malloc(con->size);
00611 memset(con->buffer, 32, con->size);
00612
00613 bnprintf(con->buffer, con->size, con->width, &con->cursor,
00614 "Booting system.\n12345678\n12\t678\n12345678\nDone.\n............................."
00615 );
00616
00617 con = &gCon[1];
00618 con->cursor = 0;
00619 con->width = 40;
00620 con->size = con->width * 30;
00621 con->buffer = (char*) malloc(con->size);
00622 memset(con->buffer, 32, con->size);
00623 }
00624
00625 void Reshape(int w, int h) {
00626 glViewport(0, 0, w, h);
00627 glMatrixMode(GL_PROJECTION);
00628 glLoadIdentity();
00629 gluPerspective(60, (double) w / (double) h, 0.001, 100);
00630 glMatrixMode(GL_MODELVIEW);
00631 glutPostRedisplay();
00632 }
00633
00634 void Draw() {
00635
00636 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
00637
00638 static float t = 0;
00639 t += 0.3;
00640
00641 Console* con = NULL;
00642
00643 glDisable(GL_BLEND);
00644 glColor3f(0, 0, 0.6);
00645 glPushMatrix();
00646 glTranslatef(0, 0, -35);
00647 glRotatef(t * 10, 1, 2, 3);
00648 glTranslatef(-20, +15, 0);
00649 con = &gCon[1];
00650 glDrawConsole(con->buffer, con->size, con->width, con->cursor);
00651 glPopMatrix();
00652 glEnable(GL_BLEND);
00653
00654 con = &gCon[1];
00655 bnprintf(con->buffer, con->size, con->width, &con->cursor, "123");
00656
00657 glColor3f(0.1, 0.4, 0.1);
00658 glPushMatrix();
00659 glTranslatef(-19.0 / 2.0, +7.5, -14);
00660 glPrintf("Console System Test");
00661 glPopMatrix();
00662
00663 glColor3f(0.1, 0.4, 0.1);
00664 glPushMatrix();
00665 glTranslatef(-12.0 / 2.0, -6.5, -14);
00666 glPrintf("Instant Font");
00667 glPopMatrix();
00668
00669 glColor3f(0, 0.3, 0.7);
00670 glPushMatrix();
00671 glTranslatef(-5, +5, -20);
00672 glScalef(0.6, 1.2, 1);
00673 con = &gCon[0];
00674 glDrawConsole(con->buffer, con->size, con->width, con->cursor);
00675 glPopMatrix();
00676
00677 glutSwapBuffers();
00678 }
00679
00680 void Idle() {
00681 glutPostRedisplay();
00682 }
00683
00684 void Key(unsigned char k, int x, int y) {
00685 if (k == 27) exit(0);
00686 }
00687
00688 #if defined(_WIN32)
00689 #define WIN32_LEAN_AND_MEAN
00690 #include <windows.h>
00691
00692 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
00693 int argc = 2;
00694 char *argv[] = {"Nothing", "Nothing", "Nothing"};
00695
00696 #else
00697
00698 int main(int argc, char **argv) {
00699
00700 #endif
00701
00702 glutInit(&argc, argv);
00703 glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB);
00704
00705 #define FULLSCREEN
00706 #if defined(FULLSCREEN)
00707 glutGameModeString("640x480:16");
00708 glutEnterGameMode();
00709 if (glutGameModeGet(GLUT_GAME_MODE_WIDTH) == -1)
00710 #endif
00711 {
00712 glutInitWindowSize(640, 480);
00713 glutInitWindowPosition(0, 0);
00714 glutCreateWindow("benjamin.pickhardt udo.edu");
00715 };
00716
00717 glutDisplayFunc(*Draw);
00718 glutReshapeFunc(*Reshape);
00719 glutIdleFunc(*Idle);
00720 glutKeyboardFunc(*Key);
00721
00722
00723 glutSetKeyRepeat(GLUT_KEY_REPEAT_OFF);
00724
00725 Init();
00726 glutMainLoop();
00727
00728 return 0;
00729 }
00730
00731 #endif