1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>AllegroGL: texture.c Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
</script>
<link href="alleggl.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.3 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">AllegroGL <span id="projectnumber">0.4.4</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main Page</span></a></li>
<li><a href="pages.html"><span>Related Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
initNavTree('texture_8c.html','');
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<h1>texture.c</h1> </div>
</div>
<div class="contents">
<a href="texture_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/* This code is (C) AllegroGL contributors, and double licensed under</span>
<a name="l00002"></a>00002 <span class="comment"> * the GPL and zlib licenses. See gpl.txt or zlib.txt for details.</span>
<a name="l00003"></a>00003 <span class="comment"> */</span>
<a name="l00008"></a>00008 <span class="preprocessor">#include <string.h></span>
<a name="l00009"></a>00009
<a name="l00010"></a>00010 <span class="preprocessor">#include "alleggl.h"</span>
<a name="l00011"></a>00011 <span class="preprocessor">#include "allglint.h"</span>
<a name="l00012"></a>00012
<a name="l00013"></a>00013 <span class="preprocessor">#include <allegro/internal/aintern.h></span>
<a name="l00014"></a>00014
<a name="l00015"></a>00015 <span class="preprocessor">#ifdef ALLEGRO_MACOSX</span>
<a name="l00016"></a>00016 <span class="preprocessor"></span><span class="preprocessor">#include <OpenGL/glu.h></span>
<a name="l00017"></a>00017 <span class="preprocessor">#else</span>
<a name="l00018"></a>00018 <span class="preprocessor"></span><span class="preprocessor">#include <GL/glu.h></span>
<a name="l00019"></a>00019 <span class="preprocessor">#endif</span>
<a name="l00020"></a>00020 <span class="preprocessor"></span>
<a name="l00021"></a>00021 <span class="keyword">static</span> GLint allegro_gl_opengl_internal_texture_format = -1;
<a name="l00022"></a>00022 <span class="keyword">static</span> <span class="keywordtype">int</span> allegro_gl_use_mipmapping_for_textures = 0;
<a name="l00023"></a>00023 <span class="keywordtype">int</span> __allegro_gl_use_alpha = FALSE;
<a name="l00024"></a>00024 <span class="keywordtype">int</span> __allegro_gl_flip_texture = TRUE;
<a name="l00025"></a>00025 GLint __allegro_gl_texture_read_format[5];
<a name="l00026"></a>00026 GLint __allegro_gl_texture_components[5];
<a name="l00027"></a>00027
<a name="l00028"></a>00028 <span class="preprocessor">#define PREFIX_I "agl-tex INFO: "</span>
<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#define PREFIX_W "agl-tex WARNING: "</span>
<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#define PREFIX_E "agl-tex ERROR: "</span>
<a name="l00031"></a>00031 <span class="preprocessor"></span>
<a name="l00032"></a>00032
<a name="l00038"></a>00038 <span class="keywordtype">char</span> <span class="keyword">const</span> *__allegro_gl_get_format_description(GLint format)
<a name="l00039"></a>00039 {
<a name="l00040"></a>00040 <span class="keyword">static</span> <span class="keywordtype">char</span> str[256];
<a name="l00041"></a>00041 <span class="preprocessor">#define F(s) case s: return #s</span>
<a name="l00042"></a>00042 <span class="preprocessor"></span> <span class="keywordflow">switch</span> (format) {
<a name="l00043"></a>00043 F(GL_ALPHA);
<a name="l00044"></a>00044 F(GL_ALPHA4);
<a name="l00045"></a>00045 F(GL_ALPHA8);
<a name="l00046"></a>00046 F(GL_ALPHA12);
<a name="l00047"></a>00047 F(GL_ALPHA16);
<a name="l00048"></a>00048 F(GL_ALPHA16F_ARB);
<a name="l00049"></a>00049 F(GL_ALPHA32F_ARB);
<a name="l00050"></a>00050 F(GL_INTENSITY);
<a name="l00051"></a>00051 F(GL_INTENSITY4);
<a name="l00052"></a>00052 F(GL_INTENSITY8);
<a name="l00053"></a>00053 F(GL_INTENSITY12);
<a name="l00054"></a>00054 F(GL_INTENSITY16);
<a name="l00055"></a>00055 F(GL_INTENSITY16F_ARB);
<a name="l00056"></a>00056 F(GL_INTENSITY32F_ARB);
<a name="l00057"></a>00057 F(GL_LUMINANCE);
<a name="l00058"></a>00058 F(GL_LUMINANCE4);
<a name="l00059"></a>00059 F(GL_LUMINANCE8);
<a name="l00060"></a>00060 F(GL_LUMINANCE12);
<a name="l00061"></a>00061 F(GL_LUMINANCE16);
<a name="l00062"></a>00062 F(GL_LUMINANCE16F_ARB);
<a name="l00063"></a>00063 F(GL_LUMINANCE32F_ARB);
<a name="l00064"></a>00064 F(GL_LUMINANCE_ALPHA);
<a name="l00065"></a>00065 F(GL_LUMINANCE4_ALPHA4);
<a name="l00066"></a>00066 F(GL_LUMINANCE12_ALPHA4);
<a name="l00067"></a>00067 F(GL_LUMINANCE8_ALPHA8);
<a name="l00068"></a>00068 F(GL_LUMINANCE6_ALPHA2);
<a name="l00069"></a>00069 F(GL_LUMINANCE12_ALPHA12);
<a name="l00070"></a>00070 F(GL_LUMINANCE16_ALPHA16);
<a name="l00071"></a>00071 F(GL_LUMINANCE_ALPHA16F_ARB);
<a name="l00072"></a>00072 F(GL_LUMINANCE_ALPHA32F_ARB);
<a name="l00073"></a>00073 F(GL_RGB);
<a name="l00074"></a>00074 F(GL_R3_G3_B2);
<a name="l00075"></a>00075 F(GL_RGB4);
<a name="l00076"></a>00076 F(GL_RGB5);
<a name="l00077"></a>00077 F(GL_RGB8);
<a name="l00078"></a>00078 F(GL_RGB10);
<a name="l00079"></a>00079 F(GL_RGB12);
<a name="l00080"></a>00080 F(GL_RGB16);
<a name="l00081"></a>00081 F(GL_RGB16F_ARB);
<a name="l00082"></a>00082 F(GL_RGB32F_ARB);
<a name="l00083"></a>00083 F(GL_RGBA);
<a name="l00084"></a>00084 F(GL_RGBA2);
<a name="l00085"></a>00085 F(GL_RGBA4);
<a name="l00086"></a>00086 F(GL_RGB5_A1);
<a name="l00087"></a>00087 F(GL_RGBA8);
<a name="l00088"></a>00088 F(GL_RGB10_A2);
<a name="l00089"></a>00089 F(GL_RGBA12);
<a name="l00090"></a>00090 F(GL_RGBA16);
<a name="l00091"></a>00091 F(GL_RGBA16F_ARB);
<a name="l00092"></a>00092 F(GL_RGBA32F_ARB);
<a name="l00093"></a>00093 }
<a name="l00094"></a>00094 uszprintf(str, <span class="keyword">sizeof</span> str, <span class="stringliteral">"%x"</span>, format);
<a name="l00095"></a>00095 <span class="keywordflow">return</span> str;
<a name="l00096"></a>00096 <span class="preprocessor">#undef F</span>
<a name="l00097"></a>00097 <span class="preprocessor"></span>}
<a name="l00098"></a>00098
<a name="l00099"></a>00099
<a name="l00100"></a>00100
<a name="l00101"></a>00101 <span class="comment">/* int __allegro_gl_get_num_channels(GLenum format) */</span>
<a name="l00111"></a>00111 <span class="keywordtype">int</span> __allegro_gl_get_num_channels(GLenum format) {
<a name="l00112"></a>00112
<a name="l00113"></a>00113 <span class="keywordflow">switch</span> (format) {
<a name="l00114"></a>00114 <span class="keywordflow">case</span> 1:
<a name="l00115"></a>00115 <span class="keywordflow">case</span> GL_ALPHA:
<a name="l00116"></a>00116 <span class="keywordflow">case</span> GL_ALPHA4:
<a name="l00117"></a>00117 <span class="keywordflow">case</span> GL_ALPHA8:
<a name="l00118"></a>00118 <span class="keywordflow">case</span> GL_ALPHA12:
<a name="l00119"></a>00119 <span class="keywordflow">case</span> GL_ALPHA16:
<a name="l00120"></a>00120 <span class="keywordflow">case</span> GL_ALPHA16F_ARB:
<a name="l00121"></a>00121 <span class="keywordflow">case</span> GL_ALPHA32F_ARB:
<a name="l00122"></a>00122 <span class="keywordflow">case</span> GL_INTENSITY:
<a name="l00123"></a>00123 <span class="keywordflow">case</span> GL_INTENSITY4:
<a name="l00124"></a>00124 <span class="keywordflow">case</span> GL_INTENSITY8:
<a name="l00125"></a>00125 <span class="keywordflow">case</span> GL_INTENSITY12:
<a name="l00126"></a>00126 <span class="keywordflow">case</span> GL_INTENSITY16:
<a name="l00127"></a>00127 <span class="keywordflow">case</span> GL_INTENSITY16F_ARB:
<a name="l00128"></a>00128 <span class="keywordflow">case</span> GL_INTENSITY32F_ARB:
<a name="l00129"></a>00129 <span class="keywordflow">case</span> GL_LUMINANCE:
<a name="l00130"></a>00130 <span class="keywordflow">case</span> GL_LUMINANCE4:
<a name="l00131"></a>00131 <span class="keywordflow">case</span> GL_LUMINANCE8:
<a name="l00132"></a>00132 <span class="keywordflow">case</span> GL_LUMINANCE12:
<a name="l00133"></a>00133 <span class="keywordflow">case</span> GL_LUMINANCE16:
<a name="l00134"></a>00134 <span class="keywordflow">case</span> GL_LUMINANCE16F_ARB:
<a name="l00135"></a>00135 <span class="keywordflow">case</span> GL_LUMINANCE32F_ARB:
<a name="l00136"></a>00136 <span class="keywordflow">return</span> 1;
<a name="l00137"></a>00137 <span class="keywordflow">case</span> 2:
<a name="l00138"></a>00138 <span class="keywordflow">case</span> GL_LUMINANCE_ALPHA:
<a name="l00139"></a>00139 <span class="keywordflow">case</span> GL_LUMINANCE4_ALPHA4:
<a name="l00140"></a>00140 <span class="keywordflow">case</span> GL_LUMINANCE12_ALPHA4:
<a name="l00141"></a>00141 <span class="keywordflow">case</span> GL_LUMINANCE8_ALPHA8:
<a name="l00142"></a>00142 <span class="keywordflow">case</span> GL_LUMINANCE6_ALPHA2:
<a name="l00143"></a>00143 <span class="keywordflow">case</span> GL_LUMINANCE12_ALPHA12:
<a name="l00144"></a>00144 <span class="keywordflow">case</span> GL_LUMINANCE16_ALPHA16:
<a name="l00145"></a>00145 <span class="keywordflow">case</span> GL_LUMINANCE_ALPHA16F_ARB:
<a name="l00146"></a>00146 <span class="keywordflow">case</span> GL_LUMINANCE_ALPHA32F_ARB:
<a name="l00147"></a>00147 <span class="keywordflow">return</span> 2;
<a name="l00148"></a>00148 <span class="keywordflow">case</span> 3:
<a name="l00149"></a>00149 <span class="keywordflow">case</span> GL_RGB:
<a name="l00150"></a>00150 <span class="keywordflow">case</span> GL_R3_G3_B2:
<a name="l00151"></a>00151 <span class="keywordflow">case</span> GL_RGB4:
<a name="l00152"></a>00152 <span class="keywordflow">case</span> GL_RGB5:
<a name="l00153"></a>00153 <span class="keywordflow">case</span> GL_RGB8:
<a name="l00154"></a>00154 <span class="keywordflow">case</span> GL_RGB10:
<a name="l00155"></a>00155 <span class="keywordflow">case</span> GL_RGB12:
<a name="l00156"></a>00156 <span class="keywordflow">case</span> GL_RGB16:
<a name="l00157"></a>00157 <span class="keywordflow">case</span> GL_RGB16F_ARB:
<a name="l00158"></a>00158 <span class="keywordflow">case</span> GL_RGB32F_ARB:
<a name="l00159"></a>00159 <span class="keywordflow">return</span> 3;
<a name="l00160"></a>00160 <span class="keywordflow">case</span> 4:
<a name="l00161"></a>00161 <span class="keywordflow">case</span> GL_RGBA:
<a name="l00162"></a>00162 <span class="keywordflow">case</span> GL_RGBA2:
<a name="l00163"></a>00163 <span class="keywordflow">case</span> GL_RGBA4:
<a name="l00164"></a>00164 <span class="keywordflow">case</span> GL_RGB5_A1:
<a name="l00165"></a>00165 <span class="keywordflow">case</span> GL_RGBA8:
<a name="l00166"></a>00166 <span class="keywordflow">case</span> GL_RGB10_A2:
<a name="l00167"></a>00167 <span class="keywordflow">case</span> GL_RGBA12:
<a name="l00168"></a>00168 <span class="keywordflow">case</span> GL_RGBA16:
<a name="l00169"></a>00169 <span class="keywordflow">case</span> GL_RGBA16F_ARB:
<a name="l00170"></a>00170 <span class="keywordflow">case</span> GL_RGBA32F_ARB:
<a name="l00171"></a>00171 <span class="keywordflow">return</span> 4;
<a name="l00172"></a>00172 <span class="keywordflow">default</span>:
<a name="l00173"></a>00173 <span class="keywordflow">return</span> 0;
<a name="l00174"></a>00174 }
<a name="l00175"></a>00175 }
<a name="l00176"></a>00176
<a name="l00177"></a>00177
<a name="l00178"></a>00178
<a name="l00179"></a>00179 <span class="comment">/* GLint __allegro_gl_get_texture_format_ex(BITMAP *bmp, int flags) */</span>
<a name="l00190"></a>00190 GLint __allegro_gl_get_texture_format_ex(BITMAP *bmp, <span class="keywordtype">int</span> flags) {
<a name="l00191"></a>00191
<a name="l00192"></a>00192 <span class="keywordflow">if</span> (!bmp) {
<a name="l00193"></a>00193 <span class="keywordflow">return</span> -1;
<a name="l00194"></a>00194 }
<a name="l00195"></a>00195
<a name="l00196"></a>00196 <span class="keywordflow">switch</span> (bitmap_color_depth(bmp)) {
<a name="l00197"></a>00197 <span class="keywordflow">case</span> 32:
<a name="l00198"></a>00198 <span class="keywordflow">if</span> (flags
<a name="l00199"></a>00199 & (<a class="code" href="group__texture.html#ga8cc859eadf1610b424cd9188e716f432" title="Tell AllegroGL that the bitmap had an alpha channel, so it should be preserved when generating the te...">AGL_TEXTURE_HAS_ALPHA</a> | AGL_TEXTURE_FORCE_ALPHA_INTERNAL)) {
<a name="l00200"></a>00200 <span class="keywordflow">return</span> GL_RGBA8;
<a name="l00201"></a>00201 }
<a name="l00202"></a>00202 <span class="keywordflow">else</span> {
<a name="l00203"></a>00203 <span class="keywordflow">return</span> GL_RGB8;
<a name="l00204"></a>00204 }
<a name="l00205"></a>00205 <span class="keywordflow">case</span> 8:
<a name="l00206"></a>00206 <span class="keywordflow">return</span> GL_INTENSITY8;
<a name="l00207"></a>00207 <span class="keywordflow">case</span> 15:
<a name="l00208"></a>00208 <span class="keywordflow">if</span> (flags & AGL_TEXTURE_FORCE_ALPHA_INTERNAL) {
<a name="l00209"></a>00209 <span class="keywordflow">return</span> GL_RGB5_A1;
<a name="l00210"></a>00210 }
<a name="l00211"></a>00211 <span class="keywordflow">else</span> {
<a name="l00212"></a>00212 <span class="keywordflow">return</span> GL_RGB5;
<a name="l00213"></a>00213 }
<a name="l00214"></a>00214 <span class="keywordflow">case</span> 16:
<a name="l00215"></a>00215 <span class="keywordflow">case</span> 24:
<a name="l00216"></a>00216 <span class="keywordflow">if</span> (flags & AGL_TEXTURE_FORCE_ALPHA_INTERNAL) {
<a name="l00217"></a>00217 <span class="keywordflow">return</span> GL_RGBA8;
<a name="l00218"></a>00218 }
<a name="l00219"></a>00219 <span class="keywordflow">else</span> {
<a name="l00220"></a>00220 <span class="keywordflow">return</span> GL_RGB8;
<a name="l00221"></a>00221 }
<a name="l00222"></a>00222 <span class="keywordflow">default</span>:
<a name="l00223"></a>00223 <span class="keywordflow">return</span> -1;
<a name="l00224"></a>00224 }
<a name="l00225"></a>00225
<a name="l00226"></a>00226 <span class="keywordflow">return</span> -1;
<a name="l00227"></a>00227 }
<a name="l00228"></a>00228
<a name="l00229"></a>00229
<a name="l00230"></a>00230
<a name="l00231"></a>00231 <span class="comment">/* GLint allegro_gl_get_texture_format(BITMAP *bmp) */</span>
<a name="l00248"></a><a class="code" href="group__texture.html#ga2392fe7a8dd6db65532160821804aa68">00248</a> GLint <a class="code" href="group__texture.html#ga2392fe7a8dd6db65532160821804aa68" title="Returns the OpenGL internal texture format for this bitmap.">allegro_gl_get_texture_format</a>(BITMAP *bmp) {
<a name="l00249"></a>00249
<a name="l00250"></a>00250 <span class="keywordflow">if</span> (bmp && allegro_gl_opengl_internal_texture_format == -1) {
<a name="l00251"></a>00251 <span class="keywordflow">return</span> __allegro_gl_get_texture_format_ex(bmp,
<a name="l00252"></a>00252 __allegro_gl_use_alpha ? AGL_TEXTURE_FORCE_ALPHA_INTERNAL : 0);
<a name="l00253"></a>00253 }
<a name="l00254"></a>00254
<a name="l00255"></a>00255 <span class="keywordflow">return</span> allegro_gl_opengl_internal_texture_format;
<a name="l00256"></a>00256 }
<a name="l00257"></a>00257
<a name="l00258"></a>00258
<a name="l00259"></a>00259
<a name="l00260"></a>00260 <span class="comment">/* GLint allegro_gl_set_texture_format(GLint format) */</span>
<a name="l00282"></a><a class="code" href="group__texture.html#ga5d535e8af776dd449cc4755b9e3585b1">00282</a> GLint <a class="code" href="group__texture.html#ga5d535e8af776dd449cc4755b9e3585b1" title="Sets the color format you&#39;d like OpenGL to use for its textures.">allegro_gl_set_texture_format</a>(GLint format) {
<a name="l00283"></a>00283
<a name="l00284"></a>00284 GLint old = allegro_gl_opengl_internal_texture_format;
<a name="l00285"></a>00285 allegro_gl_opengl_internal_texture_format = format;
<a name="l00286"></a>00286 <span class="keywordflow">return</span> old;
<a name="l00287"></a>00287 }
<a name="l00288"></a>00288
<a name="l00289"></a>00289
<a name="l00290"></a>00290
<a name="l00291"></a>00291 <span class="comment">/* GLenum __allegro_gl_get_bitmap_type(BITMAP *bmp, int flags) */</span>
<a name="l00311"></a>00311 GLenum __allegro_gl_get_bitmap_type(BITMAP *bmp, <span class="keywordtype">int</span> flags) {
<a name="l00312"></a>00312
<a name="l00313"></a>00313 <span class="keywordtype">int</span> c = bitmap_color_depth(bmp);
<a name="l00314"></a>00314
<a name="l00315"></a>00315 <span class="keywordflow">switch</span> (c) {
<a name="l00316"></a>00316
<a name="l00317"></a>00317 <span class="keywordflow">case</span> 8:
<a name="l00318"></a>00318 <span class="keywordflow">return</span> __allegro_gl_texture_read_format[0];
<a name="l00319"></a>00319
<a name="l00320"></a>00320 <span class="keywordflow">case</span> 15:
<a name="l00321"></a>00321 <span class="keywordflow">return</span> __allegro_gl_texture_read_format[1];
<a name="l00322"></a>00322
<a name="l00323"></a>00323 <span class="keywordflow">case</span> 16:
<a name="l00324"></a>00324 <span class="keywordflow">return</span> __allegro_gl_texture_read_format[2];
<a name="l00325"></a>00325
<a name="l00326"></a>00326 <span class="keywordflow">case</span> 24:
<a name="l00327"></a>00327 <span class="keywordflow">return</span> __allegro_gl_texture_read_format[3];
<a name="l00328"></a>00328
<a name="l00329"></a>00329 <span class="keywordflow">case</span> 32:
<a name="l00330"></a>00330 <span class="keywordflow">return</span> __allegro_gl_texture_read_format[4];
<a name="l00331"></a>00331
<a name="l00332"></a>00332 <span class="keywordflow">default</span>:
<a name="l00333"></a>00333 TRACE(PREFIX_E <span class="stringliteral">"get_bitmap_type: unhandled bitmap depth: %d\n"</span>,
<a name="l00334"></a>00334 c);
<a name="l00335"></a>00335 <span class="keywordflow">return</span> -1;
<a name="l00336"></a>00336 }
<a name="l00337"></a>00337 }
<a name="l00338"></a>00338
<a name="l00339"></a>00339
<a name="l00340"></a>00340
<a name="l00341"></a>00341 <span class="comment">/* GLenum __allegro_gl_get_bitmap_color_format(BITMAP *bmp, int flags) */</span>
<a name="l00355"></a>00355 GLenum __allegro_gl_get_bitmap_color_format(BITMAP *bmp, <span class="keywordtype">int</span> flags) {
<a name="l00356"></a>00356
<a name="l00357"></a>00357 <span class="keywordtype">int</span> c = bitmap_color_depth(bmp);
<a name="l00358"></a>00358
<a name="l00359"></a>00359 <span class="keywordflow">switch</span> (c) {
<a name="l00360"></a>00360
<a name="l00361"></a>00361 <span class="keywordflow">case</span> 8:
<a name="l00362"></a>00362 <span class="keywordflow">if</span> (flags & <a class="code" href="group__texture.html#gad67cfdfd21ef2cae75b03cb871e57f4a" title="Tell AllegroGL that the specified BITMAP is an 8-bpp alpha-only BITMAP.">AGL_TEXTURE_ALPHA_ONLY</a>) {
<a name="l00363"></a>00363 <span class="keywordflow">return</span> GL_ALPHA;
<a name="l00364"></a>00364 }
<a name="l00365"></a>00365 <span class="keywordflow">else</span> {
<a name="l00366"></a>00366 <span class="keywordflow">return</span> __allegro_gl_texture_components[0];
<a name="l00367"></a>00367 }
<a name="l00368"></a>00368
<a name="l00369"></a>00369 <span class="keywordflow">case</span> 15:
<a name="l00370"></a>00370 <span class="keywordflow">if</span> (flags & AGL_TEXTURE_FORCE_ALPHA_INTERNAL) {
<a name="l00371"></a>00371 <span class="keywordflow">return</span> GL_RGBA;
<a name="l00372"></a>00372 }
<a name="l00373"></a>00373 <span class="keywordflow">else</span> {
<a name="l00374"></a>00374 <span class="keywordflow">return</span> __allegro_gl_texture_components[1];
<a name="l00375"></a>00375 }
<a name="l00376"></a>00376
<a name="l00377"></a>00377 <span class="keywordflow">case</span> 16:
<a name="l00378"></a>00378 <span class="keywordflow">return</span> __allegro_gl_texture_components[2];
<a name="l00379"></a>00379
<a name="l00380"></a>00380 <span class="keywordflow">case</span> 24:
<a name="l00381"></a>00381 <span class="keywordflow">return</span> __allegro_gl_texture_components[3];
<a name="l00382"></a>00382
<a name="l00383"></a>00383 <span class="keywordflow">case</span> 32:
<a name="l00384"></a>00384 <span class="keywordflow">if</span> (flags & (<a class="code" href="group__texture.html#ga8cc859eadf1610b424cd9188e716f432" title="Tell AllegroGL that the bitmap had an alpha channel, so it should be preserved when generating the te...">AGL_TEXTURE_HAS_ALPHA</a>
<a name="l00385"></a>00385 | AGL_TEXTURE_FORCE_ALPHA_INTERNAL)) {
<a name="l00386"></a>00386 <span class="keywordflow">return</span> GL_RGBA;
<a name="l00387"></a>00387 }
<a name="l00388"></a>00388 <span class="keywordflow">else</span> {
<a name="l00389"></a>00389 <span class="keywordflow">return</span> __allegro_gl_texture_components[4];
<a name="l00390"></a>00390 }
<a name="l00391"></a>00391
<a name="l00392"></a>00392 <span class="keywordflow">default</span>:
<a name="l00393"></a>00393 TRACE(PREFIX_E <span class="stringliteral">"get_bitmap_color_format: unhandled bitmap "</span>
<a name="l00394"></a>00394 <span class="stringliteral">"depth: %d\n"</span>, c);
<a name="l00395"></a>00395 <span class="keywordflow">return</span> -1;
<a name="l00396"></a>00396 }
<a name="l00397"></a>00397 }
<a name="l00398"></a>00398
<a name="l00399"></a>00399
<a name="l00400"></a>00400
<a name="l00401"></a>00401 <span class="comment">/* int allegro_gl_use_mipmapping(int enable) */</span>
<a name="l00415"></a><a class="code" href="group__texture.html#gab5393ecc10a2a31da7eb80c889af89ac">00415</a> <span class="keywordtype">int</span> <a class="code" href="group__texture.html#gab5393ecc10a2a31da7eb80c889af89ac" title="Tell AllegroGL to use Mipmapping or not when generating textures via its functions.">allegro_gl_use_mipmapping</a>(<span class="keywordtype">int</span> enable) {
<a name="l00416"></a>00416
<a name="l00417"></a>00417 <span class="keywordtype">int</span> old = allegro_gl_use_mipmapping_for_textures;
<a name="l00418"></a>00418 allegro_gl_use_mipmapping_for_textures = enable;
<a name="l00419"></a>00419 <span class="keywordflow">return</span> old;
<a name="l00420"></a>00420 }
<a name="l00421"></a>00421
<a name="l00422"></a>00422
<a name="l00423"></a>00423
<a name="l00424"></a>00424 <span class="comment">/* int allegro_gl_use_alpha_channel(int enable) */</span>
<a name="l00439"></a><a class="code" href="group__texture.html#ga1d88f4ebc7ed1ecd65640b72ea46a71e">00439</a> <span class="keywordtype">int</span> <a class="code" href="group__texture.html#ga1d88f4ebc7ed1ecd65640b72ea46a71e" title="Tell AllegroGL to use Alpha channel or not when generating textures via its functions.">allegro_gl_use_alpha_channel</a>(<span class="keywordtype">int</span> enable) {
<a name="l00440"></a>00440
<a name="l00441"></a>00441 <span class="keywordtype">int</span> old = __allegro_gl_use_alpha;
<a name="l00442"></a>00442 __allegro_gl_use_alpha = enable;
<a name="l00443"></a>00443 <span class="keywordflow">return</span> old;
<a name="l00444"></a>00444 }
<a name="l00445"></a>00445
<a name="l00446"></a>00446
<a name="l00447"></a>00447
<a name="l00448"></a>00448 <span class="comment">/* int allegro_gl_flip_texture(int enable) */</span>
<a name="l00464"></a><a class="code" href="group__texture.html#ga3ec0a1c4c6656f13c8398bab7a1293f2">00464</a> <span class="keywordtype">int</span> <a class="code" href="group__texture.html#ga3ec0a1c4c6656f13c8398bab7a1293f2" title="Tell AllegroGL to flip the texture vertically or not when generating textures via its functions...">allegro_gl_flip_texture</a>(<span class="keywordtype">int</span> enable) {
<a name="l00465"></a>00465
<a name="l00466"></a>00466 <span class="keywordtype">int</span> old = __allegro_gl_flip_texture;
<a name="l00467"></a>00467 __allegro_gl_flip_texture = enable;
<a name="l00468"></a>00468 <span class="keywordflow">return</span> old;
<a name="l00469"></a>00469 }
<a name="l00470"></a>00470
<a name="l00471"></a>00471
<a name="l00472"></a>00472
<a name="l00473"></a>00473 <span class="comment">/* int allegro_gl_check_texture_ex(int flags, BITMAP *bmp, GLuint internal_format) */</span>
<a name="l00495"></a><a class="code" href="group__texture.html#gab0cf4dc0ddcb45f5b067d08aed1c88e6">00495</a> <span class="keywordtype">int</span> <a class="code" href="group__texture.html#gab0cf4dc0ddcb45f5b067d08aed1c88e6" title="Checks whether the specified bitmap is of the proper size for texturing.">allegro_gl_check_texture_ex</a>(<span class="keywordtype">int</span> flags, BITMAP *bmp,
<a name="l00496"></a>00496 GLint internal_format) {
<a name="l00497"></a>00497
<a name="l00498"></a>00498 <span class="keywordflow">return</span> (<a class="code" href="group__texture.html#gaf3a48c555068e7051171255c1011150a" title="Uploads an Allegro BITMAP to the GL driver as a texture.">allegro_gl_make_texture_ex</a>(flags | AGL_TEXTURE_CHECK_VALID_INTERNAL,
<a name="l00499"></a>00499 bmp, internal_format) ? TRUE : FALSE);
<a name="l00500"></a>00500 }
<a name="l00501"></a>00501
<a name="l00502"></a>00502
<a name="l00503"></a>00503
<a name="l00504"></a>00504 <span class="comment">/* Convert flags from pre-0.2.0 to 0.2.0+ */</span>
<a name="l00505"></a>00505 <span class="keyword">static</span> <span class="keywordtype">int</span> __allegro_gl_convert_flags(<span class="keywordtype">int</span> flags) {
<a name="l00506"></a>00506
<a name="l00507"></a>00507 flags |= <a class="code" href="group__texture.html#gaa8b7246edc7ec019ec3b434eb0cacdf2" title="Tell AllegroGL to allow rescaling of the bitmap.">AGL_TEXTURE_RESCALE</a>;
<a name="l00508"></a>00508
<a name="l00509"></a>00509 <span class="keywordflow">if</span> (allegro_gl_use_mipmapping_for_textures) {
<a name="l00510"></a>00510 flags |= <a class="code" href="group__texture.html#gabaf179e577a9328a751e92e3603f0746" title="AllegroGL will generate mipmaps for this texture.">AGL_TEXTURE_MIPMAP</a>;
<a name="l00511"></a>00511 }
<a name="l00512"></a>00512 <span class="keywordflow">if</span> (__allegro_gl_use_alpha) {
<a name="l00513"></a>00513 flags |= <a class="code" href="group__texture.html#ga8cc859eadf1610b424cd9188e716f432" title="Tell AllegroGL that the bitmap had an alpha channel, so it should be preserved when generating the te...">AGL_TEXTURE_HAS_ALPHA</a>;
<a name="l00514"></a>00514 }
<a name="l00515"></a>00515 <span class="keywordflow">if</span> (__allegro_gl_flip_texture) {
<a name="l00516"></a>00516 flags |= <a class="code" href="group__texture.html#gadeffe4feb290278035beacedb284a010" title="Flip the texture on the x-axis.">AGL_TEXTURE_FLIP</a>;
<a name="l00517"></a>00517 }
<a name="l00518"></a>00518
<a name="l00519"></a>00519 <span class="keywordflow">if</span> (allegro_gl_opengl_internal_texture_format == GL_ALPHA4
<a name="l00520"></a>00520 || allegro_gl_opengl_internal_texture_format == GL_ALPHA8
<a name="l00521"></a>00521 || allegro_gl_opengl_internal_texture_format == GL_ALPHA12
<a name="l00522"></a>00522 || allegro_gl_opengl_internal_texture_format == GL_ALPHA16
<a name="l00523"></a>00523 || allegro_gl_opengl_internal_texture_format == GL_ALPHA
<a name="l00524"></a>00524 || allegro_gl_opengl_internal_texture_format == GL_INTENSITY4
<a name="l00525"></a>00525 || allegro_gl_opengl_internal_texture_format == GL_INTENSITY8
<a name="l00526"></a>00526 || allegro_gl_opengl_internal_texture_format == GL_INTENSITY12
<a name="l00527"></a>00527 || allegro_gl_opengl_internal_texture_format == GL_INTENSITY16
<a name="l00528"></a>00528 || allegro_gl_opengl_internal_texture_format == GL_INTENSITY
<a name="l00529"></a>00529 || allegro_gl_opengl_internal_texture_format == 1) {
<a name="l00530"></a>00530 flags |= <a class="code" href="group__texture.html#gad67cfdfd21ef2cae75b03cb871e57f4a" title="Tell AllegroGL that the specified BITMAP is an 8-bpp alpha-only BITMAP.">AGL_TEXTURE_ALPHA_ONLY</a>;
<a name="l00531"></a>00531 }
<a name="l00532"></a>00532
<a name="l00533"></a>00533 <span class="keywordflow">return</span> flags;
<a name="l00534"></a>00534 }
<a name="l00535"></a>00535
<a name="l00536"></a>00536
<a name="l00537"></a>00537
<a name="l00538"></a>00538 <span class="comment">/* int allegro_gl_check_texture(BITMAP *bmp) */</span>
<a name="l00557"></a><a class="code" href="group__texture.html#ga6996c14538e18b1614f91d34b2d4d691">00557</a> <span class="keywordtype">int</span> <a class="code" href="group__texture.html#ga6996c14538e18b1614f91d34b2d4d691" title="Checks whether the specified bitmap is of the proper size for texturing.">allegro_gl_check_texture</a>(BITMAP *bmp) {
<a name="l00558"></a>00558
<a name="l00559"></a>00559 <span class="keywordtype">int</span> flags = __allegro_gl_convert_flags(0);
<a name="l00560"></a>00560
<a name="l00561"></a>00561 <span class="keywordflow">return</span> <a class="code" href="group__texture.html#gab0cf4dc0ddcb45f5b067d08aed1c88e6" title="Checks whether the specified bitmap is of the proper size for texturing.">allegro_gl_check_texture_ex</a>(flags, bmp,
<a name="l00562"></a>00562 allegro_gl_opengl_internal_texture_format);
<a name="l00563"></a>00563 }
<a name="l00564"></a>00564
<a name="l00565"></a>00565
<a name="l00566"></a>00566
<a name="l00567"></a>00567 <span class="comment">/* Integer log2 function. Not optimized for speed. */</span>
<a name="l00568"></a>00568 <span class="keyword">static</span> <span class="keywordtype">int</span> log2i(<span class="keywordtype">int</span> n) {
<a name="l00569"></a>00569
<a name="l00570"></a>00570 <span class="keywordtype">int</span> k;
<a name="l00571"></a>00571
<a name="l00572"></a>00572 <span class="keywordflow">if</span> (n < 1) {
<a name="l00573"></a>00573 <span class="keywordflow">return</span> -1;
<a name="l00574"></a>00574 }
<a name="l00575"></a>00575
<a name="l00576"></a>00576 k = 0;
<a name="l00577"></a>00577 <span class="keywordflow">while</span> (n >>= 1) {
<a name="l00578"></a>00578 k++;
<a name="l00579"></a>00579 }
<a name="l00580"></a>00580
<a name="l00581"></a>00581 <span class="keywordflow">return</span> k;
<a name="l00582"></a>00582 }
<a name="l00583"></a>00583
<a name="l00584"></a>00584
<a name="l00585"></a>00585
<a name="l00586"></a>00586 <span class="comment">/* BITMAP *__allegro_gl_munge_bitmap(int flags, BITMAP *bmp, GLint *type, GLint *format) */</span>
<a name="l00596"></a>00596 BITMAP *__allegro_gl_munge_bitmap(<span class="keywordtype">int</span> flags, BITMAP *bmp, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y,
<a name="l00597"></a>00597 <span class="keywordtype">int</span> w, <span class="keywordtype">int</span> h, GLint *type, GLint *format) {
<a name="l00598"></a>00598
<a name="l00599"></a>00599 BITMAP *ret = 0, *temp = 0;
<a name="l00600"></a>00600
<a name="l00601"></a>00601 <span class="keywordtype">int</span> need_rescale = 0;
<a name="l00602"></a>00602 <span class="keywordtype">int</span> need_alpha = 0;
<a name="l00603"></a>00603 <span class="keywordtype">int</span> need_flip = 0;
<a name="l00604"></a>00604 <span class="keywordtype">int</span> depth = bitmap_color_depth(bmp);
<a name="l00605"></a>00605 <span class="keywordtype">int</span> force_copy = 0;
<a name="l00606"></a>00606
<a name="l00607"></a>00607 <span class="keyword">const</span> <span class="keywordtype">int</span> old_w = w, old_h = h;
<a name="l00608"></a>00608
<a name="l00609"></a>00609 <span class="keywordflow">if</span> (flags & <a class="code" href="group__texture.html#gaa8b7246edc7ec019ec3b434eb0cacdf2" title="Tell AllegroGL to allow rescaling of the bitmap.">AGL_TEXTURE_RESCALE</a>) {
<a name="l00610"></a>00610
<a name="l00611"></a>00611 <span class="comment">/* Check if rescaling is needed */</span>
<a name="l00612"></a>00612
<a name="l00613"></a>00613 <span class="comment">/* NP2 is not supported, and the texture isn't a power-of-two.</span>
<a name="l00614"></a>00614 <span class="comment"> * Resize the next power of 2</span>
<a name="l00615"></a>00615 <span class="comment"> */</span>
<a name="l00616"></a>00616 <span class="keywordflow">if</span> (!<a class="code" href="group__extensions.html#ga7492f6f6acc608789210560ee63e5436" title="List of OpenGL extensions supported by AllegroGL.">allegro_gl_extensions_GL</a>.ARB_texture_non_power_of_two
<a name="l00617"></a>00617 && ((w & (w - 1)) || (h & (h - 1)))) {
<a name="l00618"></a>00618 w = __allegro_gl_make_power_of_2(w);
<a name="l00619"></a>00619 h = __allegro_gl_make_power_of_2(h);
<a name="l00620"></a>00620 TRACE(PREFIX_I <span class="stringliteral">"munge_bitmap: Rescaling bitmap from "</span>
<a name="l00621"></a>00621 <span class="stringliteral">"%ix%i to %ix%i due to non-power-of-2 source size.\n"</span>,
<a name="l00622"></a>00622 old_w, old_h, w, h);
<a name="l00623"></a>00623 need_rescale = 1;
<a name="l00624"></a>00624 }
<a name="l00625"></a>00625
<a name="l00626"></a>00626 <span class="comment">/* Don't go over the max texture size */</span>
<a name="l00627"></a>00627 <span class="keywordflow">if</span> (w > allegro_gl_info.max_texture_size) {
<a name="l00628"></a>00628 w = allegro_gl_info.max_texture_size;
<a name="l00629"></a>00629 TRACE(PREFIX_I <span class="stringliteral">"munge_bitmap: Rescaling bitmap from "</span>
<a name="l00630"></a>00630 <span class="stringliteral">"%ix%i to %ix%i due to max supported size exceed.\n"</span>,
<a name="l00631"></a>00631 old_w, old_h, w, h);
<a name="l00632"></a>00632 need_rescale = 1;
<a name="l00633"></a>00633 }
<a name="l00634"></a>00634
<a name="l00635"></a>00635 <span class="keywordflow">if</span> (h > allegro_gl_info.max_texture_size) {
<a name="l00636"></a>00636 h = allegro_gl_info.max_texture_size;
<a name="l00637"></a>00637 TRACE(PREFIX_I <span class="stringliteral">"munge_bitmap: Rescaling bitmap from "</span>
<a name="l00638"></a>00638 <span class="stringliteral">"%ix%i to %ix%i due to max supported size exceed.\n"</span>,
<a name="l00639"></a>00639 old_w, old_h, w, h);
<a name="l00640"></a>00640 need_rescale = 1;
<a name="l00641"></a>00641 }
<a name="l00642"></a>00642
<a name="l00643"></a>00643 <span class="comment">/* Voodoos don't support mipmaps for textures greater than 32x32.</span>
<a name="l00644"></a>00644 <span class="comment"> * If we're allowed to rescale, rescale the bitmap to 32x32.</span>
<a name="l00645"></a>00645 <span class="comment"> * XXX <rohannessian> Apparently, this is a bug in one version</span>
<a name="l00646"></a>00646 <span class="comment"> * of the Voodoo GL driver. Need to figure out a workaround</span>
<a name="l00647"></a>00647 <span class="comment"> * for that.</span>
<a name="l00648"></a>00648 <span class="comment"> */</span>
<a name="l00649"></a>00649 <span class="keywordflow">if</span> (allegro_gl_info.is_voodoo && (flags & <a class="code" href="group__texture.html#gabaf179e577a9328a751e92e3603f0746" title="AllegroGL will generate mipmaps for this texture.">AGL_TEXTURE_MIPMAP</a>)
<a name="l00650"></a>00650 && (w > 32 || h > 32)) {
<a name="l00651"></a>00651
<a name="l00652"></a>00652 w = MIN(32, w);
<a name="l00653"></a>00653 h = MIN(32, h);
<a name="l00654"></a>00654
<a name="l00655"></a>00655 TRACE(PREFIX_I <span class="stringliteral">"munge_bitmap: Rescaling bitmap from "</span>
<a name="l00656"></a>00656 <span class="stringliteral">"%ix%i to %ix%i due to Voodoo driver bug.\n"</span>,
<a name="l00657"></a>00657 old_w, old_h, w, h);
<a name="l00658"></a>00658 need_rescale = 1;
<a name="l00659"></a>00659 }
<a name="l00660"></a>00660 }
<a name="l00661"></a>00661
<a name="l00662"></a>00662 <span class="comment">/* Matrox G200 cards have a bug where rectangular textures can't have</span>
<a name="l00663"></a>00663 <span class="comment"> * more than 4 levels of mipmaps (max_mip == 3). This doesn't seem</span>
<a name="l00664"></a>00664 <span class="comment"> * to affect square textures.</span>
<a name="l00665"></a>00665 <span class="comment"> *</span>
<a name="l00666"></a>00666 <span class="comment"> * Note: Using GLU to build the mipmaps seems to work. Maybe AGL is</span>
<a name="l00667"></a>00667 <span class="comment"> * doing something wrong?</span>
<a name="l00668"></a>00668 <span class="comment"> *</span>
<a name="l00669"></a>00669 <span class="comment"> * Workaround: Use GLU to build the mipmaps, and force depth to 24 or</span>
<a name="l00670"></a>00670 <span class="comment"> * 32.</span>
<a name="l00671"></a>00671 <span class="comment"> */</span>
<a name="l00672"></a>00672 <span class="keywordflow">if</span> ( allegro_gl_info.is_matrox_g200 && (flags & <a class="code" href="group__texture.html#gabaf179e577a9328a751e92e3603f0746" title="AllegroGL will generate mipmaps for this texture.">AGL_TEXTURE_MIPMAP</a>)) {
<a name="l00673"></a>00673 <span class="keywordtype">int</span> wl = log2i(w);
<a name="l00674"></a>00674 <span class="keywordtype">int</span> hl = log2i(h);
<a name="l00675"></a>00675
<a name="l00676"></a>00676 <span class="keywordflow">if</span> (w != h && MAX(wl, hl) > 3 && depth < 24
<a name="l00677"></a>00677 && !(flags & AGL_TEXTURE_ALPHA_ONLY)) {
<a name="l00678"></a>00678 TRACE(PREFIX_I <span class="stringliteral">"munge_bitmap: G200 path in use.\n"</span>);
<a name="l00679"></a>00679 depth = 24;
<a name="l00680"></a>00680 }
<a name="l00681"></a>00681 }
<a name="l00682"></a>00682
<a name="l00683"></a>00683 <span class="comment">/* Do we need to flip the texture on the t axis? */</span>
<a name="l00684"></a>00684 <span class="keywordflow">if</span> (flags & <a class="code" href="group__texture.html#gadeffe4feb290278035beacedb284a010" title="Flip the texture on the x-axis.">AGL_TEXTURE_FLIP</a>) {
<a name="l00685"></a>00685 need_flip = 1;
<a name="l00686"></a>00686 }
<a name="l00687"></a>00687
<a name="l00688"></a>00688
<a name="l00689"></a>00689 <span class="comment">/* If not supported, blit to a 24 bpp bitmap and try again</span>
<a name="l00690"></a>00690 <span class="comment"> */</span>
<a name="l00691"></a>00691 <span class="keywordflow">if</span> (*type == -1) {
<a name="l00692"></a>00692 TRACE(PREFIX_W <span class="stringliteral">"munge_bitmap: using temporary 24bpp bitmap\n"</span>);
<a name="l00693"></a>00693 depth = 24;
<a name="l00694"></a>00694 }
<a name="l00695"></a>00695
<a name="l00696"></a>00696 <span class="comment">/* We need a texture that can be used for masked blits.</span>
<a name="l00697"></a>00697 <span class="comment"> * Insert an alpha channel if one is not there.</span>
<a name="l00698"></a>00698 <span class="comment"> * If it's already there, replace it by 0/1 as needed.</span>
<a name="l00699"></a>00699 <span class="comment"> */</span>
<a name="l00700"></a>00700 <span class="keywordflow">if</span> ((flags & <a class="code" href="group__texture.html#gaba184d573c65f33b35d1d57936607d08" title="Generate an alpha channel for this texture, based on the Allegro mask color.">AGL_TEXTURE_MASKED</a>) && !(flags & AGL_TEXTURE_ALPHA_ONLY)) {
<a name="l00701"></a>00701 need_alpha = 1;
<a name="l00702"></a>00702
<a name="l00703"></a>00703 <span class="keywordflow">switch</span> (depth) {
<a name="l00704"></a>00704 <span class="keywordflow">case</span> 15:
<a name="l00705"></a>00705 <span class="keywordflow">if</span> (!<a class="code" href="group__extensions.html#ga7492f6f6acc608789210560ee63e5436" title="List of OpenGL extensions supported by AllegroGL.">allegro_gl_extensions_GL</a>.EXT_packed_pixels) {
<a name="l00706"></a>00706 depth = 32;
<a name="l00707"></a>00707 }
<a name="l00708"></a>00708 <span class="keywordflow">break</span>;
<a name="l00709"></a>00709 <span class="keywordflow">case</span> 8:
<a name="l00710"></a>00710 <span class="keywordflow">case</span> 16:
<a name="l00711"></a>00711 <span class="keywordflow">case</span> 24:
<a name="l00712"></a>00712 <span class="keywordflow">case</span> 32:
<a name="l00713"></a>00713 depth = 32;
<a name="l00714"></a>00714 <span class="keywordflow">break</span>;
<a name="l00715"></a>00715 }
<a name="l00716"></a>00716 force_copy = 1;
<a name="l00717"></a>00717 }
<a name="l00718"></a>00718
<a name="l00719"></a>00719 <span class="comment">/* Allegro fills in 0 for the alpha channel. Matrox G200 seems to ignore</span>
<a name="l00720"></a>00720 <span class="comment"> * the internal format; so we need to drop down to 24-bpp if no alpha</span>
<a name="l00721"></a>00721 <span class="comment"> * will be needed.</span>
<a name="l00722"></a>00722 <span class="comment"> */</span>
<a name="l00723"></a>00723 <span class="keywordflow">if</span> (allegro_gl_info.is_matrox_g200 && !(flags & AGL_TEXTURE_MASKED)
<a name="l00724"></a>00724 && !(flags & <a class="code" href="group__texture.html#ga8cc859eadf1610b424cd9188e716f432" title="Tell AllegroGL that the bitmap had an alpha channel, so it should be preserved when generating the te...">AGL_TEXTURE_HAS_ALPHA</a>) && depth == 32) {
<a name="l00725"></a>00725 TRACE(PREFIX_I <span class="stringliteral">"munge_bitmap: G200 path in use.\n"</span>);
<a name="l00726"></a>00726 depth = 24;
<a name="l00727"></a>00727 force_copy = 1;
<a name="l00728"></a>00728 }
<a name="l00729"></a>00729
<a name="l00730"></a>00730
<a name="l00731"></a>00731 <span class="comment">/* Do we need to do a color depth conversion or bitmap copy? */</span>
<a name="l00732"></a>00732 <span class="keywordflow">if</span> (depth != bitmap_color_depth(bmp) || force_copy) {
<a name="l00733"></a>00733
<a name="l00734"></a>00734 TRACE(PREFIX_I <span class="stringliteral">"munge_bitmap: Need to perform depth conversion from %i "</span>
<a name="l00735"></a>00735 <span class="stringliteral">"to %i bpp.\n"</span>, bitmap_color_depth(bmp), depth);
<a name="l00736"></a>00736
<a name="l00737"></a>00737 temp = create_bitmap_ex(depth, bmp->w, bmp->h);
<a name="l00738"></a>00738
<a name="l00739"></a>00739 <span class="keywordflow">if</span> (!temp) {
<a name="l00740"></a>00740 TRACE(PREFIX_E <span class="stringliteral">"munge_bitmap: Unable to create temporary bitmap "</span>
<a name="l00741"></a>00741 <span class="stringliteral">"%ix%ix%i\n"</span>, bmp->w, bmp->h, depth);
<a name="l00742"></a>00742 <span class="keywordflow">return</span> NULL;
<a name="l00743"></a>00743 }
<a name="l00744"></a>00744
<a name="l00745"></a>00745 <span class="comment">/* XXX <rohannessian> Use palette conversion?</span>
<a name="l00746"></a>00746 <span class="comment"> */</span>
<a name="l00747"></a>00747 <span class="keywordflow">if</span> (bitmap_color_depth(bmp) == 8 && depth > 8) {
<a name="l00748"></a>00748 <span class="keywordtype">int</span> i, j;
<a name="l00749"></a>00749 <span class="keywordflow">for</span> (j = 0; j < bmp->h; j++) {
<a name="l00750"></a>00750 <span class="keywordflow">for</span> (i = 0; i < bmp->w; i++) {
<a name="l00751"></a>00751 <span class="keywordtype">int</span> c = _getpixel(bmp, i, j);
<a name="l00752"></a>00752 putpixel(temp, i, j, makecol_depth(depth, c, c, c));
<a name="l00753"></a>00753 }
<a name="l00754"></a>00754 }
<a name="l00755"></a>00755 }
<a name="l00756"></a>00756 <span class="keywordflow">else</span> {
<a name="l00757"></a>00757 blit(bmp, temp, 0, 0, 0, 0, bmp->w, bmp->h);
<a name="l00758"></a>00758 }
<a name="l00759"></a>00759 bmp = temp;
<a name="l00760"></a>00760
<a name="l00761"></a>00761 *format = __allegro_gl_get_bitmap_color_format(bmp, flags);
<a name="l00762"></a>00762 *type = __allegro_gl_get_bitmap_type(bmp, flags);
<a name="l00763"></a>00763 }
<a name="l00764"></a>00764
<a name="l00765"></a>00765
<a name="l00766"></a>00766
<a name="l00767"></a>00767 <span class="comment">/* Nothing to do? */</span>
<a name="l00768"></a>00768 <span class="keywordflow">if</span> (!need_rescale && !need_alpha && !need_flip) {
<a name="l00769"></a>00769
<a name="l00770"></a>00770 TRACE(PREFIX_I <span class="stringliteral">"munge_bitmap: No need for munging - returning %p\n"</span>,
<a name="l00771"></a>00771 temp);
<a name="l00772"></a>00772
<a name="l00773"></a>00773 <span class="comment">/* Return depth-converte bitmap, if present */</span>
<a name="l00774"></a>00774 <span class="keywordflow">if</span> (temp) {
<a name="l00775"></a>00775 <span class="keywordflow">return</span> temp;
<a name="l00776"></a>00776 }
<a name="l00777"></a>00777 <span class="keywordflow">return</span> NULL;
<a name="l00778"></a>00778 }
<a name="l00779"></a>00779
<a name="l00780"></a>00780 ret = create_bitmap_ex(depth, w, h);
<a name="l00781"></a>00781
<a name="l00782"></a>00782 <span class="keywordflow">if</span> (!ret) {
<a name="l00783"></a>00783 TRACE(PREFIX_E <span class="stringliteral">"munge_bitmap: Unable to create result bitmap "</span>
<a name="l00784"></a>00784 <span class="stringliteral">"%ix%ix%i\n"</span>, w, h, depth);
<a name="l00785"></a>00785 <span class="keywordflow">goto</span> error;
<a name="l00786"></a>00786 }
<a name="l00787"></a>00787
<a name="l00788"></a>00788
<a name="l00789"></a>00789 <span class="comment">/* No need to fill in bitmap if we're just making a query */</span>
<a name="l00790"></a>00790 <span class="keywordflow">if</span> (flags & AGL_TEXTURE_CHECK_VALID_INTERNAL) {
<a name="l00791"></a>00791 <span class="keywordflow">if</span> (temp) {
<a name="l00792"></a>00792 destroy_bitmap(temp);
<a name="l00793"></a>00793 }
<a name="l00794"></a>00794 <span class="keywordflow">return</span> ret;
<a name="l00795"></a>00795 }
<a name="l00796"></a>00796
<a name="l00797"></a>00797
<a name="l00798"></a>00798 <span class="comment">/* Perform flip</span>
<a name="l00799"></a>00799 <span class="comment"> * I don't want to have to deal with *yet another* temporary bitmap</span>
<a name="l00800"></a>00800 <span class="comment"> * so instead, I fugde the line pointers around.</span>
<a name="l00801"></a>00801 <span class="comment"> * This will work because we require Allegro memory bitmaps anyway.</span>
<a name="l00802"></a>00802 <span class="comment"> */</span>
<a name="l00803"></a>00803 <span class="keywordflow">if</span> (need_flip) {
<a name="l00804"></a>00804 <span class="keywordtype">int</span> i;
<a name="l00805"></a>00805 TRACE(PREFIX_I <span class="stringliteral">"munge_bitmap: Flipping bitmap.\n"</span>);
<a name="l00806"></a>00806 <span class="keywordflow">for</span> (i = 0; i < bmp->h/2; i++) {
<a name="l00807"></a>00807 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *l = bmp->line[i];
<a name="l00808"></a>00808 bmp->line[i] = bmp->line[bmp->h - i - 1];
<a name="l00809"></a>00809 bmp->line[bmp->h - i - 1] = l;
<a name="l00810"></a>00810 }
<a name="l00811"></a>00811 }
<a name="l00812"></a>00812
<a name="l00813"></a>00813 <span class="comment">/* Rescale bitmap */</span>
<a name="l00814"></a>00814 <span class="keywordflow">if</span> (need_rescale) {
<a name="l00815"></a>00815 TRACE(PREFIX_I <span class="stringliteral">"munge_bitmap: Rescaling bitmap.\n"</span>);
<a name="l00816"></a>00816 stretch_blit(bmp, ret, x, y, old_w, old_h, 0, 0, ret->w, ret->h);
<a name="l00817"></a>00817 }
<a name="l00818"></a>00818 <span class="keywordflow">else</span> {
<a name="l00819"></a>00819 TRACE(PREFIX_I <span class="stringliteral">"munge_bitmap: Copying bitmap.\n"</span>);
<a name="l00820"></a>00820 blit(bmp, ret, x, y, 0, 0, w, h);
<a name="l00821"></a>00821 }
<a name="l00822"></a>00822
<a name="l00823"></a>00823 <span class="comment">/* Restore the original bitmap, if needed */</span>
<a name="l00824"></a>00824 <span class="keywordflow">if</span> (need_flip && !temp) {
<a name="l00825"></a>00825 <span class="keywordtype">int</span> i;
<a name="l00826"></a>00826 TRACE(PREFIX_I <span class="stringliteral">"munge_bitmap: Unflipping bitmap.\n"</span>);
<a name="l00827"></a>00827 <span class="keywordflow">for</span> (i = 0; i < bmp->h/2; i++) {
<a name="l00828"></a>00828 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *l = bmp->line[i];
<a name="l00829"></a>00829 bmp->line[i] = bmp->line[bmp->h - i - 1];
<a name="l00830"></a>00830 bmp->line[bmp->h - i - 1] = l;
<a name="l00831"></a>00831 }
<a name="l00832"></a>00832 }
<a name="l00833"></a>00833
<a name="l00834"></a>00834 <span class="comment">/* Insert alpha channel */</span>
<a name="l00835"></a>00835 <span class="keywordflow">if</span> (need_alpha) {
<a name="l00836"></a>00836 <span class="keywordtype">int</span> i, j;
<a name="l00837"></a>00837 <span class="keywordtype">int</span> mask = bitmap_mask_color(ret);
<a name="l00838"></a>00838
<a name="l00839"></a>00839 <span class="comment">/* alpha mask for 5.5.5.1 pixels */</span>
<a name="l00840"></a>00840 <span class="keywordtype">int</span> alpha = (-1) ^ makecol_depth(depth, 255, 255, 255);
<a name="l00841"></a>00841
<a name="l00842"></a>00842 TRACE(PREFIX_I <span class="stringliteral">"munge_bitmap: Inserting alpha channel.\n"</span>);
<a name="l00843"></a>00843
<a name="l00844"></a>00844 <span class="keywordflow">for</span> (j = 0; j < h; j++) {
<a name="l00845"></a>00845 <span class="keywordflow">for</span> (i = 0; i < w; i++) {
<a name="l00846"></a>00846 <span class="keywordtype">int</span> pix;
<a name="l00847"></a>00847
<a name="l00848"></a>00848 <span class="keywordflow">switch</span> (depth) {
<a name="l00849"></a>00849 <span class="keywordflow">case</span> 32:
<a name="l00850"></a>00850 pix = _getpixel32(ret, i, j);
<a name="l00851"></a>00851
<a name="l00852"></a>00852 <span class="keywordflow">if</span> (pix == mask) {
<a name="l00853"></a>00853 pix = 0;
<a name="l00854"></a>00854 }
<a name="l00855"></a>00855 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((flags & AGL_TEXTURE_HAS_ALPHA) == 0) {
<a name="l00856"></a>00856 <span class="keywordtype">int</span> r, g, b;
<a name="l00857"></a>00857 r = getr32(pix);
<a name="l00858"></a>00858 g = getg32(pix);
<a name="l00859"></a>00859 b = getb32(pix);
<a name="l00860"></a>00860 pix = makeacol32(r, g, b, 255);
<a name="l00861"></a>00861 }
<a name="l00862"></a>00862 _putpixel32(ret, i, j, pix);
<a name="l00863"></a>00863 <span class="keywordflow">break</span>;
<a name="l00864"></a>00864 <span class="keywordflow">case</span> 15:
<a name="l00865"></a>00865 pix = _getpixel16(ret, i, j);
<a name="l00866"></a>00866
<a name="l00867"></a>00867 <span class="keywordflow">if</span> (pix == mask) {
<a name="l00868"></a>00868 pix = 0;
<a name="l00869"></a>00869 }
<a name="l00870"></a>00870 <span class="keywordflow">else</span> {
<a name="l00871"></a>00871 pix |= alpha;
<a name="l00872"></a>00872 }
<a name="l00873"></a>00873
<a name="l00874"></a>00874 _putpixel16(temp, i, j, pix);
<a name="l00875"></a>00875 <span class="keywordflow">break</span>;
<a name="l00876"></a>00876 <span class="keywordflow">default</span>:
<a name="l00877"></a>00877 <span class="comment">/* Shouldn't actually come here */</span>
<a name="l00878"></a>00878 ASSERT(0);
<a name="l00879"></a>00879 }
<a name="l00880"></a>00880 }
<a name="l00881"></a>00881 }
<a name="l00882"></a>00882 }
<a name="l00883"></a>00883
<a name="l00884"></a>00884
<a name="l00885"></a>00885 error:
<a name="l00886"></a>00886 <span class="keywordflow">if</span> (temp) {
<a name="l00887"></a>00887 destroy_bitmap(temp);
<a name="l00888"></a>00888 }
<a name="l00889"></a>00889
<a name="l00890"></a>00890 <span class="keywordflow">return</span> ret;
<a name="l00891"></a>00891 }
<a name="l00892"></a>00892
<a name="l00893"></a>00893
<a name="l00894"></a>00894
<a name="l00895"></a>00895 <span class="comment">/* Perform the actual texture upload. Helper for agl_make_texture_ex().</span>
<a name="l00896"></a>00896 <span class="comment"> */</span>
<a name="l00897"></a>00897 <span class="keyword">static</span> GLuint do_texture_upload(BITMAP *bmp, GLuint tex, GLint internal_format,
<a name="l00898"></a>00898 GLint format, GLint type, <span class="keywordtype">int</span> flags) {
<a name="l00899"></a>00899
<a name="l00900"></a>00900 <span class="keywordtype">int</span> bytes_per_pixel = BYTES_PER_PIXEL(bitmap_color_depth(bmp));
<a name="l00901"></a>00901 GLint saved_row_length;
<a name="l00902"></a>00902 GLint saved_alignment;
<a name="l00903"></a>00903 GLenum target = GL_TEXTURE_2D;
<a name="l00904"></a>00904
<a name="l00905"></a>00905 glBindTexture(target, tex);
<a name="l00906"></a>00906
<a name="l00907"></a>00907
<a name="l00908"></a>00908 <span class="comment">/* Handle proxy texture checks */</span>
<a name="l00909"></a>00909 <span class="keywordflow">if</span> (flags & AGL_TEXTURE_CHECK_VALID_INTERNAL) {
<a name="l00910"></a>00910 <span class="comment">/* <bcoconni> allegro_gl_check_texture is broken with GL drivers based</span>
<a name="l00911"></a>00911 <span class="comment"> * on Mesa. It seems this is a Mesa bug...</span>
<a name="l00912"></a>00912 <span class="comment"> */</span>
<a name="l00913"></a>00913 <span class="keywordflow">if</span> (allegro_gl_info.is_mesa_driver) {
<a name="l00914"></a>00914 AGL_LOG(1, <span class="stringliteral">"* Note * check_texture: Mesa driver detected: "</span>
<a name="l00915"></a>00915 <span class="stringliteral">"PROXY_TEXTURE_2D tests are skipped\n"</span>);
<a name="l00916"></a>00916 <span class="keywordflow">return</span> tex;
<a name="l00917"></a>00917 }
<a name="l00918"></a>00918 <span class="keywordflow">else</span> {
<a name="l00919"></a>00919 glTexImage2D(GL_PROXY_TEXTURE_2D, 0, internal_format,
<a name="l00920"></a>00920 bmp->w, bmp->h, 0, format, type, NULL);
<a name="l00921"></a>00921
<a name="l00922"></a>00922 glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0,
<a name="l00923"></a>00923 GL_TEXTURE_COMPONENTS, &internal_format);
<a name="l00924"></a>00924
<a name="l00925"></a>00925 <span class="keywordflow">return</span> (internal_format ? tex : 0);
<a name="l00926"></a>00926 }
<a name="l00927"></a>00927 }
<a name="l00928"></a>00928
<a name="l00929"></a>00929
<a name="l00930"></a>00930 <span class="comment">/* Set up pixel transfer mode */</span>
<a name="l00931"></a>00931 glGetIntegerv(GL_UNPACK_ROW_LENGTH, &saved_row_length);
<a name="l00932"></a>00932 glGetIntegerv(GL_UNPACK_ALIGNMENT, &saved_alignment);
<a name="l00933"></a>00933 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
<a name="l00934"></a>00934
<a name="l00935"></a>00935 TRACE(PREFIX_I <span class="stringliteral">"do_texture_upload: Making texture: bpp: %i\n"</span>,
<a name="l00936"></a>00936 bitmap_color_depth(bmp));
<a name="l00937"></a>00937
<a name="l00938"></a>00938 <span class="comment">/* Generate mipmaps, if needed */</span>
<a name="l00939"></a>00939 <span class="keywordflow">if</span> (flags & AGL_TEXTURE_MIPMAP) {
<a name="l00940"></a>00940
<a name="l00941"></a>00941 <span class="keywordflow">if</span> (<a class="code" href="group__extensions.html#ga7492f6f6acc608789210560ee63e5436" title="List of OpenGL extensions supported by AllegroGL.">allegro_gl_extensions_GL</a>.SGIS_generate_mipmap) {
<a name="l00942"></a>00942 <span class="comment">/* Easy way out - let the driver do it ;) </span>
<a name="l00943"></a>00943 <span class="comment"> * We do need to set high-qual mipmap generation though.</span>
<a name="l00944"></a>00944 <span class="comment"> */</span>
<a name="l00945"></a>00945 glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
<a name="l00946"></a>00946 glTexParameteri(target, GL_GENERATE_MIPMAP, GL_TRUE);
<a name="l00947"></a>00947 TRACE(PREFIX_I <span class="stringliteral">"do_texture_upload: Using SGIS_generate_mipmap for "</span>
<a name="l00948"></a>00948 <span class="stringliteral">"mipmap generation.\n"</span>);
<a name="l00949"></a>00949 }
<a name="l00950"></a>00950 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (allegro_gl_info.is_matrox_g200
<a name="l00951"></a>00951 && (flags & AGL_TEXTURE_MIPMAP) && (bitmap_color_depth(bmp) >= 24
<a name="l00952"></a>00952 || bitmap_color_depth(bmp) == 8)
<a name="l00953"></a>00953 && (bmp->w != bmp->h)) {
<a name="l00954"></a>00954
<a name="l00955"></a>00955 <span class="comment">/* Matrox G200 has issues with our mipmapping code. Use GLU if we</span>
<a name="l00956"></a>00956 <span class="comment"> * can.</span>
<a name="l00957"></a>00957 <span class="comment"> */</span>
<a name="l00958"></a>00958 TRACE(PREFIX_I <span class="stringliteral">"do_texture_upload: Using GLU for mipmaps.\n"</span>);
<a name="l00959"></a>00959 glPixelStorei(GL_UNPACK_ROW_LENGTH, bmp->h > 1
<a name="l00960"></a>00960 ? (bmp->line[1] - bmp->line[0]) / bytes_per_pixel
<a name="l00961"></a>00961 : bmp->w);
<a name="l00962"></a>00962 glPixelStorei(GL_UNPACK_ROW_LENGTH,
<a name="l00963"></a>00963 (bmp->line[1] - bmp->line[0]) / bytes_per_pixel);
<a name="l00964"></a>00964 gluBuild2DMipmaps(GL_TEXTURE_2D, internal_format, bmp->w, bmp->h,
<a name="l00965"></a>00965 format, type, bmp->line[0]);
<a name="l00966"></a>00966 }
<a name="l00967"></a>00967 <span class="keywordflow">else</span> {
<a name="l00968"></a>00968 <span class="keywordtype">int</span> w = bmp->w;
<a name="l00969"></a>00969 <span class="keywordtype">int</span> h = bmp->h;
<a name="l00970"></a>00970 <span class="keywordtype">int</span> depth = bitmap_color_depth(bmp);
<a name="l00971"></a>00971
<a name="l00972"></a>00972 <span class="comment">/* The driver can't generate mipmaps for us. We can't rely on GLU</span>
<a name="l00973"></a>00973 <span class="comment"> * since the Win32 version doesn't support any of the new pixel</span>
<a name="l00974"></a>00974 <span class="comment"> * formats. Instead, we'll use our own downsampler (which only</span>
<a name="l00975"></a>00975 <span class="comment"> * has to work on Allegro BITMAPs)</span>
<a name="l00976"></a>00976 <span class="comment"> */</span>
<a name="l00977"></a>00977 BITMAP *temp = create_bitmap_ex(depth, w / 2, h / 2);
<a name="l00978"></a>00978
<a name="l00979"></a>00979 <span class="comment">/* We need to generate mipmaps up to 1x1 - compute the number</span>
<a name="l00980"></a>00980 <span class="comment"> * of levels we need.</span>
<a name="l00981"></a>00981 <span class="comment"> */</span>
<a name="l00982"></a>00982 <span class="keywordtype">int</span> num_levels = log2i(MAX(bmp->w, bmp->h));
<a name="l00983"></a>00983
<a name="l00984"></a>00984 <span class="keywordtype">int</span> i, x, y;
<a name="l00985"></a>00985
<a name="l00986"></a>00986 BITMAP *src, *dest;
<a name="l00987"></a>00987
<a name="l00988"></a>00988 TRACE(PREFIX_I <span class="stringliteral">"do_texture_upload: Using Allegro for "</span>
<a name="l00989"></a>00989 <span class="stringliteral">"mipmap generation.\n"</span>);
<a name="l00990"></a>00990
<a name="l00991"></a>00991 <span class="keywordflow">if</span> (!temp) {
<a name="l00992"></a>00992 TRACE(PREFIX_E <span class="stringliteral">"do_texture_upload: Unable to create "</span>
<a name="l00993"></a>00993 <span class="stringliteral">"temporary bitmap sized %ix%ix%i for mipmap generation!"</span>,
<a name="l00994"></a>00994 w / 2, h / 2, depth);
<a name="l00995"></a>00995 tex = 0;
<a name="l00996"></a>00996 <span class="keywordflow">goto</span> end;
<a name="l00997"></a>00997 }
<a name="l00998"></a>00998
<a name="l00999"></a>00999 src = bmp;
<a name="l01000"></a>01000 dest = temp;
<a name="l01001"></a>01001
<a name="l01002"></a>01002 <span class="keywordflow">for</span> (i = 1; i <= num_levels; i++) {
<a name="l01003"></a>01003
<a name="l01004"></a>01004 <span class="keywordflow">for</span> (y = 0; y < h; y += 2) {
<a name="l01005"></a>01005 <span class="keywordflow">for</span> (x = 0; x < w; x += 2) {
<a name="l01006"></a>01006
<a name="l01007"></a>01007 <span class="keywordtype">int</span> r, g, b, a;
<a name="l01008"></a>01008 <span class="keywordtype">int</span> pix[4];
<a name="l01009"></a>01009 <span class="keywordtype">int</span> avg;
<a name="l01010"></a>01010
<a name="l01011"></a>01011 pix[0] = getpixel(src, x, y);
<a name="l01012"></a>01012 pix[1] = getpixel(src, x + 1, y);
<a name="l01013"></a>01013 pix[2] = getpixel(src, x, y + 1);
<a name="l01014"></a>01014 pix[3] = getpixel(src, x + 1, y + 1);
<a name="l01015"></a>01015
<a name="l01016"></a>01016 <span class="keywordflow">if</span> (w == 1) {
<a name="l01017"></a>01017 pix[1] = pix[0];
<a name="l01018"></a>01018 pix[3] = pix[2];
<a name="l01019"></a>01019 }
<a name="l01020"></a>01020 <span class="keywordflow">if</span> (h == 1) {
<a name="l01021"></a>01021 pix[2] = pix[0];
<a name="l01022"></a>01022 pix[3] = pix[1];
<a name="l01023"></a>01023 }
<a name="l01024"></a>01024
<a name="l01025"></a>01025 <span class="keywordflow">if</span> (flags & AGL_TEXTURE_ALPHA_ONLY) {
<a name="l01026"></a>01026 avg = (pix[0] + pix[1] + pix[2] + pix[3] + 2) / 4;
<a name="l01027"></a>01027 }
<a name="l01028"></a>01028 <span class="keywordflow">else</span> {
<a name="l01029"></a>01029 r = (getr_depth(depth, pix[0])
<a name="l01030"></a>01030 + getr_depth(depth, pix[1])
<a name="l01031"></a>01031 + getr_depth(depth, pix[2])
<a name="l01032"></a>01032 + getr_depth(depth, pix[3]) + 2) / 4;
<a name="l01033"></a>01033 g = (getg_depth(depth, pix[0])
<a name="l01034"></a>01034 + getg_depth(depth, pix[1])
<a name="l01035"></a>01035 + getg_depth(depth, pix[2])
<a name="l01036"></a>01036 + getg_depth(depth, pix[3]) + 2) / 4;
<a name="l01037"></a>01037 b = (getb_depth(depth, pix[0])
<a name="l01038"></a>01038 + getb_depth(depth, pix[1])
<a name="l01039"></a>01039 + getb_depth(depth, pix[2])
<a name="l01040"></a>01040 + getb_depth(depth, pix[3]) + 2) / 4;
<a name="l01041"></a>01041 a = (geta_depth(depth, pix[0])
<a name="l01042"></a>01042 + geta_depth(depth, pix[1])
<a name="l01043"></a>01043 + geta_depth(depth, pix[2])
<a name="l01044"></a>01044 + geta_depth(depth, pix[3]) + 2) / 4;
<a name="l01045"></a>01045
<a name="l01046"></a>01046 avg = makeacol_depth(depth, r, g, b, a);
<a name="l01047"></a>01047 }
<a name="l01048"></a>01048
<a name="l01049"></a>01049 putpixel(dest, x / 2, y / 2, avg);
<a name="l01050"></a>01050 }
<a name="l01051"></a>01051 }
<a name="l01052"></a>01052 src = temp;
<a name="l01053"></a>01053
<a name="l01054"></a>01054 <span class="comment">/* Note - we round down; we're still compatible with</span>
<a name="l01055"></a>01055 <span class="comment"> * ARB_texture_non_power_of_two.</span>
<a name="l01056"></a>01056 <span class="comment"> */</span>
<a name="l01057"></a>01057 w = MAX(w / 2, 1);
<a name="l01058"></a>01058 h = MAX(h / 2, 1);
<a name="l01059"></a>01059
<a name="l01060"></a>01060 TRACE(PREFIX_I <span class="stringliteral">"do_texture_upload: Unpack row length: %li.\n"</span>,
<a name="l01061"></a>01061 (temp->h > 1)
<a name="l01062"></a>01062 ? (<span class="keywordtype">long</span> <span class="keywordtype">int</span>)((temp->line[1] - temp->line[0]) / bytes_per_pixel)
<a name="l01063"></a>01063 : temp->w);
<a name="l01064"></a>01064
<a name="l01065"></a>01065 glPixelStorei(GL_UNPACK_ROW_LENGTH, temp->h > 1
<a name="l01066"></a>01066 ? (temp->line[1] - temp->line[0]) / bytes_per_pixel
<a name="l01067"></a>01067 : temp->w);
<a name="l01068"></a>01068
<a name="l01069"></a>01069 glTexImage2D(GL_TEXTURE_2D, i, internal_format,
<a name="l01070"></a>01070 w, h, 0, format, type, temp->line[0]);
<a name="l01071"></a>01071
<a name="l01072"></a>01072 TRACE(PREFIX_I <span class="stringliteral">"do_texture_upload: Mipmap level: %i, "</span>
<a name="l01073"></a>01073 <span class="stringliteral">"size: %i x %i\n"</span>, i, w, h);
<a name="l01074"></a>01074
<a name="l01075"></a>01075 TRACE(PREFIX_I <span class="stringliteral">"do_texture_upload: Uploaded texture: level %i, "</span>
<a name="l01076"></a>01076 <span class="stringliteral">"internalformat: %s, %ix%i, format: 0x%x, type: 0x%x."</span>
<a name="l01077"></a>01077 <span class="stringliteral">"\n"</span>, i, __allegro_gl_get_format_description(internal_format),
<a name="l01078"></a>01078 bmp->w, bmp->h, format, type);
<a name="l01079"></a>01079 }
<a name="l01080"></a>01080
<a name="l01081"></a>01081 destroy_bitmap(temp);
<a name="l01082"></a>01082 }
<a name="l01083"></a>01083 }
<a name="l01084"></a>01084
<a name="l01085"></a>01085 glPixelStorei(GL_UNPACK_ROW_LENGTH, (bmp->h > 1)
<a name="l01086"></a>01086 ? (bmp->line[1] - bmp->line[0]) / bytes_per_pixel
<a name="l01087"></a>01087 : bmp->w);
<a name="l01088"></a>01088
<a name="l01089"></a>01089 TRACE(PREFIX_I <span class="stringliteral">"do_texture_upload: Unpack row length: %li.\n"</span>,
<a name="l01090"></a>01090 (bmp->h > 1) ? (<span class="keywordtype">long</span> <span class="keywordtype">int</span>)((bmp->line[1] - bmp->line[0]) / bytes_per_pixel)
<a name="l01091"></a>01091 : bmp->w);
<a name="l01092"></a>01092
<a name="l01093"></a>01093 <span class="comment">/* Upload the base texture */</span>
<a name="l01094"></a>01094 glGetError();
<a name="l01095"></a>01095 glTexImage2D(GL_TEXTURE_2D, 0, internal_format,
<a name="l01096"></a>01096 bmp->w, bmp->h, 0, format, type, bmp->line[0]);
<a name="l01097"></a>01097
<a name="l01098"></a>01098 TRACE(PREFIX_I <span class="stringliteral">"do_texture_upload: Uploaded texture: level 0, "</span>
<a name="l01099"></a>01099 <span class="stringliteral">"internalformat: %s, %ix%i, format: 0x%x, type: 0x%x.\n"</span>,
<a name="l01100"></a>01100 __allegro_gl_get_format_description(internal_format),
<a name="l01101"></a>01101 bmp->w, bmp->h, format, type);
<a name="l01102"></a>01102
<a name="l01103"></a>01103 TRACE(PREFIX_I <span class="stringliteral">"do_texture_upload: GL Error code: 0x%x\n"</span>, glGetError());
<a name="l01104"></a>01104
<a name="l01105"></a>01105 <span class="keywordflow">if</span> (!(flags & AGL_TEXTURE_MIPMAP)) {
<a name="l01106"></a>01106 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
<a name="l01107"></a>01107 }
<a name="l01108"></a>01108
<a name="l01109"></a>01109 end:
<a name="l01110"></a>01110 <span class="comment">/* Restore state */</span>
<a name="l01111"></a>01111 glPixelStorei(GL_UNPACK_ROW_LENGTH, saved_row_length);
<a name="l01112"></a>01112 glPixelStorei(GL_UNPACK_ALIGNMENT, saved_alignment);
<a name="l01113"></a>01113
<a name="l01114"></a>01114 <span class="keywordflow">return</span> tex;
<a name="l01115"></a>01115 }
<a name="l01116"></a>01116
<a name="l01117"></a>01117
<a name="l01118"></a>01118
<a name="l01119"></a>01119 <span class="comment">/* GLuint allegro_gl_make_texture_ex(int flag, BITMAP *bmp, GLint internal_format) */</span>
<a name="l01165"></a><a class="code" href="group__texture.html#gaf3a48c555068e7051171255c1011150a">01165</a> GLuint <a class="code" href="group__texture.html#gaf3a48c555068e7051171255c1011150a" title="Uploads an Allegro BITMAP to the GL driver as a texture.">allegro_gl_make_texture_ex</a>(<span class="keywordtype">int</span> flags, BITMAP *bmp, GLint internal_format)
<a name="l01166"></a>01166 {
<a name="l01167"></a>01167 GLuint tex = 0, ret = 0;
<a name="l01168"></a>01168 BITMAP *temp = NULL;
<a name="l01169"></a>01169 GLint type;
<a name="l01170"></a>01170 GLint format;
<a name="l01171"></a>01171 GLint old_tex;
<a name="l01172"></a>01172
<a name="l01173"></a>01173 <span class="comment">/* Print the parameters */</span>
<a name="l01174"></a>01174 <span class="preprocessor">#ifdef DEBUGMODE</span>
<a name="l01175"></a>01175 <span class="preprocessor"></span> <span class="keywordtype">char</span> buf[1024] = <span class="stringliteral">""</span>;
<a name="l01176"></a>01176 <span class="preprocessor"># define PFLAG(name) if (flags & name) strcat(buf, #name "|");</span>
<a name="l01177"></a>01177 <span class="preprocessor"></span> PFLAG(AGL_TEXTURE_MIPMAP);
<a name="l01178"></a>01178 PFLAG(AGL_TEXTURE_HAS_ALPHA);
<a name="l01179"></a>01179 PFLAG(AGL_TEXTURE_FLIP);
<a name="l01180"></a>01180 PFLAG(AGL_TEXTURE_MASKED);
<a name="l01181"></a>01181 PFLAG(AGL_TEXTURE_RESCALE);
<a name="l01182"></a>01182 PFLAG(AGL_TEXTURE_ALPHA_ONLY);
<a name="l01183"></a>01183 <span class="preprocessor"># undef PFLAG</span>
<a name="l01184"></a>01184 <span class="preprocessor"></span>
<a name="l01185"></a>01185 TRACE(PREFIX_I <span class="stringliteral">"make_texture_ex: flags: %s, bitmap %ix%i, %i bpp.\n"</span>, buf,
<a name="l01186"></a>01186 bmp ? bmp->w : 0, bmp ? bmp->h : 0,
<a name="l01187"></a>01187 bmp ? bitmap_color_depth(bmp) : 0);
<a name="l01188"></a>01188 <span class="keywordflow">if</span> (internal_format == -1) {
<a name="l01189"></a>01189 TRACE(PREFIX_I <span class="stringliteral">"internalformat: AUTO\n"</span>);
<a name="l01190"></a>01190 }
<a name="l01191"></a>01191 <span class="keywordflow">else</span> {
<a name="l01192"></a>01192 TRACE(PREFIX_I <span class="stringliteral">"internalformat: %s\n"</span>,
<a name="l01193"></a>01193 __allegro_gl_get_format_description(internal_format));
<a name="l01194"></a>01194 }
<a name="l01195"></a>01195 <span class="preprocessor">#endif </span>
<a name="l01196"></a>01196 <span class="preprocessor"></span>
<a name="l01197"></a>01197 <span class="comment">/* Basic parameter checks */</span>
<a name="l01198"></a>01198 <span class="keywordflow">if</span> (!__allegro_gl_valid_context)
<a name="l01199"></a>01199 <span class="keywordflow">return</span> 0;
<a name="l01200"></a>01200
<a name="l01201"></a>01201 <span class="keywordflow">if</span> (!bmp) {
<a name="l01202"></a>01202 <span class="keywordflow">return</span> 0;
<a name="l01203"></a>01203 }
<a name="l01204"></a>01204
<a name="l01205"></a>01205 glGetIntegerv(GL_TEXTURE_2D_BINDING, &old_tex);
<a name="l01206"></a>01206
<a name="l01207"></a>01207 <span class="comment">/* Voodoo cards don't seem to support mipmaps for textures over 32x32...</span>
<a name="l01208"></a>01208 <span class="comment"> */</span>
<a name="l01209"></a>01209 <span class="keywordflow">if</span> ((bmp->w > 32 || bmp->h > 32) && (allegro_gl_info.is_voodoo)) {
<a name="l01210"></a>01210 <span class="comment">/* Disable mipmapping if the user didn't allow us to rescale */</span>
<a name="l01211"></a>01211 <span class="keywordflow">if</span> (!(flags & AGL_TEXTURE_RESCALE)) {
<a name="l01212"></a>01212 TRACE(PREFIX_I <span class="stringliteral">"make_texture_ex: Voodoo card detected && texture "</span>
<a name="l01213"></a>01213 <span class="stringliteral">"size > 32 texels && no rescaling. Disabling mipmaps.\n"</span>);
<a name="l01214"></a>01214 flags &= ~AGL_TEXTURE_MIPMAP;
<a name="l01215"></a>01215 }
<a name="l01216"></a>01216 }
<a name="l01217"></a>01217
<a name="l01218"></a>01218 <span class="comment">/* Check the maximum texture size */</span>
<a name="l01219"></a>01219 <span class="keywordflow">if</span> (bmp->w > allegro_gl_info.max_texture_size
<a name="l01220"></a>01220 || bmp->h > allegro_gl_info.max_texture_size) {
<a name="l01221"></a>01221 <span class="keywordflow">if</span> ((flags & AGL_TEXTURE_RESCALE) == 0) {
<a name="l01222"></a>01222 TRACE(PREFIX_I <span class="stringliteral">"make_texture_ex: Max texture size exceeded but no "</span>
<a name="l01223"></a>01223 <span class="stringliteral">"rescaling allowed. Returning 0 (unsupported).\n"</span>);
<a name="l01224"></a>01224 <span class="keywordflow">return</span> 0;
<a name="l01225"></a>01225 }
<a name="l01226"></a>01226 }
<a name="l01227"></a>01227
<a name="l01228"></a>01228 <span class="comment">/* Check power-of-2 */</span>
<a name="l01229"></a>01229 <span class="keywordflow">if</span> (((bmp->w & (bmp->w - 1)) || (bmp->h & (bmp->h - 1)))
<a name="l01230"></a>01230 && !(flags & AGL_TEXTURE_RESCALE)
<a name="l01231"></a>01231 && !<a class="code" href="group__extensions.html#ga7492f6f6acc608789210560ee63e5436" title="List of OpenGL extensions supported by AllegroGL.">allegro_gl_extensions_GL</a>.ARB_texture_non_power_of_two) {
<a name="l01232"></a>01232 TRACE(PREFIX_I <span class="stringliteral">"make_texture_ex: Non-power-of-2 sized bitmap provided, "</span>
<a name="l01233"></a>01233 <span class="stringliteral">"no rescaling allowed, and ARB_texture_non_power_of_two "</span>
<a name="l01234"></a>01234 <span class="stringliteral">"unsupported. Returning 0 (unsupported).\n"</span>);
<a name="l01235"></a>01235 <span class="keywordflow">return</span> 0;
<a name="l01236"></a>01236 }
<a name="l01237"></a>01237
<a name="l01238"></a>01238
<a name="l01239"></a>01239 <span class="comment">/* Get OpenGL format and type for this pixel data */</span>
<a name="l01240"></a>01240 format = __allegro_gl_get_bitmap_color_format(bmp, flags);
<a name="l01241"></a>01241 type = __allegro_gl_get_bitmap_type(bmp, flags);
<a name="l01242"></a>01242
<a name="l01243"></a>01243 <span class="keywordflow">if</span> (flags & AGL_TEXTURE_ALPHA_ONLY) {
<a name="l01244"></a>01244 type = GL_UNSIGNED_BYTE;
<a name="l01245"></a>01245 <span class="keywordflow">if</span> (internal_format == GL_ALPHA || internal_format == GL_ALPHA4
<a name="l01246"></a>01246 || internal_format == GL_ALPHA8) {
<a name="l01247"></a>01247 format = GL_ALPHA;
<a name="l01248"></a>01248 }
<a name="l01249"></a>01249 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (internal_format == GL_INTENSITY
<a name="l01250"></a>01250 || internal_format == GL_INTENSITY4
<a name="l01251"></a>01251 || internal_format == GL_INTENSITY8) {
<a name="l01252"></a>01252 format = GL_RED;
<a name="l01253"></a>01253 }
<a name="l01254"></a>01254 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (internal_format == GL_LUMINANCE
<a name="l01255"></a>01255 || internal_format == GL_LUMINANCE4
<a name="l01256"></a>01256 || internal_format == GL_LUMINANCE8) {
<a name="l01257"></a>01257 format = GL_LUMINANCE;
<a name="l01258"></a>01258 }
<a name="l01259"></a>01259
<a name="l01260"></a>01260 <span class="comment">/* Alpha bitmaps must be 8-bpp */</span>
<a name="l01261"></a>01261 <span class="keywordflow">if</span> (bitmap_color_depth(bmp) != 8) {
<a name="l01262"></a>01262 <span class="keywordflow">return</span> 0;
<a name="l01263"></a>01263 }
<a name="l01264"></a>01264 }
<a name="l01265"></a>01265
<a name="l01266"></a>01266 <span class="keywordflow">if</span> (flags & AGL_TEXTURE_MASKED) {
<a name="l01267"></a>01267 flags |= AGL_TEXTURE_FORCE_ALPHA_INTERNAL;
<a name="l01268"></a>01268 }
<a name="l01269"></a>01269
<a name="l01270"></a>01270 TRACE(PREFIX_I <span class="stringliteral">"make_texture_ex: Preselected texture format: %s, "</span>
<a name="l01271"></a>01271 <span class="stringliteral">"type: 0x%x\n"</span>, __allegro_gl_get_format_description(format), type);
<a name="l01272"></a>01272
<a name="l01273"></a>01273 <span class="comment">/* Munge the bitmap if needed (rescaling, alpha channel, etc) */</span>
<a name="l01274"></a>01274 temp = __allegro_gl_munge_bitmap(flags, bmp, 0, 0, bmp->w, bmp->h,
<a name="l01275"></a>01275 &type, &format);
<a name="l01276"></a>01276 <span class="keywordflow">if</span> (temp) {
<a name="l01277"></a>01277 bmp = temp;
<a name="l01278"></a>01278 }
<a name="l01279"></a>01279
<a name="l01280"></a>01280 <span class="keywordflow">if</span> (internal_format == -1) {
<a name="l01281"></a>01281 internal_format = __allegro_gl_get_texture_format_ex(bmp, flags);
<a name="l01282"></a>01282 TRACE(PREFIX_I <span class="stringliteral">"make_texture_ex: Picked internalformat: %s\n"</span>,
<a name="l01283"></a>01283 __allegro_gl_get_format_description(internal_format));
<a name="l01284"></a>01284 }
<a name="l01285"></a>01285
<a name="l01286"></a>01286 <span class="keywordflow">if</span> (internal_format == -1) {
<a name="l01287"></a>01287 TRACE(PREFIX_E <span class="stringliteral">"make_texture_ex: Invalid internal format!: "</span>
<a name="l01288"></a>01288 <span class="stringliteral">"%s\n"</span>, __allegro_gl_get_format_description(internal_format));
<a name="l01289"></a>01289 <span class="keywordflow">goto</span> end;
<a name="l01290"></a>01290 }
<a name="l01291"></a>01291
<a name="l01292"></a>01292 TRACE(PREFIX_I <span class="stringliteral">"make_texture_ex: dest format=%s, source format=%s, "</span>
<a name="l01293"></a>01293 <span class="stringliteral">"type=0x%x\n"</span>, __allegro_gl_get_format_description(internal_format),
<a name="l01294"></a>01294 __allegro_gl_get_format_description(format), (<span class="keywordtype">int</span>)type);
<a name="l01295"></a>01295
<a name="l01296"></a>01296
<a name="l01297"></a>01297 <span class="comment">/* ATI Radeon 7000 inverts R and B components when generating mipmaps and</span>
<a name="l01298"></a>01298 <span class="comment"> * the internal format is GL_RGB8, but only on mipmaps. Instead, we'll use</span>
<a name="l01299"></a>01299 <span class="comment"> * GL_RGBA8. This works for bitmaps of depth <= 24. For 32-bpp bitmaps,</span>
<a name="l01300"></a>01300 <span class="comment"> * some additional tricks are needed: We must fill in alpha with 255.</span>
<a name="l01301"></a>01301 <span class="comment"> */</span>
<a name="l01302"></a>01302 <span class="keywordflow">if</span> (allegro_gl_info.is_ati_radeon_7000 && (flags & AGL_TEXTURE_MIPMAP)
<a name="l01303"></a>01303 && internal_format == GL_RGB8
<a name="l01304"></a>01304 && <a class="code" href="group__extensions.html#ga7492f6f6acc608789210560ee63e5436" title="List of OpenGL extensions supported by AllegroGL.">allegro_gl_extensions_GL</a>.SGIS_generate_mipmap) {
<a name="l01305"></a>01305
<a name="l01306"></a>01306 <span class="keywordtype">int</span> i, j;
<a name="l01307"></a>01307 <span class="keywordtype">int</span> depth = bitmap_color_depth(bmp);
<a name="l01308"></a>01308
<a name="l01309"></a>01309 TRACE(PREFIX_I <span class="stringliteral">"make_texture_ex: ATI Radeon 7000 detected, mipmapping "</span>
<a name="l01310"></a>01310 <span class="stringliteral">"used, SGIS_generate_mipmap available and selected "</span>
<a name="l01311"></a>01311 <span class="stringliteral">"internalformat is GL_RGB8 but format is GL_RGBA. Working around "</span>
<a name="l01312"></a>01312 <span class="stringliteral">"ATI driver bug by upgrading bitmap to 32-bpp and using GL_RGBA8 "</span>
<a name="l01313"></a>01313 <span class="stringliteral">"instead.\n"</span>);
<a name="l01314"></a>01314
<a name="l01315"></a>01315 <span class="keywordflow">if</span> (depth == 32) {
<a name="l01316"></a>01316
<a name="l01317"></a>01317 <span class="comment">/* Create temp bitmap if not already there */</span>
<a name="l01318"></a>01318 <span class="keywordflow">if</span> (!temp) {
<a name="l01319"></a>01319 temp = create_bitmap_ex(depth, bmp->w, bmp->h);
<a name="l01320"></a>01320 <span class="keywordflow">if</span> (!temp) {
<a name="l01321"></a>01321 TRACE(PREFIX_E <span class="stringliteral">"make_texture_ex: Unable to allocate "</span>
<a name="l01322"></a>01322 <span class="stringliteral">"memory for temporary bitmap (Radeon 7000 path)!\n"</span>);
<a name="l01323"></a>01323 <span class="keywordflow">goto</span> end;
<a name="l01324"></a>01324 }
<a name="l01325"></a>01325 blit(bmp, temp, 0, 0, 0, 0, bmp->w, bmp->h);
<a name="l01326"></a>01326 bmp = temp;
<a name="l01327"></a>01327 }
<a name="l01328"></a>01328
<a name="l01329"></a>01329 <span class="comment">/* Slow path, until ATI finally gets around to fixing their</span>
<a name="l01330"></a>01330 <span class="comment"> * drivers.</span>
<a name="l01331"></a>01331 <span class="comment"> *</span>
<a name="l01332"></a>01332 <span class="comment"> * Note: If destination internal format was GL_RGBx, then no masking</span>
<a name="l01333"></a>01333 <span class="comment"> * code is needed.</span>
<a name="l01334"></a>01334 <span class="comment"> */</span>
<a name="l01335"></a>01335 <span class="keywordflow">for</span> (j = 0; j < bmp->h; j++) {
<a name="l01336"></a>01336 <span class="keywordflow">for</span> (i = 0; i < bmp->w; i++) {
<a name="l01337"></a>01337 <span class="keywordtype">int</span> pix = _getpixel32(bmp, i, j);
<a name="l01338"></a>01338 _putpixel32(bmp, i, j,
<a name="l01339"></a>01339 makeacol32(getr32(pix), getg32(pix), getb32(pix), 255));
<a name="l01340"></a>01340 }
<a name="l01341"></a>01341 }
<a name="l01342"></a>01342 }
<a name="l01343"></a>01343 internal_format = GL_RGBA8;
<a name="l01344"></a>01344 }
<a name="l01345"></a>01345
<a name="l01346"></a>01346
<a name="l01347"></a>01347 <span class="comment">/* Generate the texture */</span>
<a name="l01348"></a>01348 glGenTextures(1, &tex);
<a name="l01349"></a>01349 <span class="keywordflow">if</span> (!tex) {
<a name="l01350"></a>01350 TRACE(PREFIX_E <span class="stringliteral">"make_texture_ex: Unable to create GL texture!\n"</span>);
<a name="l01351"></a>01351 <span class="keywordflow">goto</span> end;
<a name="l01352"></a>01352 }
<a name="l01353"></a>01353
<a name="l01354"></a>01354 ret = do_texture_upload(bmp, tex, internal_format, format, type, flags);
<a name="l01355"></a>01355
<a name="l01356"></a>01356 end:
<a name="l01357"></a>01357 <span class="keywordflow">if</span> (temp) {
<a name="l01358"></a>01358 destroy_bitmap(temp);
<a name="l01359"></a>01359 }
<a name="l01360"></a>01360
<a name="l01361"></a>01361 <span class="keywordflow">if</span> (!ret && tex) {
<a name="l01362"></a>01362 glDeleteTextures(1, &tex);
<a name="l01363"></a>01363 }
<a name="l01364"></a>01364
<a name="l01365"></a>01365 glBindTexture(GL_TEXTURE_2D, old_tex);
<a name="l01366"></a>01366
<a name="l01367"></a>01367 <span class="keywordflow">return</span> tex;
<a name="l01368"></a>01368 }
<a name="l01369"></a>01369
<a name="l01370"></a>01370
<a name="l01371"></a>01371
<a name="l01372"></a>01372
<a name="l01373"></a>01373
<a name="l01374"></a>01374 <span class="comment">/* GLuint allegro_gl_make_texture(BITMAP *bmp) */</span>
<a name="l01383"></a><a class="code" href="group__texture.html#gae071354f76bc28e1bafbd90bdecbc0c9">01383</a> GLuint <a class="code" href="group__texture.html#gae071354f76bc28e1bafbd90bdecbc0c9" title="Uploads an Allegro BITMAP to the GL driver as a texture.">allegro_gl_make_texture</a>(BITMAP *bmp) {
<a name="l01384"></a>01384
<a name="l01385"></a>01385 <span class="keywordtype">int</span> flags = __allegro_gl_convert_flags(0);
<a name="l01386"></a>01386
<a name="l01387"></a>01387 <span class="keywordflow">return</span> <a class="code" href="group__texture.html#gaf3a48c555068e7051171255c1011150a" title="Uploads an Allegro BITMAP to the GL driver as a texture.">allegro_gl_make_texture_ex</a>(flags, bmp,
<a name="l01388"></a>01388 allegro_gl_opengl_internal_texture_format);
<a name="l01389"></a>01389 }
<a name="l01390"></a>01390
<a name="l01391"></a>01391
<a name="l01392"></a>01392
<a name="l01393"></a>01393 <span class="comment">/* GLuint allegro_gl_make_masked_texture(BITMAP *bmp) */</span>
<a name="l01402"></a><a class="code" href="group__texture.html#gaeb33dfbbc1725f5132c10ac32ef6800d">01402</a> GLuint <a class="code" href="group__texture.html#gaeb33dfbbc1725f5132c10ac32ef6800d" title="Uploads an Allegro BITMAP to the GL driver as a texture.">allegro_gl_make_masked_texture</a>(BITMAP *bmp) {
<a name="l01403"></a>01403
<a name="l01404"></a>01404 <span class="keywordtype">int</span> flags = __allegro_gl_convert_flags(AGL_TEXTURE_MASKED);
<a name="l01405"></a>01405
<a name="l01406"></a>01406 <span class="keywordflow">return</span> <a class="code" href="group__texture.html#gaf3a48c555068e7051171255c1011150a" title="Uploads an Allegro BITMAP to the GL driver as a texture.">allegro_gl_make_texture_ex</a>(flags, bmp,
<a name="l01407"></a>01407 allegro_gl_opengl_internal_texture_format);
<a name="l01408"></a>01408 }
<a name="l01409"></a>01409
<a name="l01410"></a>01410
<a name="l01411"></a>01411
<a name="l01412"></a>01412 <span class="comment">/* GLenum allegro_gl_get_bitmap_type(BITMAP *bmp) */</span>
<a name="l01433"></a><a class="code" href="group__texture.html#ga59f7129dd541d2e5a291d36bf90b7289">01433</a> GLenum <a class="code" href="group__texture.html#ga59f7129dd541d2e5a291d36bf90b7289" title="AllegroGL will generate mipmaps for this texture.">allegro_gl_get_bitmap_type</a>(BITMAP *bmp) {
<a name="l01434"></a>01434
<a name="l01435"></a>01435 <span class="keywordtype">int</span> flags = __allegro_gl_convert_flags(0);
<a name="l01436"></a>01436 <span class="keywordflow">return</span> __allegro_gl_get_bitmap_type(bmp, flags);
<a name="l01437"></a>01437 }
<a name="l01438"></a>01438
<a name="l01439"></a>01439
<a name="l01440"></a>01440
<a name="l01441"></a>01441 <span class="comment">/* GLenum allegro_gl_get_bitmap_color_format(BITMAP *bmp) */</span>
<a name="l01456"></a><a class="code" href="group__texture.html#ga83b2b13cb35dd4b4e9e874173a246581">01456</a> GLenum <a class="code" href="group__texture.html#ga83b2b13cb35dd4b4e9e874173a246581" title="AllegroGL will generate mipmaps for this texture.">allegro_gl_get_bitmap_color_format</a>(BITMAP *bmp) {
<a name="l01457"></a>01457
<a name="l01458"></a>01458 <span class="keywordtype">int</span> flags = __allegro_gl_convert_flags(0);
<a name="l01459"></a>01459 <span class="keywordflow">return</span> __allegro_gl_get_bitmap_color_format(bmp, flags);
<a name="l01460"></a>01460 }
<a name="l01461"></a>01461
</pre></div></div>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="texture_8c.html">texture.c</a> </li>
<li class="footer">Generated on Thu May 19 2011 23:20:20 for AllegroGL by 
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.3 </li>
</ul>
</div>
</body>
</html>
|