File: glvtable_8c_source.html

package info (click to toggle)
allegro4.4 2%3A4.4.2-5
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 19,920 kB
  • ctags: 39,951
  • sloc: ansic: 164,225; asm: 17,620; cpp: 3,848; objc: 1,687; sh: 1,131; python: 676; pascal: 179; makefile: 48; perl: 29; lisp: 1
file content (2681 lines) | stat: -rw-r--r-- 198,549 bytes parent folder | download | duplicates (4)
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
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
<!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: glvtable.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&#160;<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&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;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&#160;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('glvtable_8c.html','');
</script>
<div id="doc-content">
<div class="header">
  <div class="headertitle">
<h1>glvtable.c</h1>  </div>
</div>
<div class="contents">
<a href="glvtable_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 &lt;string.h&gt;</span>
<a name="l00009"></a>00009 
<a name="l00010"></a>00010 <span class="preprocessor">#include &lt;allegro.h&gt;</span>
<a name="l00011"></a>00011 
<a name="l00012"></a>00012 <span class="preprocessor">#ifdef ALLEGRO_WINDOWS</span>
<a name="l00013"></a>00013 <span class="preprocessor"></span><span class="preprocessor">#include &lt;winalleg.h&gt;</span>
<a name="l00014"></a>00014 <span class="preprocessor">#endif</span>
<a name="l00015"></a>00015 <span class="preprocessor"></span>
<a name="l00016"></a>00016 <span class="preprocessor">#include &quot;alleggl.h&quot;</span>
<a name="l00017"></a>00017 <span class="preprocessor">#include &quot;allglint.h&quot;</span>
<a name="l00018"></a>00018 <span class="preprocessor">#include &quot;glvtable.h&quot;</span>
<a name="l00019"></a>00019 <span class="preprocessor">#include &lt;allegro/internal/aintern.h&gt;</span>
<a name="l00020"></a>00020 <span class="preprocessor">#ifdef ALLEGRO_MACOSX</span>
<a name="l00021"></a>00021 <span class="preprocessor"></span><span class="preprocessor">#include &lt;OpenGL/glu.h&gt;</span>
<a name="l00022"></a>00022 <span class="preprocessor">#else</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span><span class="preprocessor">#include &lt;GL/glu.h&gt;</span>
<a name="l00024"></a>00024 <span class="preprocessor">#endif</span>
<a name="l00025"></a>00025 <span class="preprocessor"></span>
<a name="l00026"></a>00026 
<a name="l00027"></a>00027 <span class="keyword">static</span> GFX_VTABLE allegro_gl_screen_vtable;
<a name="l00028"></a>00028 <span class="keyword">static</span> GLuint __allegro_gl_pool_texture = 0;
<a name="l00029"></a>00029 
<a name="l00030"></a>00030 <span class="keyword">static</span> GLuint __allegro_gl_dummy_texture = 0; <span class="comment">/* For ATI Rage Pro */</span>
<a name="l00031"></a>00031 
<a name="l00032"></a>00032 <span class="keyword">static</span> <span class="keywordtype">int</span> __agl_owning_drawing_pattern_tex = FALSE;
<a name="l00033"></a>00033 GLuint __agl_drawing_pattern_tex = 0;
<a name="l00034"></a>00034 BITMAP *__agl_drawing_pattern_bmp = 0;
<a name="l00035"></a>00035 <span class="keyword">static</span> <span class="keywordtype">int</span> __agl_drawing_mode = DRAW_MODE_SOLID;
<a name="l00036"></a>00036 
<a name="l00037"></a>00037 
<a name="l00058"></a>00058 <span class="comment">/* Computes the next power of two if the number wasn&#39;t a power of two to start</span>
<a name="l00059"></a>00059 <span class="comment"> * with. Ref: http://bob.allegronetwork.com/prog/tricks.html#roundtonextpowerof2</span>
<a name="l00060"></a>00060 <span class="comment"> */</span>
<a name="l00061"></a>00061 <span class="keywordtype">int</span> __allegro_gl_make_power_of_2(<span class="keywordtype">int</span> x) {
<a name="l00062"></a>00062     x--;
<a name="l00063"></a>00063     x |= (x &gt;&gt; 1);
<a name="l00064"></a>00064     x |= (x &gt;&gt; 2);
<a name="l00065"></a>00065     x |= (x &gt;&gt; 4);
<a name="l00066"></a>00066     x |= (x &gt;&gt; 8);
<a name="l00067"></a>00067     x |= (x &gt;&gt; 16);
<a name="l00068"></a>00068     x++;
<a name="l00069"></a>00069     <span class="keywordflow">return</span> x;
<a name="l00070"></a>00070 }
<a name="l00071"></a>00071 
<a name="l00072"></a>00072 
<a name="l00073"></a>00073 
<a name="l00074"></a>00074 <span class="comment">/* allegro_gl_drawing_mode (GFX_DRIVER vtable entry):</span>
<a name="l00075"></a>00075 <span class="comment"> * Sets the drawing mode. Same implementation to all GFX vtables.</span>
<a name="l00076"></a>00076 <span class="comment"> */</span>
<a name="l00077"></a>00077 <span class="keywordtype">void</span> allegro_gl_drawing_mode(<span class="keywordtype">void</span>) {
<a name="l00078"></a>00078     <span class="keywordflow">if</span> (__agl_drawing_mode == _drawing_mode)
<a name="l00079"></a>00079         <span class="keywordflow">return</span>;
<a name="l00080"></a>00080 
<a name="l00081"></a>00081     <span class="keywordflow">switch</span> (__agl_drawing_mode) {
<a name="l00082"></a>00082         <span class="keywordflow">case</span> DRAW_MODE_TRANS:
<a name="l00083"></a>00083             glDisable(GL_BLEND);
<a name="l00084"></a>00084         <span class="keywordflow">break</span>;
<a name="l00085"></a>00085         <span class="keywordflow">case</span> DRAW_MODE_XOR:
<a name="l00086"></a>00086             glDisable(GL_COLOR_LOGIC_OP);
<a name="l00087"></a>00087         <span class="keywordflow">break</span>;
<a name="l00088"></a>00088         <span class="keywordflow">case</span> DRAW_MODE_COPY_PATTERN:
<a name="l00089"></a>00089             glDisable(GL_TEXTURE_2D);
<a name="l00090"></a>00090             glBindTexture(GL_TEXTURE_2D, 0);
<a name="l00091"></a>00091             <span class="keywordflow">if</span> (__agl_owning_drawing_pattern_tex &amp;&amp; __agl_drawing_pattern_tex)
<a name="l00092"></a>00092                 glDeleteTextures(1, &amp;__agl_drawing_pattern_tex);
<a name="l00093"></a>00093             __agl_drawing_pattern_tex = 0;
<a name="l00094"></a>00094             __agl_drawing_pattern_bmp = 0;
<a name="l00095"></a>00095         <span class="keywordflow">break</span>;
<a name="l00096"></a>00096     }
<a name="l00097"></a>00097 
<a name="l00098"></a>00098     __agl_drawing_mode = _drawing_mode;
<a name="l00099"></a>00099 
<a name="l00100"></a>00100     <span class="keywordflow">switch</span> (_drawing_mode) {
<a name="l00101"></a>00101         <span class="keywordflow">case</span> DRAW_MODE_TRANS:
<a name="l00102"></a>00102             glEnable(GL_BLEND);
<a name="l00103"></a>00103         <span class="keywordflow">break</span>;
<a name="l00104"></a>00104 
<a name="l00105"></a>00105         <span class="keywordflow">case</span> DRAW_MODE_XOR:
<a name="l00106"></a>00106             glEnable(GL_COLOR_LOGIC_OP);
<a name="l00107"></a>00107             glLogicOp(GL_XOR);
<a name="l00108"></a>00108         <span class="keywordflow">break</span>;
<a name="l00109"></a>00109 
<a name="l00110"></a>00110         <span class="keywordflow">case</span> DRAW_MODE_COPY_PATTERN:
<a name="l00111"></a>00111             <span class="keywordflow">if</span> (is_memory_bitmap(_drawing_pattern)) {
<a name="l00112"></a>00112                 __agl_drawing_pattern_tex =
<a name="l00113"></a>00113                                     <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>(_drawing_pattern);
<a name="l00114"></a>00114                 __agl_drawing_pattern_bmp = _drawing_pattern;
<a name="l00115"></a>00115                 __agl_owning_drawing_pattern_tex = TRUE;
<a name="l00116"></a>00116             }
<a name="l00117"></a>00117             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (is_video_bitmap(_drawing_pattern)) {
<a name="l00118"></a>00118                 AGL_VIDEO_BITMAP *bmp = _drawing_pattern-&gt;extra;
<a name="l00119"></a>00119                 __agl_drawing_pattern_tex = bmp-&gt;tex;
<a name="l00120"></a>00120                 __agl_drawing_pattern_bmp = bmp-&gt;memory_copy;
<a name="l00121"></a>00121                 __agl_owning_drawing_pattern_tex = FALSE;
<a name="l00122"></a>00122             }
<a name="l00123"></a>00123 
<a name="l00124"></a>00124             glEnable(GL_TEXTURE_2D);
<a name="l00125"></a>00125             glBindTexture(GL_TEXTURE_2D, __agl_drawing_pattern_tex);
<a name="l00126"></a>00126 
<a name="l00127"></a>00127             <span class="keywordflow">break</span>;
<a name="l00128"></a>00128     }
<a name="l00129"></a>00129 }
<a name="l00130"></a>00130 
<a name="l00131"></a>00131 
<a name="l00132"></a>00132 <span class="keywordtype">void</span> split_color(<span class="keywordtype">int</span> color, GLubyte *r, GLubyte *g, GLubyte *b, GLubyte *a,
<a name="l00133"></a>00133                         <span class="keywordtype">int</span> color_depth)
<a name="l00134"></a>00134 {
<a name="l00135"></a>00135     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:split_color\n&quot;</span>);
<a name="l00136"></a>00136     *r = getr_depth(color_depth, color);
<a name="l00137"></a>00137     *g = getg_depth(color_depth, color);
<a name="l00138"></a>00138     *b = getb_depth(color_depth, color);
<a name="l00139"></a>00139     <span class="keywordflow">if</span> (color_depth == 32)
<a name="l00140"></a>00140         *a = geta_depth(color_depth, color);
<a name="l00141"></a>00141     <span class="keywordflow">else</span>
<a name="l00142"></a>00142         *a = 255;
<a name="l00143"></a>00143 }
<a name="l00144"></a>00144 
<a name="l00145"></a>00145 
<a name="l00146"></a>00146 <span class="comment">/* allegro_gl_created_sub_bitmap:</span>
<a name="l00147"></a>00147 <span class="comment"> */</span>
<a name="l00148"></a>00148 <span class="keywordtype">void</span> allegro_gl_created_sub_bitmap(BITMAP *bmp, BITMAP *parent)
<a name="l00149"></a>00149 {
<a name="l00150"></a>00150    bmp-&gt;extra = parent;
<a name="l00151"></a>00151 }
<a name="l00152"></a>00152 
<a name="l00153"></a>00153 
<a name="l00154"></a>00154 <span class="comment">/* static void allegro_gl_screen_acquire(struct BITMAP *bmp) */</span>
<a name="l00160"></a><a class="code" href="group__glvtable.html#ga702812e50246c61eb9f01fd8aba69325">00160</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#ga702812e50246c61eb9f01fd8aba69325" title="acquire_bitmap(screen) overload.">allegro_gl_screen_acquire</a>(<span class="keyword">struct</span> BITMAP *bmp) {}
<a name="l00161"></a>00161 
<a name="l00162"></a>00162 
<a name="l00163"></a>00163 
<a name="l00164"></a>00164 <span class="comment">/* static void allegro_gl_screen_release(struct BITMAP *bmp) */</span>
<a name="l00170"></a><a class="code" href="group__glvtable.html#ga6c2b0685587a0feafcb194a9a67d6aa9">00170</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#ga6c2b0685587a0feafcb194a9a67d6aa9" title="release_bitmap(screen) overload.">allegro_gl_screen_release</a>(<span class="keyword">struct</span> BITMAP *bmp) {}
<a name="l00171"></a>00171 
<a name="l00172"></a>00172 
<a name="l00173"></a>00173 
<a name="l00174"></a>00174 <span class="keyword">static</span> <span class="keywordtype">int</span> allegro_gl_screen_getpixel(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y)
<a name="l00175"></a>00175 {
<a name="l00176"></a>00176     GLubyte pixel[3];
<a name="l00177"></a>00177     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_screen_getpixel\n&quot;</span>);
<a name="l00178"></a>00178     <span class="keywordflow">if</span> (bmp-&gt;clip &amp;&amp; (x &lt; bmp-&gt;cl || x &gt;= bmp-&gt;cr
<a name="l00179"></a>00179                                               || y &lt; bmp-&gt;ct || y &gt;= bmp-&gt;cb)) {
<a name="l00180"></a>00180         <span class="keywordflow">return</span> -1;
<a name="l00181"></a>00181     }
<a name="l00182"></a>00182     <span class="keywordflow">if</span> (is_sub_bitmap(bmp)) {
<a name="l00183"></a>00183         x += bmp-&gt;x_ofs;
<a name="l00184"></a>00184         y += bmp-&gt;y_ofs;
<a name="l00185"></a>00185     }
<a name="l00186"></a>00186     glReadPixels(x, bmp-&gt;h - y - 1, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel);
<a name="l00187"></a>00187 
<a name="l00188"></a>00188     <span class="keywordflow">return</span> makecol_depth(bitmap_color_depth(screen),
<a name="l00189"></a>00189                                                   pixel[0], pixel[1], pixel[2]);
<a name="l00190"></a>00190 }
<a name="l00191"></a>00191 
<a name="l00192"></a>00192 
<a name="l00193"></a>00193 
<a name="l00194"></a>00194 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_putpixel(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y,
<a name="l00195"></a>00195                                                                       <span class="keywordtype">int</span> color)
<a name="l00196"></a>00196 {
<a name="l00197"></a>00197     GLubyte r, g, b, a;
<a name="l00198"></a>00198     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_screen_putpixel\n&quot;</span>);
<a name="l00199"></a>00199     split_color(color, &amp;r, &amp;g, &amp;b, &amp;a, bitmap_color_depth(bmp));
<a name="l00200"></a>00200     <span class="keywordflow">if</span> (bmp-&gt;clip &amp;&amp; (x &lt; bmp-&gt;cl || x &gt;= bmp-&gt;cr
<a name="l00201"></a>00201                                               || y &lt; bmp-&gt;ct || y &gt;= bmp-&gt;cb)) {
<a name="l00202"></a>00202         <span class="keywordflow">return</span>;
<a name="l00203"></a>00203     }
<a name="l00204"></a>00204 
<a name="l00205"></a>00205     <span class="keywordflow">if</span> (is_sub_bitmap(bmp)) {
<a name="l00206"></a>00206         x += bmp-&gt;x_ofs;
<a name="l00207"></a>00207         y += bmp-&gt;y_ofs;
<a name="l00208"></a>00208     }
<a name="l00209"></a>00209 
<a name="l00210"></a>00210     glColor4ub(r, g, b, a);
<a name="l00211"></a>00211     glBegin(GL_POINTS);
<a name="l00212"></a>00212         glVertex2f(x, y);
<a name="l00213"></a>00213     glEnd();
<a name="l00214"></a>00214 }
<a name="l00215"></a>00215 
<a name="l00216"></a>00216 
<a name="l00217"></a>00217 
<a name="l00218"></a>00218 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_vline(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y1, <span class="keywordtype">int</span> y2,
<a name="l00219"></a>00219                                                                       <span class="keywordtype">int</span> color)
<a name="l00220"></a>00220 {
<a name="l00221"></a>00221     GLubyte r, g, b, a;
<a name="l00222"></a>00222     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_screen_vline\n&quot;</span>);
<a name="l00223"></a>00223 
<a name="l00224"></a>00224     <span class="keywordflow">if</span> (y1 &gt; y2) {
<a name="l00225"></a>00225         <span class="keywordtype">int</span> temp = y1;
<a name="l00226"></a>00226         y1 = y2;
<a name="l00227"></a>00227         y2 = temp;
<a name="l00228"></a>00228     }
<a name="l00229"></a>00229 
<a name="l00230"></a>00230     <span class="keywordflow">if</span> (bmp-&gt;clip) {
<a name="l00231"></a>00231         <span class="keywordflow">if</span> ((x &lt; bmp-&gt;cl) || (x &gt;= bmp-&gt;cr)) {
<a name="l00232"></a>00232             <span class="keywordflow">return</span>;
<a name="l00233"></a>00233         }
<a name="l00234"></a>00234         <span class="keywordflow">if</span> ((y1 &gt;= bmp-&gt;cb) || (y2 &lt; bmp-&gt;ct)) {
<a name="l00235"></a>00235             <span class="keywordflow">return</span>;
<a name="l00236"></a>00236         }
<a name="l00237"></a>00237         <span class="keywordflow">if</span> (y1 &lt; bmp-&gt;ct) {
<a name="l00238"></a>00238             y1 = bmp-&gt;ct;
<a name="l00239"></a>00239         }
<a name="l00240"></a>00240         <span class="keywordflow">if</span> (y2 &gt;= bmp-&gt;cb) {
<a name="l00241"></a>00241             y2 = bmp-&gt;cb - 1;
<a name="l00242"></a>00242         }
<a name="l00243"></a>00243     }
<a name="l00244"></a>00244     
<a name="l00245"></a>00245     <span class="keywordflow">if</span> (is_sub_bitmap(bmp)) {
<a name="l00246"></a>00246         x += bmp-&gt;x_ofs;
<a name="l00247"></a>00247         y1 += bmp-&gt;y_ofs;
<a name="l00248"></a>00248         y2 += bmp-&gt;y_ofs;
<a name="l00249"></a>00249     }
<a name="l00250"></a>00250 
<a name="l00251"></a>00251     split_color(color, &amp;r, &amp;g, &amp;b, &amp;a, bitmap_color_depth(bmp));
<a name="l00252"></a>00252 
<a name="l00253"></a>00253     glColor4ub(r, g, b, a);
<a name="l00254"></a>00254     glBegin(GL_LINES);
<a name="l00255"></a>00255         glVertex2f(x, y1);
<a name="l00256"></a>00256         glVertex2f(x, y2 + 0.325 * 3);
<a name="l00257"></a>00257     glEnd();
<a name="l00258"></a>00258 
<a name="l00259"></a>00259     <span class="keywordflow">return</span>;
<a name="l00260"></a>00260 }
<a name="l00261"></a>00261 
<a name="l00262"></a>00262 
<a name="l00263"></a>00263 
<a name="l00264"></a>00264 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_hline(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> x1, <span class="keywordtype">int</span> y, <span class="keywordtype">int</span> x2,
<a name="l00265"></a>00265                                                                       <span class="keywordtype">int</span> color)
<a name="l00266"></a>00266 {
<a name="l00267"></a>00267     GLubyte r, g, b, a;
<a name="l00268"></a>00268     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_hline\n&quot;</span>);
<a name="l00269"></a>00269     
<a name="l00270"></a>00270     <span class="keywordflow">if</span> (x1 &gt; x2) {
<a name="l00271"></a>00271         <span class="keywordtype">int</span> temp = x1;
<a name="l00272"></a>00272         x1 = x2;
<a name="l00273"></a>00273         x2 = temp;
<a name="l00274"></a>00274     }
<a name="l00275"></a>00275     <span class="keywordflow">if</span> (bmp-&gt;clip) {
<a name="l00276"></a>00276         <span class="keywordflow">if</span> ((y &lt; bmp-&gt;ct) || (y &gt;= bmp-&gt;cb)) {
<a name="l00277"></a>00277             <span class="keywordflow">return</span>;
<a name="l00278"></a>00278         }
<a name="l00279"></a>00279         <span class="keywordflow">if</span> ((x1 &gt;= bmp-&gt;cr) || (x2 &lt; bmp-&gt;cl)) {
<a name="l00280"></a>00280             <span class="keywordflow">return</span>;
<a name="l00281"></a>00281         }
<a name="l00282"></a>00282         <span class="keywordflow">if</span> (x1 &lt; bmp-&gt;cl) {
<a name="l00283"></a>00283             x1 = bmp-&gt;cl;
<a name="l00284"></a>00284         }
<a name="l00285"></a>00285         <span class="keywordflow">if</span> (x2 &gt;= bmp-&gt;cr) {
<a name="l00286"></a>00286             x2 = bmp-&gt;cr - 1;
<a name="l00287"></a>00287         }
<a name="l00288"></a>00288     }
<a name="l00289"></a>00289     <span class="keywordflow">if</span> (is_sub_bitmap(bmp)) {
<a name="l00290"></a>00290         x1 += bmp-&gt;x_ofs;
<a name="l00291"></a>00291         x2 += bmp-&gt;x_ofs;
<a name="l00292"></a>00292         y += bmp-&gt;y_ofs;
<a name="l00293"></a>00293     }
<a name="l00294"></a>00294     
<a name="l00295"></a>00295     split_color(color, &amp;r, &amp;g, &amp;b, &amp;a, bitmap_color_depth(bmp));
<a name="l00296"></a>00296     
<a name="l00297"></a>00297     glColor4ub(r, g, b, a);
<a name="l00298"></a>00298     glBegin(GL_LINES);
<a name="l00299"></a>00299         glVertex2f(x1 - 0.325, y);
<a name="l00300"></a>00300         glVertex2f(x2 + 0.325 * 2, y);
<a name="l00301"></a>00301     glEnd();
<a name="l00302"></a>00302 
<a name="l00303"></a>00303     <span class="keywordflow">return</span>;
<a name="l00304"></a>00304 }
<a name="l00305"></a>00305 
<a name="l00306"></a>00306 
<a name="l00307"></a>00307 
<a name="l00308"></a>00308 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_line(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> x1, <span class="keywordtype">int</span> y1, <span class="keywordtype">int</span> x2,
<a name="l00309"></a>00309                                                               <span class="keywordtype">int</span> y2, <span class="keywordtype">int</span> color)
<a name="l00310"></a>00310 {
<a name="l00311"></a>00311     GLubyte r, g, b, a;
<a name="l00312"></a>00312     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_screen_line\n&quot;</span>);
<a name="l00313"></a>00313 
<a name="l00314"></a>00314     <span class="keywordflow">if</span> (bmp-&gt;clip) {
<a name="l00315"></a>00315         glPushAttrib(GL_SCISSOR_BIT);
<a name="l00316"></a>00316         glEnable(GL_SCISSOR_TEST);
<a name="l00317"></a>00317         glScissor(bmp-&gt;x_ofs + bmp-&gt;cl, bmp-&gt;h + bmp-&gt;y_ofs - bmp-&gt;cb,
<a name="l00318"></a>00318                                           bmp-&gt;cr - bmp-&gt;cl, bmp-&gt;cb - bmp-&gt;ct);
<a name="l00319"></a>00319     }
<a name="l00320"></a>00320     <span class="keywordflow">if</span> (is_sub_bitmap(bmp)) {
<a name="l00321"></a>00321         x1 += bmp-&gt;x_ofs;
<a name="l00322"></a>00322         x2 += bmp-&gt;x_ofs;
<a name="l00323"></a>00323         y1 += bmp-&gt;y_ofs;
<a name="l00324"></a>00324         y2 += bmp-&gt;y_ofs;
<a name="l00325"></a>00325     }
<a name="l00326"></a>00326     
<a name="l00327"></a>00327     split_color(color, &amp;r, &amp;g, &amp;b, &amp;a, bitmap_color_depth(bmp));
<a name="l00328"></a>00328 
<a name="l00329"></a>00329     glColor4ub(r, g, b, a);
<a name="l00330"></a>00330     glBegin(GL_LINES);
<a name="l00331"></a>00331         glVertex2f(x1 + 0.1625, y1 + 0.1625);
<a name="l00332"></a>00332         glVertex2f(x2 + 0.1625, y2 + 0.1625);
<a name="l00333"></a>00333     glEnd();
<a name="l00334"></a>00334 
<a name="l00335"></a>00335     <span class="comment">/* OpenGL skips the endpoint when drawing lines */</span>
<a name="l00336"></a>00336     glBegin(GL_POINTS);
<a name="l00337"></a>00337         glVertex2f(x2 + 0.1625, y2 + 0.1625);
<a name="l00338"></a>00338     glEnd();
<a name="l00339"></a>00339     
<a name="l00340"></a>00340     <span class="keywordflow">if</span> (bmp-&gt;clip) {
<a name="l00341"></a>00341         glPopAttrib();
<a name="l00342"></a>00342     }
<a name="l00343"></a>00343 
<a name="l00344"></a>00344     <span class="keywordflow">return</span>;
<a name="l00345"></a>00345 }
<a name="l00346"></a>00346 
<a name="l00347"></a>00347 
<a name="l00348"></a>00348 <span class="preprocessor">#define SET_TEX_COORDS(x, y)  \</span>
<a name="l00349"></a>00349 <span class="preprocessor">    do {                      \</span>
<a name="l00350"></a>00350 <span class="preprocessor">        if (__agl_drawing_pattern_tex) {  \</span>
<a name="l00351"></a>00351 <span class="preprocessor">            glTexCoord2f (                \</span>
<a name="l00352"></a>00352 <span class="preprocessor">                (x - _drawing_x_anchor) / (float)__agl_drawing_pattern_bmp-&gt;w,\</span>
<a name="l00353"></a>00353 <span class="preprocessor">                (y - _drawing_y_anchor) / (float)__agl_drawing_pattern_bmp-&gt;h \</span>
<a name="l00354"></a>00354 <span class="preprocessor">            );                                                                \</span>
<a name="l00355"></a>00355 <span class="preprocessor">        }                                                                     \</span>
<a name="l00356"></a>00356 <span class="preprocessor">    } while(0)</span>
<a name="l00357"></a>00357 <span class="preprocessor"></span>
<a name="l00358"></a>00358 
<a name="l00359"></a>00359 <span class="keywordtype">void</span> allegro_gl_screen_rectfill(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> x1, <span class="keywordtype">int</span> y1,
<a name="l00360"></a>00360                                                       <span class="keywordtype">int</span> x2, <span class="keywordtype">int</span> y2, <span class="keywordtype">int</span> color)
<a name="l00361"></a>00361 {
<a name="l00362"></a>00362     GLubyte r, g, b, a;
<a name="l00363"></a>00363     GLfloat old_col[4];
<a name="l00364"></a>00364     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_screen_rectfill\n&quot;</span>);
<a name="l00365"></a>00365     
<a name="l00366"></a>00366     <span class="keywordflow">if</span> (x1 &gt; x2) {
<a name="l00367"></a>00367         <span class="keywordtype">int</span> temp = x1;
<a name="l00368"></a>00368         x1 = x2;
<a name="l00369"></a>00369         x2 = temp;
<a name="l00370"></a>00370     }
<a name="l00371"></a>00371     
<a name="l00372"></a>00372     <span class="keywordflow">if</span> (y1 &gt; y2) {
<a name="l00373"></a>00373         <span class="keywordtype">int</span> temp = y1;
<a name="l00374"></a>00374         y1 = y2;
<a name="l00375"></a>00375         y2 = temp;
<a name="l00376"></a>00376     }
<a name="l00377"></a>00377     
<a name="l00378"></a>00378     <span class="keywordflow">if</span> (bmp-&gt;clip) {
<a name="l00379"></a>00379         <span class="keywordflow">if</span> ((x1 &gt; bmp-&gt;cr) || (x2 &lt; bmp-&gt;cl)) {
<a name="l00380"></a>00380             <span class="keywordflow">return</span>;
<a name="l00381"></a>00381         }
<a name="l00382"></a>00382         <span class="keywordflow">if</span> (x1 &lt; bmp-&gt;cl) {
<a name="l00383"></a>00383             x1 = bmp-&gt;cl;
<a name="l00384"></a>00384         }
<a name="l00385"></a>00385         <span class="keywordflow">if</span> (x2 &gt; bmp-&gt;cr) {
<a name="l00386"></a>00386             x2 = bmp-&gt;cr;
<a name="l00387"></a>00387         }
<a name="l00388"></a>00388         <span class="keywordflow">if</span> ((y1 &gt; bmp-&gt;cb) || (y2 &lt; bmp-&gt;ct)) {
<a name="l00389"></a>00389             <span class="keywordflow">return</span>;
<a name="l00390"></a>00390         }
<a name="l00391"></a>00391         <span class="keywordflow">if</span> (y1 &lt; bmp-&gt;ct) {
<a name="l00392"></a>00392             y1 = bmp-&gt;ct;
<a name="l00393"></a>00393         }
<a name="l00394"></a>00394         <span class="keywordflow">if</span> (y2 &gt; bmp-&gt;cb) {
<a name="l00395"></a>00395             y2 = bmp-&gt;cb;
<a name="l00396"></a>00396         }
<a name="l00397"></a>00397     }
<a name="l00398"></a>00398     <span class="keywordflow">if</span> (is_sub_bitmap(bmp)) {
<a name="l00399"></a>00399         x1 += bmp-&gt;x_ofs;
<a name="l00400"></a>00400         x2 += bmp-&gt;x_ofs;
<a name="l00401"></a>00401         y1 += bmp-&gt;y_ofs;
<a name="l00402"></a>00402         y2 += bmp-&gt;y_ofs;
<a name="l00403"></a>00403     }
<a name="l00404"></a>00404     
<a name="l00405"></a>00405     glGetFloatv(GL_CURRENT_COLOR, old_col);
<a name="l00406"></a>00406     split_color(color, &amp;r, &amp;g, &amp;b, &amp;a, bitmap_color_depth(bmp));
<a name="l00407"></a>00407     glColor4ub(r, g, b, a);
<a name="l00408"></a>00408 
<a name="l00409"></a>00409     glBegin(GL_QUADS);
<a name="l00410"></a>00410         SET_TEX_COORDS(x1, y1);
<a name="l00411"></a>00411         glVertex2f(x1, y1);
<a name="l00412"></a>00412         SET_TEX_COORDS(x2, y1);
<a name="l00413"></a>00413         glVertex2f(x2, y1);
<a name="l00414"></a>00414         SET_TEX_COORDS(x2, y2);
<a name="l00415"></a>00415         glVertex2f(x2, y2);
<a name="l00416"></a>00416         SET_TEX_COORDS(x1, y2);
<a name="l00417"></a>00417         glVertex2f(x1, y2);
<a name="l00418"></a>00418     glEnd();
<a name="l00419"></a>00419 
<a name="l00420"></a>00420     glColor4fv(old_col);
<a name="l00421"></a>00421 
<a name="l00422"></a>00422     <span class="keywordflow">return</span>;
<a name="l00423"></a>00423 }
<a name="l00424"></a>00424 
<a name="l00425"></a>00425 
<a name="l00426"></a>00426 
<a name="l00427"></a>00427 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_triangle(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> x1, <span class="keywordtype">int</span> y1,
<a name="l00428"></a>00428                                       <span class="keywordtype">int</span> x2, <span class="keywordtype">int</span> y2, <span class="keywordtype">int</span> x3, <span class="keywordtype">int</span> y3, <span class="keywordtype">int</span> color)
<a name="l00429"></a>00429 {
<a name="l00430"></a>00430     GLubyte r, g, b, a;
<a name="l00431"></a>00431     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_screen_triangle\n&quot;</span>);
<a name="l00432"></a>00432     
<a name="l00433"></a>00433     split_color(color, &amp;r, &amp;g, &amp;b, &amp;a, bitmap_color_depth(bmp));
<a name="l00434"></a>00434     
<a name="l00435"></a>00435     <span class="keywordflow">if</span> (bmp-&gt;clip) {
<a name="l00436"></a>00436         glPushAttrib(GL_SCISSOR_BIT);
<a name="l00437"></a>00437         glEnable(GL_SCISSOR_TEST);
<a name="l00438"></a>00438         glScissor(bmp-&gt;x_ofs + bmp-&gt;cl, bmp-&gt;h + bmp-&gt;y_ofs - bmp-&gt;cb,
<a name="l00439"></a>00439                                          bmp-&gt;cr - bmp-&gt;cl, bmp-&gt;cb - bmp-&gt;ct);
<a name="l00440"></a>00440     }
<a name="l00441"></a>00441     <span class="keywordflow">if</span> (is_sub_bitmap(bmp)) {
<a name="l00442"></a>00442         x1 += bmp-&gt;x_ofs;
<a name="l00443"></a>00443         y1 += bmp-&gt;y_ofs;
<a name="l00444"></a>00444         x2 += bmp-&gt;x_ofs;
<a name="l00445"></a>00445         y2 += bmp-&gt;y_ofs;
<a name="l00446"></a>00446         x3 += bmp-&gt;x_ofs;
<a name="l00447"></a>00447         y3 += bmp-&gt;y_ofs;
<a name="l00448"></a>00448     }
<a name="l00449"></a>00449     
<a name="l00450"></a>00450     glColor4ub(r, g, b, a);
<a name="l00451"></a>00451     glBegin(GL_TRIANGLES);
<a name="l00452"></a>00452         SET_TEX_COORDS(x1, y1);
<a name="l00453"></a>00453         glVertex2f(x1, y1);
<a name="l00454"></a>00454         SET_TEX_COORDS(x2, y2);
<a name="l00455"></a>00455         glVertex2f(x2, y2);
<a name="l00456"></a>00456         SET_TEX_COORDS(x3, y3);
<a name="l00457"></a>00457         glVertex2f(x3, y3);
<a name="l00458"></a>00458     glEnd();
<a name="l00459"></a>00459 
<a name="l00460"></a>00460     <span class="keywordflow">if</span> (bmp-&gt;clip) {
<a name="l00461"></a>00461         glPopAttrib();
<a name="l00462"></a>00462     }
<a name="l00463"></a>00463 }
<a name="l00464"></a>00464 
<a name="l00465"></a>00465 
<a name="l00466"></a>00466 
<a name="l00467"></a>00467 <span class="preprocessor">#define BITMAP_BLIT_CLIP(source, dest, source_x, source_y, dest_x, dest_y, \</span>
<a name="l00468"></a>00468 <span class="preprocessor">                                                          width, height) { \</span>
<a name="l00469"></a>00469 <span class="preprocessor">    if (dest-&gt;clip) {                                                      \</span>
<a name="l00470"></a>00470 <span class="preprocessor">        if ((dest_x &gt;= dest-&gt;cr) || (dest_y &gt;= dest-&gt;cb)                   \</span>
<a name="l00471"></a>00471 <span class="preprocessor">         || (dest_x + width &lt; dest-&gt;cl) || (dest_y + height &lt; dest-&gt;ct)) { \</span>
<a name="l00472"></a>00472 <span class="preprocessor">            width = 0;                                                     \</span>
<a name="l00473"></a>00473 <span class="preprocessor">        }                                                                  \</span>
<a name="l00474"></a>00474 <span class="preprocessor">        if (dest_x &lt; dest-&gt;cl) {                                           \</span>
<a name="l00475"></a>00475 <span class="preprocessor">            width += dest_x - dest-&gt;cl;                                    \</span>
<a name="l00476"></a>00476 <span class="preprocessor">            source_x -= dest_x - dest-&gt;cl;                                 \</span>
<a name="l00477"></a>00477 <span class="preprocessor">            dest_x = dest-&gt;cl;                                             \</span>
<a name="l00478"></a>00478 <span class="preprocessor">        }                                                                  \</span>
<a name="l00479"></a>00479 <span class="preprocessor">        if (dest_y &lt; dest-&gt;ct) {                                           \</span>
<a name="l00480"></a>00480 <span class="preprocessor">            height += dest_y - dest-&gt;ct;                                   \</span>
<a name="l00481"></a>00481 <span class="preprocessor">            source_y -= dest_y - dest-&gt;ct;                                 \</span>
<a name="l00482"></a>00482 <span class="preprocessor">            dest_y = dest-&gt;ct;                                             \</span>
<a name="l00483"></a>00483 <span class="preprocessor">        }                                                                  \</span>
<a name="l00484"></a>00484 <span class="preprocessor">        if (dest_x + width &gt; dest-&gt;cr) {                                   \</span>
<a name="l00485"></a>00485 <span class="preprocessor">            width = dest-&gt;cr - dest_x;                                     \</span>
<a name="l00486"></a>00486 <span class="preprocessor">        }                                                                  \</span>
<a name="l00487"></a>00487 <span class="preprocessor">        if (dest_y + height &gt; dest-&gt;cb) {                                  \</span>
<a name="l00488"></a>00488 <span class="preprocessor">            height = dest-&gt;cb - dest_y;                                    \</span>
<a name="l00489"></a>00489 <span class="preprocessor">        }                                                                  \</span>
<a name="l00490"></a>00490 <span class="preprocessor">    }                                                                      \</span>
<a name="l00491"></a>00491 <span class="preprocessor">    if (source-&gt;clip) {                                                    \</span>
<a name="l00492"></a>00492 <span class="preprocessor">        if ((source_x &gt;= source-&gt;cr) || (source_y &gt;= source-&gt;cb)           \</span>
<a name="l00493"></a>00493 <span class="preprocessor">         || (source_x + width &lt; source-&gt;cl)                                \</span>
<a name="l00494"></a>00494 <span class="preprocessor">         || (source_y + height &lt; source-&gt;ct)) {                            \</span>
<a name="l00495"></a>00495 <span class="preprocessor">            width = 0;                                                     \</span>
<a name="l00496"></a>00496 <span class="preprocessor">        }                                                                  \</span>
<a name="l00497"></a>00497 <span class="preprocessor">        if (source_x &lt; source-&gt;cl) {                                       \</span>
<a name="l00498"></a>00498 <span class="preprocessor">            width += source_x - source-&gt;cl;                                \</span>
<a name="l00499"></a>00499 <span class="preprocessor">            dest_x -= source_x - source-&gt;cl;                               \</span>
<a name="l00500"></a>00500 <span class="preprocessor">            source_x = source-&gt;cl;                                         \</span>
<a name="l00501"></a>00501 <span class="preprocessor">        }                                                                  \</span>
<a name="l00502"></a>00502 <span class="preprocessor">        if (source_y &lt; source-&gt;ct) {                                       \</span>
<a name="l00503"></a>00503 <span class="preprocessor">            height += source_y - source-&gt;ct;                               \</span>
<a name="l00504"></a>00504 <span class="preprocessor">            dest_y -= source_y - source-&gt;ct;                               \</span>
<a name="l00505"></a>00505 <span class="preprocessor">            source_y = source-&gt;ct;                                         \</span>
<a name="l00506"></a>00506 <span class="preprocessor">        }                                                                  \</span>
<a name="l00507"></a>00507 <span class="preprocessor">        if (source_x + width &gt; source-&gt;cr) {                               \</span>
<a name="l00508"></a>00508 <span class="preprocessor">            width = source-&gt;cr - source_x;                                 \</span>
<a name="l00509"></a>00509 <span class="preprocessor">        }                                                                  \</span>
<a name="l00510"></a>00510 <span class="preprocessor">        if (source_y + height &gt; source-&gt;cb) {                              \</span>
<a name="l00511"></a>00511 <span class="preprocessor">            height = source-&gt;cb - source_y;                                \</span>
<a name="l00512"></a>00512 <span class="preprocessor">        }                                                                  \</span>
<a name="l00513"></a>00513 <span class="preprocessor">    }                                                                      \</span>
<a name="l00514"></a>00514 <span class="preprocessor">}</span>
<a name="l00515"></a>00515 <span class="preprocessor"></span>    
<a name="l00516"></a>00516 
<a name="l00517"></a>00517 
<a name="l00518"></a>00518 
<a name="l00519"></a>00519 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_blit_from_memory(
<a name="l00520"></a>00520     <span class="keyword">struct</span> BITMAP *source, <span class="keyword">struct</span> BITMAP *dest,
<a name="l00521"></a>00521     <span class="keywordtype">int</span> source_x, <span class="keywordtype">int</span> source_y, <span class="keywordtype">int</span> dest_x, <span class="keywordtype">int</span> dest_y, <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height)
<a name="l00522"></a>00522 {
<a name="l00523"></a>00523     GLfloat saved_zoom_x, saved_zoom_y;
<a name="l00524"></a>00524     GLint saved_row_length;
<a name="l00525"></a>00525     BITMAP *temp = NULL;
<a name="l00526"></a>00526     <span class="keywordtype">void</span> *data;
<a name="l00527"></a>00527     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_screen_blit_from_memory\n&quot;</span>);
<a name="l00528"></a>00528 
<a name="l00529"></a>00529     BITMAP_BLIT_CLIP(source, dest, source_x, source_y, dest_x, dest_y,
<a name="l00530"></a>00530                                                                  width, height);
<a name="l00531"></a>00531 
<a name="l00532"></a>00532     <span class="keywordflow">if</span> (width &lt;= 0 || height &lt;= 0) {
<a name="l00533"></a>00533         <span class="keywordflow">return</span>;
<a name="l00534"></a>00534     }
<a name="l00535"></a>00535     
<a name="l00536"></a>00536 
<a name="l00537"></a>00537     <span class="keywordflow">if</span> (is_sub_bitmap(dest)) {
<a name="l00538"></a>00538         dest_x += dest-&gt;x_ofs;
<a name="l00539"></a>00539         dest_y += dest-&gt;y_ofs;
<a name="l00540"></a>00540     }
<a name="l00541"></a>00541 
<a name="l00542"></a>00542     <span class="comment">/* Note: We don&#39;t need to offset the source bitmap coordinates</span>
<a name="l00543"></a>00543 <span class="comment">     * because we use source-&gt;line[] directly, which is already offsetted for</span>
<a name="l00544"></a>00544 <span class="comment">     * us.</span>
<a name="l00545"></a>00545 <span class="comment">     */</span>
<a name="l00546"></a>00546     data = source-&gt;line[source_y]
<a name="l00547"></a>00547          + source_x * BYTES_PER_PIXEL(bitmap_color_depth(source));
<a name="l00548"></a>00548 
<a name="l00549"></a>00549     <span class="comment">/* If packed pixels (or GL 1.2) isn&#39;t supported, then we need to convert</span>
<a name="l00550"></a>00550 <span class="comment">     * the bitmap into something GL can understand - 24-bpp should do it.</span>
<a name="l00551"></a>00551 <span class="comment">     */</span>
<a name="l00552"></a>00552     <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="l00553"></a>00553                                            &amp;&amp; bitmap_color_depth(source) &lt; 24) {
<a name="l00554"></a>00554         temp = create_bitmap_ex(24, width, height);
<a name="l00555"></a>00555 
<a name="l00556"></a>00556         <span class="keywordflow">if</span> (temp) {
<a name="l00557"></a>00557             blit(source, temp, source_x, source_y, 0, 0, width, height);
<a name="l00558"></a>00558             source_x = 0;
<a name="l00559"></a>00559             source_y = 0;
<a name="l00560"></a>00560             data = temp-&gt;line[0];
<a name="l00561"></a>00561         }
<a name="l00562"></a>00562         <span class="keywordflow">else</span> {
<a name="l00563"></a>00563             <span class="comment">/* XXX &lt;rohannessian&gt; Report error? */</span>
<a name="l00564"></a>00564             <span class="keywordflow">return</span>;
<a name="l00565"></a>00565         }
<a name="l00566"></a>00566         source = temp;
<a name="l00567"></a>00567     }
<a name="l00568"></a>00568         
<a name="l00569"></a>00569 
<a name="l00570"></a>00570     <span class="comment">/* Save state */</span>
<a name="l00571"></a>00571     glGetFloatv(GL_ZOOM_X, &amp;saved_zoom_x);
<a name="l00572"></a>00572     glGetFloatv(GL_ZOOM_Y, &amp;saved_zoom_y);
<a name="l00573"></a>00573     glGetIntegerv(GL_UNPACK_ROW_LENGTH, &amp;saved_row_length);
<a name="l00574"></a>00574 
<a name="l00575"></a>00575     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
<a name="l00576"></a>00576 
<a name="l00577"></a>00577     glRasterPos2i(dest_x, dest_y);
<a name="l00578"></a>00578 
<a name="l00579"></a>00579     <span class="comment">/* XXX &lt;rohannessian&gt; I wonder if it would be faster to use glDrawPixels()</span>
<a name="l00580"></a>00580 <span class="comment">     * one line at a time instead of playing with the Zoom factor.</span>
<a name="l00581"></a>00581 <span class="comment">     */</span>
<a name="l00582"></a>00582     glPixelZoom (1.0, -1.0);
<a name="l00583"></a>00583     glPixelStorei(GL_UNPACK_ROW_LENGTH,
<a name="l00584"></a>00584                     (source-&gt;line[1] - source-&gt;line[0])
<a name="l00585"></a>00585                     / BYTES_PER_PIXEL(source-&gt;vtable-&gt;color_depth));
<a name="l00586"></a>00586 
<a name="l00587"></a>00587     glDrawPixels(width, height, __allegro_gl_get_bitmap_color_format(source, 0),
<a name="l00588"></a>00588         __allegro_gl_get_bitmap_type(source, 0), data);
<a name="l00589"></a>00589 
<a name="l00590"></a>00590     <span class="comment">/* Restore state */</span>
<a name="l00591"></a>00591     glPixelZoom(saved_zoom_x, saved_zoom_y);
<a name="l00592"></a>00592     glPixelStorei(GL_UNPACK_ROW_LENGTH, saved_row_length);
<a name="l00593"></a>00593 
<a name="l00594"></a>00594     <span class="keywordflow">if</span> (temp) {
<a name="l00595"></a>00595         destroy_bitmap(temp);
<a name="l00596"></a>00596     }
<a name="l00597"></a>00597     <span class="keywordflow">return</span>;
<a name="l00598"></a>00598 }
<a name="l00599"></a>00599 
<a name="l00600"></a>00600 
<a name="l00601"></a>00601 
<a name="l00602"></a>00602 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_blit_to_memory(
<a name="l00603"></a>00603       <span class="keyword">struct</span> BITMAP *source, <span class="keyword">struct</span> BITMAP *dest,
<a name="l00604"></a>00604       <span class="keywordtype">int</span> source_x, <span class="keywordtype">int</span> source_y, <span class="keywordtype">int</span> dest_x, <span class="keywordtype">int</span> dest_y, <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height)
<a name="l00605"></a>00605 {
<a name="l00606"></a>00606     GLint saved_row_length;
<a name="l00607"></a>00607     GLint saved_alignment;
<a name="l00608"></a>00608     GLint saved_pack_invert;
<a name="l00609"></a>00609 
<a name="l00610"></a>00610     BITMAP *bmp = NULL;
<a name="l00611"></a>00611 
<a name="l00612"></a>00612     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_screen_blit_to_memory\n&quot;</span>);
<a name="l00613"></a>00613 
<a name="l00614"></a>00614     BITMAP_BLIT_CLIP(source, dest, source_x, source_y, dest_x, dest_y,
<a name="l00615"></a>00615                                                                  width, height);
<a name="l00616"></a>00616     
<a name="l00617"></a>00617     <span class="keywordflow">if</span> (is_sub_bitmap(source)) {
<a name="l00618"></a>00618         source_x += source-&gt;x_ofs;
<a name="l00619"></a>00619         source_y += source-&gt;y_ofs;
<a name="l00620"></a>00620     }
<a name="l00621"></a>00621     <span class="keywordflow">if</span> (is_sub_bitmap(dest)) {
<a name="l00622"></a>00622         dest_x += dest-&gt;x_ofs;
<a name="l00623"></a>00623         dest_y += dest-&gt;y_ofs;
<a name="l00624"></a>00624     }
<a name="l00625"></a>00625 
<a name="l00626"></a>00626     <span class="keywordflow">if</span> (width &lt;= 0 || height &lt;= 0) {
<a name="l00627"></a>00627         <span class="keywordflow">return</span>;
<a name="l00628"></a>00628     }
<a name="l00629"></a>00629     
<a name="l00630"></a>00630     <span class="comment">/* Note that glPixelZoom doesn&#39;t affect reads -- so we have to do a flip.</span>
<a name="l00631"></a>00631 <span class="comment">     * We can do this by reading into a temporary bitmap then flipping that to</span>
<a name="l00632"></a>00632 <span class="comment">     * the destination, -OR- use the GL_MESA_pack_invert extension to do it</span>
<a name="l00633"></a>00633 <span class="comment">     * for us.</span>
<a name="l00634"></a>00634 <span class="comment">     *</span>
<a name="l00635"></a>00635 <span class="comment">     * If GL_EXT_packed_pixels isn&#39;t supported, then we can&#39;t use</span>
<a name="l00636"></a>00636 <span class="comment">     * MESA_pack_invert on 16-bpp bitmaps or less.</span>
<a name="l00637"></a>00637 <span class="comment">     */</span>
<a name="l00638"></a>00638     
<a name="l00639"></a>00639     <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>.MESA_pack_invert
<a name="l00640"></a>00640      || (!<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="l00641"></a>00641        &amp;&amp; bitmap_color_depth(dest) &lt; 24)) {
<a name="l00642"></a>00642     
<a name="l00643"></a>00643         <span class="comment">/* XXX &lt;rohannessian&gt; Bitmap format should be the same as the source</span>
<a name="l00644"></a>00644 <span class="comment">         * dest bitmap!</span>
<a name="l00645"></a>00645 <span class="comment">         */</span>
<a name="l00646"></a>00646         <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="l00647"></a>00647            &amp;&amp; bitmap_color_depth(dest) &lt; 24)) {
<a name="l00648"></a>00648             bmp = create_bitmap_ex(24, width, height);
<a name="l00649"></a>00649         }
<a name="l00650"></a>00650         <span class="keywordflow">else</span> {
<a name="l00651"></a>00651             bmp = create_bitmap_ex(bitmap_color_depth(dest), width, height);
<a name="l00652"></a>00652         }
<a name="l00653"></a>00653         <span class="keywordflow">if</span> (!bmp)
<a name="l00654"></a>00654             <span class="keywordflow">return</span>;
<a name="l00655"></a>00655     }
<a name="l00656"></a>00656 
<a name="l00657"></a>00657     glGetIntegerv(GL_PACK_ROW_LENGTH, &amp;saved_row_length);
<a name="l00658"></a>00658     glGetIntegerv(GL_PACK_ALIGNMENT,  &amp;saved_alignment);
<a name="l00659"></a>00659     glPixelStorei(GL_PACK_ROW_LENGTH, 0);
<a name="l00660"></a>00660     glPixelStorei(GL_PACK_ALIGNMENT,  1);
<a name="l00661"></a>00661 
<a name="l00662"></a>00662     <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>.MESA_pack_invert) {
<a name="l00663"></a>00663 
<a name="l00664"></a>00664         glReadPixels(source_x, source-&gt;h - source_y - height, width, height,
<a name="l00665"></a>00665             __allegro_gl_get_bitmap_color_format(bmp, 0),
<a name="l00666"></a>00666             __allegro_gl_get_bitmap_type(bmp, 0), bmp-&gt;dat);
<a name="l00667"></a>00667     }
<a name="l00668"></a>00668     <span class="keywordflow">else</span> {
<a name="l00669"></a>00669         glGetIntegerv(GL_PACK_INVERT_MESA, &amp;saved_pack_invert);
<a name="l00670"></a>00670         glPixelStorei(GL_PACK_INVERT_MESA, TRUE);
<a name="l00671"></a>00671         glPixelStorei(GL_PACK_ROW_LENGTH,
<a name="l00672"></a>00672                       (dest-&gt;line[1] - dest-&gt;line[0])
<a name="l00673"></a>00673                        / BYTES_PER_PIXEL(dest-&gt;vtable-&gt;color_depth));
<a name="l00674"></a>00674         
<a name="l00675"></a>00675         glReadPixels(source_x, source-&gt;h - source_y - height, width, height,
<a name="l00676"></a>00676             __allegro_gl_get_bitmap_color_format(dest, 0),
<a name="l00677"></a>00677             __allegro_gl_get_bitmap_type(dest, 0), dest-&gt;line[0]);
<a name="l00678"></a>00678         
<a name="l00679"></a>00679         glPixelStorei(GL_PACK_INVERT_MESA, saved_pack_invert);
<a name="l00680"></a>00680     }
<a name="l00681"></a>00681 
<a name="l00682"></a>00682     glPixelStorei(GL_PACK_ROW_LENGTH, saved_row_length);
<a name="l00683"></a>00683     glPixelStorei(GL_PACK_ALIGNMENT,  saved_alignment);
<a name="l00684"></a>00684 
<a name="l00685"></a>00685     <span class="comment">/* Flip image if needed (glPixelZoom doesn&#39;t affect reads) */</span>
<a name="l00686"></a>00686     <span class="keywordflow">if</span> (bmp) {
<a name="l00687"></a>00687         
<a name="l00688"></a>00688         <span class="keywordtype">int</span> y, dy;
<a name="l00689"></a>00689         
<a name="l00690"></a>00690         <span class="keywordflow">for</span> (y = 0, dy = dest_y + height - 1; y &lt; height; y++, dy--) {
<a name="l00691"></a>00691             blit(bmp, dest, 0, y, dest_x, dy, width, 1);
<a name="l00692"></a>00692         }
<a name="l00693"></a>00693 
<a name="l00694"></a>00694         destroy_bitmap(bmp);
<a name="l00695"></a>00695     }
<a name="l00696"></a>00696 
<a name="l00697"></a>00697     <span class="keywordflow">return</span>;
<a name="l00698"></a>00698 }
<a name="l00699"></a>00699 
<a name="l00700"></a>00700 
<a name="l00701"></a>00701 
<a name="l00702"></a>00702 
<a name="l00703"></a>00703 <span class="keywordtype">void</span> allegro_gl_screen_blit_to_self (
<a name="l00704"></a>00704      <span class="keyword">struct</span> BITMAP *source, <span class="keyword">struct</span> BITMAP *dest,
<a name="l00705"></a>00705      <span class="keywordtype">int</span> source_x, <span class="keywordtype">int</span> source_y, <span class="keywordtype">int</span> dest_x, <span class="keywordtype">int</span> dest_y, <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height)
<a name="l00706"></a>00706 {
<a name="l00707"></a>00707     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_screen_blit_to_self\n&quot;</span>);
<a name="l00708"></a>00708 
<a name="l00709"></a>00709     BITMAP_BLIT_CLIP(source, dest, source_x, source_y, dest_x, dest_y,
<a name="l00710"></a>00710                                                                  width, height);
<a name="l00711"></a>00711 
<a name="l00712"></a>00712     <span class="keywordflow">if</span> (is_sub_bitmap(source)) {
<a name="l00713"></a>00713         source_x += source-&gt;x_ofs;
<a name="l00714"></a>00714         source_y += source-&gt;y_ofs;
<a name="l00715"></a>00715     }
<a name="l00716"></a>00716     <span class="keywordflow">if</span> (is_sub_bitmap(dest)) {
<a name="l00717"></a>00717         dest_x += dest-&gt;x_ofs;
<a name="l00718"></a>00718         dest_y += dest-&gt;y_ofs;
<a name="l00719"></a>00719     }
<a name="l00720"></a>00720 
<a name="l00721"></a>00721     <span class="keywordflow">if</span> (width &lt;= 0 || height &lt;= 0) {
<a name="l00722"></a>00722         <span class="keywordflow">return</span>;
<a name="l00723"></a>00723     }
<a name="l00724"></a>00724 
<a name="l00725"></a>00725     <span class="comment">/* screen -&gt; screen */</span>
<a name="l00726"></a>00726     <span class="keywordflow">if</span> (is_screen_bitmap(source) &amp;&amp; is_screen_bitmap(dest)) {
<a name="l00727"></a>00727         glRasterPos2i(dest_x, dest_y + height - 1);
<a name="l00728"></a>00728         glCopyPixels(source_x, SCREEN_H - source_y - height, width, height,
<a name="l00729"></a>00729                                                                       GL_COLOR);
<a name="l00730"></a>00730     }
<a name="l00731"></a>00731     <span class="comment">/* video -&gt; screen */</span>
<a name="l00732"></a>00732     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (is_screen_bitmap(dest) &amp;&amp; is_video_bitmap(source)) {
<a name="l00733"></a>00733         AGL_VIDEO_BITMAP *vid;
<a name="l00734"></a>00734         BITMAP *source_parent = source;
<a name="l00735"></a>00735         GLfloat current_color[4];
<a name="l00736"></a>00736 
<a name="l00737"></a>00737         <span class="keywordflow">while</span> (source_parent-&gt;id &amp; BMP_ID_SUB) {
<a name="l00738"></a>00738             source_parent = (BITMAP *)source_parent-&gt;extra;
<a name="l00739"></a>00739         }
<a name="l00740"></a>00740         vid = source_parent-&gt;extra;
<a name="l00741"></a>00741 
<a name="l00742"></a>00742         glGetFloatv(GL_CURRENT_COLOR, current_color);
<a name="l00743"></a>00743         glColor4ub(255, 255, 255, 255);
<a name="l00744"></a>00744 
<a name="l00745"></a>00745         <span class="keywordflow">while</span> (vid) {
<a name="l00746"></a>00746             <span class="keywordtype">int</span> sx, sy;           <span class="comment">/* source coordinates */</span>
<a name="l00747"></a>00747             <span class="keywordtype">int</span> dx, dy;           <span class="comment">/* destination coordinates */</span>
<a name="l00748"></a>00748             <span class="keywordtype">int</span> w, h;
<a name="l00749"></a>00749 
<a name="l00750"></a>00750             <span class="keywordflow">if</span> (source_x &gt;= vid-&gt;x_ofs + vid-&gt;memory_copy-&gt;w ||
<a name="l00751"></a>00751                 source_y &gt;= vid-&gt;y_ofs + vid-&gt;memory_copy-&gt;h ||
<a name="l00752"></a>00752                 vid-&gt;x_ofs &gt;= source_x + width ||
<a name="l00753"></a>00753                 vid-&gt;y_ofs &gt;= source_y + height) {
<a name="l00754"></a>00754                 vid = vid-&gt;next;
<a name="l00755"></a>00755                 <span class="keywordflow">continue</span>;
<a name="l00756"></a>00756             }
<a name="l00757"></a>00757 
<a name="l00758"></a>00758             sx = MAX(vid-&gt;x_ofs, source_x) - vid-&gt;x_ofs;
<a name="l00759"></a>00759             w = MIN(vid-&gt;x_ofs + vid-&gt;memory_copy-&gt;w, source_x + width)
<a name="l00760"></a>00760               - vid-&gt;x_ofs - sx;
<a name="l00761"></a>00761             sy = MAX(vid-&gt;y_ofs, source_y) - vid-&gt;y_ofs;
<a name="l00762"></a>00762             h = MIN(vid-&gt;y_ofs + vid-&gt;memory_copy-&gt;h, source_y + height)
<a name="l00763"></a>00763               - vid-&gt;y_ofs - sy;
<a name="l00764"></a>00764     
<a name="l00765"></a>00765             dx = dest_x + vid-&gt;x_ofs + sx - source_x;
<a name="l00766"></a>00766             dy = dest_y + vid-&gt;y_ofs + sy - source_y;
<a name="l00767"></a>00767 
<a name="l00768"></a>00768             glEnable(vid-&gt;target);
<a name="l00769"></a>00769             glBindTexture(vid-&gt;target, vid-&gt;tex);
<a name="l00770"></a>00770 
<a name="l00771"></a>00771             <span class="keywordflow">if</span> (vid-&gt;target == GL_TEXTURE_2D) {
<a name="l00772"></a>00772                 <span class="keywordtype">float</span> tx = sx / (float)vid-&gt;memory_copy-&gt;w;
<a name="l00773"></a>00773                 <span class="keywordtype">float</span> ty = sy / (<span class="keywordtype">float</span>)vid-&gt;memory_copy-&gt;h;
<a name="l00774"></a>00774                 <span class="keywordtype">float</span> tw = w / (float)vid-&gt;memory_copy-&gt;w;
<a name="l00775"></a>00775                 <span class="keywordtype">float</span> th = h / (<span class="keywordtype">float</span>)vid-&gt;memory_copy-&gt;h;
<a name="l00776"></a>00776 
<a name="l00777"></a>00777                 glBegin(GL_QUADS);
<a name="l00778"></a>00778                     glTexCoord2f(tx, ty);
<a name="l00779"></a>00779                     glVertex2f(dx, dy);
<a name="l00780"></a>00780                     glTexCoord2f(tx, ty + th);
<a name="l00781"></a>00781                     glVertex2f(dx, dy + h);
<a name="l00782"></a>00782                     glTexCoord2f(tx + tw, ty + th);
<a name="l00783"></a>00783                     glVertex2f(dx + w, dy + h);
<a name="l00784"></a>00784                     glTexCoord2f(tx + tw, ty);
<a name="l00785"></a>00785                     glVertex2f(dx + w, dy);
<a name="l00786"></a>00786                 glEnd();
<a name="l00787"></a>00787             }
<a name="l00788"></a>00788             <span class="keywordflow">else</span> {
<a name="l00789"></a>00789                 glBegin(GL_QUADS);
<a name="l00790"></a>00790                     glTexCoord2i(sx, sy);
<a name="l00791"></a>00791                     glVertex2f(dx, dy);
<a name="l00792"></a>00792                     glTexCoord2i(sx, sy + h);
<a name="l00793"></a>00793                     glVertex2f(dx, dy + h);
<a name="l00794"></a>00794                     glTexCoord2i(sx + w, sy + h);
<a name="l00795"></a>00795                     glVertex2f(dx + w, dy + h);
<a name="l00796"></a>00796                     glTexCoord2i(sx + w, sy);
<a name="l00797"></a>00797                     glVertex2f(dx + w, dy);
<a name="l00798"></a>00798                 glEnd();
<a name="l00799"></a>00799             }
<a name="l00800"></a>00800 
<a name="l00801"></a>00801             glBindTexture(vid-&gt;target, 0);
<a name="l00802"></a>00802             glDisable(vid-&gt;target);
<a name="l00803"></a>00803 
<a name="l00804"></a>00804             vid = vid-&gt;next;
<a name="l00805"></a>00805         }
<a name="l00806"></a>00806         
<a name="l00807"></a>00807         glColor4fv(current_color);
<a name="l00808"></a>00808     }
<a name="l00809"></a>00809     <span class="comment">/* screen -&gt; video */</span>
<a name="l00810"></a>00810     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (is_screen_bitmap(source) &amp;&amp; is_video_bitmap(dest)) {
<a name="l00811"></a>00811     
<a name="l00812"></a>00812         AGL_VIDEO_BITMAP *vid;
<a name="l00813"></a>00813         BITMAP *source_parent = source;
<a name="l00814"></a>00814 
<a name="l00815"></a>00815         <span class="keywordflow">while</span> (source_parent-&gt;id &amp; BMP_ID_SUB) {
<a name="l00816"></a>00816             source_parent = (BITMAP *)source_parent-&gt;extra;
<a name="l00817"></a>00817         }
<a name="l00818"></a>00818 
<a name="l00819"></a>00819         vid = dest-&gt;extra;
<a name="l00820"></a>00820 
<a name="l00821"></a>00821         <span class="keywordflow">while</span> (vid) {
<a name="l00822"></a>00822             <span class="keywordtype">int</span> sx, sy;           <span class="comment">/* source coordinates */</span>
<a name="l00823"></a>00823             <span class="keywordtype">int</span> dx, dy;           <span class="comment">/* destination coordinates */</span>
<a name="l00824"></a>00824             <span class="keywordtype">int</span> w, h;
<a name="l00825"></a>00825 
<a name="l00826"></a>00826             <span class="keywordflow">if</span> (dest_x &gt;= vid-&gt;x_ofs + vid-&gt;memory_copy-&gt;w ||
<a name="l00827"></a>00827                 dest_y &gt;= vid-&gt;y_ofs + vid-&gt;memory_copy-&gt;h ||
<a name="l00828"></a>00828                 vid-&gt;x_ofs &gt;= dest_x + width ||
<a name="l00829"></a>00829                 vid-&gt;y_ofs &gt;= dest_y + height) {
<a name="l00830"></a>00830                 vid = vid-&gt;next;
<a name="l00831"></a>00831                 <span class="keywordflow">continue</span>;
<a name="l00832"></a>00832             }
<a name="l00833"></a>00833 
<a name="l00834"></a>00834             dx = MAX(vid-&gt;x_ofs, dest_x) - vid-&gt;x_ofs;
<a name="l00835"></a>00835             w = MIN(vid-&gt;x_ofs + vid-&gt;memory_copy-&gt;w, dest_x + width)
<a name="l00836"></a>00836               - vid-&gt;x_ofs - dx;
<a name="l00837"></a>00837             dy = MAX(vid-&gt;y_ofs, dest_y) - vid-&gt;y_ofs;
<a name="l00838"></a>00838             h = MIN(vid-&gt;y_ofs + vid-&gt;memory_copy-&gt;h, dest_y + height)
<a name="l00839"></a>00839               - vid-&gt;y_ofs - dy;
<a name="l00840"></a>00840     
<a name="l00841"></a>00841             sx = source_x + vid-&gt;x_ofs + dx - dest_x;
<a name="l00842"></a>00842             sy = source_y + vid-&gt;y_ofs + dy - dest_y;
<a name="l00843"></a>00843 
<a name="l00844"></a>00844             <span class="comment">/* We cannot use glCopyTexSubImage2D() here because it will flip the image. */</span>
<a name="l00845"></a>00845             allegro_gl_screen_blit_to_memory(source, vid-&gt;memory_copy,
<a name="l00846"></a>00846                                              sx, sy, dx, dy, w, h);
<a name="l00847"></a>00847 
<a name="l00848"></a>00848             allegro_gl_video_blit_from_memory(vid-&gt;memory_copy, dest, 0, 0,
<a name="l00849"></a>00849                 vid-&gt;x_ofs, vid-&gt;y_ofs, vid-&gt;memory_copy-&gt;w, vid-&gt;memory_copy-&gt;h);
<a name="l00850"></a>00850 
<a name="l00851"></a>00851             vid = vid-&gt;next;
<a name="l00852"></a>00852         }
<a name="l00853"></a>00853     }
<a name="l00854"></a>00854     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (is_video_bitmap(source) &amp;&amp; is_video_bitmap(dest)) {
<a name="l00855"></a>00855         allegro_gl_video_blit_to_self(source, dest, source_x, source_y,
<a name="l00856"></a>00856                                       dest_x, dest_y, width, height);
<a name="l00857"></a>00857     }
<a name="l00858"></a>00858 }
<a name="l00859"></a>00859 
<a name="l00860"></a>00860 
<a name="l00861"></a>00861 
<a name="l00862"></a>00862 <span class="keywordtype">void</span> allegro_gl_upload_and_display_texture(<span class="keyword">struct</span> BITMAP *source,
<a name="l00863"></a>00863      <span class="keywordtype">int</span> source_x, <span class="keywordtype">int</span> source_y, <span class="keywordtype">int</span> dest_x, <span class="keywordtype">int</span> dest_y, <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height,
<a name="l00864"></a>00864      <span class="keywordtype">int</span> flip_dir, GLint format, GLint type)
<a name="l00865"></a>00865 {
<a name="l00866"></a>00866     <span class="keywordtype">float</span> tx, ty;
<a name="l00867"></a>00867     GLint saved_row_length;
<a name="l00868"></a>00868     <span class="keywordtype">int</span> bytes_per_pixel = BYTES_PER_PIXEL(bitmap_color_depth(source));
<a name="l00869"></a>00869     <span class="keywordtype">int</span> i, j;
<a name="l00870"></a>00870     
<a name="l00871"></a>00871     glEnable(GL_ALPHA_TEST);
<a name="l00872"></a>00872     glAlphaFunc(GL_GREATER, 0.0f);
<a name="l00873"></a>00873 
<a name="l00874"></a>00874     glEnable(GL_TEXTURE_2D);
<a name="l00875"></a>00875     glBindTexture(GL_TEXTURE_2D, __allegro_gl_pool_texture);
<a name="l00876"></a>00876 
<a name="l00877"></a>00877     glGetIntegerv(GL_UNPACK_ROW_LENGTH, &amp;saved_row_length);
<a name="l00878"></a>00878     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
<a name="l00879"></a>00879 
<a name="l00880"></a>00880     glPixelStorei(GL_UNPACK_ROW_LENGTH,
<a name="l00881"></a>00881                          (source-&gt;line[1] - source-&gt;line[0]) / bytes_per_pixel);
<a name="l00882"></a>00882     
<a name="l00883"></a>00883     <span class="keywordflow">for</span> (i = 0; i &lt;= abs(width) / 256; i++) {
<a name="l00884"></a>00884         <span class="keywordflow">for</span> (j = 0; j &lt;= abs(height) / 256; j++) {
<a name="l00885"></a>00885 
<a name="l00886"></a>00886             <span class="keywordtype">void</span> *data = source-&gt;line[source_y + j * 256]
<a name="l00887"></a>00887                                        + (source_x + i * 256) * bytes_per_pixel;
<a name="l00888"></a>00888             <span class="keywordtype">int</span> w = abs(width)  - i * 256;
<a name="l00889"></a>00889             <span class="keywordtype">int</span> h = abs(height) - j * 256;
<a name="l00890"></a>00890             <span class="keywordtype">int</span> dx = dest_x + i * 256;
<a name="l00891"></a>00891             <span class="keywordtype">int</span> dy = dest_y + j * 256;
<a name="l00892"></a>00892 
<a name="l00893"></a>00893             w = (w &amp; -256) ? 256 : w;
<a name="l00894"></a>00894             h = (h &amp; -256) ? 256 : h;
<a name="l00895"></a>00895 
<a name="l00896"></a>00896             glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, format, type, data);
<a name="l00897"></a>00897 
<a name="l00898"></a>00898             tx = (float)w / 256.;
<a name="l00899"></a>00899             ty = (float)h / 256.;
<a name="l00900"></a>00900 
<a name="l00901"></a>00901             <span class="keywordflow">if</span> (flip_dir &amp; AGL_H_FLIP) {
<a name="l00902"></a>00902                 dx = 2*dest_x + width - dx;
<a name="l00903"></a>00903                 w = -w;
<a name="l00904"></a>00904             }
<a name="l00905"></a>00905 
<a name="l00906"></a>00906             <span class="keywordflow">if</span> (flip_dir &amp; AGL_V_FLIP) {
<a name="l00907"></a>00907                 dy = 2*dest_y + height - dy;
<a name="l00908"></a>00908                 h = -h;
<a name="l00909"></a>00909             }
<a name="l00910"></a>00910 
<a name="l00911"></a>00911             <span class="keywordflow">if</span> (width &lt; 0)  w = -w;
<a name="l00912"></a>00912             <span class="keywordflow">if</span> (height &lt; 0) h = -h;
<a name="l00913"></a>00913 
<a name="l00914"></a>00914             glBegin(GL_QUADS);
<a name="l00915"></a>00915                 glTexCoord2f(0., 0.);
<a name="l00916"></a>00916                 glVertex2i(dx, dy);
<a name="l00917"></a>00917                 glTexCoord2f(0., ty);
<a name="l00918"></a>00918                 glVertex2i(dx, dy + h);
<a name="l00919"></a>00919                 glTexCoord2f(tx, ty);
<a name="l00920"></a>00920                 glVertex2i(dx + w, dy + h);
<a name="l00921"></a>00921                 glTexCoord2f(tx, 0.);
<a name="l00922"></a>00922                 glVertex2i(dx + w, dy);
<a name="l00923"></a>00923             glEnd();
<a name="l00924"></a>00924         }
<a name="l00925"></a>00925     }
<a name="l00926"></a>00926 
<a name="l00927"></a>00927     <span class="comment">/* Restore state */</span>
<a name="l00928"></a>00928     glPixelStorei(GL_UNPACK_ROW_LENGTH, saved_row_length);
<a name="l00929"></a>00929     glBindTexture(GL_TEXTURE_2D, 0);
<a name="l00930"></a>00930     glDisable(GL_TEXTURE_2D);
<a name="l00931"></a>00931     glDisable(GL_ALPHA_TEST);
<a name="l00932"></a>00932 
<a name="l00933"></a>00933     <span class="keywordflow">return</span>;
<a name="l00934"></a>00934 }
<a name="l00935"></a>00935 
<a name="l00936"></a>00936 
<a name="l00937"></a>00937 
<a name="l00938"></a>00938 <span class="keyword">static</span> <span class="keywordtype">void</span> do_screen_masked_blit_standard(GLint format, GLint type, <span class="keyword">struct</span> BITMAP *temp, <span class="keywordtype">int</span> source_x, <span class="keywordtype">int</span> source_y, <span class="keywordtype">int</span> dest_x, <span class="keywordtype">int</span> dest_y, <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height, <span class="keywordtype">int</span> flip_dir, <span class="keywordtype">int</span> blit_type)
<a name="l00939"></a>00939 {
<a name="l00940"></a>00940     glPushAttrib(GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT);
<a name="l00941"></a>00941 
<a name="l00942"></a>00942     <span class="keywordflow">if</span> (blit_type &amp; AGL_NO_ROTATION) {
<a name="l00943"></a>00943         GLint saved_row_length;
<a name="l00944"></a>00944         <span class="keywordtype">float</span> dx = dest_x, dy = dest_y;
<a name="l00945"></a>00945         GLfloat zoom_x, zoom_y, old_zoom_x, old_zoom_y;
<a name="l00946"></a>00946 
<a name="l00947"></a>00947         glEnable(GL_ALPHA_TEST);
<a name="l00948"></a>00948         glAlphaFunc(GL_GREATER, 0.0f);
<a name="l00949"></a>00949 
<a name="l00950"></a>00950         glGetIntegerv(GL_UNPACK_ROW_LENGTH, &amp;saved_row_length);
<a name="l00951"></a>00951         glGetFloatv(GL_ZOOM_X, &amp;old_zoom_x);
<a name="l00952"></a>00952         glGetFloatv(GL_ZOOM_Y, &amp;old_zoom_y);
<a name="l00953"></a>00953 
<a name="l00954"></a>00954         <span class="keywordflow">if</span> (flip_dir &amp; AGL_H_FLIP) {
<a name="l00955"></a>00955             zoom_x = -1.0f;   
<a name="l00956"></a>00956             <span class="comment">/* Without the -0.5 below, we get an invalid position,</span>
<a name="l00957"></a>00957 <span class="comment">             * and the operation is ignored by OpenGL. */</span>
<a name="l00958"></a>00958             dx += abs(width) - 0.5;
<a name="l00959"></a>00959         }
<a name="l00960"></a>00960         <span class="keywordflow">else</span> {
<a name="l00961"></a>00961             zoom_x = (float) width / abs(width);
<a name="l00962"></a>00962         }
<a name="l00963"></a>00963 
<a name="l00964"></a>00964         <span class="keywordflow">if</span> (flip_dir &amp; AGL_V_FLIP) {
<a name="l00965"></a>00965             zoom_y = 1.0f;
<a name="l00966"></a>00966             dy += abs(height) - 0.5;
<a name="l00967"></a>00967         }
<a name="l00968"></a>00968         <span class="keywordflow">else</span> {
<a name="l00969"></a>00969             zoom_y = -1.0f * width / abs(width);
<a name="l00970"></a>00970         }
<a name="l00971"></a>00971 
<a name="l00972"></a>00972         glRasterPos2f(dx, dy);
<a name="l00973"></a>00973         glPixelZoom(zoom_x, zoom_y);
<a name="l00974"></a>00974         glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
<a name="l00975"></a>00975         glPixelStorei(GL_UNPACK_ROW_LENGTH,
<a name="l00976"></a>00976                 (temp-&gt;line[1] - temp-&gt;line[0])
<a name="l00977"></a>00977                 / BYTES_PER_PIXEL(bitmap_color_depth(temp)));
<a name="l00978"></a>00978 
<a name="l00979"></a>00979         glDrawPixels(abs(width), abs(height), format, type, temp-&gt;line[0]);
<a name="l00980"></a>00980         
<a name="l00981"></a>00981         glPixelStorei(GL_UNPACK_ROW_LENGTH, saved_row_length);
<a name="l00982"></a>00982         glPixelZoom(old_zoom_x, old_zoom_y);
<a name="l00983"></a>00983     }
<a name="l00984"></a>00984     <span class="keywordflow">else</span> {
<a name="l00985"></a>00985         allegro_gl_upload_and_display_texture(temp, 0, 0, dest_x, dest_y, width, height,
<a name="l00986"></a>00986                                    flip_dir, format, type);
<a name="l00987"></a>00987     }
<a name="l00988"></a>00988 
<a name="l00989"></a>00989     glPopAttrib();
<a name="l00990"></a>00990 }
<a name="l00991"></a>00991 
<a name="l00992"></a>00992 
<a name="l00993"></a>00993 
<a name="l00994"></a>00994 <span class="keyword">static</span> <span class="keywordtype">void</span> screen_masked_blit_standard(<span class="keyword">struct</span> BITMAP *source,
<a name="l00995"></a>00995     <span class="keywordtype">int</span> source_x, <span class="keywordtype">int</span> source_y, <span class="keywordtype">int</span> dest_x, <span class="keywordtype">int</span> dest_y, <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height,
<a name="l00996"></a>00996     <span class="keywordtype">int</span> flip_dir, <span class="keywordtype">int</span> blit_type)
<a name="l00997"></a>00997 {
<a name="l00998"></a>00998     BITMAP *temp = NULL;
<a name="l00999"></a>00999 
<a name="l01000"></a>01000     GLint format, type;
<a name="l01001"></a>01001     
<a name="l01002"></a>01002     format = __allegro_gl_get_bitmap_color_format(source, <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>);
<a name="l01003"></a>01003     type   = __allegro_gl_get_bitmap_type(source, <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>);
<a name="l01004"></a>01004 
<a name="l01005"></a>01005     temp = __allegro_gl_munge_bitmap(<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>, source,
<a name="l01006"></a>01006                             source_x, source_y, abs(width), abs(height),
<a name="l01007"></a>01007                             &amp;type, &amp;format);
<a name="l01008"></a>01008 
<a name="l01009"></a>01009     <span class="keywordflow">if</span> (temp) {
<a name="l01010"></a>01010         source = temp;
<a name="l01011"></a>01011     }
<a name="l01012"></a>01012 
<a name="l01013"></a>01013     do_screen_masked_blit_standard(format, type, source, source_x, source_y,
<a name="l01014"></a>01014         dest_x, dest_y, width, height, flip_dir, blit_type);
<a name="l01015"></a>01015 
<a name="l01016"></a>01016     <span class="keywordflow">if</span> (temp) {
<a name="l01017"></a>01017         destroy_bitmap(temp);
<a name="l01018"></a>01018     }
<a name="l01019"></a>01019 
<a name="l01020"></a>01020     <span class="keywordflow">return</span>;
<a name="l01021"></a>01021 }
<a name="l01022"></a>01022 
<a name="l01023"></a>01023 
<a name="l01024"></a>01024 
<a name="l01025"></a>01025 <span class="keyword">static</span> <span class="keywordtype">void</span> __allegro_gl_init_nv_register_combiners(BITMAP *bmp)
<a name="l01026"></a>01026 {
<a name="l01027"></a>01027     GLfloat mask_color[4];
<a name="l01028"></a>01028     <span class="keywordtype">int</span> depth = bitmap_color_depth(bmp);
<a name="l01029"></a>01029     <span class="keywordtype">int</span> color = bitmap_mask_color(bmp);
<a name="l01030"></a>01030 
<a name="l01031"></a>01031     mask_color[0] = getr_depth(depth, color) / 255.;
<a name="l01032"></a>01032     mask_color[1] = getg_depth(depth, color) / 255.;
<a name="l01033"></a>01033     mask_color[2] = getb_depth(depth, color) / 255.;
<a name="l01034"></a>01034     mask_color[3] = 0.;
<a name="l01035"></a>01035 
<a name="l01036"></a>01036     glCombinerParameterfvNV(GL_CONSTANT_COLOR0_NV, mask_color);
<a name="l01037"></a>01037     glCombinerParameteriNV(GL_NUM_GENERAL_COMBINERS_NV, 2);
<a name="l01038"></a>01038     glEnable(GL_REGISTER_COMBINERS_NV);
<a name="l01039"></a>01039 
<a name="l01040"></a>01040     glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV,
<a name="l01041"></a>01041         GL_TEXTURE0_ARB, GL_SIGNED_IDENTITY_NV, GL_RGB);
<a name="l01042"></a>01042     glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV,
<a name="l01043"></a>01043         GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_RGB);
<a name="l01044"></a>01044     glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV,
<a name="l01045"></a>01045         GL_CONSTANT_COLOR0_NV, GL_SIGNED_IDENTITY_NV, GL_RGB);
<a name="l01046"></a>01046     glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV,
<a name="l01047"></a>01047         GL_ZERO, GL_EXPAND_NORMAL_NV, GL_RGB);
<a name="l01048"></a>01048     glCombinerOutputNV(GL_COMBINER0_NV, GL_RGB, GL_DISCARD_NV,
<a name="l01049"></a>01049         GL_DISCARD_NV, GL_SPARE0_NV, GL_NONE, GL_NONE,
<a name="l01050"></a>01050         GL_FALSE, GL_FALSE, GL_FALSE);
<a name="l01051"></a>01051 
<a name="l01052"></a>01052     glCombinerInputNV(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_A_NV,
<a name="l01053"></a>01053         GL_SPARE0_NV, GL_SIGNED_IDENTITY_NV, GL_RGB);
<a name="l01054"></a>01054     glCombinerInputNV(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_B_NV,
<a name="l01055"></a>01055         GL_SPARE0_NV, GL_SIGNED_IDENTITY_NV, GL_RGB);
<a name="l01056"></a>01056     glCombinerOutputNV(GL_COMBINER1_NV, GL_RGB, GL_SPARE1_NV,
<a name="l01057"></a>01057         GL_DISCARD_NV, GL_DISCARD_NV, GL_NONE, GL_NONE,
<a name="l01058"></a>01058         GL_TRUE, GL_FALSE, GL_FALSE);
<a name="l01059"></a>01059 
<a name="l01060"></a>01060     glFinalCombinerInputNV(GL_VARIABLE_A_NV, GL_TEXTURE0_ARB,
<a name="l01061"></a>01061         GL_UNSIGNED_IDENTITY_NV, GL_RGB);
<a name="l01062"></a>01062     glFinalCombinerInputNV(GL_VARIABLE_B_NV, GL_ZERO,
<a name="l01063"></a>01063         GL_UNSIGNED_INVERT_NV, GL_RGB);
<a name="l01064"></a>01064     glFinalCombinerInputNV(GL_VARIABLE_C_NV, GL_ZERO,
<a name="l01065"></a>01065         GL_UNSIGNED_IDENTITY_NV, GL_RGB);
<a name="l01066"></a>01066     glFinalCombinerInputNV(GL_VARIABLE_D_NV, GL_ZERO,
<a name="l01067"></a>01067         GL_UNSIGNED_IDENTITY_NV, GL_RGB);
<a name="l01068"></a>01068     glFinalCombinerInputNV(GL_VARIABLE_G_NV, GL_SPARE1_NV,
<a name="l01069"></a>01069         GL_UNSIGNED_IDENTITY_NV, GL_BLUE);
<a name="l01070"></a>01070 
<a name="l01071"></a>01071     <span class="keywordflow">return</span>;
<a name="l01072"></a>01072 }
<a name="l01073"></a>01073 
<a name="l01074"></a>01074 
<a name="l01075"></a>01075 
<a name="l01076"></a>01076 <span class="keyword">static</span> <span class="keywordtype">void</span> screen_masked_blit_nv_register(<span class="keyword">struct</span> BITMAP *source,
<a name="l01077"></a>01077     <span class="keywordtype">int</span> source_x, <span class="keywordtype">int</span> source_y, <span class="keywordtype">int</span> dest_x, <span class="keywordtype">int</span> dest_y, <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height,
<a name="l01078"></a>01078     <span class="keywordtype">int</span> flip_dir, <span class="keywordtype">int</span> blit_type)
<a name="l01079"></a>01079 {
<a name="l01080"></a>01080     BITMAP *temp = NULL;
<a name="l01081"></a>01081     GLint type   = __allegro_gl_get_bitmap_type(source, 0);
<a name="l01082"></a>01082     GLint format = __allegro_gl_get_bitmap_color_format(source, 0);
<a name="l01083"></a>01083 
<a name="l01084"></a>01084     <span class="keywordflow">if</span> (type == -1) {
<a name="l01085"></a>01085         temp = create_bitmap_ex(24, width, height);
<a name="l01086"></a>01086         <span class="keywordflow">if</span> (!temp) {
<a name="l01087"></a>01087             <span class="keywordflow">return</span>;
<a name="l01088"></a>01088         }
<a name="l01089"></a>01089         blit(source, temp, source_x, source_y, 0, 0, width, height);
<a name="l01090"></a>01090         source = temp;
<a name="l01091"></a>01091         source_x = 0;
<a name="l01092"></a>01092         source_y = 0;
<a name="l01093"></a>01093 
<a name="l01094"></a>01094         type   = __allegro_gl_get_bitmap_type(source, 0);
<a name="l01095"></a>01095         format = __allegro_gl_get_bitmap_color_format(source, 0);
<a name="l01096"></a>01096     }
<a name="l01097"></a>01097 
<a name="l01098"></a>01098     glPushAttrib(GL_TEXTURE_BIT | GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT);
<a name="l01099"></a>01099     __allegro_gl_init_nv_register_combiners(source);
<a name="l01100"></a>01100 
<a name="l01101"></a>01101     allegro_gl_upload_and_display_texture(source, source_x, source_y, dest_x, dest_y,
<a name="l01102"></a>01102                                width, height, flip_dir, format, type);
<a name="l01103"></a>01103 
<a name="l01104"></a>01104     glPopAttrib();
<a name="l01105"></a>01105 
<a name="l01106"></a>01106     <span class="keywordflow">if</span> (temp) {
<a name="l01107"></a>01107         destroy_bitmap(temp);
<a name="l01108"></a>01108     }
<a name="l01109"></a>01109     <span class="keywordflow">return</span>;
<a name="l01110"></a>01110 }
<a name="l01111"></a>01111 
<a name="l01112"></a>01112 
<a name="l01113"></a>01113 
<a name="l01114"></a>01114 <span class="keyword">static</span> <span class="keywordtype">void</span> __allegro_gl_init_combine_textures(BITMAP *bmp)
<a name="l01115"></a>01115 {
<a name="l01116"></a>01116     GLubyte mask_color[4];
<a name="l01117"></a>01117 
<a name="l01118"></a>01118     split_color(bitmap_mask_color(bmp), &amp;mask_color[0], &amp;mask_color[1],
<a name="l01119"></a>01119         &amp;mask_color[2], &amp;mask_color[3], bitmap_color_depth(bmp));
<a name="l01120"></a>01120     glColor4ubv(mask_color);
<a name="l01121"></a>01121 
<a name="l01122"></a>01122     glActiveTexture(GL_TEXTURE0);
<a name="l01123"></a>01123     glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
<a name="l01124"></a>01124     glEnable(GL_TEXTURE_2D);
<a name="l01125"></a>01125     glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD_SIGNED_ARB);
<a name="l01126"></a>01126     glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);
<a name="l01127"></a>01127     glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PRIMARY_COLOR);
<a name="l01128"></a>01128     glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_ONE_MINUS_SRC_COLOR);
<a name="l01129"></a>01129 
<a name="l01130"></a>01130     <span class="comment">/* Dot the result of the subtract with itself. Store it in the alpha </span>
<a name="l01131"></a>01131 <span class="comment">     * component. The alpha should then be 0 if the color fragment was equal to </span>
<a name="l01132"></a>01132 <span class="comment">     * the mask color, or &gt;0 otherwise.</span>
<a name="l01133"></a>01133 <span class="comment">     */</span>
<a name="l01134"></a>01134     glActiveTexture(GL_TEXTURE1);
<a name="l01135"></a>01135     glEnable(GL_TEXTURE_2D);
<a name="l01136"></a>01136     glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
<a name="l01137"></a>01137     glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_DOT3_RGBA_ARB);
<a name="l01138"></a>01138     glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB);
<a name="l01139"></a>01139     glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB);
<a name="l01140"></a>01140 
<a name="l01141"></a>01141     <span class="comment">/* Put the original RGB value in its place */</span>
<a name="l01142"></a>01142 
<a name="l01143"></a>01143     glActiveTexture(GL_TEXTURE2);
<a name="l01144"></a>01144     glEnable(GL_TEXTURE_2D);
<a name="l01145"></a>01145     glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
<a name="l01146"></a>01146     glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE);
<a name="l01147"></a>01147     glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);
<a name="l01148"></a>01148     glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
<a name="l01149"></a>01149     glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS_ARB);
<a name="l01150"></a>01150 
<a name="l01151"></a>01151     glActiveTexture(GL_TEXTURE0);
<a name="l01152"></a>01152 
<a name="l01153"></a>01153     <span class="keywordflow">return</span>;
<a name="l01154"></a>01154 }
<a name="l01155"></a>01155 
<a name="l01156"></a>01156 
<a name="l01157"></a>01157 
<a name="l01158"></a>01158 <span class="keyword">static</span> <span class="keywordtype">void</span> screen_masked_blit_combine_tex(<span class="keyword">struct</span> BITMAP *source,
<a name="l01159"></a>01159     <span class="keywordtype">int</span> source_x, <span class="keywordtype">int</span> source_y, <span class="keywordtype">int</span> dest_x, <span class="keywordtype">int</span> dest_y, <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height,
<a name="l01160"></a>01160     <span class="keywordtype">int</span> flip_dir, <span class="keywordtype">int</span> blit_type)
<a name="l01161"></a>01161 {
<a name="l01162"></a>01162     <span class="keywordtype">float</span> tx, ty;
<a name="l01163"></a>01163     BITMAP *temp = NULL;
<a name="l01164"></a>01164     GLint saved_row_length;
<a name="l01165"></a>01165     GLint type   = __allegro_gl_get_bitmap_type(source, 0);
<a name="l01166"></a>01166     GLint format = __allegro_gl_get_bitmap_color_format(source, 0);
<a name="l01167"></a>01167     <span class="keywordtype">int</span> bytes_per_pixel;
<a name="l01168"></a>01168     <span class="keywordtype">int</span> i, j;
<a name="l01169"></a>01169     GLfloat current_color[4];
<a name="l01170"></a>01170 
<a name="l01171"></a>01171     <span class="keywordflow">if</span> (type == -1) {
<a name="l01172"></a>01172         temp = create_bitmap_ex(24, width, height);
<a name="l01173"></a>01173         <span class="keywordflow">if</span> (!temp)
<a name="l01174"></a>01174             <span class="keywordflow">return</span>;
<a name="l01175"></a>01175         blit(source, temp, source_x, source_y, 0, 0, width, height);
<a name="l01176"></a>01176         source = temp;
<a name="l01177"></a>01177         source_x = 0;
<a name="l01178"></a>01178         source_y = 0;
<a name="l01179"></a>01179 
<a name="l01180"></a>01180         type   = __allegro_gl_get_bitmap_type(source, 0);
<a name="l01181"></a>01181         format = __allegro_gl_get_bitmap_color_format(source, 0);
<a name="l01182"></a>01182     }
<a name="l01183"></a>01183 
<a name="l01184"></a>01184     glEnable(GL_TEXTURE_2D);
<a name="l01185"></a>01185     glBindTexture(GL_TEXTURE_2D, __allegro_gl_pool_texture);
<a name="l01186"></a>01186     
<a name="l01187"></a>01187     glPushAttrib(GL_TEXTURE_BIT | GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT);
<a name="l01188"></a>01188     glGetFloatv(GL_CURRENT_COLOR, current_color);
<a name="l01189"></a>01189     __allegro_gl_init_combine_textures(source);
<a name="l01190"></a>01190     
<a name="l01191"></a>01191     glActiveTexture(GL_TEXTURE0);
<a name="l01192"></a>01192     glBindTexture(GL_TEXTURE_2D, __allegro_gl_pool_texture);
<a name="l01193"></a>01193     glActiveTexture(GL_TEXTURE1);
<a name="l01194"></a>01194     glBindTexture(GL_TEXTURE_2D, __allegro_gl_pool_texture);
<a name="l01195"></a>01195     glActiveTexture(GL_TEXTURE2);
<a name="l01196"></a>01196     glBindTexture(GL_TEXTURE_2D, __allegro_gl_pool_texture);
<a name="l01197"></a>01197     glActiveTexture(GL_TEXTURE0);
<a name="l01198"></a>01198     
<a name="l01199"></a>01199     bytes_per_pixel = BYTES_PER_PIXEL(bitmap_color_depth(source));
<a name="l01200"></a>01200 
<a name="l01201"></a>01201     glEnable(GL_ALPHA_TEST);
<a name="l01202"></a>01202     glAlphaFunc(GL_GREATER, 0.0f);
<a name="l01203"></a>01203 
<a name="l01204"></a>01204     glGetIntegerv(GL_UNPACK_ROW_LENGTH, &amp;saved_row_length);
<a name="l01205"></a>01205     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
<a name="l01206"></a>01206 
<a name="l01207"></a>01207     glPixelStorei(GL_UNPACK_ROW_LENGTH,
<a name="l01208"></a>01208                          (source-&gt;line[1] - source-&gt;line[0]) / bytes_per_pixel);
<a name="l01209"></a>01209 
<a name="l01210"></a>01210     <span class="keywordflow">for</span> (i = 0; i &lt;= width / 256; i++) {
<a name="l01211"></a>01211         <span class="keywordflow">for</span> (j = 0; j &lt;= height / 256; j++) {
<a name="l01212"></a>01212                 
<a name="l01213"></a>01213             <span class="keywordtype">void</span> *data = source-&gt;line[source_y + j * 256]
<a name="l01214"></a>01214                                        + (source_x + i * 256) * bytes_per_pixel;
<a name="l01215"></a>01215             <span class="keywordtype">int</span> w = width - i * 256;
<a name="l01216"></a>01216             <span class="keywordtype">int</span> h = height - j * 256;
<a name="l01217"></a>01217             <span class="keywordtype">int</span> dx = dest_x + i * 256;
<a name="l01218"></a>01218             <span class="keywordtype">int</span> dy = dest_y + j * 256;
<a name="l01219"></a>01219 
<a name="l01220"></a>01220             w = (w &amp; -256) ? 256 : w;
<a name="l01221"></a>01221             h = (h &amp; -256) ? 256 : h;
<a name="l01222"></a>01222 
<a name="l01223"></a>01223             glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, format, type, data);
<a name="l01224"></a>01224 
<a name="l01225"></a>01225             tx = (float)w / 256.;
<a name="l01226"></a>01226             ty = (float)h / 256.;
<a name="l01227"></a>01227 
<a name="l01228"></a>01228             <span class="keywordflow">if</span> (flip_dir &amp; AGL_H_FLIP) {
<a name="l01229"></a>01229                 dx = 2*dest_x + width - dx;
<a name="l01230"></a>01230                 w = -w;
<a name="l01231"></a>01231             }
<a name="l01232"></a>01232 
<a name="l01233"></a>01233             <span class="keywordflow">if</span> (flip_dir &amp; AGL_V_FLIP) {
<a name="l01234"></a>01234                 dy = 2*dest_y + height - dy;
<a name="l01235"></a>01235                 h = -h;
<a name="l01236"></a>01236             }
<a name="l01237"></a>01237 
<a name="l01238"></a>01238             glBegin(GL_QUADS);
<a name="l01239"></a>01239                 glMultiTexCoord2f(GL_TEXTURE0, 0., 0.);
<a name="l01240"></a>01240                 glMultiTexCoord2f(GL_TEXTURE1, 0., 0.);
<a name="l01241"></a>01241                 glMultiTexCoord2f(GL_TEXTURE2, 0., 0.);
<a name="l01242"></a>01242                 glVertex2f(dx, dy);
<a name="l01243"></a>01243                 glMultiTexCoord2f(GL_TEXTURE0, 0., ty);
<a name="l01244"></a>01244                 glMultiTexCoord2f(GL_TEXTURE1, 0., ty);
<a name="l01245"></a>01245                 glMultiTexCoord2f(GL_TEXTURE2, 0., ty);
<a name="l01246"></a>01246                 glVertex2f(dx, dy + h);
<a name="l01247"></a>01247                 glMultiTexCoord2f(GL_TEXTURE0, tx, ty);
<a name="l01248"></a>01248                 glMultiTexCoord2f(GL_TEXTURE1, tx, ty);
<a name="l01249"></a>01249                 glMultiTexCoord2f(GL_TEXTURE2, tx, ty);
<a name="l01250"></a>01250                 glVertex2f(dx + w, dy + h);
<a name="l01251"></a>01251                 glMultiTexCoord2f(GL_TEXTURE0, tx, 0.);
<a name="l01252"></a>01252                 glMultiTexCoord2f(GL_TEXTURE1, tx, 0.);
<a name="l01253"></a>01253                 glMultiTexCoord2f(GL_TEXTURE2, tx, 0.);
<a name="l01254"></a>01254                 glVertex2f(dx + w, dy);
<a name="l01255"></a>01255             glEnd();
<a name="l01256"></a>01256         }
<a name="l01257"></a>01257     }
<a name="l01258"></a>01258 
<a name="l01259"></a>01259     <span class="comment">/* Restore state */</span>
<a name="l01260"></a>01260     glPixelStorei(GL_UNPACK_ROW_LENGTH, saved_row_length);
<a name="l01261"></a>01261     glBindTexture(GL_TEXTURE_2D, 0);
<a name="l01262"></a>01262     glDisable(GL_TEXTURE_2D);
<a name="l01263"></a>01263     glPopAttrib();
<a name="l01264"></a>01264     glColor4fv(current_color);
<a name="l01265"></a>01265 
<a name="l01266"></a>01266     <span class="keywordflow">if</span> (temp) {
<a name="l01267"></a>01267         destroy_bitmap(temp);
<a name="l01268"></a>01268     }
<a name="l01269"></a>01269 
<a name="l01270"></a>01270     <span class="keywordflow">return</span>;
<a name="l01271"></a>01271 }
<a name="l01272"></a>01272 
<a name="l01273"></a>01273 
<a name="l01274"></a>01274 
<a name="l01275"></a>01275 <span class="keywordtype">void</span> do_masked_blit_screen(<span class="keyword">struct</span> BITMAP *source, <span class="keyword">struct</span> BITMAP *dest,
<a name="l01276"></a>01276      <span class="keywordtype">int</span> source_x, <span class="keywordtype">int</span> source_y, <span class="keywordtype">int</span> dest_x, <span class="keywordtype">int</span> dest_y, <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height,
<a name="l01277"></a>01277      <span class="keywordtype">int</span> flip_dir, <span class="keywordtype">int</span> blit_type)
<a name="l01278"></a>01278 {
<a name="l01279"></a>01279     
<a name="l01280"></a>01280     <span class="comment">/* XXX &lt;rohannessian&gt; We should merge this clip code with the</span>
<a name="l01281"></a>01281 <span class="comment">     * BITMAP_BLIT_CLIP macro</span>
<a name="l01282"></a>01282 <span class="comment">     */</span>
<a name="l01283"></a>01283 
<a name="l01284"></a>01284     <span class="comment">/* Clipping of destination bitmap */</span>
<a name="l01285"></a>01285     <span class="keywordflow">if</span> (dest-&gt;clip &amp;&amp; (blit_type &amp; AGL_NO_ROTATION)) {
<a name="l01286"></a>01286         <span class="keywordflow">if</span> ((dest_x &gt;= dest-&gt;cr) || (dest_y &gt;= dest-&gt;cb)
<a name="l01287"></a>01287          || (dest_x + width &lt; dest-&gt;cl) || (dest_y + height &lt; dest-&gt;ct)) {
<a name="l01288"></a>01288             <span class="keywordflow">return</span>;
<a name="l01289"></a>01289         }
<a name="l01290"></a>01290         <span class="keywordflow">if</span> (flip_dir &amp; AGL_H_FLIP) {
<a name="l01291"></a>01291             <span class="keywordflow">if</span> (dest_x &lt; dest-&gt;cl) {
<a name="l01292"></a>01292                 width += dest_x - dest-&gt;cl;
<a name="l01293"></a>01293                 dest_x = dest-&gt;cl;
<a name="l01294"></a>01294             }
<a name="l01295"></a>01295             <span class="keywordflow">if</span> (dest_x + width &gt; dest-&gt;cr) {
<a name="l01296"></a>01296                 source_x += dest_x + width - dest-&gt;cr;
<a name="l01297"></a>01297                 width = dest-&gt;cr - dest_x;
<a name="l01298"></a>01298             }
<a name="l01299"></a>01299         }
<a name="l01300"></a>01300         <span class="keywordflow">else</span> {
<a name="l01301"></a>01301             <span class="keywordflow">if</span> (dest_x &lt; dest-&gt;cl) {
<a name="l01302"></a>01302                 width += dest_x - dest-&gt;cl;
<a name="l01303"></a>01303                 source_x -= dest_x - dest-&gt;cl;
<a name="l01304"></a>01304                 dest_x = dest-&gt;cl;
<a name="l01305"></a>01305             }
<a name="l01306"></a>01306             <span class="keywordflow">if</span> (dest_x + width &gt; dest-&gt;cr) {
<a name="l01307"></a>01307                 width = dest-&gt;cr - dest_x;
<a name="l01308"></a>01308             }
<a name="l01309"></a>01309         }
<a name="l01310"></a>01310         <span class="keywordflow">if</span> (flip_dir &amp; AGL_V_FLIP) {
<a name="l01311"></a>01311             <span class="keywordflow">if</span> (dest_y &lt; dest-&gt;ct) {
<a name="l01312"></a>01312                 height += dest_y - dest-&gt;ct;
<a name="l01313"></a>01313                 dest_y = dest-&gt;ct;
<a name="l01314"></a>01314             }
<a name="l01315"></a>01315             <span class="keywordflow">if</span> (dest_y + height &gt; dest-&gt;cb) {
<a name="l01316"></a>01316                 source_y += dest_y + height - dest-&gt;cb;
<a name="l01317"></a>01317                 height = dest-&gt;cb - dest_y;
<a name="l01318"></a>01318             }
<a name="l01319"></a>01319         }
<a name="l01320"></a>01320         <span class="keywordflow">else</span> {
<a name="l01321"></a>01321             <span class="keywordflow">if</span> (dest_y &lt; dest-&gt;ct) {
<a name="l01322"></a>01322                 height += dest_y - dest-&gt;ct;
<a name="l01323"></a>01323                 source_y -= dest_y - dest-&gt;ct;
<a name="l01324"></a>01324                 dest_y = dest-&gt;ct;
<a name="l01325"></a>01325             }
<a name="l01326"></a>01326             <span class="keywordflow">if</span> (dest_y + height &gt; dest-&gt;cb) {
<a name="l01327"></a>01327                 height = dest-&gt;cb - dest_y;
<a name="l01328"></a>01328             }
<a name="l01329"></a>01329         }
<a name="l01330"></a>01330     }
<a name="l01331"></a>01331 
<a name="l01332"></a>01332     <span class="comment">/* Clipping of source bitmap */</span>
<a name="l01333"></a>01333     <span class="keywordflow">if</span> (source-&gt;clip &amp;&amp; (blit_type &amp; AGL_REGULAR_BMP)) {
<a name="l01334"></a>01334         <span class="keywordflow">if</span> ((source_x &gt;= source-&gt;cr) || (source_y &gt;= source-&gt;cb)
<a name="l01335"></a>01335          || (source_x + width &lt; source-&gt;cl)
<a name="l01336"></a>01336          || (source_y + height &lt; source-&gt;ct)) {
<a name="l01337"></a>01337             <span class="keywordflow">return</span>;
<a name="l01338"></a>01338         }
<a name="l01339"></a>01339         <span class="keywordflow">if</span> (source_x &lt; source-&gt;cl) {
<a name="l01340"></a>01340             width += source_x - source-&gt;cl;
<a name="l01341"></a>01341             dest_x -= source_x - source-&gt;cl;
<a name="l01342"></a>01342             source_x = source-&gt;cl;
<a name="l01343"></a>01343         }
<a name="l01344"></a>01344         <span class="keywordflow">if</span> (source_y &lt; source-&gt;ct) {
<a name="l01345"></a>01345             height += source_y - source-&gt;ct;
<a name="l01346"></a>01346             dest_y -= source_y - source-&gt;ct;
<a name="l01347"></a>01347             source_y = source-&gt;ct;
<a name="l01348"></a>01348         }
<a name="l01349"></a>01349         <span class="keywordflow">if</span> (source_x + width &gt; source-&gt;cr) {
<a name="l01350"></a>01350             width = source-&gt;cr - source_x;
<a name="l01351"></a>01351         }
<a name="l01352"></a>01352         <span class="keywordflow">if</span> (source_y + height &gt; source-&gt;cb) {
<a name="l01353"></a>01353             height = source-&gt;cb - source_y;
<a name="l01354"></a>01354         }
<a name="l01355"></a>01355     }
<a name="l01356"></a>01356     <span class="keywordflow">if</span> (is_sub_bitmap(dest)) {
<a name="l01357"></a>01357         dest_x += dest-&gt;x_ofs;
<a name="l01358"></a>01358         dest_y += dest-&gt;y_ofs;
<a name="l01359"></a>01359     }
<a name="l01360"></a>01360     <span class="keywordflow">if</span> (width &lt;= 0 || height &lt;= 0)
<a name="l01361"></a>01361         <span class="keywordflow">return</span>;
<a name="l01362"></a>01362 
<a name="l01363"></a>01363     <span class="comment">/* memory -&gt; screen */</span>
<a name="l01364"></a>01364     <span class="keywordflow">if</span> (!is_video_bitmap(source) &amp;&amp; !is_screen_bitmap(source)) {
<a name="l01365"></a>01365 
<a name="l01366"></a>01366         __allegro_gl_driver-&gt;screen_masked_blit(source, source_x, source_y,
<a name="l01367"></a>01367                             dest_x, dest_y, width, height, flip_dir, blit_type);
<a name="l01368"></a>01368     }
<a name="l01369"></a>01369     <span class="comment">/* video -&gt; screen */</span>
<a name="l01370"></a>01370     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (is_video_bitmap(source)) {
<a name="l01371"></a>01371         AGL_VIDEO_BITMAP *vid;
<a name="l01372"></a>01372         BITMAP *source_parent = source;
<a name="l01373"></a>01373 
<a name="l01374"></a>01374         <span class="keywordtype">int</span> use_combiners = 0;
<a name="l01375"></a>01375 
<a name="l01376"></a>01376         <span class="comment">/* Special combiner paths */</span>
<a name="l01377"></a>01377         <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>.NV_register_combiners
<a name="l01378"></a>01378          || allegro_gl_info.num_texture_units &gt;= 3) {
<a name="l01379"></a>01379 
<a name="l01380"></a>01380             use_combiners = 1;
<a name="l01381"></a>01381 
<a name="l01382"></a>01382             glPushAttrib(GL_ENABLE_BIT | GL_TEXTURE_BIT | GL_COLOR_BUFFER_BIT);
<a name="l01383"></a>01383 
<a name="l01384"></a>01384             <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>.NV_register_combiners) {
<a name="l01385"></a>01385                 __allegro_gl_init_nv_register_combiners(source);
<a name="l01386"></a>01386             }
<a name="l01387"></a>01387             <span class="keywordflow">else</span> {
<a name="l01388"></a>01388                 __allegro_gl_init_combine_textures(source);
<a name="l01389"></a>01389             }
<a name="l01390"></a>01390 
<a name="l01391"></a>01391             glEnable(GL_ALPHA_TEST);
<a name="l01392"></a>01392             glAlphaFunc(GL_GREATER, 0.0f);
<a name="l01393"></a>01393         }
<a name="l01394"></a>01394 
<a name="l01395"></a>01395         <span class="keywordflow">while</span> (source_parent-&gt;id &amp; BMP_ID_SUB) {
<a name="l01396"></a>01396             source_parent = (BITMAP *)source_parent-&gt;extra;
<a name="l01397"></a>01397         }
<a name="l01398"></a>01398         vid = source_parent-&gt;extra;
<a name="l01399"></a>01399 
<a name="l01400"></a>01400         <span class="keywordflow">while</span> (vid) {
<a name="l01401"></a>01401             <span class="keywordtype">int</span> sx, sy;           <span class="comment">/* source coordinates */</span>
<a name="l01402"></a>01402             <span class="keywordtype">int</span> dx, dy;           <span class="comment">/* destination coordinates */</span>
<a name="l01403"></a>01403             <span class="keywordtype">int</span> w, h;
<a name="l01404"></a>01404 
<a name="l01405"></a>01405             <span class="keywordflow">if</span> (source_x &gt;= vid-&gt;x_ofs + vid-&gt;memory_copy-&gt;w ||
<a name="l01406"></a>01406                 source_y &gt;= vid-&gt;y_ofs + vid-&gt;memory_copy-&gt;h ||
<a name="l01407"></a>01407                 vid-&gt;x_ofs &gt;= source_x + width ||
<a name="l01408"></a>01408                 vid-&gt;y_ofs &gt;= source_y + height) {
<a name="l01409"></a>01409                 vid = vid-&gt;next;
<a name="l01410"></a>01410                 <span class="keywordflow">continue</span>;
<a name="l01411"></a>01411             }
<a name="l01412"></a>01412 
<a name="l01413"></a>01413             sx = MAX (vid-&gt;x_ofs, source_x) - vid-&gt;x_ofs;
<a name="l01414"></a>01414             w = MIN (vid-&gt;x_ofs + vid-&gt;memory_copy-&gt;w, source_x + width)
<a name="l01415"></a>01415               - vid-&gt;x_ofs - sx;
<a name="l01416"></a>01416             sy = MAX (vid-&gt;y_ofs, source_y) - vid-&gt;y_ofs;
<a name="l01417"></a>01417             h = MIN (vid-&gt;y_ofs + vid-&gt;memory_copy-&gt;h, source_y + height)
<a name="l01418"></a>01418               - vid-&gt;y_ofs - sy;
<a name="l01419"></a>01419 
<a name="l01420"></a>01420             dx = dest_x + vid-&gt;x_ofs + sx - source_x;
<a name="l01421"></a>01421             dy = dest_y + vid-&gt;y_ofs + sy - source_y;
<a name="l01422"></a>01422 
<a name="l01423"></a>01423             <span class="keywordflow">if</span> (flip_dir &amp; AGL_H_FLIP) {
<a name="l01424"></a>01424                 dx = 2*dest_x + width - dx;
<a name="l01425"></a>01425                 w = -w;
<a name="l01426"></a>01426             }
<a name="l01427"></a>01427 
<a name="l01428"></a>01428             <span class="keywordflow">if</span> (flip_dir &amp; AGL_V_FLIP) {
<a name="l01429"></a>01429                 dy = 2*dest_y + height - dy;
<a name="l01430"></a>01430                 h = -h;
<a name="l01431"></a>01431             }
<a name="l01432"></a>01432 
<a name="l01433"></a>01433             <span class="keywordflow">if</span> (use_combiners) {
<a name="l01434"></a>01434                 <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>.NV_register_combiners) {
<a name="l01435"></a>01435                     glEnable(vid-&gt;target);
<a name="l01436"></a>01436                     glBindTexture(vid-&gt;target, vid-&gt;tex);
<a name="l01437"></a>01437                     glTexParameteri(vid-&gt;target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
<a name="l01438"></a>01438                     glTexParameteri(vid-&gt;target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
<a name="l01439"></a>01439 
<a name="l01440"></a>01440                     <span class="keywordflow">if</span> (vid-&gt;target == GL_TEXTURE_2D) {
<a name="l01441"></a>01441                         <span class="keywordtype">float</span> tx = sx / (float)vid-&gt;memory_copy-&gt;w;
<a name="l01442"></a>01442                         <span class="keywordtype">float</span> ty = sy / (<span class="keywordtype">float</span>)vid-&gt;memory_copy-&gt;h;
<a name="l01443"></a>01443                         <span class="keywordtype">float</span> tw = abs(w) / (float)vid-&gt;memory_copy-&gt;w;
<a name="l01444"></a>01444                         <span class="keywordtype">float</span> th = abs(h) / (float)vid-&gt;memory_copy-&gt;h;
<a name="l01445"></a>01445 
<a name="l01446"></a>01446                         glBegin(GL_QUADS);
<a name="l01447"></a>01447                             glTexCoord2f(tx, ty);
<a name="l01448"></a>01448                             glVertex2f(dx, dy);
<a name="l01449"></a>01449                             glTexCoord2f(tx, ty + th);
<a name="l01450"></a>01450                             glVertex2f(dx, dy + h);
<a name="l01451"></a>01451                             glTexCoord2f(tx + tw, ty + th);
<a name="l01452"></a>01452                             glVertex2f(dx + w, dy + h);
<a name="l01453"></a>01453                             glTexCoord2f(tx + tw, ty);
<a name="l01454"></a>01454                             glVertex2f(dx + w, dy);
<a name="l01455"></a>01455                         glEnd();
<a name="l01456"></a>01456                     }
<a name="l01457"></a>01457                     <span class="keywordflow">else</span> {
<a name="l01458"></a>01458                         glBegin(GL_QUADS);
<a name="l01459"></a>01459                             glTexCoord2i(sx, sy);
<a name="l01460"></a>01460                             glVertex2f(dx, dy);
<a name="l01461"></a>01461                             glTexCoord2i(sx, sy + h);
<a name="l01462"></a>01462                             glVertex2f(dx, dy + h);
<a name="l01463"></a>01463                             glTexCoord2i(sx + w, sy + h);
<a name="l01464"></a>01464                             glVertex2f(dx + w, dy + h);
<a name="l01465"></a>01465                             glTexCoord2i(sx + w, sy);
<a name="l01466"></a>01466                             glVertex2f(dx + w, dy);
<a name="l01467"></a>01467                         glEnd();
<a name="l01468"></a>01468                     }
<a name="l01469"></a>01469 
<a name="l01470"></a>01470                     glBindTexture(vid-&gt;target, 0);
<a name="l01471"></a>01471                     glDisable(vid-&gt;target);
<a name="l01472"></a>01472                 }
<a name="l01473"></a>01473                 <span class="keywordflow">else</span> {
<a name="l01474"></a>01474                     glEnable(vid-&gt;target);
<a name="l01475"></a>01475                     glActiveTexture(GL_TEXTURE0);
<a name="l01476"></a>01476                     glBindTexture(vid-&gt;target, vid-&gt;tex);
<a name="l01477"></a>01477                     glActiveTexture(GL_TEXTURE1);
<a name="l01478"></a>01478                     glBindTexture(vid-&gt;target, vid-&gt;tex);
<a name="l01479"></a>01479                     glActiveTexture(GL_TEXTURE2);
<a name="l01480"></a>01480                     glBindTexture(vid-&gt;target, vid-&gt;tex);
<a name="l01481"></a>01481                     glActiveTexture(GL_TEXTURE0);
<a name="l01482"></a>01482                     glTexParameteri(vid-&gt;target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
<a name="l01483"></a>01483                     glTexParameteri(vid-&gt;target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
<a name="l01484"></a>01484 
<a name="l01485"></a>01485                     <span class="keywordflow">if</span> (vid-&gt;target == GL_TEXTURE_2D) {
<a name="l01486"></a>01486                         <span class="keywordtype">float</span> tx, ty, tw, th; <span class="comment">/* texture coordinates */</span>
<a name="l01487"></a>01487                         tx = sx / (float)vid-&gt;memory_copy-&gt;w;
<a name="l01488"></a>01488                         ty = sy / (<span class="keywordtype">float</span>)vid-&gt;memory_copy-&gt;h;
<a name="l01489"></a>01489                         tw = abs(w) / (float)vid-&gt;memory_copy-&gt;w;
<a name="l01490"></a>01490                         th = abs(h) / (float)vid-&gt;memory_copy-&gt;h;
<a name="l01491"></a>01491 
<a name="l01492"></a>01492                         glBegin(GL_QUADS);
<a name="l01493"></a>01493                             glMultiTexCoord2f(GL_TEXTURE0, tx, ty);
<a name="l01494"></a>01494                             glMultiTexCoord2f(GL_TEXTURE1, tx, ty);
<a name="l01495"></a>01495                             glMultiTexCoord2f(GL_TEXTURE2, tx, ty);
<a name="l01496"></a>01496                             glVertex2f(dx, dy);
<a name="l01497"></a>01497                             glMultiTexCoord2f(GL_TEXTURE0, tx, ty + th);
<a name="l01498"></a>01498                             glMultiTexCoord2f(GL_TEXTURE1, tx, ty + th);
<a name="l01499"></a>01499                             glMultiTexCoord2f(GL_TEXTURE2, tx, ty + th);
<a name="l01500"></a>01500                             glVertex2f(dx, dy + h);
<a name="l01501"></a>01501                             glMultiTexCoord2f(GL_TEXTURE0, tx + tw, ty + th);
<a name="l01502"></a>01502                             glMultiTexCoord2f(GL_TEXTURE1, tx + tw, ty + th);
<a name="l01503"></a>01503                             glMultiTexCoord2f(GL_TEXTURE2, tx + tw, ty + th);
<a name="l01504"></a>01504                             glVertex2f(dx + w, dy + h);
<a name="l01505"></a>01505                             glMultiTexCoord2f(GL_TEXTURE0, tx + tw, ty);
<a name="l01506"></a>01506                             glMultiTexCoord2f(GL_TEXTURE1, tx + tw, ty);
<a name="l01507"></a>01507                             glMultiTexCoord2f(GL_TEXTURE2, tx + tw, ty);
<a name="l01508"></a>01508                             glVertex2f(dx + w, dy);
<a name="l01509"></a>01509                         glEnd();
<a name="l01510"></a>01510                     }
<a name="l01511"></a>01511                     <span class="keywordflow">else</span> {
<a name="l01512"></a>01512                         glBegin(GL_QUADS);
<a name="l01513"></a>01513                             glMultiTexCoord2i(GL_TEXTURE0, dx, dy);
<a name="l01514"></a>01514                             glMultiTexCoord2i(GL_TEXTURE1, dx, dy);
<a name="l01515"></a>01515                             glMultiTexCoord2i(GL_TEXTURE2, dx, dy);
<a name="l01516"></a>01516                             glVertex2f(dx, dy);
<a name="l01517"></a>01517                             glMultiTexCoord2i(GL_TEXTURE0, dx, dy + h);
<a name="l01518"></a>01518                             glMultiTexCoord2i(GL_TEXTURE1, dx, dy + h);
<a name="l01519"></a>01519                             glMultiTexCoord2i(GL_TEXTURE2, dx, dy + h);
<a name="l01520"></a>01520                             glVertex2f(dx, dy + h);
<a name="l01521"></a>01521                             glMultiTexCoord2i(GL_TEXTURE0, dx + w, dy + h);
<a name="l01522"></a>01522                             glMultiTexCoord2i(GL_TEXTURE1, dx + w, dy + h);
<a name="l01523"></a>01523                             glMultiTexCoord2i(GL_TEXTURE2, dx + w, dy + h);
<a name="l01524"></a>01524                             glVertex2f(dx + w, dy + h);
<a name="l01525"></a>01525                             glMultiTexCoord2i(GL_TEXTURE0, dx + w, dy);
<a name="l01526"></a>01526                             glMultiTexCoord2i(GL_TEXTURE1, dx + w, dy);
<a name="l01527"></a>01527                             glMultiTexCoord2i(GL_TEXTURE2, dx + w, dy);
<a name="l01528"></a>01528                             glVertex2f(dx + w, dy);
<a name="l01529"></a>01529                         glEnd();
<a name="l01530"></a>01530                     }
<a name="l01531"></a>01531 
<a name="l01532"></a>01532                     glBindTexture(vid-&gt;target, 0);
<a name="l01533"></a>01533                     glDisable(vid-&gt;target);
<a name="l01534"></a>01534                 }
<a name="l01535"></a>01535             }
<a name="l01536"></a>01536             <span class="keywordflow">else</span> {
<a name="l01537"></a>01537                 screen_masked_blit_standard(vid-&gt;memory_copy, sx, sy, dx, dy,
<a name="l01538"></a>01538                                             w, h, FALSE, blit_type);
<a name="l01539"></a>01539             }
<a name="l01540"></a>01540 
<a name="l01541"></a>01541             vid = vid-&gt;next;
<a name="l01542"></a>01542         }
<a name="l01543"></a>01543 
<a name="l01544"></a>01544         <span class="keywordflow">if</span> (use_combiners) {
<a name="l01545"></a>01545             glPopAttrib();
<a name="l01546"></a>01546         }
<a name="l01547"></a>01547     }
<a name="l01548"></a>01548     <span class="keywordflow">return</span>;
<a name="l01549"></a>01549 }
<a name="l01550"></a>01550 
<a name="l01551"></a>01551 
<a name="l01552"></a>01552 
<a name="l01553"></a>01553 <span class="keyword">static</span> BITMAP* __allegro_gl_convert_rle_sprite(AL_CONST <span class="keyword">struct</span> RLE_SPRITE *sprite, <span class="keywordtype">int</span> trans)
<a name="l01554"></a>01554 {
<a name="l01555"></a>01555     BITMAP *temp = NULL;
<a name="l01556"></a>01556     <span class="keywordtype">int</span> y, x, src_depth;
<a name="l01557"></a>01557     <span class="keywordtype">signed</span> <span class="keywordtype">long</span> src_mask;
<a name="l01558"></a>01558 
<a name="l01559"></a>01559 <span class="preprocessor">    #define DRAW_RLE_8888(bits)                 \</span>
<a name="l01560"></a>01560 <span class="preprocessor">    {                               \</span>
<a name="l01561"></a>01561 <span class="preprocessor">        for (y = 0; y &lt; sprite-&gt;h; y++) {           \</span>
<a name="l01562"></a>01562 <span class="preprocessor">            signed long c = *s++;               \</span>
<a name="l01563"></a>01563 <span class="preprocessor">            for (x = 0; x &lt; sprite-&gt;w;) {           \</span>
<a name="l01564"></a>01564 <span class="preprocessor">                if (c == src_mask)          \</span>
<a name="l01565"></a>01565 <span class="preprocessor">                    break;              \</span>
<a name="l01566"></a>01566 <span class="preprocessor">                if (c &gt; 0) {                \</span>
<a name="l01567"></a>01567 <span class="preprocessor">                    </span><span class="comment">/* Run of solid pixels */</span>   \
<a name="l01568"></a>01568                     for (c--; c&gt;=0; c--) {      \
<a name="l01569"></a>01569                         unsigned long col = *s++;       \
<a name="l01570"></a>01570                         if (bits == 32 &amp;&amp; trans)        \
<a name="l01571"></a>01571                             _putpixel32(temp, x++, y, makeacol32(getr32(col), getg32(col), getb32(col), geta32(col))); \
<a name="l01572"></a>01572                         else            \
<a name="l01573"></a>01573                             _putpixel32(temp, x++, y, makeacol32(getr##bits(col), getg##bits(col), getb##bits(col), 255)); \
<a name="l01574"></a>01574                     }               \
<a name="l01575"></a>01575                 }                   \
<a name="l01576"></a>01576                 else {                  \
<a name="l01577"></a>01577                     <span class="comment">/* Run of transparent pixels */</span> \
<a name="l01578"></a>01578                     hline(temp, x, y, x-c+1, 0);    \
<a name="l01579"></a>01579                     x -= c;             \
<a name="l01580"></a>01580                 }                   \
<a name="l01581"></a>01581                 c = *s++;               \
<a name="l01582"></a>01582             }                       \
<a name="l01583"></a>01583         }                           \
<a name="l01584"></a>01584     }
<a name="l01585"></a>01585 
<a name="l01586"></a>01586     src_depth = sprite-&gt;color_depth;
<a name="l01587"></a>01587     <span class="keywordflow">if</span> (src_depth == 8)
<a name="l01588"></a>01588         src_mask = 0;
<a name="l01589"></a>01589     <span class="keywordflow">else</span>
<a name="l01590"></a>01590         src_mask = makecol_depth(src_depth, 255, 0, 255);
<a name="l01591"></a>01591 
<a name="l01592"></a>01592     temp = create_bitmap_ex(32, sprite-&gt;w, sprite-&gt;h);
<a name="l01593"></a>01593     <span class="keywordflow">if</span> (!temp) <span class="keywordflow">return</span> NULL;
<a name="l01594"></a>01594 
<a name="l01595"></a>01595     <span class="comment">/* RGBA 8888 */</span>
<a name="l01596"></a>01596     <span class="keywordflow">switch</span>(src_depth) {
<a name="l01597"></a>01597         <span class="keywordflow">case</span> 8:
<a name="l01598"></a>01598         {
<a name="l01599"></a>01599             <span class="keywordtype">signed</span> <span class="keywordtype">char</span> *s = (<span class="keywordtype">signed</span> <span class="keywordtype">char</span>*)sprite-&gt;dat;
<a name="l01600"></a>01600             DRAW_RLE_8888(8);
<a name="l01601"></a>01601             <span class="keywordflow">break</span>;
<a name="l01602"></a>01602         }
<a name="l01603"></a>01603         <span class="keywordflow">case</span> 15:
<a name="l01604"></a>01604         {
<a name="l01605"></a>01605             int16_t *s = (int16_t*)sprite-&gt;dat;
<a name="l01606"></a>01606             DRAW_RLE_8888(15);
<a name="l01607"></a>01607             <span class="keywordflow">break</span>;
<a name="l01608"></a>01608         }
<a name="l01609"></a>01609         <span class="keywordflow">case</span> 16:
<a name="l01610"></a>01610         {
<a name="l01611"></a>01611             int16_t *s = (int16_t*)sprite-&gt;dat;
<a name="l01612"></a>01612             DRAW_RLE_8888(16);
<a name="l01613"></a>01613             <span class="keywordflow">break</span>;
<a name="l01614"></a>01614         }
<a name="l01615"></a>01615         <span class="keywordflow">case</span> 24:
<a name="l01616"></a>01616         {
<a name="l01617"></a>01617             int32_t *s = (int32_t*)sprite-&gt;dat;
<a name="l01618"></a>01618             DRAW_RLE_8888(24);
<a name="l01619"></a>01619             <span class="keywordflow">break</span>;
<a name="l01620"></a>01620         }
<a name="l01621"></a>01621         <span class="keywordflow">case</span> 32:
<a name="l01622"></a>01622         {
<a name="l01623"></a>01623             int32_t *s = (int32_t*)sprite-&gt;dat;
<a name="l01624"></a>01624             DRAW_RLE_8888(32);
<a name="l01625"></a>01625             <span class="keywordflow">break</span>;
<a name="l01626"></a>01626         }
<a name="l01627"></a>01627     }
<a name="l01628"></a>01628 
<a name="l01629"></a>01629     <span class="keywordflow">return</span> temp;
<a name="l01630"></a>01630 }
<a name="l01631"></a>01631 
<a name="l01632"></a>01632 
<a name="l01633"></a>01633 
<a name="l01634"></a>01634 <span class="keywordtype">void</span> allegro_gl_screen_draw_rle_sprite(<span class="keyword">struct</span> BITMAP *bmp, AL_CONST <span class="keyword">struct</span> RLE_SPRITE *sprite, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y)
<a name="l01635"></a>01635 {
<a name="l01636"></a>01636     BITMAP *temp = NULL, *temp2 = NULL;
<a name="l01637"></a>01637     <span class="keywordtype">int</span> source_x = 0, source_y = 0;
<a name="l01638"></a>01638     <span class="keywordtype">int</span> width = sprite-&gt;w, height = sprite-&gt;h;
<a name="l01639"></a>01639 
<a name="l01640"></a>01640     temp = __allegro_gl_convert_rle_sprite(sprite, FALSE);
<a name="l01641"></a>01641     <span class="keywordflow">if</span> (!temp)
<a name="l01642"></a>01642         <span class="keywordflow">return</span>;
<a name="l01643"></a>01643 
<a name="l01644"></a>01644     BITMAP_BLIT_CLIP(temp, bmp, source_x, source_y, x, y, width, height);
<a name="l01645"></a>01645     
<a name="l01646"></a>01646     <span class="keywordflow">if</span> (is_sub_bitmap(bmp)) {
<a name="l01647"></a>01647         x += bmp-&gt;x_ofs;
<a name="l01648"></a>01648         y += bmp-&gt;y_ofs;
<a name="l01649"></a>01649     }
<a name="l01650"></a>01650 
<a name="l01651"></a>01651     <span class="keywordflow">if</span> (width &lt;= 0 || height &lt;= 0) {
<a name="l01652"></a>01652         destroy_bitmap(temp);
<a name="l01653"></a>01653         <span class="keywordflow">return</span>;
<a name="l01654"></a>01654     }
<a name="l01655"></a>01655 
<a name="l01656"></a>01656     temp2 = create_sub_bitmap(temp, source_x, source_y, width, height);
<a name="l01657"></a>01657     <span class="keywordflow">if</span> (!temp2) {
<a name="l01658"></a>01658         destroy_bitmap(temp);
<a name="l01659"></a>01659         <span class="keywordflow">return</span>;
<a name="l01660"></a>01660     }
<a name="l01661"></a>01661 
<a name="l01662"></a>01662     do_screen_masked_blit_standard(GL_RGBA, 
<a name="l01663"></a>01663         __allegro_gl_get_bitmap_type(temp2, <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>), temp2,
<a name="l01664"></a>01664         0, 0, x, y, width, height, FALSE, AGL_NO_ROTATION);
<a name="l01665"></a>01665 
<a name="l01666"></a>01666     destroy_bitmap(temp2);
<a name="l01667"></a>01667     destroy_bitmap(temp);
<a name="l01668"></a>01668 }
<a name="l01669"></a>01669 
<a name="l01670"></a>01670 
<a name="l01671"></a>01671 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_draw_trans_rgba_rle_sprite(<span class="keyword">struct</span> BITMAP *bmp,
<a name="l01672"></a>01672                             AL_CONST <span class="keyword">struct</span> RLE_SPRITE *sprite, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y) {
<a name="l01673"></a>01673     BITMAP *temp = NULL, *temp2 = NULL;
<a name="l01674"></a>01674     <span class="keywordtype">int</span> source_x = 0, source_y = 0;
<a name="l01675"></a>01675     <span class="keywordtype">int</span> width = sprite-&gt;w, height = sprite-&gt;h;
<a name="l01676"></a>01676 
<a name="l01677"></a>01677     temp = __allegro_gl_convert_rle_sprite(sprite, TRUE);
<a name="l01678"></a>01678     <span class="keywordflow">if</span> (!temp)
<a name="l01679"></a>01679         <span class="keywordflow">return</span>;
<a name="l01680"></a>01680 
<a name="l01681"></a>01681     BITMAP_BLIT_CLIP(temp, bmp, source_x, source_y, x, y, width, height);
<a name="l01682"></a>01682     
<a name="l01683"></a>01683     <span class="keywordflow">if</span> (is_sub_bitmap(bmp)) {
<a name="l01684"></a>01684         x += bmp-&gt;x_ofs;
<a name="l01685"></a>01685         y += bmp-&gt;y_ofs;
<a name="l01686"></a>01686     }
<a name="l01687"></a>01687 
<a name="l01688"></a>01688     <span class="keywordflow">if</span> (width &lt;= 0 || height &lt;= 0) {
<a name="l01689"></a>01689         destroy_bitmap(temp);
<a name="l01690"></a>01690         <span class="keywordflow">return</span>;
<a name="l01691"></a>01691     }
<a name="l01692"></a>01692 
<a name="l01693"></a>01693     temp2 = create_sub_bitmap(temp, source_x, source_y, width, height);
<a name="l01694"></a>01694     <span class="keywordflow">if</span> (!temp2) {
<a name="l01695"></a>01695         destroy_bitmap(temp);
<a name="l01696"></a>01696         <span class="keywordflow">return</span>;
<a name="l01697"></a>01697     }
<a name="l01698"></a>01698     
<a name="l01699"></a>01699     <span class="keywordflow">if</span> (__allegro_gl_blit_operation == AGL_OP_LOGIC_OP)
<a name="l01700"></a>01700         glEnable(GL_COLOR_LOGIC_OP);
<a name="l01701"></a>01701     <span class="keywordflow">else</span>
<a name="l01702"></a>01702         glEnable(GL_BLEND);
<a name="l01703"></a>01703 
<a name="l01704"></a>01704     allegro_gl_upload_and_display_texture(temp2, 0, 0, x, y, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE);
<a name="l01705"></a>01705     
<a name="l01706"></a>01706     <span class="keywordflow">if</span> (__allegro_gl_blit_operation == AGL_OP_LOGIC_OP)
<a name="l01707"></a>01707         glDisable(GL_COLOR_LOGIC_OP);
<a name="l01708"></a>01708     <span class="keywordflow">else</span>
<a name="l01709"></a>01709         glDisable(GL_BLEND);
<a name="l01710"></a>01710 
<a name="l01711"></a>01711     destroy_bitmap(temp2);
<a name="l01712"></a>01712     destroy_bitmap(temp);
<a name="l01713"></a>01713 }
<a name="l01714"></a>01714 
<a name="l01715"></a>01715 
<a name="l01716"></a>01716 
<a name="l01717"></a>01717 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_masked_blit(<span class="keyword">struct</span> BITMAP *source,
<a name="l01718"></a>01718     <span class="keyword">struct</span> BITMAP *dest, <span class="keywordtype">int</span> source_x, <span class="keywordtype">int</span> source_y, <span class="keywordtype">int</span> dest_x, <span class="keywordtype">int</span> dest_y,
<a name="l01719"></a>01719     <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height)
<a name="l01720"></a>01720 {
<a name="l01721"></a>01721     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_screen_masked_blit\n&quot;</span>);
<a name="l01722"></a>01722     do_masked_blit_screen(source, dest, source_x, source_y, dest_x, dest_y,
<a name="l01723"></a>01723                           width, height, FALSE, AGL_REGULAR_BMP | AGL_NO_ROTATION);
<a name="l01724"></a>01724 }
<a name="l01725"></a>01725 
<a name="l01726"></a>01726 
<a name="l01727"></a>01727 
<a name="l01728"></a>01728 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_draw_sprite(<span class="keyword">struct</span> BITMAP *bmp,
<a name="l01729"></a>01729     <span class="keyword">struct</span> BITMAP *sprite, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y)
<a name="l01730"></a>01730 {
<a name="l01731"></a>01731     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_screen_draw_sprite\n&quot;</span>);
<a name="l01732"></a>01732     do_masked_blit_screen(sprite, bmp, 0, 0, x, y, sprite-&gt;w, sprite-&gt;h,
<a name="l01733"></a>01733                           FALSE, AGL_NO_ROTATION);
<a name="l01734"></a>01734 }
<a name="l01735"></a>01735 
<a name="l01736"></a>01736 
<a name="l01737"></a>01737 
<a name="l01738"></a>01738 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_draw_sprite_v_flip(<span class="keyword">struct</span> BITMAP *bmp,
<a name="l01739"></a>01739     <span class="keyword">struct</span> BITMAP *sprite, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y)
<a name="l01740"></a>01740 {
<a name="l01741"></a>01741     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_screen_draw_sprite_v_flip\n&quot;</span>);
<a name="l01742"></a>01742     do_masked_blit_screen(sprite, bmp, 0, 0, x, y, sprite-&gt;w, sprite-&gt;h,
<a name="l01743"></a>01743                           AGL_V_FLIP, AGL_NO_ROTATION);
<a name="l01744"></a>01744 }
<a name="l01745"></a>01745 
<a name="l01746"></a>01746 
<a name="l01747"></a>01747 
<a name="l01748"></a>01748 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_draw_sprite_h_flip(<span class="keyword">struct</span> BITMAP *bmp,
<a name="l01749"></a>01749     <span class="keyword">struct</span> BITMAP *sprite, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y)
<a name="l01750"></a>01750 {
<a name="l01751"></a>01751     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_screen_draw_sprite_h_flip\n&quot;</span>);
<a name="l01752"></a>01752     do_masked_blit_screen(sprite, bmp, 0, 0, x, y, sprite-&gt;w, sprite-&gt;h,
<a name="l01753"></a>01753                           AGL_H_FLIP, AGL_NO_ROTATION);
<a name="l01754"></a>01754 }
<a name="l01755"></a>01755 
<a name="l01756"></a>01756 
<a name="l01757"></a>01757 
<a name="l01758"></a>01758 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_draw_sprite_vh_flip(<span class="keyword">struct</span> BITMAP *bmp,
<a name="l01759"></a>01759     <span class="keyword">struct</span> BITMAP *sprite, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y)
<a name="l01760"></a>01760 {
<a name="l01761"></a>01761     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_screen_draw_sprite_vh_flip\n&quot;</span>);
<a name="l01762"></a>01762     do_masked_blit_screen(sprite, bmp, 0, 0, x, y, sprite-&gt;w, sprite-&gt;h,
<a name="l01763"></a>01763                           AGL_V_FLIP | AGL_H_FLIP, AGL_NO_ROTATION);
<a name="l01764"></a>01764 }
<a name="l01765"></a>01765 
<a name="l01766"></a>01766 
<a name="l01767"></a>01767 
<a name="l01768"></a>01768 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_pivot_scaled_sprite_flip(<span class="keyword">struct</span> BITMAP *bmp,
<a name="l01769"></a>01769     <span class="keyword">struct</span> BITMAP *sprite, fixed x, fixed y, fixed cx, fixed cy, fixed angle,
<a name="l01770"></a>01770     fixed scale, <span class="keywordtype">int</span> v_flip)
<a name="l01771"></a>01771 {
<a name="l01772"></a>01772     <span class="keywordtype">double</span> dscale = fixtof(scale);
<a name="l01773"></a>01773     GLint matrix_mode;
<a name="l01774"></a>01774     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_screen_pivot_scaled_sprite_flip\n&quot;</span>);
<a name="l01775"></a>01775     
<a name="l01776"></a>01776 <span class="preprocessor">#define BIN_2_DEG(x) (-(x) * 180.0 / 128)</span>
<a name="l01777"></a>01777 <span class="preprocessor"></span>    
<a name="l01778"></a>01778     glGetIntegerv(GL_MATRIX_MODE, &amp;matrix_mode);
<a name="l01779"></a>01779     glMatrixMode(GL_MODELVIEW);
<a name="l01780"></a>01780     glPushMatrix();
<a name="l01781"></a>01781     glTranslated(fixtof(x), fixtof(y), 0.);
<a name="l01782"></a>01782     glRotated(BIN_2_DEG(fixtof(angle)), 0., 0., -1.);
<a name="l01783"></a>01783     glScaled(dscale, dscale, dscale);
<a name="l01784"></a>01784     glTranslated(-fixtof(x+cx), -fixtof(y+cy), 0.);
<a name="l01785"></a>01785     
<a name="l01786"></a>01786     do_masked_blit_screen(sprite, bmp, 0, 0, fixtoi(x), fixtoi(y),
<a name="l01787"></a>01787                           sprite-&gt;w, sprite-&gt;h, v_flip ? AGL_V_FLIP : FALSE, FALSE);
<a name="l01788"></a>01788     glPopMatrix();
<a name="l01789"></a>01789     glMatrixMode(matrix_mode);
<a name="l01790"></a>01790 
<a name="l01791"></a>01791 <span class="preprocessor">#undef BIN_2_DEG</span>
<a name="l01792"></a>01792 <span class="preprocessor"></span>
<a name="l01793"></a>01793     <span class="keywordflow">return</span>;
<a name="l01794"></a>01794 }
<a name="l01795"></a>01795 
<a name="l01796"></a>01796 
<a name="l01797"></a>01797 
<a name="l01798"></a>01798 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_draw_trans_rgba_sprite(<span class="keyword">struct</span> BITMAP *bmp,
<a name="l01799"></a>01799     <span class="keyword">struct</span> BITMAP *sprite, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y) {
<a name="l01800"></a>01800 
<a name="l01801"></a>01801     <span class="keywordflow">if</span> (__allegro_gl_blit_operation == AGL_OP_LOGIC_OP)
<a name="l01802"></a>01802         glEnable(GL_COLOR_LOGIC_OP);
<a name="l01803"></a>01803     <span class="keywordflow">else</span>
<a name="l01804"></a>01804         glEnable(GL_BLEND);
<a name="l01805"></a>01805 
<a name="l01806"></a>01806     <span class="comment">/* video -&gt; screen */</span>
<a name="l01807"></a>01807     <span class="keywordflow">if</span> (is_video_bitmap(sprite)) {
<a name="l01808"></a>01808         allegro_gl_screen_blit_to_self(sprite, bmp, 0, 0, x, y, sprite-&gt;w, sprite-&gt;h);
<a name="l01809"></a>01809     }
<a name="l01810"></a>01810     <span class="comment">/* memory -&gt; screen */</span>
<a name="l01811"></a>01811     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (is_memory_bitmap(sprite)) {
<a name="l01812"></a>01812         GLint format = __allegro_gl_get_bitmap_color_format(sprite, <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="l01813"></a>01813         GLint type = __allegro_gl_get_bitmap_type(sprite, 0);
<a name="l01814"></a>01814         allegro_gl_upload_and_display_texture(sprite, 0, 0, x, y, sprite-&gt;w, sprite-&gt;h, 0, format, type);
<a name="l01815"></a>01815     }
<a name="l01816"></a>01816     
<a name="l01817"></a>01817     <span class="keywordflow">if</span> (__allegro_gl_blit_operation == AGL_OP_LOGIC_OP)
<a name="l01818"></a>01818         glDisable(GL_COLOR_LOGIC_OP);
<a name="l01819"></a>01819     <span class="keywordflow">else</span>
<a name="l01820"></a>01820         glDisable(GL_BLEND);
<a name="l01821"></a>01821     
<a name="l01822"></a>01822     <span class="keywordflow">return</span>;
<a name="l01823"></a>01823 }
<a name="l01824"></a>01824 
<a name="l01825"></a>01825 
<a name="l01826"></a>01826 
<a name="l01827"></a>01827 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_draw_sprite_ex(<span class="keyword">struct</span> BITMAP *bmp,
<a name="l01828"></a>01828     <span class="keyword">struct</span> BITMAP *sprite, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y, <span class="keywordtype">int</span> mode, <span class="keywordtype">int</span> flip)
<a name="l01829"></a>01829 {
<a name="l01830"></a>01830     <span class="keywordtype">int</span> lflip = 0;
<a name="l01831"></a>01831     <span class="keywordtype">int</span> matrix_mode;
<a name="l01832"></a>01832     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_screen_draw_sprite_ex\n&quot;</span>);
<a name="l01833"></a>01833 
<a name="l01834"></a>01834     <span class="comment">/* convert allegro&#39;s flipping flags to AGL&#39;s flags */</span>
<a name="l01835"></a>01835     <span class="keywordflow">switch</span> (flip) {
<a name="l01836"></a>01836         <span class="keywordflow">case</span> DRAW_SPRITE_NO_FLIP:
<a name="l01837"></a>01837             lflip = FALSE;
<a name="l01838"></a>01838         <span class="keywordflow">break</span>;
<a name="l01839"></a>01839         <span class="keywordflow">case</span> DRAW_SPRITE_V_FLIP:
<a name="l01840"></a>01840             lflip = AGL_V_FLIP;
<a name="l01841"></a>01841         <span class="keywordflow">break</span>;
<a name="l01842"></a>01842         <span class="keywordflow">case</span> DRAW_SPRITE_H_FLIP:
<a name="l01843"></a>01843             lflip = AGL_H_FLIP;
<a name="l01844"></a>01844         <span class="keywordflow">break</span>;
<a name="l01845"></a>01845         <span class="keywordflow">case</span> DRAW_SPRITE_VH_FLIP:
<a name="l01846"></a>01846             lflip = AGL_V_FLIP | AGL_H_FLIP;
<a name="l01847"></a>01847         <span class="keywordflow">break</span>;
<a name="l01848"></a>01848     }
<a name="l01849"></a>01849 
<a name="l01850"></a>01850     <span class="keywordflow">switch</span> (mode) {
<a name="l01851"></a>01851         <span class="keywordflow">case</span> DRAW_SPRITE_NORMAL:
<a name="l01852"></a>01852             do_masked_blit_screen(sprite, bmp, 0, 0, x, y, sprite-&gt;w, sprite-&gt;h,
<a name="l01853"></a>01853                 lflip, AGL_NO_ROTATION);
<a name="l01854"></a>01854         <span class="keywordflow">break</span>;
<a name="l01855"></a>01855         <span class="keywordflow">case</span> DRAW_SPRITE_TRANS:
<a name="l01856"></a>01856             <span class="keywordflow">if</span> (lflip) {
<a name="l01857"></a>01857                 glGetIntegerv(GL_MATRIX_MODE, &amp;matrix_mode);
<a name="l01858"></a>01858                 glMatrixMode(GL_MODELVIEW);
<a name="l01859"></a>01859                 glPushMatrix();
<a name="l01860"></a>01860 
<a name="l01861"></a>01861                 glTranslatef(x, y, 0.f);
<a name="l01862"></a>01862                 glScalef((lflip&amp;AGL_H_FLIP) ? -1 : 1, (lflip&amp;AGL_V_FLIP)? -1 : 1, 1);
<a name="l01863"></a>01863                 glTranslatef(-x, -y, 0);
<a name="l01864"></a>01864                 glTranslatef((lflip&amp;AGL_H_FLIP) ? -sprite-&gt;w : 0,
<a name="l01865"></a>01865                              (lflip&amp;AGL_V_FLIP) ? -sprite-&gt;h : 0, 0);
<a name="l01866"></a>01866             }
<a name="l01867"></a>01867 
<a name="l01868"></a>01868             allegro_gl_screen_draw_trans_rgba_sprite(bmp, sprite, x, y);
<a name="l01869"></a>01869 
<a name="l01870"></a>01870             <span class="keywordflow">if</span> (lflip) {
<a name="l01871"></a>01871                 glPopMatrix();
<a name="l01872"></a>01872                 glMatrixMode(matrix_mode);
<a name="l01873"></a>01873             }
<a name="l01874"></a>01874         <span class="keywordflow">break</span>;
<a name="l01875"></a>01875         <span class="keywordflow">case</span> DRAW_SPRITE_LIT:
<a name="l01876"></a>01876         <span class="comment">/* unsupported */</span>
<a name="l01877"></a>01877         <span class="keywordflow">break</span>;
<a name="l01878"></a>01878     }
<a name="l01879"></a>01879 }
<a name="l01880"></a>01880 
<a name="l01881"></a>01881 
<a name="l01882"></a>01882 
<a name="l01883"></a>01883 <span class="keywordtype">void</span> allegro_gl_screen_draw_glyph_ex(<span class="keyword">struct</span> BITMAP *bmp,
<a name="l01884"></a>01884                                   AL_CONST <span class="keyword">struct</span> FONT_GLYPH *glyph, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y,
<a name="l01885"></a>01885                                   <span class="keywordtype">int</span> color, <span class="keywordtype">int</span> bg, <span class="keywordtype">int</span> flip)
<a name="l01886"></a>01886 {
<a name="l01887"></a>01887     GLubyte r, g, b, a;
<a name="l01888"></a>01888     <span class="keywordtype">int</span> x_offs = 0;
<a name="l01889"></a>01889     <span class="keywordtype">int</span> i;
<a name="l01890"></a>01890 
<a name="l01891"></a>01891     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_screen_draw_glyph_ex\n&quot;</span>);
<a name="l01892"></a>01892     
<a name="l01893"></a>01893     <span class="keywordflow">if</span> (bmp-&gt;clip) {
<a name="l01894"></a>01894         glPushAttrib(GL_SCISSOR_BIT);
<a name="l01895"></a>01895         glEnable(GL_SCISSOR_TEST);
<a name="l01896"></a>01896         glScissor(bmp-&gt;x_ofs + bmp-&gt;cl, bmp-&gt;h + bmp-&gt;y_ofs - bmp-&gt;cb,
<a name="l01897"></a>01897                   bmp-&gt;cr - bmp-&gt;cl, bmp-&gt;cb - bmp-&gt;ct);
<a name="l01898"></a>01898 
<a name="l01899"></a>01899         <span class="keywordflow">if</span> (x &lt; bmp-&gt;cl) {
<a name="l01900"></a>01900             x_offs -= x - bmp-&gt;cl;
<a name="l01901"></a>01901             x = bmp-&gt;cl;
<a name="l01902"></a>01902         }
<a name="l01903"></a>01903     }
<a name="l01904"></a>01904     <span class="keywordflow">if</span> (is_sub_bitmap(bmp)) {
<a name="l01905"></a>01905         x += bmp-&gt;x_ofs;
<a name="l01906"></a>01906         y += bmp-&gt;y_ofs;
<a name="l01907"></a>01907     }
<a name="l01908"></a>01908     
<a name="l01909"></a>01909     <span class="keywordflow">if</span> (bg != -1) {
<a name="l01910"></a>01910         split_color(bg, &amp;r, &amp;g, &amp;b, &amp;a, bitmap_color_depth(bmp));
<a name="l01911"></a>01911         glColor4ub(r, g, b, a);
<a name="l01912"></a>01912         glRecti(x, y, x + glyph-&gt;w, y + glyph-&gt;h);              
<a name="l01913"></a>01913     }
<a name="l01914"></a>01914 
<a name="l01915"></a>01915     split_color(color, &amp;r, &amp;g, &amp;b, &amp;a, bitmap_color_depth(bmp));
<a name="l01916"></a>01916     glColor4ub(r, g, b, a);
<a name="l01917"></a>01917     glRasterPos2i(x, y);
<a name="l01918"></a>01918     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
<a name="l01919"></a>01919     glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
<a name="l01920"></a>01920 
<a name="l01921"></a>01921     <span class="keywordflow">if</span> (flip) {
<a name="l01922"></a>01922         <span class="keywordflow">for</span> (i = 0; i &lt; glyph-&gt;h; i++) {
<a name="l01923"></a>01923             glBitmap(glyph-&gt;w, 1, x_offs, i, 0, 2,
<a name="l01924"></a>01924                                          glyph-&gt;dat + i * ((glyph-&gt;w + 7) / 8));
<a name="l01925"></a>01925         }
<a name="l01926"></a>01926     }
<a name="l01927"></a>01927     <span class="keywordflow">else</span> {
<a name="l01928"></a>01928         <span class="keywordflow">for</span> (i = 0; i &lt; glyph-&gt;h; i++) {
<a name="l01929"></a>01929             glBitmap(glyph-&gt;w, 1, x_offs, i, 0, 0,
<a name="l01930"></a>01930                                          glyph-&gt;dat + i * ((glyph-&gt;w + 7) / 8));
<a name="l01931"></a>01931         }
<a name="l01932"></a>01932     }
<a name="l01933"></a>01933     
<a name="l01934"></a>01934     <span class="keywordflow">if</span> (bmp-&gt;clip) {
<a name="l01935"></a>01935         glPopAttrib();
<a name="l01936"></a>01936     }
<a name="l01937"></a>01937 
<a name="l01938"></a>01938     <span class="keywordflow">return</span>;
<a name="l01939"></a>01939 }
<a name="l01940"></a>01940 
<a name="l01941"></a>01941 
<a name="l01942"></a>01942 
<a name="l01943"></a>01943 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_draw_glyph(<span class="keyword">struct</span> BITMAP *bmp,
<a name="l01944"></a>01944                                   AL_CONST <span class="keyword">struct</span> FONT_GLYPH *glyph, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y,
<a name="l01945"></a>01945                                   <span class="keywordtype">int</span> color, <span class="keywordtype">int</span> bg) {
<a name="l01946"></a>01946     allegro_gl_screen_draw_glyph_ex(bmp, glyph, x, y, color, bg, 0);
<a name="l01947"></a>01947 }
<a name="l01948"></a>01948 
<a name="l01949"></a>01949 
<a name="l01950"></a>01950 
<a name="l01951"></a>01951 <span class="keywordtype">void</span> allegro_gl_screen_draw_color_glyph_ex(<span class="keyword">struct</span> BITMAP *bmp,
<a name="l01952"></a>01952     <span class="keyword">struct</span> BITMAP *sprite, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y, <span class="keywordtype">int</span> color, <span class="keywordtype">int</span> bg, <span class="keywordtype">int</span> flip)
<a name="l01953"></a>01953 {
<a name="l01954"></a>01954 
<a name="l01955"></a>01955     <span class="comment">/* Implementation note: we should try building textures and see how well</span>
<a name="l01956"></a>01956 <span class="comment">     * those work instead of of DrawPixels with a weird I_TO_RGBA mapping.</span>
<a name="l01957"></a>01957 <span class="comment">     */</span>
<a name="l01958"></a>01958     <span class="keyword">static</span> GLfloat red_map[256];
<a name="l01959"></a>01959     <span class="keyword">static</span> GLfloat green_map[256];
<a name="l01960"></a>01960     <span class="keyword">static</span> GLfloat blue_map[256];
<a name="l01961"></a>01961     <span class="keyword">static</span> GLfloat alpha_map[256];
<a name="l01962"></a>01962     GLubyte r, g, b, a;
<a name="l01963"></a>01963     <span class="keywordtype">int</span> i;
<a name="l01964"></a>01964     GLint saved_row_length;
<a name="l01965"></a>01965     GLint width, height;
<a name="l01966"></a>01966     <span class="keywordtype">int</span> sprite_x = 0, sprite_y = 0;
<a name="l01967"></a>01967     <span class="keywordtype">void</span> *data;
<a name="l01968"></a>01968     <span class="keywordtype">int</span> *table;
<a name="l01969"></a>01969 
<a name="l01970"></a>01970     width = sprite-&gt;w;
<a name="l01971"></a>01971     height = sprite-&gt;h;
<a name="l01972"></a>01972 
<a name="l01973"></a>01973     <span class="keywordflow">if</span> (bmp-&gt;clip) {
<a name="l01974"></a>01974         <span class="keywordflow">if</span> ((x &gt;= bmp-&gt;cr) || (y &gt;= bmp-&gt;cb) || (x + width &lt; bmp-&gt;cl)
<a name="l01975"></a>01975          || (y + height &lt; bmp-&gt;ct)) {
<a name="l01976"></a>01976             <span class="keywordflow">return</span>;
<a name="l01977"></a>01977         }
<a name="l01978"></a>01978         <span class="keywordflow">if</span> (x &lt; bmp-&gt;cl) {
<a name="l01979"></a>01979             width += x - bmp-&gt;cl;
<a name="l01980"></a>01980             sprite_x -= (x - bmp-&gt;cl);
<a name="l01981"></a>01981             x = bmp-&gt;cl;
<a name="l01982"></a>01982         }
<a name="l01983"></a>01983         <span class="keywordflow">if</span> (y &lt; bmp-&gt;ct) {
<a name="l01984"></a>01984             height += y - bmp-&gt;ct;
<a name="l01985"></a>01985             sprite_y -= (y - bmp-&gt;ct);
<a name="l01986"></a>01986             y = bmp-&gt;ct;
<a name="l01987"></a>01987         }
<a name="l01988"></a>01988         <span class="keywordflow">if</span> (x + width &gt; bmp-&gt;cr) {
<a name="l01989"></a>01989             width = bmp-&gt;cr - x;
<a name="l01990"></a>01990         }
<a name="l01991"></a>01991         <span class="keywordflow">if</span> (y + height &gt; bmp-&gt;cb) {
<a name="l01992"></a>01992             height = bmp-&gt;cb - y;
<a name="l01993"></a>01993         }
<a name="l01994"></a>01994     }
<a name="l01995"></a>01995     <span class="keywordflow">if</span> (is_sub_bitmap(bmp)) {
<a name="l01996"></a>01996         x += bmp-&gt;x_ofs;
<a name="l01997"></a>01997         y += bmp-&gt;y_ofs;
<a name="l01998"></a>01998     }
<a name="l01999"></a>01999 
<a name="l02000"></a>02000     data = sprite-&gt;line[sprite_y]
<a name="l02001"></a>02001          + sprite_x * BYTES_PER_PIXEL(bitmap_color_depth(sprite));
<a name="l02002"></a>02002 
<a name="l02003"></a>02003     <span class="keywordflow">if</span> (bg &lt; 0) {
<a name="l02004"></a>02004         glAlphaFunc(GL_GREATER, 0.0f);
<a name="l02005"></a>02005         glEnable(GL_ALPHA_TEST);
<a name="l02006"></a>02006         alpha_map[0] = 0.;
<a name="l02007"></a>02007     }
<a name="l02008"></a>02008     <span class="keywordflow">else</span> {
<a name="l02009"></a>02009         split_color(bg, &amp;r, &amp;g, &amp;b, &amp;a, bitmap_color_depth(bmp));
<a name="l02010"></a>02010         red_map[0] = r / 255.;
<a name="l02011"></a>02011         green_map[0] = g / 255.;
<a name="l02012"></a>02012         blue_map[0] = b / 255.;
<a name="l02013"></a>02013         alpha_map[0] = 1.;
<a name="l02014"></a>02014     }
<a name="l02015"></a>02015 
<a name="l02016"></a>02016     <span class="keywordflow">if</span> (color &lt; 0) {
<a name="l02017"></a>02017         table = _palette_expansion_table(bitmap_color_depth(bmp));
<a name="l02018"></a>02018 
<a name="l02019"></a>02019         <span class="keywordflow">for</span>(i = 1; i &lt; 255; i++) {
<a name="l02020"></a>02020             split_color(table[i], &amp;r, &amp;g, &amp;b, &amp;a, bitmap_color_depth(bmp));
<a name="l02021"></a>02021             red_map[i] = r / 255.;
<a name="l02022"></a>02022             green_map[i] = g / 255.;
<a name="l02023"></a>02023             blue_map[i] = b / 255.;
<a name="l02024"></a>02024             alpha_map[i] = 1.;
<a name="l02025"></a>02025         }
<a name="l02026"></a>02026     }
<a name="l02027"></a>02027     <span class="keywordflow">else</span> {
<a name="l02028"></a>02028         split_color(color, &amp;r, &amp;g, &amp;b, &amp;a, bitmap_color_depth(bmp));
<a name="l02029"></a>02029 
<a name="l02030"></a>02030         <span class="keywordflow">for</span>(i = 1; i &lt; 255; i++) {
<a name="l02031"></a>02031             red_map[i] = r / 255.;
<a name="l02032"></a>02032             green_map[i] = g / 255.;
<a name="l02033"></a>02033             blue_map[i] = b / 255.;
<a name="l02034"></a>02034             alpha_map[i] = 1.;
<a name="l02035"></a>02035         }
<a name="l02036"></a>02036     }
<a name="l02037"></a>02037     
<a name="l02038"></a>02038     glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 256, red_map);
<a name="l02039"></a>02039     glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 256, green_map);
<a name="l02040"></a>02040     glPixelMapfv(GL_PIXEL_MAP_I_TO_B, 256, blue_map);
<a name="l02041"></a>02041     glPixelMapfv(GL_PIXEL_MAP_I_TO_A, 256, alpha_map);
<a name="l02042"></a>02042     
<a name="l02043"></a>02043     glRasterPos2i(x, y);
<a name="l02044"></a>02044     glPushAttrib(GL_PIXEL_MODE_BIT);
<a name="l02045"></a>02045     glGetIntegerv(GL_UNPACK_ROW_LENGTH, &amp;saved_row_length);
<a name="l02046"></a>02046     
<a name="l02047"></a>02047     glPixelZoom(1.0, flip ? -1.0 : 1.0);
<a name="l02048"></a>02048     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
<a name="l02049"></a>02049     glPixelStorei(GL_UNPACK_ROW_LENGTH, sprite-&gt;w);
<a name="l02050"></a>02050     glPixelTransferi(GL_MAP_COLOR, GL_TRUE);
<a name="l02051"></a>02051 
<a name="l02052"></a>02052     glDrawPixels(width, height, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, data);
<a name="l02053"></a>02053     glPixelStorei(GL_UNPACK_ROW_LENGTH, saved_row_length);
<a name="l02054"></a>02054     glPopAttrib();
<a name="l02055"></a>02055     <span class="keywordflow">if</span> (bg &lt; 0) {
<a name="l02056"></a>02056         glDisable(GL_ALPHA_TEST);
<a name="l02057"></a>02057     }
<a name="l02058"></a>02058 
<a name="l02059"></a>02059     <span class="keywordflow">return</span>;
<a name="l02060"></a>02060 }
<a name="l02061"></a>02061 
<a name="l02062"></a>02062 
<a name="l02063"></a>02063 
<a name="l02064"></a>02064 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_draw_color_glyph(<span class="keyword">struct</span> BITMAP *bmp,
<a name="l02065"></a>02065     <span class="keyword">struct</span> BITMAP *sprite, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y, <span class="keywordtype">int</span> color, <span class="keywordtype">int</span> bg) {
<a name="l02066"></a>02066     allegro_gl_screen_draw_color_glyph_ex(bmp, sprite, x, y, color, bg, 1);
<a name="l02067"></a>02067 }
<a name="l02068"></a>02068 
<a name="l02069"></a>02069 
<a name="l02070"></a>02070 
<a name="l02071"></a>02071 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_draw_character(<span class="keyword">struct</span> BITMAP *bmp,
<a name="l02072"></a>02072                          <span class="keyword">struct</span> BITMAP *sprite, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y, <span class="keywordtype">int</span> color, <span class="keywordtype">int</span> bg)
<a name="l02073"></a>02073 {
<a name="l02074"></a>02074     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_screen_draw_character\n&quot;</span>);
<a name="l02075"></a>02075     allegro_gl_screen_draw_color_glyph(bmp, sprite, x, y, color, bg);
<a name="l02076"></a>02076 }
<a name="l02077"></a>02077 
<a name="l02078"></a>02078 
<a name="l02079"></a>02079 
<a name="l02080"></a>02080 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_draw_256_sprite(<span class="keyword">struct</span> BITMAP *bmp,
<a name="l02081"></a>02081                                             <span class="keyword">struct</span> BITMAP *sprite, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y)
<a name="l02082"></a>02082 {
<a name="l02083"></a>02083     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_screen_draw_256_sprite\n&quot;</span>);
<a name="l02084"></a>02084     allegro_gl_screen_draw_color_glyph(bmp, sprite, x, y, -1, -1);
<a name="l02085"></a>02085 }
<a name="l02086"></a>02086 
<a name="l02087"></a>02087 
<a name="l02088"></a>02088 
<a name="l02089"></a>02089 <span class="keywordtype">void</span> allegro_gl_screen_clear_to_color(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> color)
<a name="l02090"></a>02090 {
<a name="l02091"></a>02091     <span class="keywordflow">if</span> (__agl_drawing_pattern_tex || bmp-&gt;clip) {
<a name="l02092"></a>02092         allegro_gl_screen_rectfill(bmp, 0, 0, bmp-&gt;w, bmp-&gt;h, color);
<a name="l02093"></a>02093     }
<a name="l02094"></a>02094     <span class="keywordflow">else</span> {
<a name="l02095"></a>02095         GLubyte r, g, b, a;
<a name="l02096"></a>02096         GLfloat old_col[4];
<a name="l02097"></a>02097     
<a name="l02098"></a>02098         split_color(color, &amp;r, &amp;g, &amp;b, &amp;a, bitmap_color_depth(bmp));
<a name="l02099"></a>02099         
<a name="l02100"></a>02100         glGetFloatv(GL_COLOR_CLEAR_VALUE, old_col);
<a name="l02101"></a>02101         glClearColor(((<span class="keywordtype">float</span>) r / 255), ((<span class="keywordtype">float</span>) g / 255), ((<span class="keywordtype">float</span>) b / 255),
<a name="l02102"></a>02102                      ((<span class="keywordtype">float</span>) a / 255));
<a name="l02103"></a>02103 
<a name="l02104"></a>02104         glClear(GL_COLOR_BUFFER_BIT);
<a name="l02105"></a>02105         glClearColor(old_col[0], old_col[1], old_col[2], old_col[3]);
<a name="l02106"></a>02106     }
<a name="l02107"></a>02107 
<a name="l02108"></a>02108     <span class="keywordflow">return</span>;
<a name="l02109"></a>02109 }
<a name="l02110"></a>02110 
<a name="l02111"></a>02111 
<a name="l02112"></a>02112 
<a name="l02113"></a>02113 <span class="comment">/* TODO: Handle concave and self-intersecting. */</span>
<a name="l02114"></a>02114 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_polygon(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> vertices,
<a name="l02115"></a>02115                                       AL_CONST <span class="keywordtype">int</span> *points, <span class="keywordtype">int</span> color) {
<a name="l02116"></a>02116     GLubyte r, g, b, a;
<a name="l02117"></a>02117     <span class="keywordtype">int</span> i;
<a name="l02118"></a>02118 
<a name="l02119"></a>02119     split_color(color, &amp;r, &amp;g, &amp;b, &amp;a, bitmap_color_depth(bmp));
<a name="l02120"></a>02120     glColor4ub(r, g, b, a);
<a name="l02121"></a>02121     
<a name="l02122"></a>02122     glPushAttrib(GL_SCISSOR_BIT);
<a name="l02123"></a>02123 
<a name="l02124"></a>02124     <span class="keywordflow">if</span> (bmp-&gt;clip) {
<a name="l02125"></a>02125         glEnable(GL_SCISSOR_TEST);
<a name="l02126"></a>02126         glScissor(bmp-&gt;x_ofs + bmp-&gt;cl, bmp-&gt;h + bmp-&gt;y_ofs - bmp-&gt;cb,
<a name="l02127"></a>02127                   bmp-&gt;cr - bmp-&gt;cl, bmp-&gt;cb - bmp-&gt;ct);
<a name="l02128"></a>02128     }
<a name="l02129"></a>02129     <span class="keywordflow">else</span> {
<a name="l02130"></a>02130         glScissor(0, 0, bmp-&gt;w, bmp-&gt;h);
<a name="l02131"></a>02131     }
<a name="l02132"></a>02132 
<a name="l02133"></a>02133     glBegin(GL_POLYGON);
<a name="l02134"></a>02134         <span class="keywordflow">for</span> (i = 0; i &lt; vertices*2-1; i+=2) {
<a name="l02135"></a>02135             SET_TEX_COORDS(points[i], points[i+1]);
<a name="l02136"></a>02136             <span class="keywordflow">if</span> (is_sub_bitmap(bmp)) {
<a name="l02137"></a>02137                 glVertex2f(points[i] + bmp-&gt;x_ofs, points[i+1] + bmp-&gt;y_ofs);
<a name="l02138"></a>02138             }
<a name="l02139"></a>02139             <span class="keywordflow">else</span> {
<a name="l02140"></a>02140                 glVertex2f(points[i], points[i+1]);
<a name="l02141"></a>02141             }
<a name="l02142"></a>02142         }
<a name="l02143"></a>02143     glEnd();
<a name="l02144"></a>02144 
<a name="l02145"></a>02145     glPopAttrib();
<a name="l02146"></a>02146 }
<a name="l02147"></a>02147 
<a name="l02148"></a>02148 
<a name="l02149"></a>02149 
<a name="l02150"></a>02150 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_rect(<span class="keyword">struct</span> BITMAP *bmp,
<a name="l02151"></a>02151                                    <span class="keywordtype">int</span> x1, <span class="keywordtype">int</span> y1, <span class="keywordtype">int</span> x2, <span class="keywordtype">int</span> y2, <span class="keywordtype">int</span> color) {
<a name="l02152"></a>02152     GLubyte r, g, b, a;
<a name="l02153"></a>02153 
<a name="l02154"></a>02154     split_color(color, &amp;r, &amp;g, &amp;b, &amp;a, bitmap_color_depth(bmp));
<a name="l02155"></a>02155     glColor4ub(r, g, b, a);
<a name="l02156"></a>02156     
<a name="l02157"></a>02157     glPushAttrib(GL_SCISSOR_BIT);
<a name="l02158"></a>02158 
<a name="l02159"></a>02159     <span class="keywordflow">if</span> (bmp-&gt;clip) {
<a name="l02160"></a>02160         glEnable(GL_SCISSOR_TEST);
<a name="l02161"></a>02161         glScissor(bmp-&gt;x_ofs + bmp-&gt;cl, bmp-&gt;h + bmp-&gt;y_ofs - bmp-&gt;cb,
<a name="l02162"></a>02162                   bmp-&gt;cr - bmp-&gt;cl, bmp-&gt;cb - bmp-&gt;ct);
<a name="l02163"></a>02163     }
<a name="l02164"></a>02164     <span class="keywordflow">else</span> {
<a name="l02165"></a>02165         glScissor(0, 0, bmp-&gt;w, bmp-&gt;h);
<a name="l02166"></a>02166     }
<a name="l02167"></a>02167     <span class="keywordflow">if</span> (is_sub_bitmap(bmp)) {
<a name="l02168"></a>02168         x1 += bmp-&gt;x_ofs;
<a name="l02169"></a>02169         x2 += bmp-&gt;x_ofs;
<a name="l02170"></a>02170         y1 += bmp-&gt;y_ofs;
<a name="l02171"></a>02171         y2 += bmp-&gt;y_ofs;
<a name="l02172"></a>02172     }
<a name="l02173"></a>02173 
<a name="l02174"></a>02174     glBegin(GL_LINE_STRIP);
<a name="l02175"></a>02175         glVertex2f(x1, y1);
<a name="l02176"></a>02176         glVertex2f(x2, y1);
<a name="l02177"></a>02177         glVertex2f(x2, y2);
<a name="l02178"></a>02178         glVertex2f(x1, y2);
<a name="l02179"></a>02179         glVertex2f(x1, y1);
<a name="l02180"></a>02180     glEnd();
<a name="l02181"></a>02181 
<a name="l02182"></a>02182     glPopAttrib();
<a name="l02183"></a>02183 }
<a name="l02184"></a>02184 
<a name="l02185"></a>02185 
<a name="l02186"></a>02186 
<a name="l02187"></a>02187 <span class="keywordtype">void</span> allegro_gl_screen_polygon3d_f(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> type,
<a name="l02188"></a>02188                                    <span class="keyword">struct</span> BITMAP *texture, <span class="keywordtype">int</span> vc,
<a name="l02189"></a>02189                                    V3D_f *vtx[]) {
<a name="l02190"></a>02190     <span class="keywordtype">int</span> i;
<a name="l02191"></a>02191     <span class="keywordtype">int</span> use_z = FALSE;
<a name="l02192"></a>02192 
<a name="l02193"></a>02193     <span class="keywordflow">if</span> (type &amp; POLYTYPE_ZBUF) {
<a name="l02194"></a>02194         use_z = TRUE;
<a name="l02195"></a>02195         type &amp;= ~POLYTYPE_ZBUF;
<a name="l02196"></a>02196     }
<a name="l02197"></a>02197 
<a name="l02198"></a>02198     <span class="keywordflow">if</span> (type == POLYTYPE_PTEX || type == POLYTYPE_PTEX_TRANS)
<a name="l02199"></a>02199         use_z = TRUE;
<a name="l02200"></a>02200 
<a name="l02201"></a>02201     <span class="keywordflow">if</span> (bmp-&gt;clip) {
<a name="l02202"></a>02202         glPushAttrib(GL_SCISSOR_BIT);
<a name="l02203"></a>02203         glEnable(GL_SCISSOR_TEST);
<a name="l02204"></a>02204         glScissor(bmp-&gt;x_ofs + bmp-&gt;cl, bmp-&gt;h + bmp-&gt;y_ofs - bmp-&gt;cb,
<a name="l02205"></a>02205                   bmp-&gt;cr - bmp-&gt;cl, bmp-&gt;cb - bmp-&gt;ct);
<a name="l02206"></a>02206     }
<a name="l02207"></a>02207     <span class="keywordflow">if</span> (is_sub_bitmap(bmp)) {
<a name="l02208"></a>02208         <span class="keywordflow">for</span> (i = 0; i &lt; vc*2-1; i+=2) {
<a name="l02209"></a>02209             vtx[i] += bmp-&gt;x_ofs;
<a name="l02210"></a>02210             vtx[i+1] += bmp-&gt;y_ofs;
<a name="l02211"></a>02211         }
<a name="l02212"></a>02212     }
<a name="l02213"></a>02213 
<a name="l02214"></a>02214     <span class="keywordflow">if</span> (use_z) {
<a name="l02215"></a>02215         glEnable(GL_DEPTH_TEST);
<a name="l02216"></a>02216         glDepthFunc(GL_LESS);
<a name="l02217"></a>02217         glDepthMask(GL_TRUE);
<a name="l02218"></a>02218     }
<a name="l02219"></a>02219 
<a name="l02220"></a>02220     glColor4ub(255, 255, 255, 255);
<a name="l02221"></a>02221 
<a name="l02222"></a>02222     <span class="keywordflow">if</span> (type == POLYTYPE_ATEX || type == POLYTYPE_PTEX
<a name="l02223"></a>02223      || type == POLYTYPE_ATEX_TRANS || type == POLYTYPE_PTEX_TRANS) {
<a name="l02224"></a>02224         drawing_mode(DRAW_MODE_COPY_PATTERN, texture, 0, 0);
<a name="l02225"></a>02225     }
<a name="l02226"></a>02226 
<a name="l02227"></a>02227     <span class="keywordflow">if</span> (type == POLYTYPE_ATEX_TRANS || type == POLYTYPE_PTEX_TRANS) {
<a name="l02228"></a>02228         glEnable(GL_BLEND);
<a name="l02229"></a>02229     }
<a name="l02230"></a>02230 
<a name="l02231"></a>02231     glBegin(GL_POLYGON);
<a name="l02232"></a>02232         <span class="keywordflow">for</span> (i = 0; i &lt; vc; i++) {
<a name="l02233"></a>02233             <span class="keywordflow">if</span> (type == POLYTYPE_FLAT)
<a name="l02234"></a>02234                 glColor3ub(getr(vtx[0]-&gt;c), getg(vtx[0]-&gt;c), getb(vtx[0]-&gt;c));
<a name="l02235"></a>02235             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (type == POLYTYPE_GRGB)
<a name="l02236"></a>02236                 glColor3ub(getr24(vtx[i]-&gt;c), getg24(vtx[i]-&gt;c), getb24(vtx[i]-&gt;c));
<a name="l02237"></a>02237             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (type == POLYTYPE_GCOL)
<a name="l02238"></a>02238                 glColor3ub(getr(vtx[i]-&gt;c), getg(vtx[i]-&gt;c), getb(vtx[i]-&gt;c));
<a name="l02239"></a>02239             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (type == POLYTYPE_ATEX || type == POLYTYPE_PTEX
<a name="l02240"></a>02240                   || type == POLYTYPE_ATEX_TRANS || type == POLYTYPE_PTEX_TRANS) {
<a name="l02241"></a>02241                     SET_TEX_COORDS(vtx[i]-&gt;u, vtx[i]-&gt;v);
<a name="l02242"></a>02242             }
<a name="l02243"></a>02243 
<a name="l02244"></a>02244             <span class="keywordflow">if</span> (use_z)
<a name="l02245"></a>02245                 glVertex3f(vtx[i]-&gt;x, vtx[i]-&gt;y, 1.f / vtx[i]-&gt;z);
<a name="l02246"></a>02246             <span class="keywordflow">else</span>
<a name="l02247"></a>02247                 glVertex2f(vtx[i]-&gt;x, vtx[i]-&gt;y);
<a name="l02248"></a>02248         }
<a name="l02249"></a>02249     glEnd();
<a name="l02250"></a>02250 
<a name="l02251"></a>02251     <span class="keywordflow">if</span> (bmp-&gt;clip)
<a name="l02252"></a>02252         glPopAttrib();
<a name="l02253"></a>02253 
<a name="l02254"></a>02254     <span class="keywordflow">if</span> (use_z) {
<a name="l02255"></a>02255         glDisable(GL_DEPTH_TEST);
<a name="l02256"></a>02256         glDepthMask(GL_FALSE);
<a name="l02257"></a>02257     }
<a name="l02258"></a>02258 
<a name="l02259"></a>02259     <span class="keywordflow">if</span> (type == POLYTYPE_ATEX || type == POLYTYPE_PTEX
<a name="l02260"></a>02260      || type == POLYTYPE_ATEX_TRANS || type == POLYTYPE_PTEX_TRANS) {
<a name="l02261"></a>02261         solid_mode();
<a name="l02262"></a>02262     }
<a name="l02263"></a>02263 
<a name="l02264"></a>02264     <span class="keywordflow">if</span> (type == POLYTYPE_ATEX_TRANS || type == POLYTYPE_PTEX_TRANS)
<a name="l02265"></a>02265         glDisable(GL_BLEND);
<a name="l02266"></a>02266 }
<a name="l02267"></a>02267 
<a name="l02268"></a>02268 
<a name="l02269"></a>02269 
<a name="l02270"></a>02270 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_polygon3d(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> type,
<a name="l02271"></a>02271                                         <span class="keyword">struct</span> BITMAP *texture, <span class="keywordtype">int</span> vc,
<a name="l02272"></a>02272                                         V3D *vtx[]) {
<a name="l02273"></a>02273     <span class="keywordtype">int</span> i;
<a name="l02274"></a>02274     V3D_f **vtx_f = malloc(vc * <span class="keyword">sizeof</span>(<span class="keyword">struct</span> V3D_f*));
<a name="l02275"></a>02275     <span class="keywordflow">if</span> (!vtx_f)
<a name="l02276"></a>02276         <span class="keywordflow">return</span>;
<a name="l02277"></a>02277 
<a name="l02278"></a>02278     <span class="keywordflow">for</span> (i = 0; i &lt; vc; i++) {
<a name="l02279"></a>02279         vtx_f[i] = malloc(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> V3D_f));
<a name="l02280"></a>02280         <span class="keywordflow">if</span> (!vtx_f[i]) {
<a name="l02281"></a>02281             <span class="keywordtype">int</span> k;
<a name="l02282"></a>02282             <span class="keywordflow">for</span> (k = 0; k &lt; i; k++)
<a name="l02283"></a>02283                 free(vtx_f[k]);
<a name="l02284"></a>02284             free(vtx_f);
<a name="l02285"></a>02285             <span class="keywordflow">return</span>;
<a name="l02286"></a>02286         }
<a name="l02287"></a>02287         vtx_f[i]-&gt;c = vtx[i]-&gt;c;
<a name="l02288"></a>02288         vtx_f[i]-&gt;u = fixtof(vtx[i]-&gt;u);
<a name="l02289"></a>02289         vtx_f[i]-&gt;v = fixtof(vtx[i]-&gt;v);
<a name="l02290"></a>02290         vtx_f[i]-&gt;x = fixtof(vtx[i]-&gt;x);
<a name="l02291"></a>02291         vtx_f[i]-&gt;y = fixtof(vtx[i]-&gt;y);
<a name="l02292"></a>02292         vtx_f[i]-&gt;z = fixtof(vtx[i]-&gt;z);
<a name="l02293"></a>02293     }
<a name="l02294"></a>02294 
<a name="l02295"></a>02295     allegro_gl_screen_polygon3d_f(bmp, type, texture, vc, vtx_f);
<a name="l02296"></a>02296     <span class="keywordflow">for</span> (i = 0; i &lt; vc; i++)
<a name="l02297"></a>02297         free(vtx_f[i]);
<a name="l02298"></a>02298     free(vtx_f);
<a name="l02299"></a>02299 }
<a name="l02300"></a>02300 
<a name="l02301"></a>02301 
<a name="l02302"></a>02302 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_quad3d_f(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> type,
<a name="l02303"></a>02303                                        <span class="keyword">struct</span> BITMAP *texture,
<a name="l02304"></a>02304                                        V3D_f *v1, V3D_f *v2, V3D_f *v3, V3D_f *v4) {
<a name="l02305"></a>02305 
<a name="l02306"></a>02306     V3D_f *vtx_f[4];
<a name="l02307"></a>02307     vtx_f[0] = v1;
<a name="l02308"></a>02308     vtx_f[1] = v2;
<a name="l02309"></a>02309     vtx_f[2] = v3;
<a name="l02310"></a>02310     vtx_f[3] = v4;
<a name="l02311"></a>02311 
<a name="l02312"></a>02312     allegro_gl_screen_polygon3d_f(bmp, type, texture, 4, vtx_f);
<a name="l02313"></a>02313 }
<a name="l02314"></a>02314 
<a name="l02315"></a>02315 
<a name="l02316"></a>02316 
<a name="l02317"></a>02317 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_quad3d(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> type,
<a name="l02318"></a>02318             <span class="keyword">struct</span> BITMAP *texture, V3D *v1, V3D *v2, V3D *v3, V3D *v4) {
<a name="l02319"></a>02319 
<a name="l02320"></a>02320     V3D *vtx[4];
<a name="l02321"></a>02321     vtx[0] = v1;
<a name="l02322"></a>02322     vtx[1] = v2;
<a name="l02323"></a>02323     vtx[2] = v3;
<a name="l02324"></a>02324     vtx[3] = v4;
<a name="l02325"></a>02325 
<a name="l02326"></a>02326     allegro_gl_screen_polygon3d(bmp, type, texture, 4, vtx);
<a name="l02327"></a>02327 }
<a name="l02328"></a>02328 
<a name="l02329"></a>02329 
<a name="l02330"></a>02330 
<a name="l02331"></a>02331 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_triangle3d(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> type,
<a name="l02332"></a>02332                                          <span class="keyword">struct</span> BITMAP *texture,
<a name="l02333"></a>02333                                          V3D *v1, V3D *v2, V3D *v3) {
<a name="l02334"></a>02334     V3D *vtx[3];
<a name="l02335"></a>02335     vtx[0] = v1;
<a name="l02336"></a>02336     vtx[1] = v2;
<a name="l02337"></a>02337     vtx[2] = v3;
<a name="l02338"></a>02338 
<a name="l02339"></a>02339     allegro_gl_screen_polygon3d(bmp, type, texture, 3, vtx);
<a name="l02340"></a>02340 }
<a name="l02341"></a>02341 
<a name="l02342"></a>02342 
<a name="l02343"></a>02343 
<a name="l02344"></a>02344 <span class="keyword">static</span> <span class="keywordtype">void</span> allegro_gl_screen_triangle3d_f(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> type,
<a name="l02345"></a>02345                                            <span class="keyword">struct</span> BITMAP *texture,
<a name="l02346"></a>02346                                            V3D_f *v1, V3D_f *v2, V3D_f *v3) {
<a name="l02347"></a>02347     V3D_f *vtx_f[3];
<a name="l02348"></a>02348     vtx_f[0] = v1;
<a name="l02349"></a>02349     vtx_f[1] = v2;
<a name="l02350"></a>02350     vtx_f[2] = v3;
<a name="l02351"></a>02351 
<a name="l02352"></a>02352     allegro_gl_screen_polygon3d_f(bmp, type, texture, 3, vtx_f);
<a name="l02353"></a>02353 }
<a name="l02354"></a>02354 
<a name="l02355"></a>02355 
<a name="l02356"></a>02356 
<a name="l02357"></a>02357 <span class="keywordtype">void</span> __allegro_gl__glvtable_update_vtable(GFX_VTABLE ** vtable)
<a name="l02358"></a>02358 {
<a name="l02359"></a>02359     <span class="keywordtype">int</span> maskcolor = (*vtable)-&gt;mask_color;
<a name="l02360"></a>02360     <span class="keywordtype">int</span> depth = (*vtable)-&gt;color_depth;
<a name="l02361"></a>02361 
<a name="l02362"></a>02362     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:__allegro_gl__glvtable_update_vtable\n&quot;</span>);
<a name="l02363"></a>02363     allegro_gl_screen_vtable.color_depth = depth;
<a name="l02364"></a>02364     <span class="comment">/* makecol_depth is used below instead of the MASK_COLOR_x constants</span>
<a name="l02365"></a>02365 <span class="comment">     * because we may have changed the RGB shift values in order to</span>
<a name="l02366"></a>02366 <span class="comment">     * use the packed pixels extension</span>
<a name="l02367"></a>02367 <span class="comment">     */</span>
<a name="l02368"></a>02368     allegro_gl_screen_vtable.mask_color =
<a name="l02369"></a>02369         makecol_depth(depth, getr(maskcolor), getg(maskcolor), getb(maskcolor));
<a name="l02370"></a>02370     
<a name="l02371"></a>02371     *vtable = &amp;allegro_gl_screen_vtable;
<a name="l02372"></a>02372 
<a name="l02373"></a>02373     __allegro_gl_driver-&gt;screen_masked_blit = screen_masked_blit_standard;
<a name="l02374"></a>02374     <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>.NV_register_combiners) {
<a name="l02375"></a>02375         __allegro_gl_driver-&gt;screen_masked_blit
<a name="l02376"></a>02376                                                = screen_masked_blit_nv_register;
<a name="l02377"></a>02377     }
<a name="l02378"></a>02378     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (allegro_gl_info.num_texture_units &gt;= 3) {
<a name="l02379"></a>02379         __allegro_gl_driver-&gt;screen_masked_blit =
<a name="l02380"></a>02380                                                  screen_masked_blit_combine_tex;
<a name="l02381"></a>02381     }
<a name="l02382"></a>02382 }
<a name="l02383"></a>02383 
<a name="l02384"></a>02384 
<a name="l02385"></a>02385 
<a name="l02386"></a>02386 <span class="comment">/* Saved projection matrix */</span>
<a name="l02387"></a>02387 <span class="keyword">static</span> <span class="keywordtype">double</span> allegro_gl_projection_matrix[16];
<a name="l02388"></a>02388 <span class="keyword">static</span> <span class="keywordtype">double</span> allegro_gl_modelview_matrix[16];
<a name="l02389"></a>02389 
<a name="l02390"></a>02390 
<a name="l02391"></a>02391 
<a name="l02422"></a><a class="code" href="group__allegro.html#ga7ea7ffd9b72d0d0722cbf982b729efdb">02422</a> <span class="keywordtype">void</span> <a class="code" href="group__allegro.html#ga7ea7ffd9b72d0d0722cbf982b729efdb" title="Prepares for Allegro drawing to the screen.">allegro_gl_set_allegro_mode</a>(<span class="keywordtype">void</span>)
<a name="l02423"></a>02423 {
<a name="l02424"></a>02424     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_set_allegro_mode\n&quot;</span>);
<a name="l02425"></a>02425 
<a name="l02426"></a>02426     <span class="comment">/* Save the OpenGL state  then set it up */</span>
<a name="l02427"></a>02427     glPushAttrib(GL_ENABLE_BIT | GL_TEXTURE_BIT | GL_TRANSFORM_BIT
<a name="l02428"></a>02428                | GL_POINT_BIT | GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
<a name="l02429"></a>02429     glDisable(GL_DEPTH_TEST);
<a name="l02430"></a>02430     glDisable(GL_CULL_FACE);
<a name="l02431"></a>02431     glDisable(GL_FOG);
<a name="l02432"></a>02432     glDisable(GL_LIGHTING);
<a name="l02433"></a>02433     glDisable(GL_BLEND);
<a name="l02434"></a>02434     glDisable(GL_ALPHA_TEST);
<a name="l02435"></a>02435     glDepthMask(GL_FALSE);
<a name="l02436"></a>02436     glEnable(GL_TEXTURE_2D);
<a name="l02437"></a>02437     glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
<a name="l02438"></a>02438     glPointSize(1.);
<a name="l02439"></a>02439 
<a name="l02440"></a>02440     <span class="comment">/* Create pool texture */</span>
<a name="l02441"></a>02441     <span class="keywordflow">if</span> (!__allegro_gl_pool_texture) {
<a name="l02442"></a>02442         glGenTextures(1, &amp;__allegro_gl_pool_texture);
<a name="l02443"></a>02443     }
<a name="l02444"></a>02444 
<a name="l02445"></a>02445     glBindTexture(GL_TEXTURE_2D, __allegro_gl_pool_texture);
<a name="l02446"></a>02446         <span class="comment">/* Create a texture without defining the data */</span>
<a name="l02447"></a>02447     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0,
<a name="l02448"></a>02448                  GL_RGBA, GL_UNSIGNED_BYTE, NULL);
<a name="l02449"></a>02449     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
<a name="l02450"></a>02450     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
<a name="l02451"></a>02451 
<a name="l02452"></a>02452     glBindTexture(GL_TEXTURE_2D, 0);
<a name="l02453"></a>02453     <a class="code" href="group__allegro.html#gabaf6024e9d196da357aad02c5dc7589f" title="Prepares for Allegro drawing to the screen.">allegro_gl_set_projection</a>();
<a name="l02454"></a>02454 
<a name="l02455"></a>02455     <span class="comment">/* For some reason, ATI Rage Pro isn&#39;t able to draw correctly without a</span>
<a name="l02456"></a>02456 <span class="comment">     * texture bound. So we bind a dummy 1x1 texture to work around the issue.</span>
<a name="l02457"></a>02457 <span class="comment">     */</span>
<a name="l02458"></a>02458     <span class="keywordflow">if</span> (allegro_gl_info.is_ati_rage_pro) {
<a name="l02459"></a>02459         <span class="keywordflow">if</span> (!__allegro_gl_dummy_texture) {
<a name="l02460"></a>02460             GLubyte tex[4] = {255, 255, 255, 255};
<a name="l02461"></a>02461             glGenTextures(1, &amp;__allegro_gl_dummy_texture);
<a name="l02462"></a>02462             glBindTexture(GL_TEXTURE_2D, __allegro_gl_dummy_texture);
<a name="l02463"></a>02463             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0,
<a name="l02464"></a>02464                          GL_RGBA, GL_UNSIGNED_BYTE, tex);
<a name="l02465"></a>02465         }
<a name="l02466"></a>02466         glBindTexture(GL_TEXTURE_2D, __allegro_gl_dummy_texture);
<a name="l02467"></a>02467     }
<a name="l02468"></a>02468 <span class="preprocessor">#ifdef ALLEGRO_MACOSX</span>
<a name="l02469"></a>02469 <span class="preprocessor"></span>    <span class="comment">/* MacOSX 10.2.x has a bug: glRasterPos causes a crash (it is used in</span>
<a name="l02470"></a>02470 <span class="comment">     *&#39;blit&#39;). This stops it happening.</span>
<a name="l02471"></a>02471 <span class="comment">     */</span>
<a name="l02472"></a>02472     glBegin(GL_POINTS);
<a name="l02473"></a>02473     glEnd();
<a name="l02474"></a>02474 <span class="preprocessor">#endif</span>
<a name="l02475"></a>02475 <span class="preprocessor"></span>}
<a name="l02476"></a>02476 
<a name="l02477"></a>02477 
<a name="l02478"></a>02478 
<a name="l02491"></a><a class="code" href="group__allegro.html#ga00fbbee541046767114bf9746ceb6f8b">02491</a> <span class="keywordtype">void</span> <a class="code" href="group__allegro.html#ga00fbbee541046767114bf9746ceb6f8b" title="Restores previous OpenGL settings.">allegro_gl_unset_allegro_mode</a>(<span class="keywordtype">void</span>)
<a name="l02492"></a>02492 {
<a name="l02493"></a>02493     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_unset_allegro_mode\n&quot;</span>);
<a name="l02494"></a>02494 
<a name="l02495"></a>02495     <span class="keywordflow">switch</span>(allegro_gl_display_info.vidmem_policy) {
<a name="l02496"></a>02496         <span class="keywordflow">case</span> <a class="code" href="group__settings.html#ga5deef983a0f5b2704746d7945c614b7c" title="Keep internal texture in video memory.">AGL_KEEP</a>:
<a name="l02497"></a>02497             <span class="keywordflow">break</span>;
<a name="l02498"></a>02498         <span class="keywordflow">case</span> <a class="code" href="group__settings.html#ga77a6cb708e52f68f893128db6f20bdea" title="Release video memory occupied by internal texture.">AGL_RELEASE</a>:
<a name="l02499"></a>02499             <span class="keywordflow">if</span> (__allegro_gl_pool_texture) {
<a name="l02500"></a>02500                 glDeleteTextures(1, &amp;__allegro_gl_pool_texture);
<a name="l02501"></a>02501                 __allegro_gl_pool_texture = 0;
<a name="l02502"></a>02502             }
<a name="l02503"></a>02503             <span class="keywordflow">break</span>;
<a name="l02504"></a>02504     }
<a name="l02505"></a>02505     <a class="code" href="group__allegro.html#ga603f8f3719d02816acdf3dbdcaa1f447" title="Restores previously saved projection.">allegro_gl_unset_projection</a>();
<a name="l02506"></a>02506     glPopAttrib();
<a name="l02507"></a>02507 }
<a name="l02508"></a>02508 
<a name="l02509"></a>02509 
<a name="l02510"></a>02510 
<a name="l02540"></a><a class="code" href="group__allegro.html#gabaf6024e9d196da357aad02c5dc7589f">02540</a> <span class="keywordtype">void</span> <a class="code" href="group__allegro.html#gabaf6024e9d196da357aad02c5dc7589f" title="Prepares for Allegro drawing to the screen.">allegro_gl_set_projection</a>(<span class="keywordtype">void</span>)
<a name="l02541"></a>02541 {
<a name="l02542"></a>02542     GLint v[4];
<a name="l02543"></a>02543     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_set_projection\n&quot;</span>);
<a name="l02544"></a>02544     
<a name="l02545"></a>02545     <span class="comment">/* Setup OpenGL matrices */</span>
<a name="l02546"></a>02546     glGetIntegerv(GL_VIEWPORT, &amp;v[0]);
<a name="l02547"></a>02547     glMatrixMode(GL_MODELVIEW);
<a name="l02548"></a>02548     glGetDoublev(GL_MODELVIEW_MATRIX, allegro_gl_modelview_matrix);
<a name="l02549"></a>02549     glLoadIdentity();
<a name="l02550"></a>02550     glMatrixMode(GL_PROJECTION);
<a name="l02551"></a>02551     glGetDoublev(GL_PROJECTION_MATRIX, allegro_gl_projection_matrix);
<a name="l02552"></a>02552     glLoadIdentity();
<a name="l02553"></a>02553     gluOrtho2D(v[0] - 0.325, v[0] + v[2] - 0.325, v[1] + v[3] - 0.325, v[1] - 0.325);
<a name="l02554"></a>02554 }
<a name="l02555"></a>02555 
<a name="l02556"></a>02556 
<a name="l02557"></a>02557 
<a name="l02567"></a><a class="code" href="group__allegro.html#ga603f8f3719d02816acdf3dbdcaa1f447">02567</a> <span class="keywordtype">void</span> <a class="code" href="group__allegro.html#ga603f8f3719d02816acdf3dbdcaa1f447" title="Restores previously saved projection.">allegro_gl_unset_projection</a>(<span class="keywordtype">void</span>)
<a name="l02568"></a>02568 {
<a name="l02569"></a>02569     AGL_LOG(2, <span class="stringliteral">&quot;glvtable.c:allegro_gl_unset_projection\n&quot;</span>);
<a name="l02570"></a>02570     glMatrixMode(GL_PROJECTION);
<a name="l02571"></a>02571     glLoadMatrixd(allegro_gl_projection_matrix);
<a name="l02572"></a>02572     glMatrixMode(GL_MODELVIEW);
<a name="l02573"></a>02573     glLoadMatrixd(allegro_gl_modelview_matrix);
<a name="l02574"></a>02574 }
<a name="l02575"></a>02575 
<a name="l02576"></a>02576 
<a name="l02577"></a>02577 
<a name="l02578"></a>02578 <span class="keywordtype">void</span> allegro_gl_memory_blit_between_formats(<span class="keyword">struct</span> BITMAP *src,
<a name="l02579"></a>02579     <span class="keyword">struct</span> BITMAP *dest, <span class="keywordtype">int</span> source_x, <span class="keywordtype">int</span> source_y, <span class="keywordtype">int</span> dest_x, <span class="keywordtype">int</span> dest_y,
<a name="l02580"></a>02580     <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height)
<a name="l02581"></a>02581 {
<a name="l02582"></a>02582     AGL_LOG(2, <span class="stringliteral">&quot;AGL::blit_between_formats\n&quot;</span>);
<a name="l02583"></a>02583 
<a name="l02584"></a>02584     <span class="comment">/* screen -&gt; memory */</span>
<a name="l02585"></a>02585     <span class="keywordflow">if</span> (is_screen_bitmap(src)) {
<a name="l02586"></a>02586         allegro_gl_screen_blit_to_memory(src, dest, source_x, source_y,
<a name="l02587"></a>02587                                          dest_x, dest_y, width, height);
<a name="l02588"></a>02588         <span class="keywordflow">return</span>;
<a name="l02589"></a>02589     }
<a name="l02590"></a>02590 
<a name="l02591"></a>02591     <span class="comment">/* video -&gt; memory */</span>
<a name="l02592"></a>02592     <span class="keywordflow">if</span> (is_video_bitmap(src)) {
<a name="l02593"></a>02593         allegro_gl_video_blit_to_memory(src, dest, source_x, source_y,
<a name="l02594"></a>02594                                         dest_x, dest_y, width, height);
<a name="l02595"></a>02595         <span class="keywordflow">return</span>;
<a name="l02596"></a>02596     }
<a name="l02597"></a>02597     
<a name="l02598"></a>02598     <span class="comment">/* memory -&gt; screen */</span>
<a name="l02599"></a>02599     <span class="keywordflow">if</span> (is_screen_bitmap(dest)) {
<a name="l02600"></a>02600         allegro_gl_screen_blit_from_memory(src, dest, source_x, source_y,
<a name="l02601"></a>02601                                            dest_x, dest_y, width, height);
<a name="l02602"></a>02602         <span class="keywordflow">return</span>;
<a name="l02603"></a>02603     }
<a name="l02604"></a>02604 
<a name="l02605"></a>02605     <span class="comment">/* memory -&gt; video */</span>
<a name="l02606"></a>02606     <span class="keywordflow">if</span> (is_video_bitmap(dest)) {
<a name="l02607"></a>02607         allegro_gl_video_blit_from_memory(src, dest, source_x, source_y,
<a name="l02608"></a>02608                                           dest_x, dest_y, width, height);
<a name="l02609"></a>02609         <span class="keywordflow">return</span>;
<a name="l02610"></a>02610     }
<a name="l02611"></a>02611 
<a name="l02612"></a>02612     <span class="keywordflow">switch</span>(bitmap_color_depth(dest)) {
<a name="l02613"></a>02613 <span class="preprocessor">        #ifdef ALLEGRO_COLOR8</span>
<a name="l02614"></a>02614 <span class="preprocessor"></span>        <span class="keywordflow">case</span> 8:
<a name="l02615"></a>02615             __blit_between_formats8(src, dest, source_x, source_y,
<a name="l02616"></a>02616                                     dest_x, dest_y, width, height);
<a name="l02617"></a>02617             <span class="keywordflow">return</span>;
<a name="l02618"></a>02618 <span class="preprocessor">        #endif</span>
<a name="l02619"></a>02619 <span class="preprocessor"></span><span class="preprocessor">        #ifdef ALLEGRO_COLOR16</span>
<a name="l02620"></a>02620 <span class="preprocessor"></span>        <span class="keywordflow">case</span> 15:
<a name="l02621"></a>02621             __blit_between_formats15(src, dest, source_x, source_y,
<a name="l02622"></a>02622                                      dest_x, dest_y, width, height);
<a name="l02623"></a>02623             <span class="keywordflow">return</span>;
<a name="l02624"></a>02624         <span class="keywordflow">case</span> 16:
<a name="l02625"></a>02625             __blit_between_formats16(src, dest, source_x, source_y,
<a name="l02626"></a>02626                                      dest_x, dest_y, width, height);
<a name="l02627"></a>02627             <span class="keywordflow">return</span>;
<a name="l02628"></a>02628 <span class="preprocessor">        #endif</span>
<a name="l02629"></a>02629 <span class="preprocessor"></span><span class="preprocessor">        #ifdef ALLEGRO_COLOR24</span>
<a name="l02630"></a>02630 <span class="preprocessor"></span>        <span class="keywordflow">case</span> 24:
<a name="l02631"></a>02631             __blit_between_formats24(src, dest, source_x, source_y,
<a name="l02632"></a>02632                                      dest_x, dest_y, width, height);
<a name="l02633"></a>02633             <span class="keywordflow">return</span>;
<a name="l02634"></a>02634 <span class="preprocessor">        #endif</span>
<a name="l02635"></a>02635 <span class="preprocessor"></span><span class="preprocessor">        #ifdef ALLEGRO_COLOR32</span>
<a name="l02636"></a>02636 <span class="preprocessor"></span>        <span class="keywordflow">case</span> 32:
<a name="l02637"></a>02637             __blit_between_formats32(src, dest, source_x, source_y,
<a name="l02638"></a>02638                                      dest_x, dest_y, width, height);
<a name="l02639"></a>02639             <span class="keywordflow">return</span>;
<a name="l02640"></a>02640 <span class="preprocessor">        #endif</span>
<a name="l02641"></a>02641 <span class="preprocessor"></span>        <span class="keywordflow">default</span>:
<a name="l02642"></a>02642             TRACE(<span class="stringliteral">&quot;--== ERROR ==-- AGL::blit_between_formats : %i -&gt; %i bpp\n&quot;</span>,
<a name="l02643"></a>02643                   bitmap_color_depth(src), bitmap_color_depth(dest));
<a name="l02644"></a>02644             <span class="keywordflow">return</span>;
<a name="l02645"></a>02645     }
<a name="l02646"></a>02646 }
<a name="l02647"></a>02647 
<a name="l02648"></a>02648 
<a name="l02649"></a>02649 
<a name="l02650"></a>02650 <span class="keyword">static</span> <span class="keywordtype">void</span> dummy_unwrite_bank(<span class="keywordtype">void</span>)
<a name="l02651"></a>02651 {
<a name="l02652"></a>02652 }
<a name="l02653"></a>02653 
<a name="l02654"></a>02654 
<a name="l02655"></a>02655 
<a name="l02656"></a>02656 <span class="keyword">static</span> GFX_VTABLE allegro_gl_screen_vtable = {
<a name="l02657"></a>02657     0,
<a name="l02658"></a>02658     0,
<a name="l02659"></a>02659     dummy_unwrite_bank,         <span class="comment">//void *unwrite_bank;</span>
<a name="l02660"></a>02660     NULL,                       <span class="comment">//AL_METHOD(void, set_clip, (struct BITMAP *bmp));</span>
<a name="l02661"></a>02661     <a class="code" href="group__glvtable.html#ga702812e50246c61eb9f01fd8aba69325" title="acquire_bitmap(screen) overload.">allegro_gl_screen_acquire</a>,
<a name="l02662"></a>02662     <a class="code" href="group__glvtable.html#ga6c2b0685587a0feafcb194a9a67d6aa9" title="release_bitmap(screen) overload.">allegro_gl_screen_release</a>,
<a name="l02663"></a>02663     NULL,                       <span class="comment">//AL_METHOD(struct BITMAP *, create_sub_bitmap, (struct BITMAP *parent, int x, int y, int width, int height));</span>
<a name="l02664"></a>02664     NULL,                       <span class="comment">//AL_METHOD(void, created_sub_bitmap, (struct BITMAP *bmp, struct BITMAP *parent));</span>
<a name="l02665"></a>02665     allegro_gl_screen_getpixel,
<a name="l02666"></a>02666     allegro_gl_screen_putpixel,
<a name="l02667"></a>02667     allegro_gl_screen_vline,
<a name="l02668"></a>02668     allegro_gl_screen_hline,
<a name="l02669"></a>02669     allegro_gl_screen_hline,
<a name="l02670"></a>02670     allegro_gl_screen_line,
<a name="l02671"></a>02671     allegro_gl_screen_line,
<a name="l02672"></a>02672     allegro_gl_screen_rectfill,
<a name="l02673"></a>02673     allegro_gl_screen_triangle,
<a name="l02674"></a>02674     allegro_gl_screen_draw_sprite,
<a name="l02675"></a>02675     allegro_gl_screen_draw_256_sprite,
<a name="l02676"></a>02676     allegro_gl_screen_draw_sprite_v_flip,
<a name="l02677"></a>02677     allegro_gl_screen_draw_sprite_h_flip,
<a name="l02678"></a>02678     allegro_gl_screen_draw_sprite_vh_flip,
<a name="l02679"></a>02679     allegro_gl_screen_draw_trans_rgba_sprite,
<a name="l02680"></a>02680     allegro_gl_screen_draw_trans_rgba_sprite,
<a name="l02681"></a>02681     NULL,                       <span class="comment">//AL_METHOD(void, draw_lit_sprite, (struct BITMAP *bmp, struct BITMAP *sprite, int x, int y, int color));</span>
<a name="l02682"></a>02682     allegro_gl_screen_draw_rle_sprite,
<a name="l02683"></a>02683     allegro_gl_screen_draw_trans_rgba_rle_sprite,
<a name="l02684"></a>02684     allegro_gl_screen_draw_trans_rgba_rle_sprite,
<a name="l02685"></a>02685     NULL,                       <span class="comment">//AL_METHOD(void, draw_lit_rle_sprite, (struct BITMAP *bmp, struct RLE_SPRITE *sprite, int x, int y, int color));</span>
<a name="l02686"></a>02686     allegro_gl_screen_draw_character,
<a name="l02687"></a>02687     allegro_gl_screen_draw_glyph,
<a name="l02688"></a>02688     allegro_gl_screen_blit_from_memory,
<a name="l02689"></a>02689     allegro_gl_screen_blit_to_memory,
<a name="l02690"></a>02690     NULL,                       <span class="comment">//AL_METHOD(void, blit_from_system, (struct BITMAP *source, struct BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height));</span>
<a name="l02691"></a>02691     NULL,                       <span class="comment">//AL_METHOD(void, blit_to_system, (struct BITMAP *source, struct BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height));</span>
<a name="l02692"></a>02692     allegro_gl_screen_blit_to_self,
<a name="l02693"></a>02693     allegro_gl_screen_blit_to_self, <span class="comment">/* ..._forward */</span>
<a name="l02694"></a>02694     allegro_gl_screen_blit_to_self, <span class="comment">/* ..._backward */</span>
<a name="l02695"></a>02695     allegro_gl_memory_blit_between_formats,
<a name="l02696"></a>02696     allegro_gl_screen_masked_blit,
<a name="l02697"></a>02697     allegro_gl_screen_clear_to_color,
<a name="l02698"></a>02698     allegro_gl_screen_pivot_scaled_sprite_flip,
<a name="l02699"></a>02699     NULL,                       <span class="comment">//AL_METHOD(void, do_stretch_blit, (struct BITMAP *source, struct BITMAP *dest, int source_x, int source_y, int source_width, int source_height, int dest_x, int dest_y, int dest_width, int dest_height, int masked));</span>
<a name="l02700"></a>02700     NULL,                       <span class="comment">//AL_METHOD(void, draw_gouraud_sprite, (struct BITMAP *bmp, struct BITMAP *sprite, int x, int y, int c1, int c2, int c3, int c4));</span>
<a name="l02701"></a>02701     NULL,                       <span class="comment">//AL_METHOD(void, draw_sprite_end, (void));</span>
<a name="l02702"></a>02702     NULL,                       <span class="comment">//AL_METHOD(void, blit_end, (void));</span>
<a name="l02703"></a>02703     allegro_gl_screen_polygon,
<a name="l02704"></a>02704     allegro_gl_screen_rect,
<a name="l02705"></a>02705     _soft_circle,               <span class="comment">//AL_METHOD(void, circle, (struct BITMAP *bmp, int x, int y, int radius, int color));</span>
<a name="l02706"></a>02706     _soft_circlefill,           <span class="comment">//AL_METHOD(void, circlefill, (struct BITMAP *bmp, int x, int y, int radius, int color));</span>
<a name="l02707"></a>02707     _soft_ellipse,              <span class="comment">//AL_METHOD(void, ellipse, (struct BITMAP *bmp, int x, int y, int rx, int ry, int color));</span>
<a name="l02708"></a>02708     _soft_ellipsefill,          <span class="comment">//AL_METHOD(void, ellipsefill, (struct BITMAP *bmp, int x, int y, int rx, int ry, int color));</span>
<a name="l02709"></a>02709     _soft_arc,                  <span class="comment">//AL_METHOD(void, arc, (struct BITMAP *bmp, int x, int y, fixed ang1, fixed ang2, int r, int color));</span>
<a name="l02710"></a>02710     _soft_spline,               <span class="comment">//AL_METHOD(void, spline, (struct BITMAP *bmp, AL_CONST int points[8], int color));</span>
<a name="l02711"></a>02711     _soft_floodfill,            <span class="comment">//AL_METHOD(void, floodfill, (struct BITMAP *bmp, int x, int y, int color));</span>
<a name="l02712"></a>02712     allegro_gl_screen_polygon3d,
<a name="l02713"></a>02713     allegro_gl_screen_polygon3d_f,
<a name="l02714"></a>02714     allegro_gl_screen_triangle3d,
<a name="l02715"></a>02715     allegro_gl_screen_triangle3d_f,
<a name="l02716"></a>02716     allegro_gl_screen_quad3d,
<a name="l02717"></a>02717     allegro_gl_screen_quad3d_f,
<a name="l02718"></a>02718     allegro_gl_screen_draw_sprite_ex
<a name="l02719"></a>02719 };
<a name="l02720"></a>02720 
</pre></div></div>
</div>
  <div id="nav-path" class="navpath">
    <ul>
      <li class="navelem"><a class="el" href="glvtable_8c.html">glvtable.c</a>      </li>
      <li class="footer">Generated on Thu May 19 2011 23:20:20 for AllegroGL by&#160;
<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>