50 GLuint pixerror, pixerrorred, pixerrorgreen, pixerrorblue, pixerrorbest;
51 GLint colordist, blockerrlin[2][3];
53 GLint pixerrorcolorbest[3];
60 if (((bestcolor[0][0] & 0xf8) << 8 | (bestcolor[0][1] & 0xfc) << 3 | bestcolor[0][2] >> 3) <
61 ((bestcolor[1][0] & 0xf8) << 8 | (bestcolor[1][1] & 0xfc) << 3 | bestcolor[1][2] >> 3)) {
62 testcolor[0][0] = bestcolor[0][0];
63 testcolor[0][1] = bestcolor[0][1];
64 testcolor[0][2] = bestcolor[0][2];
65 testcolor[1][0] = bestcolor[1][0];
66 testcolor[1][1] = bestcolor[1][1];
67 testcolor[1][2] = bestcolor[1][2];
70 testcolor[1][0] = bestcolor[0][0];
71 testcolor[1][1] = bestcolor[0][1];
72 testcolor[1][2] = bestcolor[0][2];
73 testcolor[0][0] = bestcolor[1][0];
74 testcolor[0][1] = bestcolor[1][1];
75 testcolor[0][2] = bestcolor[1][2];
78 for (
i = 0;
i < 3;
i ++) {
79 cv[0][
i] = testcolor[0][
i];
80 cv[1][
i] = testcolor[1][
i];
81 cv[2][
i] = (testcolor[0][
i] * 2 + testcolor[1][
i]) / 3;
82 cv[3][
i] = (testcolor[0][
i] + testcolor[1][
i] * 2) / 3;
85 blockerrlin[0][0] = 0;
86 blockerrlin[0][1] = 0;
87 blockerrlin[0][2] = 0;
88 blockerrlin[1][0] = 0;
89 blockerrlin[1][1] = 0;
90 blockerrlin[1][2] = 0;
95 for (
j = 0;
j < numypixels;
j++) {
96 for (
i = 0;
i < numxpixels;
i++) {
97 pixerrorbest = 0xffffffff;
98 for (colors = 0; colors < 4; colors++) {
99 colordist = srccolors[
j][
i][0] - (cv[colors][0]);
100 pixerror = colordist * colordist *
REDWEIGHT;
101 pixerrorred = colordist;
102 colordist = srccolors[
j][
i][1] - (cv[colors][1]);
104 pixerrorgreen = colordist;
105 colordist = srccolors[
j][
i][2] - (cv[colors][2]);
106 pixerror += colordist * colordist *
BLUEWEIGHT;
107 pixerrorblue = colordist;
108 if (pixerror < pixerrorbest) {
110 pixerrorbest = pixerror;
111 pixerrorcolorbest[0] = pixerrorred;
112 pixerrorcolorbest[1] = pixerrorgreen;
113 pixerrorcolorbest[2] = pixerrorblue;
117 for (
z = 0;
z < 3;
z++) {
118 blockerrlin[0][
z] += 3 * pixerrorcolorbest[
z];
123 for (
z = 0;
z < 3;
z++) {
124 blockerrlin[0][
z] += 2 * pixerrorcolorbest[
z];
127 for (
z = 0;
z < 3;
z++) {
128 blockerrlin[1][
z] += 1 * pixerrorcolorbest[
z];
133 for (
z = 0;
z < 3;
z++) {
134 blockerrlin[0][
z] += 1 * pixerrorcolorbest[
z];
137 for (
z = 0;
z < 3;
z++) {
138 blockerrlin[1][
z] += 2 * pixerrorcolorbest[
z];
143 for (
z = 0;
z < 3;
z++) {
144 blockerrlin[1][
z] += 3 * pixerrorcolorbest[
z];
150 if (nrcolor[0] == 0) nrcolor[0] = 1;
151 if (nrcolor[1] == 0) nrcolor[1] = 1;
152 for (
j = 0;
j < 2;
j++) {
153 for (
i = 0;
i < 3;
i++) {
154 GLint newvalue = testcolor[
j][
i] + blockerrlin[
j][
i] / nrcolor[
j];
157 else if (newvalue >= 255)
158 testcolor[
j][
i] = 255;
159 else testcolor[
j][
i] = newvalue;
163 if ((
abs(testcolor[0][0] - testcolor[1][0]) < 8) &&
164 (
abs(testcolor[0][1] - testcolor[1][1]) < 4) &&
165 (
abs(testcolor[0][2] - testcolor[1][2]) < 8)) {
167 GLubyte coldiffred, coldiffgreen, coldiffblue, coldiffmax,
factor, ind0, ind1;
169 coldiffred =
abs(testcolor[0][0] - testcolor[1][0]);
170 coldiffgreen = 2 *
abs(testcolor[0][1] - testcolor[1][1]);
171 coldiffblue =
abs(testcolor[0][2] - testcolor[1][2]);
172 coldiffmax = coldiffred;
173 if (coldiffmax < coldiffgreen) coldiffmax = coldiffgreen;
174 if (coldiffmax < coldiffblue) coldiffmax = coldiffblue;
175 if (coldiffmax > 0) {
176 if (coldiffmax > 4)
factor = 2;
177 else if (coldiffmax > 2)
factor = 3;
181 if (testcolor[1][1] >= testcolor[0][1]) {
187 if ((testcolor[ind1][1] +
factor * coldiffgreen) <= 255)
188 testcolor[ind1][1] +=
factor * coldiffgreen;
189 else testcolor[ind1][1] = 255;
190 if ((testcolor[ind1][0] - testcolor[ind0][1]) > 0) {
191 if ((testcolor[ind1][0] +
factor * coldiffred) <= 255)
192 testcolor[ind1][0] +=
factor * coldiffred;
193 else testcolor[ind1][0] = 255;
196 if ((testcolor[ind0][0] +
factor * coldiffred) <= 255)
197 testcolor[ind0][0] +=
factor * coldiffred;
198 else testcolor[ind0][0] = 255;
200 if ((testcolor[ind1][2] - testcolor[ind0][2]) > 0) {
201 if ((testcolor[ind1][2] +
factor * coldiffblue) <= 255)
202 testcolor[ind1][2] +=
factor * coldiffblue;
203 else testcolor[ind1][2] = 255;
206 if ((testcolor[ind0][2] +
factor * coldiffblue) <= 255)
207 testcolor[ind0][2] +=
factor * coldiffblue;
208 else testcolor[ind0][2] = 255;
213 if (((testcolor[0][0] & 0xf8) << 8 | (testcolor[0][1] & 0xfc) << 3 | testcolor[0][2] >> 3) <
214 ((testcolor[1][0] & 0xf8) << 8 | (testcolor[1][1] & 0xfc) << 3 | testcolor[1][2]) >> 3) {
215 for (
i = 0;
i < 3;
i++) {
216 bestcolor[0][
i] = testcolor[0][
i];
217 bestcolor[1][
i] = testcolor[1][
i];
221 for (
i = 0;
i < 3;
i++) {
222 bestcolor[0][
i] = testcolor[1][
i];
223 bestcolor[1][
i] = testcolor[0][
i];
239 GLuint testerror, testerror2, pixerror, pixerrorbest;
247 bestcolor[0][0] = bestcolor[0][0] & 0xf8;
248 bestcolor[0][1] = bestcolor[0][1] & 0xfc;
249 bestcolor[0][2] = bestcolor[0][2] & 0xf8;
250 bestcolor[1][0] = bestcolor[1][0] & 0xf8;
251 bestcolor[1][1] = bestcolor[1][1] & 0xfc;
252 bestcolor[1][2] = bestcolor[1][2] & 0xf8;
254 color0 = bestcolor[0][0] << 8 | bestcolor[0][1] << 3 | bestcolor[0][2] >> 3;
255 color1 = bestcolor[1][0] << 8 | bestcolor[1][1] << 3 | bestcolor[1][2] >> 3;
256 if (color0 < color1) {
257 tempcolor = color0; color0 = color1; color1 = tempcolor;
258 colorptr = bestcolor[0]; bestcolor[0] = bestcolor[1]; bestcolor[1] = colorptr;
262 for (
i = 0;
i < 3;
i++) {
263 cv[0][
i] = bestcolor[0][
i];
264 cv[1][
i] = bestcolor[1][
i];
265 cv[2][
i] = (bestcolor[0][
i] * 2 + bestcolor[1][
i]) / 3;
266 cv[3][
i] = (bestcolor[0][
i] + bestcolor[1][
i] * 2) / 3;
270 for (
j = 0;
j < numypixels;
j++) {
271 for (
i = 0;
i < numxpixels;
i++) {
272 pixerrorbest = 0xffffffff;
273 for (colors = 0; colors < 4; colors++) {
274 colordist = srccolors[
j][
i][0] - cv[colors][0];
275 pixerror = colordist * colordist *
REDWEIGHT;
276 colordist = srccolors[
j][
i][1] - cv[colors][1];
278 colordist = srccolors[
j][
i][2] - cv[colors][2];
279 pixerror += colordist * colordist *
BLUEWEIGHT;
280 if (pixerror < pixerrorbest) {
281 pixerrorbest = pixerror;
285 testerror += pixerrorbest;
286 bits |= enc << (2 * (
j * 4 +
i));
292 for (
i = 0;
i < 3;
i++) {
293 cv[2][
i] = (bestcolor[0][
i] + bestcolor[1][
i]) / 2;
301 for (
j = 0;
j < numypixels;
j++) {
302 for (
i = 0;
i < numxpixels;
i++) {
303 pixerrorbest = 0xffffffff;
310 for (colors = 0; colors < 3; colors++) {
311 colordist = srccolors[
j][
i][0] - cv[colors][0];
312 pixerror = colordist * colordist *
REDWEIGHT;
313 colordist = srccolors[
j][
i][1] - cv[colors][1];
315 colordist = srccolors[
j][
i][2] - cv[colors][2];
316 pixerror += colordist * colordist *
BLUEWEIGHT;
317 if (pixerror < pixerrorbest) {
318 pixerrorbest = pixerror;
320 if (colors > 1) enc = colors;
321 else enc = colors ^ 1;
325 testerror2 += pixerrorbest;
326 bits2 |= enc << (2 * (
j * 4 +
i));
330 testerror2 = 0xffffffff;
334 if ((testerror > testerror2) || (haveAlpha)) {
335 *blkaddr++ = color1 & 0xff;
336 *blkaddr++ = color1 >> 8;
337 *blkaddr++ = color0 & 0xff;
338 *blkaddr++ = color0 >> 8;
339 *blkaddr++ = bits2 & 0xff;
340 *blkaddr++ = ( bits2 >> 8) & 0xff;
341 *blkaddr++ = ( bits2 >> 16) & 0xff;
342 *blkaddr = bits2 >> 24;
345 *blkaddr++ = color0 & 0xff;
346 *blkaddr++ = color0 >> 8;
347 *blkaddr++ = color1 & 0xff;
348 *blkaddr++ = color1 >> 8;
349 *blkaddr++ =
bits & 0xff;
350 *blkaddr++ = (
bits >> 8) & 0xff;
351 *blkaddr++ = (
bits >> 16) & 0xff;
352 *blkaddr =
bits >> 24;
370 GLuint lowcv, highcv, testcv;
373 lowcv = highcv = srccolors[0][0][0] * srccolors[0][0][0] *
REDWEIGHT +
374 srccolors[0][0][1] * srccolors[0][0][1] *
GREENWEIGHT +
375 srccolors[0][0][2] * srccolors[0][0][2] *
BLUEWEIGHT;
376 bestcolor[0] = bestcolor[1] = srccolors[0][0];
377 for (
j = 0;
j < numypixels;
j++) {
378 for (
i = 0;
i < numxpixels;
i++) {
381 testcv = srccolors[
j][
i][0] * srccolors[
j][
i][0] *
REDWEIGHT +
384 if (testcv > highcv) {
386 bestcolor[1] = srccolors[
j][
i];
388 else if (testcv < lowcv) {
390 bestcolor[0] = srccolors[
j][
i];
397 for (
j = 0;
j < 2;
j++) {
398 for (
i = 0;
i < 3;
i++) {
399 basecolors[
j][
i] = bestcolor[
j][
i];
402 bestcolor[0] = basecolors[0];
403 bestcolor[1] = basecolors[1];
414 *blkaddr++ = alphabase1;
415 *blkaddr++ = alphabase2;
416 *blkaddr++ = alphaenc[0] | (alphaenc[1] << 3) | ((alphaenc[2] & 3) << 6);
417 *blkaddr++ = (alphaenc[2] >> 2) | (alphaenc[3] << 1) | (alphaenc[4] << 4) | ((alphaenc[5] & 1) << 7);
418 *blkaddr++ = (alphaenc[5] >> 1) | (alphaenc[6] << 2) | (alphaenc[7] << 5);
419 *blkaddr++ = alphaenc[8] | (alphaenc[9] << 3) | ((alphaenc[10] & 3) << 6);
420 *blkaddr++ = (alphaenc[10] >> 2) | (alphaenc[11] << 1) | (alphaenc[12] << 4) | ((alphaenc[13] & 1) << 7);
421 *blkaddr++ = (alphaenc[13] >> 1) | (alphaenc[14] << 2) | (alphaenc[15] << 5);
427 GLubyte alphabase[2], alphause[2];
429 GLuint alphablockerror1, alphablockerror2, alphablockerror3;
431 GLubyte alphaenc1[16], alphaenc2[16], alphaenc3[16];
437 alphabase[0] = 0xff; alphabase[1] = 0x0;
438 for (
j = 0;
j < numypixels;
j++) {
439 for (
i = 0;
i < numxpixels;
i++) {
440 if (srccolors[
j][
i][3] == 0)
442 else if (srccolors[
j][
i][3] == 255)
445 if (srccolors[
j][
i][3] > alphabase[1])
446 alphabase[1] = srccolors[
j][
i][3];
447 if (srccolors[
j][
i][3] < alphabase[0])
448 alphabase[0] = srccolors[
j][
i][3];
454 if ((alphabase[0] > alphabase[1]) && !(alphaabsmin && alphaabsmax)) {
459 *blkaddr++ = srccolors[0][0][3];
473 alphablockerror1 = 0x0;
474 alphablockerror2 = 0xffffffff;
475 alphablockerror3 = 0xffffffff;
476 if (alphaabsmin) alphause[0] = 0;
477 else alphause[0] = alphabase[0];
478 if (alphaabsmax) alphause[1] = 255;
479 else alphause[1] = alphabase[1];
481 for (aindex = 0; aindex < 7; aindex++) {
483 acutValues[aindex] = (alphause[0] * (2*aindex + 1) + alphause[1] * (14 - (2*aindex + 1))) / 14;
486 for (
j = 0;
j < numypixels;
j++) {
487 for (
i = 0;
i < numxpixels;
i++) {
490 if (srccolors[
j][
i][3] > acutValues[0]) {
491 alphaenc1[4*
j +
i] = 0;
492 alphadist = srccolors[
j][
i][3] - alphause[1];
494 else if (srccolors[
j][
i][3] > acutValues[1]) {
495 alphaenc1[4*
j +
i] = 2;
496 alphadist = srccolors[
j][
i][3] - (alphause[1] * 6 + alphause[0] * 1) / 7;
498 else if (srccolors[
j][
i][3] > acutValues[2]) {
499 alphaenc1[4*
j +
i] = 3;
500 alphadist = srccolors[
j][
i][3] - (alphause[1] * 5 + alphause[0] * 2) / 7;
502 else if (srccolors[
j][
i][3] > acutValues[3]) {
503 alphaenc1[4*
j +
i] = 4;
504 alphadist = srccolors[
j][
i][3] - (alphause[1] * 4 + alphause[0] * 3) / 7;
506 else if (srccolors[
j][
i][3] > acutValues[4]) {
507 alphaenc1[4*
j +
i] = 5;
508 alphadist = srccolors[
j][
i][3] - (alphause[1] * 3 + alphause[0] * 4) / 7;
510 else if (srccolors[
j][
i][3] > acutValues[5]) {
511 alphaenc1[4*
j +
i] = 6;
512 alphadist = srccolors[
j][
i][3] - (alphause[1] * 2 + alphause[0] * 5) / 7;
514 else if (srccolors[
j][
i][3] > acutValues[6]) {
515 alphaenc1[4*
j +
i] = 7;
516 alphadist = srccolors[
j][
i][3] - (alphause[1] * 1 + alphause[0] * 6) / 7;
519 alphaenc1[4*
j +
i] = 1;
520 alphadist = srccolors[
j][
i][3] - alphause[0];
522 alphablockerror1 += alphadist * alphadist;
542 if (alphablockerror1 >= 32) {
546 alphablockerror2 = 0;
547 for (aindex = 0; aindex < 5; aindex++) {
549 acutValues[aindex] = (alphabase[0] * (10 - (2*aindex + 1)) + alphabase[1] * (2*aindex + 1)) / 10;
551 for (
j = 0;
j < numypixels;
j++) {
552 for (
i = 0;
i < numxpixels;
i++) {
555 if (srccolors[
j][
i][3] == 0) {
556 alphaenc2[4*
j +
i] = 6;
559 else if (srccolors[
j][
i][3] == 255) {
560 alphaenc2[4*
j +
i] = 7;
563 else if (srccolors[
j][
i][3] <= acutValues[0]) {
564 alphaenc2[4*
j +
i] = 0;
565 alphadist = srccolors[
j][
i][3] - alphabase[0];
567 else if (srccolors[
j][
i][3] <= acutValues[1]) {
568 alphaenc2[4*
j +
i] = 2;
569 alphadist = srccolors[
j][
i][3] - (alphabase[0] * 4 + alphabase[1] * 1) / 5;
571 else if (srccolors[
j][
i][3] <= acutValues[2]) {
572 alphaenc2[4*
j +
i] = 3;
573 alphadist = srccolors[
j][
i][3] - (alphabase[0] * 3 + alphabase[1] * 2) / 5;
575 else if (srccolors[
j][
i][3] <= acutValues[3]) {
576 alphaenc2[4*
j +
i] = 4;
577 alphadist = srccolors[
j][
i][3] - (alphabase[0] * 2 + alphabase[1] * 3) / 5;
579 else if (srccolors[
j][
i][3] <= acutValues[4]) {
580 alphaenc2[4*
j +
i] = 5;
581 alphadist = srccolors[
j][
i][3] - (alphabase[0] * 1 + alphabase[1] * 4) / 5;
584 alphaenc2[4*
j +
i] = 1;
585 alphadist = srccolors[
j][
i][3] - alphabase[1];
587 alphablockerror2 += alphadist * alphadist;
594 if ((alphablockerror2 > 96) && (alphablockerror1 > 96)) {
598 GLubyte nralphainrangehigh = 0;
602 for (
j = 0;
j < numypixels;
j++) {
603 for (
i = 0;
i < numxpixels;
i++) {
604 if ((srccolors[
j][
i][3] > alphatest[1]) && (srccolors[
j][
i][3] < (255 -(alphabase[1] - alphabase[0]) / 28)))
605 alphatest[1] = srccolors[
j][
i][3];
606 if ((srccolors[
j][
i][3] < alphatest[0]) && (srccolors[
j][
i][3] > (alphabase[1] - alphabase[0]) / 28))
607 alphatest[0] = srccolors[
j][
i][3];
611 if (alphatest[1] <= alphatest[0]) {
616 for (aindex = 0; aindex < 5; aindex++) {
618 acutValues[aindex] = (alphatest[0] * (10 - (2*aindex + 1)) + alphatest[1] * (2*aindex + 1)) / 10;
628 for (
j = 0;
j < numypixels;
j++) {
629 for (
i = 0;
i < numxpixels;
i++) {
630 if (srccolors[
j][
i][3] <= alphatest[0] / 2) {
632 else if (srccolors[
j][
i][3] > ((255 + alphatest[1]) / 2)) {
634 else if (srccolors[
j][
i][3] <= acutValues[0]) {
635 blockerrlin1 += (srccolors[
j][
i][3] - alphatest[0]);
636 nralphainrangelow += 1;
638 else if (srccolors[
j][
i][3] <= acutValues[1]) {
639 blockerrlin1 += (srccolors[
j][
i][3] - (alphatest[0] * 4 + alphatest[1] * 1) / 5);
640 blockerrlin2 += (srccolors[
j][
i][3] - (alphatest[0] * 4 + alphatest[1] * 1) / 5);
641 nralphainrangelow += 1;
642 nralphainrangehigh += 1;
644 else if (srccolors[
j][
i][3] <= acutValues[2]) {
645 blockerrlin1 += (srccolors[
j][
i][3] - (alphatest[0] * 3 + alphatest[1] * 2) / 5);
646 blockerrlin2 += (srccolors[
j][
i][3] - (alphatest[0] * 3 + alphatest[1] * 2) / 5);
647 nralphainrangelow += 1;
648 nralphainrangehigh += 1;
650 else if (srccolors[
j][
i][3] <= acutValues[3]) {
651 blockerrlin1 += (srccolors[
j][
i][3] - (alphatest[0] * 2 + alphatest[1] * 3) / 5);
652 blockerrlin2 += (srccolors[
j][
i][3] - (alphatest[0] * 2 + alphatest[1] * 3) / 5);
653 nralphainrangelow += 1;
654 nralphainrangehigh += 1;
656 else if (srccolors[
j][
i][3] <= acutValues[4]) {
657 blockerrlin1 += (srccolors[
j][
i][3] - (alphatest[0] * 1 + alphatest[1] * 4) / 5);
658 blockerrlin2 += (srccolors[
j][
i][3] - (alphatest[0] * 1 + alphatest[1] * 4) / 5);
659 nralphainrangelow += 1;
660 nralphainrangehigh += 1;
663 blockerrlin2 += (srccolors[
j][
i][3] - alphatest[1]);
664 nralphainrangehigh += 1;
669 if (nralphainrangelow == 0) nralphainrangelow = 1;
670 if (nralphainrangehigh == 0) nralphainrangehigh = 1;
671 alphatest[0] = alphatest[0] + (blockerrlin1 / nralphainrangelow);
675 if (alphatest[0] < 0) {
679 alphatest[1] = alphatest[1] + (blockerrlin2 / nralphainrangehigh);
680 if (alphatest[1] > 255) {
685 alphablockerror3 = 0;
686 for (aindex = 0; aindex < 5; aindex++) {
688 acutValues[aindex] = (alphatest[0] * (10 - (2*aindex + 1)) + alphatest[1] * (2*aindex + 1)) / 10;
690 for (
j = 0;
j < numypixels;
j++) {
691 for (
i = 0;
i < numxpixels;
i++) {
694 if (srccolors[
j][
i][3] <= alphatest[0] / 2) {
695 alphaenc3[4*
j +
i] = 6;
696 alphadist = srccolors[
j][
i][3];
698 else if (srccolors[
j][
i][3] > ((255 + alphatest[1]) / 2)) {
699 alphaenc3[4*
j +
i] = 7;
700 alphadist = 255 - srccolors[
j][
i][3];
702 else if (srccolors[
j][
i][3] <= acutValues[0]) {
703 alphaenc3[4*
j +
i] = 0;
704 alphadist = srccolors[
j][
i][3] - alphatest[0];
706 else if (srccolors[
j][
i][3] <= acutValues[1]) {
707 alphaenc3[4*
j +
i] = 2;
708 alphadist = srccolors[
j][
i][3] - (alphatest[0] * 4 + alphatest[1] * 1) / 5;
710 else if (srccolors[
j][
i][3] <= acutValues[2]) {
711 alphaenc3[4*
j +
i] = 3;
712 alphadist = srccolors[
j][
i][3] - (alphatest[0] * 3 + alphatest[1] * 2) / 5;
714 else if (srccolors[
j][
i][3] <= acutValues[3]) {
715 alphaenc3[4*
j +
i] = 4;
716 alphadist = srccolors[
j][
i][3] - (alphatest[0] * 2 + alphatest[1] * 3) / 5;
718 else if (srccolors[
j][
i][3] <= acutValues[4]) {
719 alphaenc3[4*
j +
i] = 5;
720 alphadist = srccolors[
j][
i][3] - (alphatest[0] * 1 + alphatest[1] * 4) / 5;
723 alphaenc3[4*
j +
i] = 1;
724 alphadist = srccolors[
j][
i][3] - alphatest[1];
726 alphablockerror3 += alphadist * alphadist;
732 if ((alphablockerror1 <= alphablockerror2) && (alphablockerror1 <= alphablockerror3)) {
736 else if (alphablockerror2 <= alphablockerror3) {
751 for (
j = 0;
j < numypixels;
j++) {
752 curaddr = srcaddr +
j * srcRowStride * comps;
753 for (
i = 0;
i < numxpixels;
i++) {
754 for (
c = 0;
c < comps;
c++) {
755 srcpixels[
j][
i][
c] = *curaddr++ / (
CHAN_MAX / 255);
767 const GLchan *srcaddr = srcPixData;
768 GLint numxpixels, numypixels;
772 switch (destFormat) {
776 dstRowDiff = dstRowStride >= (
width * 2) ? dstRowStride - (((
width + 3) & ~3) * 2) : 0;
780 if (
height >
j + 3) numypixels = 4;
782 srcaddr = srcPixData +
j *
width * srccomps;
784 if (
width >
i + 3) numxpixels = 4;
785 else numxpixels =
width -
i;
788 srcaddr += srccomps * numxpixels;
791 blkaddr += dstRowDiff;
795 dstRowDiff = dstRowStride >= (
width * 4) ? dstRowStride - (((
width + 3) & ~3) * 4) : 0;
799 if (
height >
j + 3) numypixels = 4;
801 srcaddr = srcPixData +
j *
width * srccomps;
803 if (
width >
i + 3) numxpixels = 4;
804 else numxpixels =
width -
i;
806 *blkaddr++ = (srcpixels[0][0][3] >> 4) | (srcpixels[0][1][3] & 0xf0);
807 *blkaddr++ = (srcpixels[0][2][3] >> 4) | (srcpixels[0][3][3] & 0xf0);
808 *blkaddr++ = (srcpixels[1][0][3] >> 4) | (srcpixels[1][1][3] & 0xf0);
809 *blkaddr++ = (srcpixels[1][2][3] >> 4) | (srcpixels[1][3][3] & 0xf0);
810 *blkaddr++ = (srcpixels[2][0][3] >> 4) | (srcpixels[2][1][3] & 0xf0);
811 *blkaddr++ = (srcpixels[2][2][3] >> 4) | (srcpixels[2][3][3] & 0xf0);
812 *blkaddr++ = (srcpixels[3][0][3] >> 4) | (srcpixels[3][1][3] & 0xf0);
813 *blkaddr++ = (srcpixels[3][2][3] >> 4) | (srcpixels[3][3][3] & 0xf0);
815 srcaddr += srccomps * numxpixels;
818 blkaddr += dstRowDiff;
822 dstRowDiff = dstRowStride >= (
width * 4) ? dstRowStride - (((
width + 3) & ~3) * 4) : 0;
826 if (
height >
j + 3) numypixels = 4;
828 srcaddr = srcPixData +
j *
width * srccomps;
830 if (
width >
i + 3) numxpixels = 4;
831 else numxpixels =
width -
i;
835 srcaddr += srccomps * numxpixels;
838 blkaddr += dstRowDiff;
void tx_compress_dxtn(GLint srccomps, GLint width, GLint height, const GLubyte *srcPixData, GLenum destFormat, GLubyte *dest, GLint dstRowStride)
static void encodedxtcolorblockfaster(GLubyte *blkaddr, GLubyte srccolors[4][4][4], GLint numxpixels, GLint numypixels, GLuint type)
static void writedxt5encodedalphablock(GLubyte *blkaddr, GLubyte alphabase1, GLubyte alphabase2, GLubyte alphaenc[16])
static void encodedxt5alpha(GLubyte *blkaddr, GLubyte srccolors[4][4][4], GLint numxpixels, GLint numypixels)
static void storedxtencodedblock(GLubyte *blkaddr, GLubyte srccolors[4][4][4], GLubyte *bestcolor[2], GLint numxpixels, GLint numypixels, GLuint type, GLboolean haveAlpha)
static void extractsrccolors(GLubyte srcpixels[4][4][4], const GLchan *srcaddr, GLint srcRowStride, GLint numxpixels, GLint numypixels, GLint comps)
static void fancybasecolorsearch(GLubyte *blkaddr, GLubyte srccolors[4][4][4], GLubyte *bestcolor[2], GLint numxpixels, GLint numypixels, GLint type, GLboolean haveAlpha)
GLuint GLuint GLsizei GLenum type
GLint GLint GLsizei GLsizei height
GLint GLint GLsizei width
#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * bits
#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint factor
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j