<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>AllegroGL: glvtable.c Source File</title> <link href="alleggl.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.5.2 --> <div class="tabs"> <ul> <li><a href="main.html"><span>Main Page</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="annotated.html"><span>Data Structures</span></a></li> <li class="current"><a href="files.html"><span>Files</span></a></li> <li><a href="pages.html"><span>Related Pages</span></a></li> </ul> </div> <div class="tabs"> <ul> <li><a href="files.html"><span>File List</span></a></li> <li><a href="globals.html"><span>Globals</span></a></li> </ul> </div> <h1>glvtable.c</h1><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 <string.h></span> <a name="l00009"></a>00009 <a name="l00010"></a>00010 <span class="preprocessor">#include <allegro.h></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 <winalleg.h></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 "<a class="code" href="alleggl_8h.html" title="Main header file for AllegroGL.">alleggl.h</a>"</span> <a name="l00017"></a>00017 <span class="preprocessor">#include "allglint.h"</span> <a name="l00018"></a>00018 <span class="preprocessor">#include "glvtable.h"</span> <a name="l00019"></a>00019 <span class="preprocessor">#include <allegro/internal/aintern.h></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 <OpenGL/glu.h></span> <a name="l00022"></a>00022 <span class="preprocessor">#else</span> <a name="l00023"></a>00023 <span class="preprocessor"></span><span class="preprocessor">#include <GL/glu.h></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><a class="code" href="glvtable_8c.html#fe00121a82e1c2ba4a94e690a1a326f5">00027</a> <span class="keyword">static</span> GFX_VTABLE <a class="code" href="glvtable_8c.html#fe00121a82e1c2ba4a94e690a1a326f5">allegro_gl_screen_vtable</a>; <a name="l00028"></a><a class="code" href="glvtable_8c.html#d72d761cd04f799d21da8d59cab2182f">00028</a> <span class="keyword">static</span> GLuint <a class="code" href="glvtable_8c.html#d72d761cd04f799d21da8d59cab2182f">__allegro_gl_pool_texture</a> = 0; <a name="l00029"></a>00029 <a name="l00030"></a><a class="code" href="glvtable_8c.html#08de572ca4af6f95d29c93c7011d1479">00030</a> <span class="keyword">static</span> GLuint <a class="code" href="glvtable_8c.html#08de572ca4af6f95d29c93c7011d1479">__allegro_gl_dummy_texture</a> = 0; <span class="comment">/* For ATI Rage Pro */</span> <a name="l00031"></a>00031 <a name="l00032"></a><a class="code" href="glvtable_8c.html#9193931a7f4a22f80daae4a495f13061">00032</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="glvtable_8c.html#9193931a7f4a22f80daae4a495f13061">__agl_owning_drawing_pattern_tex</a> = FALSE; <a name="l00033"></a><a class="code" href="glvtable_8c.html#1c5e4f15e561fc1f335a76d32135c122">00033</a> GLuint <a class="code" href="glvtable_8c.html#1c5e4f15e561fc1f335a76d32135c122">__agl_drawing_pattern_tex</a> = 0; <a name="l00034"></a><a class="code" href="videovtb_8c.html#dc2cff32ad2b6f426fd288f48e08637e">00034</a> BITMAP *<a class="code" href="glvtable_8c.html#dc2cff32ad2b6f426fd288f48e08637e">__agl_drawing_pattern_bmp</a> = 0; <a name="l00035"></a><a class="code" href="glvtable_8c.html#a4786d37ab0c5b87f87aacc22bc7cb19">00035</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="glvtable_8c.html#a4786d37ab0c5b87f87aacc22bc7cb19">__agl_drawing_mode</a> = 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'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><a class="code" href="group__glvtable.html#gf2dd739125f0ca84ac9c68263b4266f2">00061</a> <span class="keywordtype">int</span> <a class="code" href="group__glvtable.html#gf2dd739125f0ca84ac9c68263b4266f2">__allegro_gl_make_power_of_2</a>(<span class="keywordtype">int</span> x) { <a name="l00062"></a>00062 x--; <a name="l00063"></a>00063 x |= (x >> 1); <a name="l00064"></a>00064 x |= (x >> 2); <a name="l00065"></a>00065 x |= (x >> 4); <a name="l00066"></a>00066 x |= (x >> 8); <a name="l00067"></a>00067 x |= (x >> 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><a class="code" href="group__glvtable.html#g04407f993ca3c21d922919db724b96c2">00077</a> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g04407f993ca3c21d922919db724b96c2">allegro_gl_drawing_mode</a>(<span class="keywordtype">void</span>) { <a name="l00078"></a>00078 <span class="keywordflow">if</span> (<a class="code" href="glvtable_8c.html#a4786d37ab0c5b87f87aacc22bc7cb19">__agl_drawing_mode</a> == _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> (<a class="code" href="glvtable_8c.html#a4786d37ab0c5b87f87aacc22bc7cb19">__agl_drawing_mode</a>) { <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> (<a class="code" href="glvtable_8c.html#9193931a7f4a22f80daae4a495f13061">__agl_owning_drawing_pattern_tex</a> && <a class="code" href="glvtable_8c.html#1c5e4f15e561fc1f335a76d32135c122">__agl_drawing_pattern_tex</a>) <a name="l00092"></a>00092 glDeleteTextures(1, &<a class="code" href="glvtable_8c.html#1c5e4f15e561fc1f335a76d32135c122">__agl_drawing_pattern_tex</a>); <a name="l00093"></a>00093 <a class="code" href="glvtable_8c.html#1c5e4f15e561fc1f335a76d32135c122">__agl_drawing_pattern_tex</a> = 0; <a name="l00094"></a>00094 <a class="code" href="glvtable_8c.html#dc2cff32ad2b6f426fd288f48e08637e">__agl_drawing_pattern_bmp</a> = 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 <a class="code" href="glvtable_8c.html#a4786d37ab0c5b87f87aacc22bc7cb19">__agl_drawing_mode</a> = _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 <a class="code" href="glvtable_8c.html#1c5e4f15e561fc1f335a76d32135c122">__agl_drawing_pattern_tex</a> = <a name="l00113"></a>00113 <a class="code" href="group__texture.html#ge071354f76bc28e1bafbd90bdecbc0c9" title="Uploads an Allegro BITMAP to the GL driver as a texture.">allegro_gl_make_texture</a>(_drawing_pattern); <a name="l00114"></a>00114 <a class="code" href="glvtable_8c.html#dc2cff32ad2b6f426fd288f48e08637e">__agl_drawing_pattern_bmp</a> = _drawing_pattern; <a name="l00115"></a>00115 <a class="code" href="glvtable_8c.html#9193931a7f4a22f80daae4a495f13061">__agl_owning_drawing_pattern_tex</a> = 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 <a class="code" href="structAGL__VIDEO__BITMAP.html">AGL_VIDEO_BITMAP</a> *bmp = _drawing_pattern->extra; <a name="l00119"></a>00119 <a class="code" href="glvtable_8c.html#1c5e4f15e561fc1f335a76d32135c122">__agl_drawing_pattern_tex</a> = bmp-><a class="code" href="structAGL__VIDEO__BITMAP.html#4e48b83b354d43e6eedc039d986f2171">tex</a>; <a name="l00120"></a>00120 <a class="code" href="glvtable_8c.html#dc2cff32ad2b6f426fd288f48e08637e">__agl_drawing_pattern_bmp</a> = bmp-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>; <a name="l00121"></a>00121 <a class="code" href="glvtable_8c.html#9193931a7f4a22f80daae4a495f13061">__agl_owning_drawing_pattern_tex</a> = 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, <a class="code" href="glvtable_8c.html#1c5e4f15e561fc1f335a76d32135c122">__agl_drawing_pattern_tex</a>); <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><a class="code" href="group__glvtable.html#g5085e09cbdc329bfd6bd6b7fc65170c8">00132</a> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g5085e09cbdc329bfd6bd6b7fc65170c8">split_color</a>(<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">"glvtable.c:split_color\n"</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><a class="code" href="group__glvtable.html#g26f4a6de9f04b0807fa42700dd1a20d7">00148</a> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g26f4a6de9f04b0807fa42700dd1a20d7">allegro_gl_created_sub_bitmap</a>(BITMAP *bmp, BITMAP *parent) <a name="l00149"></a>00149 { <a name="l00150"></a>00150 bmp->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#g702812e50246c61eb9f01fd8aba69325">00160</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g702812e50246c61eb9f01fd8aba69325" 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#g6c2b0685587a0feafcb194a9a67d6aa9">00170</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g6c2b0685587a0feafcb194a9a67d6aa9" 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><a class="code" href="group__glvtable.html#g921c990bff3ea0faac62def172b9ac5b">00174</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="group__glvtable.html#g921c990bff3ea0faac62def172b9ac5b">allegro_gl_screen_getpixel</a>(<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">"glvtable.c:allegro_gl_screen_getpixel\n"</span>); <a name="l00178"></a>00178 <span class="keywordflow">if</span> (bmp->clip && (x < bmp->cl || x >= bmp->cr <a name="l00179"></a>00179 || y < bmp->ct || y >= bmp->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->x_ofs; <a name="l00184"></a>00184 y += bmp->y_ofs; <a name="l00185"></a>00185 } <a name="l00186"></a>00186 glReadPixels(x, bmp->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><a class="code" href="group__glvtable.html#g709f50a3934bc2339ff583c5d8d7ac4c">00194</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g709f50a3934bc2339ff583c5d8d7ac4c">allegro_gl_screen_putpixel</a>(<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">"glvtable.c:allegro_gl_screen_putpixel\n"</span>); <a name="l00199"></a>00199 <a class="code" href="group__glvtable.html#g5085e09cbdc329bfd6bd6b7fc65170c8">split_color</a>(color, &r, &g, &b, &a, bitmap_color_depth(bmp)); <a name="l00200"></a>00200 <span class="keywordflow">if</span> (bmp->clip && (x < bmp->cl || x >= bmp->cr <a name="l00201"></a>00201 || y < bmp->ct || y >= bmp->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->x_ofs; <a name="l00207"></a>00207 y += bmp->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><a class="code" href="group__glvtable.html#g7a14c4dbc0363e39c33b0416661aee98">00218</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g7a14c4dbc0363e39c33b0416661aee98">allegro_gl_screen_vline</a>(<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">"glvtable.c:allegro_gl_screen_vline\n"</span>); <a name="l00223"></a>00223 <a name="l00224"></a>00224 <span class="keywordflow">if</span> (y1 > 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->clip) { <a name="l00231"></a>00231 <span class="keywordflow">if</span> ((x < bmp->cl) || (x >= bmp->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 >= bmp->cb) || (y2 < bmp->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 < bmp->ct) { <a name="l00238"></a>00238 y1 = bmp->ct; <a name="l00239"></a>00239 } <a name="l00240"></a>00240 <span class="keywordflow">if</span> (y2 >= bmp->cb) { <a name="l00241"></a>00241 y2 = bmp->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->x_ofs; <a name="l00247"></a>00247 y1 += bmp->y_ofs; <a name="l00248"></a>00248 y2 += bmp->y_ofs; <a name="l00249"></a>00249 } <a name="l00250"></a>00250 <a name="l00251"></a>00251 <a class="code" href="group__glvtable.html#g5085e09cbdc329bfd6bd6b7fc65170c8">split_color</a>(color, &r, &g, &b, &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><a class="code" href="group__glvtable.html#g134f31b9686555dae42ae0ab1c1a2fff">00264</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g134f31b9686555dae42ae0ab1c1a2fff">allegro_gl_screen_hline</a>(<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">"glvtable.c:allegro_gl_hline\n"</span>); <a name="l00269"></a>00269 <a name="l00270"></a>00270 <span class="keywordflow">if</span> (x1 > 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->clip) { <a name="l00276"></a>00276 <span class="keywordflow">if</span> ((y < bmp->ct) || (y >= bmp->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 >= bmp->cr) || (x2 < bmp->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 < bmp->cl) { <a name="l00283"></a>00283 x1 = bmp->cl; <a name="l00284"></a>00284 } <a name="l00285"></a>00285 <span class="keywordflow">if</span> (x2 >= bmp->cr) { <a name="l00286"></a>00286 x2 = bmp->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->x_ofs; <a name="l00291"></a>00291 x2 += bmp->x_ofs; <a name="l00292"></a>00292 y += bmp->y_ofs; <a name="l00293"></a>00293 } <a name="l00294"></a>00294 <a name="l00295"></a>00295 <a class="code" href="group__glvtable.html#g5085e09cbdc329bfd6bd6b7fc65170c8">split_color</a>(color, &r, &g, &b, &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><a class="code" href="group__glvtable.html#ge401467052c88d9b91a1f80b0e0fa2ff">00308</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#ge401467052c88d9b91a1f80b0e0fa2ff">allegro_gl_screen_line</a>(<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">"glvtable.c:allegro_gl_screen_line\n"</span>); <a name="l00313"></a>00313 <a name="l00314"></a>00314 <span class="keywordflow">if</span> (bmp->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->x_ofs + bmp->cl, bmp->h + bmp->y_ofs - bmp->cb, <a name="l00318"></a>00318 bmp->cr - bmp->cl, bmp->cb - bmp->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->x_ofs; <a name="l00322"></a>00322 x2 += bmp->x_ofs; <a name="l00323"></a>00323 y1 += bmp->y_ofs; <a name="l00324"></a>00324 y2 += bmp->y_ofs; <a name="l00325"></a>00325 } <a name="l00326"></a>00326 <a name="l00327"></a>00327 <a class="code" href="group__glvtable.html#g5085e09cbdc329bfd6bd6b7fc65170c8">split_color</a>(color, &r, &g, &b, &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->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><a class="code" href="group__glvtable.html#g397c41b7c07794b6edce960693361a83">00348</a> <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->w,\</span> <a name="l00353"></a>00353 <span class="preprocessor"> (y - _drawing_y_anchor) / (float)__agl_drawing_pattern_bmp->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><a class="code" href="group__glvtable.html#g694a43ed2653fc57c21e50f2266737e8">00359</a> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g694a43ed2653fc57c21e50f2266737e8">allegro_gl_screen_rectfill</a>(<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">"glvtable.c:allegro_gl_screen_rectfill\n"</span>); <a name="l00365"></a>00365 <a name="l00366"></a>00366 <span class="keywordflow">if</span> (x1 > 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 > 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->clip) { <a name="l00379"></a>00379 <span class="keywordflow">if</span> ((x1 > bmp->cr) || (x2 < bmp->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 < bmp->cl) { <a name="l00383"></a>00383 x1 = bmp->cl; <a name="l00384"></a>00384 } <a name="l00385"></a>00385 <span class="keywordflow">if</span> (x2 > bmp->cr) { <a name="l00386"></a>00386 x2 = bmp->cr; <a name="l00387"></a>00387 } <a name="l00388"></a>00388 <span class="keywordflow">if</span> ((y1 > bmp->cb) || (y2 < bmp->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 < bmp->ct) { <a name="l00392"></a>00392 y1 = bmp->ct; <a name="l00393"></a>00393 } <a name="l00394"></a>00394 <span class="keywordflow">if</span> (y2 > bmp->cb) { <a name="l00395"></a>00395 y2 = bmp->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->x_ofs; <a name="l00400"></a>00400 x2 += bmp->x_ofs; <a name="l00401"></a>00401 y1 += bmp->y_ofs; <a name="l00402"></a>00402 y2 += bmp->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 <a class="code" href="group__glvtable.html#g5085e09cbdc329bfd6bd6b7fc65170c8">split_color</a>(color, &r, &g, &b, &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 <a class="code" href="group__glvtable.html#g397c41b7c07794b6edce960693361a83">SET_TEX_COORDS</a>(x1, y1); <a name="l00411"></a>00411 glVertex2f(x1, y1); <a name="l00412"></a>00412 <a class="code" href="group__glvtable.html#g397c41b7c07794b6edce960693361a83">SET_TEX_COORDS</a>(x2, y1); <a name="l00413"></a>00413 glVertex2f(x2, y1); <a name="l00414"></a>00414 <a class="code" href="group__glvtable.html#g397c41b7c07794b6edce960693361a83">SET_TEX_COORDS</a>(x2, y2); <a name="l00415"></a>00415 glVertex2f(x2, y2); <a name="l00416"></a>00416 <a class="code" href="group__glvtable.html#g397c41b7c07794b6edce960693361a83">SET_TEX_COORDS</a>(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><a class="code" href="group__glvtable.html#g986ad50a7a2b3ab9aa561c49bf5335e0">00427</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g986ad50a7a2b3ab9aa561c49bf5335e0">allegro_gl_screen_triangle</a>(<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">"glvtable.c:allegro_gl_screen_triangle\n"</span>); <a name="l00432"></a>00432 <a name="l00433"></a>00433 <a class="code" href="group__glvtable.html#g5085e09cbdc329bfd6bd6b7fc65170c8">split_color</a>(color, &r, &g, &b, &a, bitmap_color_depth(bmp)); <a name="l00434"></a>00434 <a name="l00435"></a>00435 <span class="keywordflow">if</span> (bmp->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->x_ofs + bmp->cl, bmp->h + bmp->y_ofs - bmp->cb, <a name="l00439"></a>00439 bmp->cr - bmp->cl, bmp->cb - bmp->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->x_ofs; <a name="l00443"></a>00443 y1 += bmp->y_ofs; <a name="l00444"></a>00444 x2 += bmp->x_ofs; <a name="l00445"></a>00445 y2 += bmp->y_ofs; <a name="l00446"></a>00446 x3 += bmp->x_ofs; <a name="l00447"></a>00447 y3 += bmp->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 <a class="code" href="group__glvtable.html#g397c41b7c07794b6edce960693361a83">SET_TEX_COORDS</a>(x1, y1); <a name="l00453"></a>00453 glVertex2f(x1, y1); <a name="l00454"></a>00454 <a class="code" href="group__glvtable.html#g397c41b7c07794b6edce960693361a83">SET_TEX_COORDS</a>(x2, y2); <a name="l00455"></a>00455 glVertex2f(x2, y2); <a name="l00456"></a>00456 <a class="code" href="group__glvtable.html#g397c41b7c07794b6edce960693361a83">SET_TEX_COORDS</a>(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->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><a class="code" href="group__glvtable.html#gad05bc3970b50f749ceaa43307349998">00468</a> <span class="preprocessor"> width, height) { \</span> <a name="l00469"></a>00469 <span class="preprocessor"> if (dest->clip) { \</span> <a name="l00470"></a>00470 <span class="preprocessor"> if ((dest_x >= dest->cr) || (dest_y >= dest->cb) \</span> <a name="l00471"></a>00471 <span class="preprocessor"> || (dest_x + width < dest->cl) || (dest_y + height < dest->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 < dest->cl) { \</span> <a name="l00475"></a>00475 <span class="preprocessor"> width += dest_x - dest->cl; \</span> <a name="l00476"></a>00476 <span class="preprocessor"> source_x -= dest_x - dest->cl; \</span> <a name="l00477"></a>00477 <span class="preprocessor"> dest_x = dest->cl; \</span> <a name="l00478"></a>00478 <span class="preprocessor"> } \</span> <a name="l00479"></a>00479 <span class="preprocessor"> if (dest_y < dest->ct) { \</span> <a name="l00480"></a>00480 <span class="preprocessor"> height += dest_y - dest->ct; \</span> <a name="l00481"></a>00481 <span class="preprocessor"> source_y -= dest_y - dest->ct; \</span> <a name="l00482"></a>00482 <span class="preprocessor"> dest_y = dest->ct; \</span> <a name="l00483"></a>00483 <span class="preprocessor"> } \</span> <a name="l00484"></a>00484 <span class="preprocessor"> if (dest_x + width > dest->cr) { \</span> <a name="l00485"></a>00485 <span class="preprocessor"> width = dest->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 > dest->cb) { \</span> <a name="l00488"></a>00488 <span class="preprocessor"> height = dest->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->clip) { \</span> <a name="l00492"></a>00492 <span class="preprocessor"> if ((source_x >= source->cr) || (source_y >= source->cb) \</span> <a name="l00493"></a>00493 <span class="preprocessor"> || (source_x + width < source->cl) \</span> <a name="l00494"></a>00494 <span class="preprocessor"> || (source_y + height < source->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 < source->cl) { \</span> <a name="l00498"></a>00498 <span class="preprocessor"> width += source_x - source->cl; \</span> <a name="l00499"></a>00499 <span class="preprocessor"> dest_x -= source_x - source->cl; \</span> <a name="l00500"></a>00500 <span class="preprocessor"> source_x = source->cl; \</span> <a name="l00501"></a>00501 <span class="preprocessor"> } \</span> <a name="l00502"></a>00502 <span class="preprocessor"> if (source_y < source->ct) { \</span> <a name="l00503"></a>00503 <span class="preprocessor"> height += source_y - source->ct; \</span> <a name="l00504"></a>00504 <span class="preprocessor"> dest_y -= source_y - source->ct; \</span> <a name="l00505"></a>00505 <span class="preprocessor"> source_y = source->ct; \</span> <a name="l00506"></a>00506 <span class="preprocessor"> } \</span> <a name="l00507"></a>00507 <span class="preprocessor"> if (source_x + width > source->cr) { \</span> <a name="l00508"></a>00508 <span class="preprocessor"> width = source->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 > source->cb) { \</span> <a name="l00511"></a>00511 <span class="preprocessor"> height = source->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><a class="code" href="group__glvtable.html#g131ec6d465e280a411980f664e35c3f2">00519</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g131ec6d465e280a411980f664e35c3f2">allegro_gl_screen_blit_from_memory</a>( <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> <a class="code" href="gui_8c.html#2474a5474cbff19523a51eb1de01cda4">width</a>, <span class="keywordtype">int</span> <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a>) <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">"glvtable.c:allegro_gl_screen_blit_from_memory\n"</span>); <a name="l00528"></a>00528 <a name="l00529"></a>00529 <a class="code" href="group__glvtable.html#gad05bc3970b50f749ceaa43307349998">BITMAP_BLIT_CLIP</a>(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 <= 0 || height <= 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->x_ofs; <a name="l00539"></a>00539 dest_y += dest->y_ofs; <a name="l00540"></a>00540 } <a name="l00541"></a>00541 <a name="l00542"></a>00542 <span class="comment">/* Note: We don't need to offset the source bitmap coordinates</span> <a name="l00543"></a>00543 <span class="comment"> * because we use source->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->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'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#g7492f6f6acc608789210560ee63e5436" title="List of OpenGL extensions supported by AllegroGL.">allegro_gl_extensions_GL</a>.EXT_packed_pixels <a name="l00553"></a>00553 && bitmap_color_depth(source) < 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->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 <rohannessian> 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, &saved_zoom_x); <a name="l00572"></a>00572 glGetFloatv(GL_ZOOM_Y, &saved_zoom_y); <a name="l00573"></a>00573 glGetIntegerv(GL_UNPACK_ROW_LENGTH, &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 <rohannessian> 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->line[1] - source->line[0]) <a name="l00585"></a>00585 / BYTES_PER_PIXEL(source->vtable->color_depth)); <a name="l00586"></a>00586 <a name="l00587"></a>00587 glDrawPixels(width, height, <a class="code" href="texture_8c.html#e7375e040634b674f80f4bda0fcf83a4">__allegro_gl_get_bitmap_color_format</a>(source, 0), <a name="l00588"></a>00588 <a class="code" href="texture_8c.html#2cef4a2942e811ed2029ac496f298b9b">__allegro_gl_get_bitmap_type</a>(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><a class="code" href="group__glvtable.html#g61116278e2fbfc40e010df442fc7d0cb">00602</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g61116278e2fbfc40e010df442fc7d0cb">allegro_gl_screen_blit_to_memory</a>( <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> <a class="code" href="gui_8c.html#2474a5474cbff19523a51eb1de01cda4">width</a>, <span class="keywordtype">int</span> <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a>) <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">"glvtable.c:allegro_gl_screen_blit_to_memory\n"</span>); <a name="l00613"></a>00613 <a name="l00614"></a>00614 <a class="code" href="group__glvtable.html#gad05bc3970b50f749ceaa43307349998">BITMAP_BLIT_CLIP</a>(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->x_ofs; <a name="l00619"></a>00619 source_y += source->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->x_ofs; <a name="l00623"></a>00623 dest_y += dest->y_ofs; <a name="l00624"></a>00624 } <a name="l00625"></a>00625 <a name="l00626"></a>00626 <span class="keywordflow">if</span> (width <= 0 || height <= 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'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't supported, then we can'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#g7492f6f6acc608789210560ee63e5436" 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#g7492f6f6acc608789210560ee63e5436" title="List of OpenGL extensions supported by AllegroGL.">allegro_gl_extensions_GL</a>.EXT_packed_pixels <a name="l00641"></a>00641 && bitmap_color_depth(dest) < 24)) { <a name="l00642"></a>00642 <a name="l00643"></a>00643 <span class="comment">/* XXX <rohannessian> 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#g7492f6f6acc608789210560ee63e5436" title="List of OpenGL extensions supported by AllegroGL.">allegro_gl_extensions_GL</a>.EXT_packed_pixels <a name="l00647"></a>00647 && bitmap_color_depth(dest) < 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, &saved_row_length); <a name="l00658"></a>00658 glGetIntegerv(GL_PACK_ALIGNMENT, &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#g7492f6f6acc608789210560ee63e5436" 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->h - source_y - height, width, height, <a name="l00665"></a>00665 <a class="code" href="texture_8c.html#e7375e040634b674f80f4bda0fcf83a4">__allegro_gl_get_bitmap_color_format</a>(bmp, 0), <a name="l00666"></a>00666 <a class="code" href="texture_8c.html#2cef4a2942e811ed2029ac496f298b9b">__allegro_gl_get_bitmap_type</a>(bmp, 0), bmp->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, &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->line[1] - dest->line[0]) <a name="l00673"></a>00673 / BYTES_PER_PIXEL(dest->vtable->color_depth)); <a name="l00674"></a>00674 <a name="l00675"></a>00675 glReadPixels(source_x, source->h - source_y - height, width, height, <a name="l00676"></a>00676 <a class="code" href="texture_8c.html#e7375e040634b674f80f4bda0fcf83a4">__allegro_gl_get_bitmap_color_format</a>(dest, 0), <a name="l00677"></a>00677 <a class="code" href="texture_8c.html#2cef4a2942e811ed2029ac496f298b9b">__allegro_gl_get_bitmap_type</a>(dest, 0), dest->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'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 < 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><a class="code" href="group__glvtable.html#g0dc407670ad3a20ca8b69668cafb00a7">00703</a> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g0dc407670ad3a20ca8b69668cafb00a7">allegro_gl_screen_blit_to_self</a> ( <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> <a class="code" href="gui_8c.html#2474a5474cbff19523a51eb1de01cda4">width</a>, <span class="keywordtype">int</span> <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a>) <a name="l00706"></a>00706 { <a name="l00707"></a>00707 AGL_LOG(2, <span class="stringliteral">"glvtable.c:allegro_gl_screen_blit_to_self\n"</span>); <a name="l00708"></a>00708 <a name="l00709"></a>00709 <a class="code" href="group__glvtable.html#gad05bc3970b50f749ceaa43307349998">BITMAP_BLIT_CLIP</a>(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->x_ofs; <a name="l00714"></a>00714 source_y += source->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->x_ofs; <a name="l00718"></a>00718 dest_y += dest->y_ofs; <a name="l00719"></a>00719 } <a name="l00720"></a>00720 <a name="l00721"></a>00721 <span class="keywordflow">if</span> (width <= 0 || height <= 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 -> screen */</span> <a name="l00726"></a>00726 <span class="keywordflow">if</span> (is_screen_bitmap(source) && 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 -> screen */</span> <a name="l00732"></a>00732 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (is_screen_bitmap(dest) && is_video_bitmap(source)) { <a name="l00733"></a>00733 <a class="code" href="structAGL__VIDEO__BITMAP.html">AGL_VIDEO_BITMAP</a> *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->id & BMP_ID_SUB) { <a name="l00738"></a>00738 source_parent = (BITMAP *)source_parent->extra; <a name="l00739"></a>00739 } <a name="l00740"></a>00740 vid = source_parent->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 >= vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a> + vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->w || <a name="l00751"></a>00751 source_y >= vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a> + vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->h || <a name="l00752"></a>00752 vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a> >= source_x + width || <a name="l00753"></a>00753 vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a> >= source_y + height) { <a name="l00754"></a>00754 vid = vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#41d26d0320a93ab4489ca75120990040">next</a>; <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-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a>, source_x) - vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a>; <a name="l00759"></a>00759 w = MIN(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a> + vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->w, source_x + width) <a name="l00760"></a>00760 - vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a> - sx; <a name="l00761"></a>00761 sy = MAX(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a>, source_y) - vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a>; <a name="l00762"></a>00762 h = MIN(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a> + vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->h, source_y + height) <a name="l00763"></a>00763 - vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a> - sy; <a name="l00764"></a>00764 <a name="l00765"></a>00765 dx = dest_x + vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a> + sx - source_x; <a name="l00766"></a>00766 dy = dest_y + vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a> + sy - source_y; <a name="l00767"></a>00767 <a name="l00768"></a>00768 glEnable(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a>); <a name="l00769"></a>00769 glBindTexture(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a>, vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#4e48b83b354d43e6eedc039d986f2171">tex</a>); <a name="l00770"></a>00770 <a name="l00771"></a>00771 <span class="keywordflow">if</span> (vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a> == GL_TEXTURE_2D) { <a name="l00772"></a>00772 <span class="keywordtype">float</span> tx = sx / (float)vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->w; <a name="l00773"></a>00773 <span class="keywordtype">float</span> ty = sy / (<span class="keywordtype">float</span>)vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->h; <a name="l00774"></a>00774 <span class="keywordtype">float</span> tw = w / (float)vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->w; <a name="l00775"></a>00775 <span class="keywordtype">float</span> th = h / (<span class="keywordtype">float</span>)vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->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-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a>, 0); <a name="l00802"></a>00802 glDisable(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a>); <a name="l00803"></a>00803 <a name="l00804"></a>00804 vid = vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#41d26d0320a93ab4489ca75120990040">next</a>; <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 -> video */</span> <a name="l00810"></a>00810 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (is_screen_bitmap(source) && is_video_bitmap(dest)) { <a name="l00811"></a>00811 <a name="l00812"></a>00812 <a class="code" href="structAGL__VIDEO__BITMAP.html">AGL_VIDEO_BITMAP</a> *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->id & BMP_ID_SUB) { <a name="l00816"></a>00816 source_parent = (BITMAP *)source_parent->extra; <a name="l00817"></a>00817 } <a name="l00818"></a>00818 <a name="l00819"></a>00819 vid = dest->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 >= vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a> + vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->w || <a name="l00827"></a>00827 dest_y >= vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a> + vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->h || <a name="l00828"></a>00828 vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a> >= dest_x + width || <a name="l00829"></a>00829 vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a> >= dest_y + height) { <a name="l00830"></a>00830 vid = vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#41d26d0320a93ab4489ca75120990040">next</a>; <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-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a>, dest_x) - vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a>; <a name="l00835"></a>00835 w = MIN(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a> + vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->w, dest_x + width) <a name="l00836"></a>00836 - vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a> - dx; <a name="l00837"></a>00837 dy = MAX(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a>, dest_y) - vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a>; <a name="l00838"></a>00838 h = MIN(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a> + vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->h, dest_y + height) <a name="l00839"></a>00839 - vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a> - dy; <a name="l00840"></a>00840 <a name="l00841"></a>00841 sx = source_x + vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a> + dx - dest_x; <a name="l00842"></a>00842 sy = source_y + vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a> + 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 <a class="code" href="group__glvtable.html#g61116278e2fbfc40e010df442fc7d0cb">allegro_gl_screen_blit_to_memory</a>(source, vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>, <a name="l00846"></a>00846 sx, sy, dx, dy, w, h); <a name="l00847"></a>00847 <a name="l00848"></a>00848 <a class="code" href="videovtb_8c.html#205bfda898f1d0c1a78fa3b08634fabf">allegro_gl_video_blit_from_memory</a>(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>, dest, 0, 0, <a name="l00849"></a>00849 vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a>, vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a>, vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->w, vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->h); <a name="l00850"></a>00850 <a name="l00851"></a>00851 vid = vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#41d26d0320a93ab4489ca75120990040">next</a>; <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) && is_video_bitmap(dest)) { <a name="l00855"></a>00855 <a class="code" href="videovtb_8c.html#426c0b0fa5683b21ce2e4018db6a4de4">allegro_gl_video_blit_to_self</a>(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><a class="code" href="group__glvtable.html#g787fdbf593783a6b16297babbaa9034b">00862</a> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g787fdbf593783a6b16297babbaa9034b">allegro_gl_upload_and_display_texture</a>(<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> <a class="code" href="gui_8c.html#2474a5474cbff19523a51eb1de01cda4">width</a>, <span class="keywordtype">int</span> <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a>, <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, <a class="code" href="glvtable_8c.html#d72d761cd04f799d21da8d59cab2182f">__allegro_gl_pool_texture</a>); <a name="l00876"></a>00876 <a name="l00877"></a>00877 glGetIntegerv(GL_UNPACK_ROW_LENGTH, &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->line[1] - source->line[0]) / bytes_per_pixel); <a name="l00882"></a>00882 <a name="l00883"></a>00883 <span class="keywordflow">for</span> (i = 0; i <= abs(width) / 256; i++) { <a name="l00884"></a>00884 <span class="keywordflow">for</span> (j = 0; j <= abs(height) / 256; j++) { <a name="l00885"></a>00885 <a name="l00886"></a>00886 <span class="keywordtype">void</span> *data = source->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 & -256) ? 256 : w; <a name="l00894"></a>00894 h = (h & -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 & 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 & 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 < 0) w = -w; <a name="l00912"></a>00912 <span class="keywordflow">if</span> (height < 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><a class="code" href="group__glvtable.html#g2d861206138005d1b5839f20584038e5">00938</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g2d861206138005d1b5839f20584038e5">do_screen_masked_blit_standard</a>(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> <a class="code" href="gui_8c.html#2474a5474cbff19523a51eb1de01cda4">width</a>, <span class="keywordtype">int</span> <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a>, <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 & 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, &saved_row_length); <a name="l00951"></a>00951 glGetFloatv(GL_ZOOM_X, &old_zoom_x); <a name="l00952"></a>00952 glGetFloatv(GL_ZOOM_Y, &old_zoom_y); <a name="l00953"></a>00953 <a name="l00954"></a>00954 <span class="keywordflow">if</span> (flip_dir & 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 & 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->line[1] - temp->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->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 <a class="code" href="group__glvtable.html#g787fdbf593783a6b16297babbaa9034b">allegro_gl_upload_and_display_texture</a>(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> <a class="code" href="group__glvtable.html#g4ebcb4f89dbec9ce336bf9e22341b9bc">screen_masked_blit_standard</a>(<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> <a class="code" href="gui_8c.html#2474a5474cbff19523a51eb1de01cda4">width</a>, <span class="keywordtype">int</span> <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a>, <a name="l00996"></a>00996 <span class="keywordtype">int</span> flip_dir, <span class="keywordtype">int</span> blit_type) <a name="l00997"></a><a class="code" href="group__glvtable.html#g4ebcb4f89dbec9ce336bf9e22341b9bc">00997</a> { <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 = <a class="code" href="texture_8c.html#e7375e040634b674f80f4bda0fcf83a4">__allegro_gl_get_bitmap_color_format</a>(source, <a class="code" href="group__texture.html#gba184d573c65f33b35d1d57936607d08" title="Generate an alpha channel for this texture, based on the Allegro mask color.">AGL_TEXTURE_MASKED</a>); <a name="l01003"></a>01003 type = <a class="code" href="texture_8c.html#2cef4a2942e811ed2029ac496f298b9b">__allegro_gl_get_bitmap_type</a>(source, <a class="code" href="group__texture.html#gba184d573c65f33b35d1d57936607d08" 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 = <a class="code" href="texture_8c.html#1820c681297583935ca97ea9e1d032e6">__allegro_gl_munge_bitmap</a>(<a class="code" href="group__texture.html#gba184d573c65f33b35d1d57936607d08" 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 &type, &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 <a class="code" href="group__glvtable.html#g2d861206138005d1b5839f20584038e5">do_screen_masked_blit_standard</a>(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> <a class="code" href="group__glvtable.html#g9c785ee9d92d83013cb8a50cfa4d902c">__allegro_gl_init_nv_register_combiners</a>(BITMAP *bmp) <a name="l01026"></a>01026 { <a name="l01027"></a>01027 GLfloat mask_color[4]; <a name="l01028"></a><a class="code" href="group__glvtable.html#g9c785ee9d92d83013cb8a50cfa4d902c">01028</a> <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> <a class="code" href="group__glvtable.html#g55c7236cf9729bd83502a5fdea3f5656">screen_masked_blit_nv_register</a>(<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> <a class="code" href="gui_8c.html#2474a5474cbff19523a51eb1de01cda4">width</a>, <span class="keywordtype">int</span> <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a>, <a name="l01078"></a>01078 <span class="keywordtype">int</span> flip_dir, <span class="keywordtype">int</span> blit_type) <a name="l01079"></a><a class="code" href="group__glvtable.html#g55c7236cf9729bd83502a5fdea3f5656">01079</a> { <a name="l01080"></a>01080 BITMAP *temp = NULL; <a name="l01081"></a>01081 GLint type = <a class="code" href="texture_8c.html#2cef4a2942e811ed2029ac496f298b9b">__allegro_gl_get_bitmap_type</a>(source, 0); <a name="l01082"></a>01082 GLint format = <a class="code" href="texture_8c.html#e7375e040634b674f80f4bda0fcf83a4">__allegro_gl_get_bitmap_color_format</a>(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 = <a class="code" href="texture_8c.html#2cef4a2942e811ed2029ac496f298b9b">__allegro_gl_get_bitmap_type</a>(source, 0); <a name="l01095"></a>01095 format = <a class="code" href="texture_8c.html#e7375e040634b674f80f4bda0fcf83a4">__allegro_gl_get_bitmap_color_format</a>(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 <a class="code" href="group__glvtable.html#g9c785ee9d92d83013cb8a50cfa4d902c">__allegro_gl_init_nv_register_combiners</a>(source); <a name="l01100"></a>01100 <a name="l01101"></a>01101 <a class="code" href="group__glvtable.html#g787fdbf593783a6b16297babbaa9034b">allegro_gl_upload_and_display_texture</a>(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> <a class="code" href="group__glvtable.html#g2989c50c9769183992c303fe1689f2a4">__allegro_gl_init_combine_textures</a>(BITMAP *bmp) <a name="l01115"></a>01115 { <a name="l01116"></a>01116 GLubyte mask_color[4]; <a name="l01117"></a><a class="code" href="group__glvtable.html#g2989c50c9769183992c303fe1689f2a4">01117</a> <a name="l01118"></a>01118 <a class="code" href="group__glvtable.html#g5085e09cbdc329bfd6bd6b7fc65170c8">split_color</a>(bitmap_mask_color(bmp), &mask_color[0], &mask_color[1], <a name="l01119"></a>01119 &mask_color[2], &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 >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> <a class="code" href="group__glvtable.html#ga4da17f4b4f2fad9bd3e623f4da377ce">screen_masked_blit_combine_tex</a>(<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> <a class="code" href="gui_8c.html#2474a5474cbff19523a51eb1de01cda4">width</a>, <span class="keywordtype">int</span> <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a>, <a name="l01160"></a>01160 <span class="keywordtype">int</span> flip_dir, <span class="keywordtype">int</span> blit_type) <a name="l01161"></a><a class="code" href="group__glvtable.html#ga4da17f4b4f2fad9bd3e623f4da377ce">01161</a> { <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 = <a class="code" href="texture_8c.html#2cef4a2942e811ed2029ac496f298b9b">__allegro_gl_get_bitmap_type</a>(source, 0); <a name="l01166"></a>01166 GLint format = <a class="code" href="texture_8c.html#e7375e040634b674f80f4bda0fcf83a4">__allegro_gl_get_bitmap_color_format</a>(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 = <a class="code" href="texture_8c.html#2cef4a2942e811ed2029ac496f298b9b">__allegro_gl_get_bitmap_type</a>(source, 0); <a name="l01181"></a>01181 format = <a class="code" href="texture_8c.html#e7375e040634b674f80f4bda0fcf83a4">__allegro_gl_get_bitmap_color_format</a>(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, <a class="code" href="glvtable_8c.html#d72d761cd04f799d21da8d59cab2182f">__allegro_gl_pool_texture</a>); <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 <a class="code" href="group__glvtable.html#g2989c50c9769183992c303fe1689f2a4">__allegro_gl_init_combine_textures</a>(source); <a name="l01190"></a>01190 <a name="l01191"></a>01191 glActiveTexture(GL_TEXTURE0); <a name="l01192"></a>01192 glBindTexture(GL_TEXTURE_2D, <a class="code" href="glvtable_8c.html#d72d761cd04f799d21da8d59cab2182f">__allegro_gl_pool_texture</a>); <a name="l01193"></a>01193 glActiveTexture(GL_TEXTURE1); <a name="l01194"></a>01194 glBindTexture(GL_TEXTURE_2D, <a class="code" href="glvtable_8c.html#d72d761cd04f799d21da8d59cab2182f">__allegro_gl_pool_texture</a>); <a name="l01195"></a>01195 glActiveTexture(GL_TEXTURE2); <a name="l01196"></a>01196 glBindTexture(GL_TEXTURE_2D, <a class="code" href="glvtable_8c.html#d72d761cd04f799d21da8d59cab2182f">__allegro_gl_pool_texture</a>); <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, &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->line[1] - source->line[0]) / bytes_per_pixel); <a name="l01209"></a>01209 <a name="l01210"></a>01210 <span class="keywordflow">for</span> (i = 0; i <= width / 256; i++) { <a name="l01211"></a>01211 <span class="keywordflow">for</span> (j = 0; j <= height / 256; j++) { <a name="l01212"></a>01212 <a name="l01213"></a>01213 <span class="keywordtype">void</span> *data = source->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 & -256) ? 256 : w; <a name="l01221"></a>01221 h = (h & -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 & 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 & 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> <a class="code" href="group__glvtable.html#gff57a6bbb1e26a7a6a04220ab2e7ccb9">do_masked_blit_screen</a>(<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> <a class="code" href="gui_8c.html#2474a5474cbff19523a51eb1de01cda4">width</a>, <span class="keywordtype">int</span> <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a>, <a name="l01277"></a>01277 <span class="keywordtype">int</span> flip_dir, <span class="keywordtype">int</span> blit_type) <a name="l01278"></a><a class="code" href="group__glvtable.html#gff57a6bbb1e26a7a6a04220ab2e7ccb9">01278</a> { <a name="l01279"></a>01279 <a name="l01280"></a>01280 <span class="comment">/* XXX <rohannessian> 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->clip && (blit_type & AGL_NO_ROTATION)) { <a name="l01286"></a>01286 <span class="keywordflow">if</span> ((dest_x >= dest->cr) || (dest_y >= dest->cb) <a name="l01287"></a>01287 || (dest_x + width < dest->cl) || (dest_y + height < dest->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 & AGL_H_FLIP) { <a name="l01291"></a>01291 <span class="keywordflow">if</span> (dest_x < dest->cl) { <a name="l01292"></a>01292 width += dest_x - dest->cl; <a name="l01293"></a>01293 dest_x = dest->cl; <a name="l01294"></a>01294 } <a name="l01295"></a>01295 <span class="keywordflow">if</span> (dest_x + width > dest->cr) { <a name="l01296"></a>01296 source_x += dest_x + width - dest->cr; <a name="l01297"></a>01297 width = dest->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 < dest->cl) { <a name="l01302"></a>01302 width += dest_x - dest->cl; <a name="l01303"></a>01303 source_x -= dest_x - dest->cl; <a name="l01304"></a>01304 dest_x = dest->cl; <a name="l01305"></a>01305 } <a name="l01306"></a>01306 <span class="keywordflow">if</span> (dest_x + width > dest->cr) { <a name="l01307"></a>01307 width = dest->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 & AGL_V_FLIP) { <a name="l01311"></a>01311 <span class="keywordflow">if</span> (dest_y < dest->ct) { <a name="l01312"></a>01312 height += dest_y - dest->ct; <a name="l01313"></a>01313 dest_y = dest->ct; <a name="l01314"></a>01314 } <a name="l01315"></a>01315 <span class="keywordflow">if</span> (dest_y + height > dest->cb) { <a name="l01316"></a>01316 source_y += dest_y + height - dest->cb; <a name="l01317"></a>01317 height = dest->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 < dest->ct) { <a name="l01322"></a>01322 height += dest_y - dest->ct; <a name="l01323"></a>01323 source_y -= dest_y - dest->ct; <a name="l01324"></a>01324 dest_y = dest->ct; <a name="l01325"></a>01325 } <a name="l01326"></a>01326 <span class="keywordflow">if</span> (dest_y + height > dest->cb) { <a name="l01327"></a>01327 height = dest->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->clip && (blit_type & AGL_REGULAR_BMP)) { <a name="l01334"></a>01334 <span class="keywordflow">if</span> ((source_x >= source->cr) || (source_y >= source->cb) <a name="l01335"></a>01335 || (source_x + width < source->cl) <a name="l01336"></a>01336 || (source_y + height < source->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 < source->cl) { <a name="l01340"></a>01340 width += source_x - source->cl; <a name="l01341"></a>01341 dest_x -= source_x - source->cl; <a name="l01342"></a>01342 source_x = source->cl; <a name="l01343"></a>01343 } <a name="l01344"></a>01344 <span class="keywordflow">if</span> (source_y < source->ct) { <a name="l01345"></a>01345 height += source_y - source->ct; <a name="l01346"></a>01346 dest_y -= source_y - source->ct; <a name="l01347"></a>01347 source_y = source->ct; <a name="l01348"></a>01348 } <a name="l01349"></a>01349 <span class="keywordflow">if</span> (source_x + width > source->cr) { <a name="l01350"></a>01350 width = source->cr - source_x; <a name="l01351"></a>01351 } <a name="l01352"></a>01352 <span class="keywordflow">if</span> (source_y + height > source->cb) { <a name="l01353"></a>01353 height = source->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->x_ofs; <a name="l01358"></a>01358 dest_y += dest->y_ofs; <a name="l01359"></a>01359 } <a name="l01360"></a>01360 <span class="keywordflow">if</span> (width <= 0 || height <= 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 -> screen */</span> <a name="l01364"></a>01364 <span class="keywordflow">if</span> (!is_video_bitmap(source) && !is_screen_bitmap(source)) { <a name="l01365"></a>01365 <a name="l01366"></a>01366 <a class="code" href="alleggl_8c.html#5367a90beaa783cd9c718b9f04581569">__allegro_gl_driver</a>-><a class="code" href="structallegro__gl__driver.html#e9d8e331b2b065b1f6d5e1a3469de0fa">screen_masked_blit</a>(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 -> 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 <a class="code" href="structAGL__VIDEO__BITMAP.html">AGL_VIDEO_BITMAP</a> *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#g7492f6f6acc608789210560ee63e5436" title="List of OpenGL extensions supported by AllegroGL.">allegro_gl_extensions_GL</a>.NV_register_combiners <a name="l01378"></a>01378 || <a class="code" href="structallegro__gl__info.html">allegro_gl_info</a>.num_texture_units >= 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#g7492f6f6acc608789210560ee63e5436" title="List of OpenGL extensions supported by AllegroGL.">allegro_gl_extensions_GL</a>.NV_register_combiners) { <a name="l01385"></a>01385 <a class="code" href="group__glvtable.html#g9c785ee9d92d83013cb8a50cfa4d902c">__allegro_gl_init_nv_register_combiners</a>(source); <a name="l01386"></a>01386 } <a name="l01387"></a>01387 <span class="keywordflow">else</span> { <a name="l01388"></a>01388 <a class="code" href="group__glvtable.html#g2989c50c9769183992c303fe1689f2a4">__allegro_gl_init_combine_textures</a>(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->id & BMP_ID_SUB) { <a name="l01396"></a>01396 source_parent = (BITMAP *)source_parent->extra; <a name="l01397"></a>01397 } <a name="l01398"></a>01398 vid = source_parent->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 >= vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a> + vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->w || <a name="l01406"></a>01406 source_y >= vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a> + vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->h || <a name="l01407"></a>01407 vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a> >= source_x + width || <a name="l01408"></a>01408 vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a> >= source_y + height) { <a name="l01409"></a>01409 vid = vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#41d26d0320a93ab4489ca75120990040">next</a>; <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-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a>, source_x) - vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a>; <a name="l01414"></a>01414 w = MIN (vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a> + vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->w, source_x + width) <a name="l01415"></a>01415 - vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a> - sx; <a name="l01416"></a>01416 sy = MAX (vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a>, source_y) - vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a>; <a name="l01417"></a>01417 h = MIN (vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a> + vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->h, source_y + height) <a name="l01418"></a>01418 - vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a> - sy; <a name="l01419"></a>01419 <a name="l01420"></a>01420 dx = dest_x + vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#26c9ef8a1918481d7df5bb204a52b1c0">x_ofs</a> + sx - source_x; <a name="l01421"></a>01421 dy = dest_y + vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#53b1e118658250ed5ac7cbaa2e357d5c">y_ofs</a> + sy - source_y; <a name="l01422"></a>01422 <a name="l01423"></a>01423 <span class="keywordflow">if</span> (flip_dir & 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 & 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#g7492f6f6acc608789210560ee63e5436" title="List of OpenGL extensions supported by AllegroGL.">allegro_gl_extensions_GL</a>.NV_register_combiners) { <a name="l01435"></a>01435 glEnable(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a>); <a name="l01436"></a>01436 glBindTexture(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a>, vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#4e48b83b354d43e6eedc039d986f2171">tex</a>); <a name="l01437"></a>01437 glTexParameteri(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a>, GL_TEXTURE_MIN_FILTER, GL_NEAREST); <a name="l01438"></a>01438 glTexParameteri(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a>, GL_TEXTURE_MAG_FILTER, GL_NEAREST); <a name="l01439"></a>01439 <a name="l01440"></a>01440 <span class="keywordflow">if</span> (vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a> == GL_TEXTURE_2D) { <a name="l01441"></a>01441 <span class="keywordtype">float</span> tx = sx / (float)vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->w; <a name="l01442"></a>01442 <span class="keywordtype">float</span> ty = sy / (<span class="keywordtype">float</span>)vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->h; <a name="l01443"></a>01443 <span class="keywordtype">float</span> tw = abs(w) / (float)vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->w; <a name="l01444"></a>01444 <span class="keywordtype">float</span> th = abs(h) / (float)vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->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-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a>, 0); <a name="l01471"></a>01471 glDisable(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a>); <a name="l01472"></a>01472 } <a name="l01473"></a>01473 <span class="keywordflow">else</span> { <a name="l01474"></a>01474 glEnable(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a>); <a name="l01475"></a>01475 glActiveTexture(GL_TEXTURE0); <a name="l01476"></a>01476 glBindTexture(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a>, vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#4e48b83b354d43e6eedc039d986f2171">tex</a>); <a name="l01477"></a>01477 glActiveTexture(GL_TEXTURE1); <a name="l01478"></a>01478 glBindTexture(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a>, vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#4e48b83b354d43e6eedc039d986f2171">tex</a>); <a name="l01479"></a>01479 glActiveTexture(GL_TEXTURE2); <a name="l01480"></a>01480 glBindTexture(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a>, vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#4e48b83b354d43e6eedc039d986f2171">tex</a>); <a name="l01481"></a>01481 glActiveTexture(GL_TEXTURE0); <a name="l01482"></a>01482 glTexParameteri(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a>, GL_TEXTURE_MIN_FILTER, GL_NEAREST); <a name="l01483"></a>01483 glTexParameteri(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a>, GL_TEXTURE_MAG_FILTER, GL_NEAREST); <a name="l01484"></a>01484 <a name="l01485"></a>01485 <span class="keywordflow">if</span> (vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a> == 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-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->w; <a name="l01488"></a>01488 ty = sy / (<span class="keywordtype">float</span>)vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->h; <a name="l01489"></a>01489 tw = abs(w) / (float)vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->w; <a name="l01490"></a>01490 th = abs(h) / (float)vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>->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-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a>, 0); <a name="l01533"></a>01533 glDisable(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#3f5f0efa83c98e120d7a0653a41949d1">target</a>); <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 <a class="code" href="group__glvtable.html#g4ebcb4f89dbec9ce336bf9e22341b9bc">screen_masked_blit_standard</a>(vid-><a class="code" href="structAGL__VIDEO__BITMAP.html#47b0935ad4dc01630823b764641da407">memory_copy</a>, 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-><a class="code" href="structAGL__VIDEO__BITMAP.html#41d26d0320a93ab4489ca75120990040">next</a>; <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* <a class="code" href="group__glvtable.html#g4492f963fb22e239cf0007c4b262d8c3">__allegro_gl_convert_rle_sprite</a>(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><a class="code" href="group__glvtable.html#g4492f963fb22e239cf0007c4b262d8c3">01561</a> <span class="preprocessor"> for (y = 0; y < sprite->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 < sprite->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 > 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>=0; c--) { \ <a name="l01569"></a>01569 unsigned long col = *s++; \ <a name="l01570"></a>01570 if (bits == 32 && 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->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->w, sprite->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->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->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->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->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->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> <a class="code" href="group__glvtable.html#g16f50f04ce8310bb6a110bd4b32fc362">allegro_gl_screen_draw_rle_sprite</a>(<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> <a class="code" href="gui_8c.html#2474a5474cbff19523a51eb1de01cda4">width</a> = sprite->w, <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a> = sprite->h; <a name="l01639"></a>01639 <a name="l01640"></a>01640 temp = <a class="code" href="group__glvtable.html#g4492f963fb22e239cf0007c4b262d8c3">__allegro_gl_convert_rle_sprite</a>(sprite, FALSE); <a name="l01641"></a>01641 <span class="keywordflow">if</span> (!temp) <a name="l01642"></a><a class="code" href="group__glvtable.html#g16f50f04ce8310bb6a110bd4b32fc362">01642</a> <span class="keywordflow">return</span>; <a name="l01643"></a>01643 <a name="l01644"></a>01644 <a class="code" href="group__glvtable.html#gad05bc3970b50f749ceaa43307349998">BITMAP_BLIT_CLIP</a>(temp, bmp, source_x, source_y, x, y, width, <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a>); <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->x_ofs; <a name="l01648"></a>01648 y += bmp->y_ofs; <a name="l01649"></a>01649 } <a name="l01650"></a>01650 <a name="l01651"></a>01651 <span class="keywordflow">if</span> (width <= 0 || <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a> <= 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, <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a>); <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 <a class="code" href="group__glvtable.html#g2d861206138005d1b5839f20584038e5">do_screen_masked_blit_standard</a>(GL_RGBA, <a name="l01663"></a>01663 <a class="code" href="texture_8c.html#2cef4a2942e811ed2029ac496f298b9b">__allegro_gl_get_bitmap_type</a>(temp2, <a class="code" href="group__texture.html#gba184d573c65f33b35d1d57936607d08" 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, <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a>, 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> <a class="code" href="group__glvtable.html#g2c836f850dc542b782acd5e7ca82cbcf">allegro_gl_screen_draw_trans_rgba_rle_sprite</a>(<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->w, <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a> = sprite->h; <a name="l01676"></a>01676 <a name="l01677"></a>01677 temp = <a class="code" href="group__glvtable.html#g4492f963fb22e239cf0007c4b262d8c3">__allegro_gl_convert_rle_sprite</a>(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 <a class="code" href="group__glvtable.html#gad05bc3970b50f749ceaa43307349998">BITMAP_BLIT_CLIP</a>(temp, bmp, source_x, source_y, x, y, width, <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a>); <a name="l01682"></a><a class="code" href="group__glvtable.html#g2c836f850dc542b782acd5e7ca82cbcf">01682</a> <a name="l01683"></a>01683 <span class="keywordflow">if</span> (is_sub_bitmap(bmp)) { <a name="l01684"></a>01684 x += bmp->x_ofs; <a name="l01685"></a>01685 y += bmp->y_ofs; <a name="l01686"></a>01686 } <a name="l01687"></a>01687 <a name="l01688"></a>01688 <span class="keywordflow">if</span> (width <= 0 || <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a> <= 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, <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a>); <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> (<a class="code" href="alleggl_8c.html#480f9c7c69cd0af982451925cb6c25c8">__allegro_gl_blit_operation</a> == 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 <a class="code" href="group__glvtable.html#g787fdbf593783a6b16297babbaa9034b">allegro_gl_upload_and_display_texture</a>(temp2, 0, 0, x, y, width, <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a>, 0, GL_RGBA, GL_UNSIGNED_BYTE); <a name="l01705"></a>01705 <a name="l01706"></a>01706 <span class="keywordflow">if</span> (<a class="code" href="alleggl_8c.html#480f9c7c69cd0af982451925cb6c25c8">__allegro_gl_blit_operation</a> == 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> <a class="code" href="group__glvtable.html#ge67e14a596e418324f4df3708b8a073a">allegro_gl_screen_masked_blit</a>(<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> <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a>) <a name="l01720"></a>01720 { <a name="l01721"></a>01721 AGL_LOG(2, <span class="stringliteral">"glvtable.c:allegro_gl_screen_masked_blit\n"</span>); <a name="l01722"></a>01722 <a class="code" href="group__glvtable.html#gff57a6bbb1e26a7a6a04220ab2e7ccb9">do_masked_blit_screen</a>(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><a class="code" href="group__glvtable.html#ge67e14a596e418324f4df3708b8a073a">01728</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g69343ec4e2cffd05868b58f0068beda9">allegro_gl_screen_draw_sprite</a>(<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">"glvtable.c:allegro_gl_screen_draw_sprite\n"</span>); <a name="l01732"></a>01732 <a class="code" href="group__glvtable.html#gff57a6bbb1e26a7a6a04220ab2e7ccb9">do_masked_blit_screen</a>(sprite, bmp, 0, 0, x, y, sprite->w, sprite->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> <a class="code" href="group__glvtable.html#g97666d6e17222004544c2acf152d637d">allegro_gl_screen_draw_sprite_v_flip</a>(<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">"glvtable.c:allegro_gl_screen_draw_sprite_v_flip\n"</span>); <a name="l01742"></a>01742 <a class="code" href="group__glvtable.html#gff57a6bbb1e26a7a6a04220ab2e7ccb9">do_masked_blit_screen</a>(sprite, bmp, 0, 0, x, y, sprite->w, sprite->h, <a name="l01743"></a>01743 AGL_V_FLIP, AGL_NO_ROTATION); <a name="l01744"></a><a class="code" href="group__glvtable.html#g69343ec4e2cffd05868b58f0068beda9">01744</a> } <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> <a class="code" href="group__glvtable.html#g3293849696eac35e57b39e393532233f">allegro_gl_screen_draw_sprite_h_flip</a>(<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">"glvtable.c:allegro_gl_screen_draw_sprite_h_flip\n"</span>); <a name="l01752"></a>01752 <a class="code" href="group__glvtable.html#gff57a6bbb1e26a7a6a04220ab2e7ccb9">do_masked_blit_screen</a>(sprite, bmp, 0, 0, x, y, sprite->w, sprite->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><a class="code" href="group__glvtable.html#g97666d6e17222004544c2acf152d637d">01757</a> <a name="l01758"></a>01758 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#gcd4a30eff37e1d3a8f877ef49b1e926c">allegro_gl_screen_draw_sprite_vh_flip</a>(<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">"glvtable.c:allegro_gl_screen_draw_sprite_vh_flip\n"</span>); <a name="l01762"></a>01762 <a class="code" href="group__glvtable.html#gff57a6bbb1e26a7a6a04220ab2e7ccb9">do_masked_blit_screen</a>(sprite, bmp, 0, 0, x, y, sprite->w, sprite->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> <a class="code" href="group__glvtable.html#g683899f78545eab4648bddd396303279">allegro_gl_screen_pivot_scaled_sprite_flip</a>(<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><a class="code" href="group__glvtable.html#g3293849696eac35e57b39e393532233f">01770</a> 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">"glvtable.c:allegro_gl_screen_pivot_scaled_sprite_flip\n"</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, &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><a class="code" href="group__glvtable.html#gcd4a30eff37e1d3a8f877ef49b1e926c">01783</a> 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 <a class="code" href="group__glvtable.html#gff57a6bbb1e26a7a6a04220ab2e7ccb9">do_masked_blit_screen</a>(sprite, bmp, 0, 0, fixtoi(x), fixtoi(y), <a name="l01787"></a>01787 sprite->w, sprite->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><a class="code" href="group__glvtable.html#g683899f78545eab4648bddd396303279">01796</a> <a name="l01797"></a>01797 <a name="l01798"></a>01798 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g36e088851faed6b4001e67afbe1affd9">allegro_gl_screen_draw_trans_rgba_sprite</a>(<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> (<a class="code" href="alleggl_8c.html#480f9c7c69cd0af982451925cb6c25c8">__allegro_gl_blit_operation</a> == 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 -> screen */</span> <a name="l01807"></a>01807 <span class="keywordflow">if</span> (is_video_bitmap(sprite)) { <a name="l01808"></a>01808 <a class="code" href="group__glvtable.html#g0dc407670ad3a20ca8b69668cafb00a7">allegro_gl_screen_blit_to_self</a>(sprite, bmp, 0, 0, x, y, sprite->w, sprite->h); <a name="l01809"></a>01809 } <a name="l01810"></a>01810 <span class="comment">/* memory -> 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 = <a class="code" href="texture_8c.html#e7375e040634b674f80f4bda0fcf83a4">__allegro_gl_get_bitmap_color_format</a>(sprite, <a class="code" href="group__texture.html#g8cc859eadf1610b424cd9188e716f432" title="Tell AllegroGL that the bitmap had an alpha channel, so it should be preserved when...">AGL_TEXTURE_HAS_ALPHA</a>); <a name="l01813"></a>01813 GLint type = <a class="code" href="texture_8c.html#2cef4a2942e811ed2029ac496f298b9b">__allegro_gl_get_bitmap_type</a>(sprite, 0); <a name="l01814"></a>01814 <a class="code" href="group__glvtable.html#g787fdbf593783a6b16297babbaa9034b">allegro_gl_upload_and_display_texture</a>(sprite, 0, 0, x, y, sprite->w, sprite->h, 0, format, type); <a name="l01815"></a>01815 } <a name="l01816"></a>01816 <a name="l01817"></a>01817 <span class="keywordflow">if</span> (<a class="code" href="alleggl_8c.html#480f9c7c69cd0af982451925cb6c25c8">__allegro_gl_blit_operation</a> == 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><a class="code" href="group__glvtable.html#g36e088851faed6b4001e67afbe1affd9">01826</a> <a name="l01827"></a>01827 <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g14425004040eaf59dad3d5937e072851">allegro_gl_screen_draw_glyph_ex</a>(<span class="keyword">struct</span> BITMAP *bmp, <a name="l01828"></a>01828 AL_CONST <span class="keyword">struct</span> FONT_GLYPH *glyph, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y, <a name="l01829"></a>01829 <span class="keywordtype">int</span> color, <span class="keywordtype">int</span> bg, <span class="keywordtype">int</span> flip) <a name="l01830"></a>01830 { <a name="l01831"></a>01831 GLubyte r, g, b, a; <a name="l01832"></a>01832 <span class="keywordtype">int</span> x_offs = 0; <a name="l01833"></a>01833 <span class="keywordtype">int</span> i; <a name="l01834"></a>01834 <a name="l01835"></a>01835 AGL_LOG(2, <span class="stringliteral">"glvtable.c:allegro_gl_screen_draw_glyph_ex\n"</span>); <a name="l01836"></a>01836 <a name="l01837"></a>01837 <span class="keywordflow">if</span> (bmp->clip) { <a name="l01838"></a>01838 glPushAttrib(GL_SCISSOR_BIT); <a name="l01839"></a>01839 glEnable(GL_SCISSOR_TEST); <a name="l01840"></a>01840 glScissor(bmp->x_ofs + bmp->cl, bmp->h + bmp->y_ofs - bmp->cb, <a name="l01841"></a>01841 bmp->cr - bmp->cl, bmp->cb - bmp->ct); <a name="l01842"></a>01842 <a name="l01843"></a>01843 <span class="keywordflow">if</span> (x < bmp->cl) { <a name="l01844"></a>01844 x_offs -= x - bmp->cl; <a name="l01845"></a>01845 x = bmp->cl; <a name="l01846"></a>01846 } <a name="l01847"></a>01847 } <a name="l01848"></a>01848 <span class="keywordflow">if</span> (is_sub_bitmap(bmp)) { <a name="l01849"></a>01849 x += bmp->x_ofs; <a name="l01850"></a>01850 y += bmp->y_ofs; <a name="l01851"></a>01851 } <a name="l01852"></a>01852 <a name="l01853"></a>01853 <span class="keywordflow">if</span> (bg != -1) { <a name="l01854"></a>01854 <a class="code" href="group__glvtable.html#g5085e09cbdc329bfd6bd6b7fc65170c8">split_color</a>(bg, &r, &g, &b, &a, bitmap_color_depth(bmp)); <a name="l01855"></a><a class="code" href="group__glvtable.html#g14425004040eaf59dad3d5937e072851">01855</a> glColor4ub(r, g, b, a); <a name="l01856"></a>01856 glRecti(x, y, x + glyph->w, y + glyph->h); <a name="l01857"></a>01857 } <a name="l01858"></a>01858 <a name="l01859"></a>01859 <a class="code" href="group__glvtable.html#g5085e09cbdc329bfd6bd6b7fc65170c8">split_color</a>(color, &r, &g, &b, &a, bitmap_color_depth(bmp)); <a name="l01860"></a>01860 glColor4ub(r, g, b, a); <a name="l01861"></a>01861 glRasterPos2i(x, y); <a name="l01862"></a>01862 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); <a name="l01863"></a>01863 glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); <a name="l01864"></a>01864 <a name="l01865"></a>01865 <span class="keywordflow">if</span> (flip) { <a name="l01866"></a>01866 <span class="keywordflow">for</span> (i = 0; i < glyph->h; i++) { <a name="l01867"></a>01867 glBitmap(glyph->w, 1, x_offs, i, 0, 2, <a name="l01868"></a>01868 glyph->dat + i * ((glyph->w + 7) / 8)); <a name="l01869"></a>01869 } <a name="l01870"></a>01870 } <a name="l01871"></a>01871 <span class="keywordflow">else</span> { <a name="l01872"></a>01872 <span class="keywordflow">for</span> (i = 0; i < glyph->h; i++) { <a name="l01873"></a>01873 glBitmap(glyph->w, 1, x_offs, i, 0, 0, <a name="l01874"></a>01874 glyph->dat + i * ((glyph->w + 7) / 8)); <a name="l01875"></a>01875 } <a name="l01876"></a>01876 } <a name="l01877"></a>01877 <a name="l01878"></a>01878 <span class="keywordflow">if</span> (bmp->clip) { <a name="l01879"></a>01879 glPopAttrib(); <a name="l01880"></a>01880 } <a name="l01881"></a>01881 <a name="l01882"></a>01882 <span class="keywordflow">return</span>; <a name="l01883"></a>01883 } <a name="l01884"></a>01884 <a name="l01885"></a>01885 <a name="l01886"></a>01886 <a name="l01887"></a>01887 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g658f4ac879e4b20cca3b60dce4d86846">allegro_gl_screen_draw_glyph</a>(<span class="keyword">struct</span> BITMAP *bmp, <a name="l01888"></a>01888 AL_CONST <span class="keyword">struct</span> FONT_GLYPH *glyph, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y, <a name="l01889"></a>01889 <span class="keywordtype">int</span> color, <span class="keywordtype">int</span> bg) { <a name="l01890"></a>01890 <a class="code" href="group__glvtable.html#g14425004040eaf59dad3d5937e072851">allegro_gl_screen_draw_glyph_ex</a>(bmp, glyph, x, y, color, bg, 0); <a name="l01891"></a>01891 } <a name="l01892"></a>01892 <a name="l01893"></a>01893 <a name="l01894"></a>01894 <a name="l01895"></a>01895 <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g9f229b5924ad20f83f25a81622800a8e">allegro_gl_screen_draw_color_glyph_ex</a>(<span class="keyword">struct</span> BITMAP *bmp, <a name="l01896"></a>01896 <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="l01897"></a>01897 { <a name="l01898"></a>01898 <a name="l01899"></a>01899 <span class="comment">/* Implementation note: we should try building textures and see how well</span> <a name="l01900"></a>01900 <span class="comment"> * those work instead of of DrawPixels with a weird I_TO_RGBA mapping.</span> <a name="l01901"></a>01901 <span class="comment"> */</span> <a name="l01902"></a>01902 <span class="keyword">static</span> GLfloat red_map[256]; <a name="l01903"></a>01903 <span class="keyword">static</span> GLfloat green_map[256]; <a name="l01904"></a>01904 <span class="keyword">static</span> GLfloat blue_map[256]; <a name="l01905"></a>01905 <span class="keyword">static</span> GLfloat alpha_map[256]; <a name="l01906"></a>01906 GLubyte r, g, b, a; <a name="l01907"></a>01907 <span class="keywordtype">int</span> i; <a name="l01908"></a>01908 GLint saved_row_length; <a name="l01909"></a>01909 GLint width, <a class="code" href="gui_8c.html#d12fc34ce789bce6c8a05d8a17138534">height</a>; <a name="l01910"></a>01910 <span class="keywordtype">int</span> sprite_x = 0, sprite_y = 0; <a name="l01911"></a>01911 <span class="keywordtype">void</span> *data; <a name="l01912"></a>01912 <span class="keywordtype">int</span> *table; <a name="l01913"></a>01913 <a name="l01914"></a>01914 width = sprite->w; <a name="l01915"></a><a class="code" href="group__glvtable.html#g658f4ac879e4b20cca3b60dce4d86846">01915</a> height = sprite->h; <a name="l01916"></a>01916 <a name="l01917"></a>01917 <span class="keywordflow">if</span> (bmp->clip) { <a name="l01918"></a>01918 <span class="keywordflow">if</span> ((x >= bmp->cr) || (y >= bmp->cb) || (x + width < bmp->cl) <a name="l01919"></a>01919 || (y + height < bmp->ct)) { <a name="l01920"></a>01920 <span class="keywordflow">return</span>; <a name="l01921"></a>01921 } <a name="l01922"></a>01922 <span class="keywordflow">if</span> (x < bmp->cl) { <a name="l01923"></a><a class="code" href="group__glvtable.html#g9f229b5924ad20f83f25a81622800a8e">01923</a> width += x - bmp->cl; <a name="l01924"></a>01924 sprite_x -= (x - bmp->cl); <a name="l01925"></a>01925 x = bmp->cl; <a name="l01926"></a>01926 } <a name="l01927"></a>01927 <span class="keywordflow">if</span> (y < bmp->ct) { <a name="l01928"></a>01928 height += y - bmp->ct; <a name="l01929"></a>01929 sprite_y -= (y - bmp->ct); <a name="l01930"></a>01930 y = bmp->ct; <a name="l01931"></a>01931 } <a name="l01932"></a>01932 <span class="keywordflow">if</span> (x + width > bmp->cr) { <a name="l01933"></a>01933 width = bmp->cr - x; <a name="l01934"></a>01934 } <a name="l01935"></a>01935 <span class="keywordflow">if</span> (y + height > bmp->cb) { <a name="l01936"></a>01936 height = bmp->cb - y; <a name="l01937"></a>01937 } <a name="l01938"></a>01938 } <a name="l01939"></a>01939 <span class="keywordflow">if</span> (is_sub_bitmap(bmp)) { <a name="l01940"></a>01940 x += bmp->x_ofs; <a name="l01941"></a>01941 y += bmp->y_ofs; <a name="l01942"></a>01942 } <a name="l01943"></a>01943 <a name="l01944"></a>01944 data = sprite->line[sprite_y] <a name="l01945"></a>01945 + sprite_x * BYTES_PER_PIXEL(bitmap_color_depth(sprite)); <a name="l01946"></a>01946 <a name="l01947"></a>01947 <span class="keywordflow">if</span> (bg < 0) { <a name="l01948"></a>01948 glAlphaFunc(GL_GREATER, 0.0f); <a name="l01949"></a>01949 glEnable(GL_ALPHA_TEST); <a name="l01950"></a>01950 alpha_map[0] = 0.; <a name="l01951"></a>01951 } <a name="l01952"></a>01952 <span class="keywordflow">else</span> { <a name="l01953"></a>01953 <a class="code" href="group__glvtable.html#g5085e09cbdc329bfd6bd6b7fc65170c8">split_color</a>(bg, &r, &g, &b, &a, bitmap_color_depth(bmp)); <a name="l01954"></a>01954 red_map[0] = r / 255.; <a name="l01955"></a>01955 green_map[0] = g / 255.; <a name="l01956"></a>01956 blue_map[0] = b / 255.; <a name="l01957"></a>01957 alpha_map[0] = 1.; <a name="l01958"></a>01958 } <a name="l01959"></a>01959 <a name="l01960"></a>01960 <span class="keywordflow">if</span> (color < 0) { <a name="l01961"></a>01961 table = _palette_expansion_table(bitmap_color_depth(bmp)); <a name="l01962"></a>01962 <a name="l01963"></a>01963 <span class="keywordflow">for</span>(i = 1; i < 255; i++) { <a name="l01964"></a>01964 <a class="code" href="group__glvtable.html#g5085e09cbdc329bfd6bd6b7fc65170c8">split_color</a>(table[i], &r, &g, &b, &a, bitmap_color_depth(bmp)); <a name="l01965"></a>01965 red_map[i] = r / 255.; <a name="l01966"></a>01966 green_map[i] = g / 255.; <a name="l01967"></a>01967 blue_map[i] = b / 255.; <a name="l01968"></a>01968 alpha_map[i] = 1.; <a name="l01969"></a>01969 } <a name="l01970"></a>01970 } <a name="l01971"></a>01971 <span class="keywordflow">else</span> { <a name="l01972"></a>01972 <a class="code" href="group__glvtable.html#g5085e09cbdc329bfd6bd6b7fc65170c8">split_color</a>(color, &r, &g, &b, &a, bitmap_color_depth(bmp)); <a name="l01973"></a>01973 <a name="l01974"></a>01974 <span class="keywordflow">for</span>(i = 1; i < 255; i++) { <a name="l01975"></a>01975 red_map[i] = r / 255.; <a name="l01976"></a>01976 green_map[i] = g / 255.; <a name="l01977"></a>01977 blue_map[i] = b / 255.; <a name="l01978"></a>01978 alpha_map[i] = 1.; <a name="l01979"></a>01979 } <a name="l01980"></a>01980 } <a name="l01981"></a>01981 <a name="l01982"></a>01982 glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 256, red_map); <a name="l01983"></a>01983 glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 256, green_map); <a name="l01984"></a>01984 glPixelMapfv(GL_PIXEL_MAP_I_TO_B, 256, blue_map); <a name="l01985"></a>01985 glPixelMapfv(GL_PIXEL_MAP_I_TO_A, 256, alpha_map); <a name="l01986"></a>01986 <a name="l01987"></a>01987 glRasterPos2i(x, y); <a name="l01988"></a>01988 glPushAttrib(GL_PIXEL_MODE_BIT); <a name="l01989"></a>01989 glGetIntegerv(GL_UNPACK_ROW_LENGTH, &saved_row_length); <a name="l01990"></a>01990 <a name="l01991"></a>01991 glPixelZoom(1.0, flip ? -1.0 : 1.0); <a name="l01992"></a>01992 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); <a name="l01993"></a>01993 glPixelStorei(GL_UNPACK_ROW_LENGTH, sprite->w); <a name="l01994"></a>01994 glPixelTransferi(GL_MAP_COLOR, GL_TRUE); <a name="l01995"></a>01995 <a name="l01996"></a>01996 glDrawPixels(width, height, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, data); <a name="l01997"></a>01997 glPixelStorei(GL_UNPACK_ROW_LENGTH, saved_row_length); <a name="l01998"></a>01998 glPopAttrib(); <a name="l01999"></a>01999 <span class="keywordflow">if</span> (bg < 0) { <a name="l02000"></a>02000 glDisable(GL_ALPHA_TEST); <a name="l02001"></a>02001 } <a name="l02002"></a>02002 <a name="l02003"></a>02003 <span class="keywordflow">return</span>; <a name="l02004"></a>02004 } <a name="l02005"></a>02005 <a name="l02006"></a>02006 <a name="l02007"></a>02007 <a name="l02008"></a>02008 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#gd2358dccf113c1fe7f8e765e67de1d89">allegro_gl_screen_draw_color_glyph</a>(<span class="keyword">struct</span> BITMAP *bmp, <a name="l02009"></a>02009 <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="l02010"></a>02010 <a class="code" href="group__glvtable.html#g9f229b5924ad20f83f25a81622800a8e">allegro_gl_screen_draw_color_glyph_ex</a>(bmp, sprite, x, y, color, bg, 1); <a name="l02011"></a>02011 } <a name="l02012"></a>02012 <a name="l02013"></a>02013 <a name="l02014"></a>02014 <a name="l02015"></a>02015 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g9685dcaec7aa65db8e790fa8177a86b0">allegro_gl_screen_draw_character</a>(<span class="keyword">struct</span> BITMAP *bmp, <a name="l02016"></a>02016 <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="l02017"></a>02017 { <a name="l02018"></a>02018 AGL_LOG(2, <span class="stringliteral">"glvtable.c:allegro_gl_screen_draw_character\n"</span>); <a name="l02019"></a>02019 <a class="code" href="group__glvtable.html#gd2358dccf113c1fe7f8e765e67de1d89">allegro_gl_screen_draw_color_glyph</a>(bmp, sprite, x, y, color, bg); <a name="l02020"></a>02020 } <a name="l02021"></a>02021 <a name="l02022"></a>02022 <a name="l02023"></a>02023 <a name="l02024"></a>02024 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g117ffbc09394307a4c78d9b48ed5b8fc">allegro_gl_screen_draw_256_sprite</a>(<span class="keyword">struct</span> BITMAP *bmp, <a name="l02025"></a>02025 <span class="keyword">struct</span> BITMAP *sprite, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y) <a name="l02026"></a>02026 { <a name="l02027"></a>02027 AGL_LOG(2, <span class="stringliteral">"glvtable.c:allegro_gl_screen_draw_256_sprite\n"</span>); <a name="l02028"></a>02028 <a class="code" href="group__glvtable.html#gd2358dccf113c1fe7f8e765e67de1d89">allegro_gl_screen_draw_color_glyph</a>(bmp, sprite, x, y, -1, -1); <a name="l02029"></a>02029 } <a name="l02030"></a>02030 <a name="l02031"></a>02031 <a name="l02032"></a>02032 <a name="l02033"></a>02033 <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g333283185678bab117599411cb4f39f3">allegro_gl_screen_clear_to_color</a>(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> color) <a name="l02034"></a>02034 { <a name="l02035"></a>02035 <span class="keywordflow">if</span> (<a class="code" href="glvtable_8c.html#1c5e4f15e561fc1f335a76d32135c122">__agl_drawing_pattern_tex</a> || bmp->clip) { <a name="l02036"></a><a class="code" href="group__glvtable.html#gd2358dccf113c1fe7f8e765e67de1d89">02036</a> <a class="code" href="group__glvtable.html#g694a43ed2653fc57c21e50f2266737e8">allegro_gl_screen_rectfill</a>(bmp, 0, 0, bmp->w, bmp->h, color); <a name="l02037"></a>02037 } <a name="l02038"></a>02038 <span class="keywordflow">else</span> { <a name="l02039"></a>02039 GLubyte r, g, b, a; <a name="l02040"></a>02040 GLfloat old_col[4]; <a name="l02041"></a>02041 <a name="l02042"></a>02042 <a class="code" href="group__glvtable.html#g5085e09cbdc329bfd6bd6b7fc65170c8">split_color</a>(color, &r, &g, &b, &a, bitmap_color_depth(bmp)); <a name="l02043"></a><a class="code" href="group__glvtable.html#g9685dcaec7aa65db8e790fa8177a86b0">02043</a> <a name="l02044"></a>02044 glGetFloatv(GL_COLOR_CLEAR_VALUE, old_col); <a name="l02045"></a>02045 glClearColor(((<span class="keywordtype">float</span>) r / 255), ((<span class="keywordtype">float</span>) g / 255), ((<span class="keywordtype">float</span>) b / 255), <a name="l02046"></a>02046 ((<span class="keywordtype">float</span>) a / 255)); <a name="l02047"></a>02047 <a name="l02048"></a>02048 glClear(GL_COLOR_BUFFER_BIT); <a name="l02049"></a>02049 glClearColor(old_col[0], old_col[1], old_col[2], old_col[3]); <a name="l02050"></a>02050 } <a name="l02051"></a>02051 <a name="l02052"></a><a class="code" href="group__glvtable.html#g117ffbc09394307a4c78d9b48ed5b8fc">02052</a> <span class="keywordflow">return</span>; <a name="l02053"></a>02053 } <a name="l02054"></a>02054 <a name="l02055"></a>02055 <a name="l02056"></a>02056 <a name="l02057"></a>02057 <span class="comment">/* TODO: Handle concave and self-intersecting. */</span> <a name="l02058"></a>02058 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g1a0882cc74dbed492216654cca342a5b">allegro_gl_screen_polygon</a>(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> vertices, <a name="l02059"></a>02059 AL_CONST <span class="keywordtype">int</span> *points, <span class="keywordtype">int</span> color) { <a name="l02060"></a>02060 GLubyte r, g, b, a; <a name="l02061"></a><a class="code" href="group__glvtable.html#g333283185678bab117599411cb4f39f3">02061</a> <span class="keywordtype">int</span> i; <a name="l02062"></a>02062 <a name="l02063"></a>02063 <a class="code" href="group__glvtable.html#g5085e09cbdc329bfd6bd6b7fc65170c8">split_color</a>(color, &r, &g, &b, &a, bitmap_color_depth(bmp)); <a name="l02064"></a>02064 glColor4ub(r, g, b, a); <a name="l02065"></a>02065 <a name="l02066"></a>02066 glPushAttrib(GL_SCISSOR_BIT); <a name="l02067"></a>02067 <a name="l02068"></a>02068 <span class="keywordflow">if</span> (bmp->clip) { <a name="l02069"></a>02069 glEnable(GL_SCISSOR_TEST); <a name="l02070"></a>02070 glScissor(bmp->x_ofs + bmp->cl, bmp->h + bmp->y_ofs - bmp->cb, <a name="l02071"></a>02071 bmp->cr - bmp->cl, bmp->cb - bmp->ct); <a name="l02072"></a>02072 } <a name="l02073"></a>02073 <span class="keywordflow">else</span> { <a name="l02074"></a>02074 glScissor(0, 0, bmp->w, bmp->h); <a name="l02075"></a>02075 } <a name="l02076"></a>02076 <a name="l02077"></a>02077 glBegin(GL_POLYGON); <a name="l02078"></a>02078 <span class="keywordflow">for</span> (i = 0; i < vertices*2-1; i+=2) { <a name="l02079"></a>02079 <a class="code" href="group__glvtable.html#g397c41b7c07794b6edce960693361a83">SET_TEX_COORDS</a>(points[i], points[i+1]); <a name="l02080"></a>02080 <span class="keywordflow">if</span> (is_sub_bitmap(bmp)) { <a name="l02081"></a>02081 glVertex2f(points[i] + bmp->x_ofs, points[i+1] + bmp->y_ofs); <a name="l02082"></a>02082 } <a name="l02083"></a>02083 <span class="keywordflow">else</span> { <a name="l02084"></a>02084 glVertex2f(points[i], points[i+1]); <a name="l02085"></a>02085 } <a name="l02086"></a><a class="code" href="group__glvtable.html#g1a0882cc74dbed492216654cca342a5b">02086</a> } <a name="l02087"></a>02087 glEnd(); <a name="l02088"></a>02088 <a name="l02089"></a>02089 glPopAttrib(); <a name="l02090"></a>02090 } <a name="l02091"></a>02091 <a name="l02092"></a>02092 <a name="l02093"></a>02093 <a name="l02094"></a>02094 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g13a50c4adf518c0e67dd6035ab9b82a4">allegro_gl_screen_rect</a>(<span class="keyword">struct</span> BITMAP *bmp, <a name="l02095"></a>02095 <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="l02096"></a>02096 GLubyte r, g, b, a; <a name="l02097"></a>02097 <a name="l02098"></a>02098 <a class="code" href="group__glvtable.html#g5085e09cbdc329bfd6bd6b7fc65170c8">split_color</a>(color, &r, &g, &b, &a, bitmap_color_depth(bmp)); <a name="l02099"></a>02099 glColor4ub(r, g, b, a); <a name="l02100"></a>02100 <a name="l02101"></a>02101 glPushAttrib(GL_SCISSOR_BIT); <a name="l02102"></a>02102 <a name="l02103"></a>02103 <span class="keywordflow">if</span> (bmp->clip) { <a name="l02104"></a>02104 glEnable(GL_SCISSOR_TEST); <a name="l02105"></a>02105 glScissor(bmp->x_ofs + bmp->cl, bmp->h + bmp->y_ofs - bmp->cb, <a name="l02106"></a>02106 bmp->cr - bmp->cl, bmp->cb - bmp->ct); <a name="l02107"></a>02107 } <a name="l02108"></a>02108 <span class="keywordflow">else</span> { <a name="l02109"></a>02109 glScissor(0, 0, bmp->w, bmp->h); <a name="l02110"></a>02110 } <a name="l02111"></a>02111 <span class="keywordflow">if</span> (is_sub_bitmap(bmp)) { <a name="l02112"></a>02112 x1 += bmp->x_ofs; <a name="l02113"></a>02113 x2 += bmp->x_ofs; <a name="l02114"></a>02114 y1 += bmp->y_ofs; <a name="l02115"></a>02115 y2 += bmp->y_ofs; <a name="l02116"></a>02116 } <a name="l02117"></a>02117 <a name="l02118"></a>02118 glBegin(GL_LINE_STRIP); <a name="l02119"></a>02119 glVertex2f(x1, y1); <a name="l02120"></a>02120 glVertex2f(x2, y1); <a name="l02121"></a>02121 glVertex2f(x2, y2); <a name="l02122"></a><a class="code" href="group__glvtable.html#g13a50c4adf518c0e67dd6035ab9b82a4">02122</a> glVertex2f(x1, y2); <a name="l02123"></a>02123 glVertex2f(x1, y1); <a name="l02124"></a>02124 glEnd(); <a name="l02125"></a>02125 <a name="l02126"></a>02126 glPopAttrib(); <a name="l02127"></a>02127 } <a name="l02128"></a>02128 <a name="l02129"></a>02129 <a name="l02130"></a>02130 <a name="l02131"></a>02131 <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g96c4dc94111a6da2ffe8b302e08e076a">allegro_gl_screen_polygon3d_f</a>(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> type, <a name="l02132"></a>02132 <span class="keyword">struct</span> BITMAP *<a class="code" href="gui_8c.html#0704dfe56dec926cb35f7bdc0834ecd0">texture</a>, <span class="keywordtype">int</span> vc, <a name="l02133"></a>02133 V3D_f *vtx[]) { <a name="l02134"></a>02134 <span class="keywordtype">int</span> i; <a name="l02135"></a>02135 <span class="keywordtype">int</span> use_z = FALSE; <a name="l02136"></a>02136 <a name="l02137"></a>02137 <span class="keywordflow">if</span> (type & POLYTYPE_ZBUF) { <a name="l02138"></a>02138 use_z = TRUE; <a name="l02139"></a>02139 type &= ~POLYTYPE_ZBUF; <a name="l02140"></a>02140 } <a name="l02141"></a>02141 <a name="l02142"></a>02142 <span class="keywordflow">if</span> (type == POLYTYPE_PTEX || type == POLYTYPE_PTEX_TRANS) <a name="l02143"></a>02143 use_z = TRUE; <a name="l02144"></a>02144 <a name="l02145"></a>02145 <span class="keywordflow">if</span> (bmp->clip) { <a name="l02146"></a>02146 glPushAttrib(GL_SCISSOR_BIT); <a name="l02147"></a>02147 glEnable(GL_SCISSOR_TEST); <a name="l02148"></a>02148 glScissor(bmp->x_ofs + bmp->cl, bmp->h + bmp->y_ofs - bmp->cb, <a name="l02149"></a>02149 bmp->cr - bmp->cl, bmp->cb - bmp->ct); <a name="l02150"></a>02150 } <a name="l02151"></a>02151 <span class="keywordflow">if</span> (is_sub_bitmap(bmp)) { <a name="l02152"></a>02152 <span class="keywordflow">for</span> (i = 0; i < vc*2-1; i+=2) { <a name="l02153"></a>02153 vtx[i] += bmp->x_ofs; <a name="l02154"></a>02154 vtx[i+1] += bmp->y_ofs; <a name="l02155"></a>02155 } <a name="l02156"></a>02156 } <a name="l02157"></a>02157 <a name="l02158"></a>02158 <span class="keywordflow">if</span> (use_z) { <a name="l02159"></a><a class="code" href="group__glvtable.html#g96c4dc94111a6da2ffe8b302e08e076a">02159</a> glEnable(GL_DEPTH_TEST); <a name="l02160"></a>02160 glDepthFunc(GL_LESS); <a name="l02161"></a>02161 glDepthMask(GL_TRUE); <a name="l02162"></a>02162 } <a name="l02163"></a>02163 <a name="l02164"></a>02164 glColor4ub(255, 255, 255, 255); <a name="l02165"></a>02165 <a name="l02166"></a>02166 <span class="keywordflow">if</span> (type == POLYTYPE_ATEX || type == POLYTYPE_PTEX <a name="l02167"></a>02167 || type == POLYTYPE_ATEX_TRANS || type == POLYTYPE_PTEX_TRANS) { <a name="l02168"></a>02168 drawing_mode(DRAW_MODE_COPY_PATTERN, texture, 0, 0); <a name="l02169"></a>02169 } <a name="l02170"></a>02170 <a name="l02171"></a>02171 <span class="keywordflow">if</span> (type == POLYTYPE_ATEX_TRANS || type == POLYTYPE_PTEX_TRANS) { <a name="l02172"></a>02172 glEnable(GL_BLEND); <a name="l02173"></a>02173 } <a name="l02174"></a>02174 <a name="l02175"></a>02175 glBegin(GL_POLYGON); <a name="l02176"></a>02176 <span class="keywordflow">for</span> (i = 0; i < vc; i++) { <a name="l02177"></a>02177 <span class="keywordflow">if</span> (type == POLYTYPE_FLAT) <a name="l02178"></a>02178 glColor3ub(getr(vtx[0]->c), getg(vtx[0]->c), getb(vtx[0]->c)); <a name="l02179"></a>02179 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (type == POLYTYPE_GRGB) <a name="l02180"></a>02180 glColor3ub(getr24(vtx[i]->c), getg24(vtx[i]->c), getb24(vtx[i]->c)); <a name="l02181"></a>02181 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (type == POLYTYPE_GCOL) <a name="l02182"></a>02182 glColor3ub(getr(vtx[i]->c), getg(vtx[i]->c), getb(vtx[i]->c)); <a name="l02183"></a>02183 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (type == POLYTYPE_ATEX || type == POLYTYPE_PTEX <a name="l02184"></a>02184 || type == POLYTYPE_ATEX_TRANS || type == POLYTYPE_PTEX_TRANS) { <a name="l02185"></a>02185 <a class="code" href="group__glvtable.html#g397c41b7c07794b6edce960693361a83">SET_TEX_COORDS</a>(vtx[i]->u, vtx[i]->v); <a name="l02186"></a>02186 } <a name="l02187"></a>02187 <a name="l02188"></a>02188 <span class="keywordflow">if</span> (use_z) <a name="l02189"></a>02189 glVertex3f(vtx[i]->x, vtx[i]->y, 1.f / vtx[i]->z); <a name="l02190"></a>02190 <span class="keywordflow">else</span> <a name="l02191"></a>02191 glVertex2f(vtx[i]->x, vtx[i]->y); <a name="l02192"></a>02192 } <a name="l02193"></a>02193 glEnd(); <a name="l02194"></a>02194 <a name="l02195"></a>02195 <span class="keywordflow">if</span> (bmp->clip) <a name="l02196"></a>02196 glPopAttrib(); <a name="l02197"></a>02197 <a name="l02198"></a>02198 <span class="keywordflow">if</span> (use_z) { <a name="l02199"></a>02199 glDisable(GL_DEPTH_TEST); <a name="l02200"></a>02200 glDepthMask(GL_FALSE); <a name="l02201"></a>02201 } <a name="l02202"></a>02202 <a name="l02203"></a>02203 <span class="keywordflow">if</span> (type == POLYTYPE_ATEX || type == POLYTYPE_PTEX <a name="l02204"></a>02204 || type == POLYTYPE_ATEX_TRANS || type == POLYTYPE_PTEX_TRANS) { <a name="l02205"></a>02205 solid_mode(); <a name="l02206"></a>02206 } <a name="l02207"></a>02207 <a name="l02208"></a>02208 <span class="keywordflow">if</span> (type == POLYTYPE_ATEX_TRANS || type == POLYTYPE_PTEX_TRANS) <a name="l02209"></a>02209 glDisable(GL_BLEND); <a name="l02210"></a>02210 } <a name="l02211"></a>02211 <a name="l02212"></a>02212 <a name="l02213"></a>02213 <a name="l02214"></a>02214 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g846d6008860731bc15174ffc0db13831">allegro_gl_screen_polygon3d</a>(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> type, <a name="l02215"></a>02215 <span class="keyword">struct</span> BITMAP *texture, <span class="keywordtype">int</span> vc, <a name="l02216"></a>02216 V3D *vtx[]) { <a name="l02217"></a>02217 <span class="keywordtype">int</span> i; <a name="l02218"></a>02218 V3D_f **vtx_f = malloc(vc * <span class="keyword">sizeof</span>(<span class="keyword">struct</span> V3D_f*)); <a name="l02219"></a>02219 <span class="keywordflow">if</span> (!vtx_f) <a name="l02220"></a>02220 <span class="keywordflow">return</span>; <a name="l02221"></a>02221 <a name="l02222"></a>02222 <span class="keywordflow">for</span> (i = 0; i < vc; i++) { <a name="l02223"></a>02223 vtx_f[i] = malloc(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> V3D_f)); <a name="l02224"></a>02224 <span class="keywordflow">if</span> (!vtx_f[i]) { <a name="l02225"></a>02225 <span class="keywordtype">int</span> k; <a name="l02226"></a>02226 <span class="keywordflow">for</span> (k = 0; k < i; k++) <a name="l02227"></a>02227 free(vtx_f[k]); <a name="l02228"></a>02228 free(vtx_f); <a name="l02229"></a>02229 <span class="keywordflow">return</span>; <a name="l02230"></a>02230 } <a name="l02231"></a>02231 vtx_f[i]->c = vtx[i]->c; <a name="l02232"></a>02232 vtx_f[i]->u = fixtof(vtx[i]->u); <a name="l02233"></a>02233 vtx_f[i]->v = fixtof(vtx[i]->v); <a name="l02234"></a>02234 vtx_f[i]->x = fixtof(vtx[i]->x); <a name="l02235"></a>02235 vtx_f[i]->y = fixtof(vtx[i]->y); <a name="l02236"></a>02236 vtx_f[i]->z = fixtof(vtx[i]->z); <a name="l02237"></a>02237 } <a name="l02238"></a>02238 <a name="l02239"></a>02239 <a class="code" href="group__glvtable.html#g96c4dc94111a6da2ffe8b302e08e076a">allegro_gl_screen_polygon3d_f</a>(bmp, type, texture, vc, vtx_f); <a name="l02240"></a>02240 <span class="keywordflow">for</span> (i = 0; i < vc; i++) <a name="l02241"></a>02241 free(vtx_f[i]); <a name="l02242"></a><a class="code" href="group__glvtable.html#g846d6008860731bc15174ffc0db13831">02242</a> free(vtx_f); <a name="l02243"></a>02243 } <a name="l02244"></a>02244 <a name="l02245"></a>02245 <a name="l02246"></a>02246 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#ge6144517eaa1d07c5916fceb6a642daa">allegro_gl_screen_quad3d_f</a>(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> type, <a name="l02247"></a>02247 <span class="keyword">struct</span> BITMAP *texture, <a name="l02248"></a>02248 V3D_f *v1, V3D_f *v2, V3D_f *v3, V3D_f *v4) { <a name="l02249"></a>02249 <a name="l02250"></a>02250 V3D_f *vtx_f[4]; <a name="l02251"></a>02251 vtx_f[0] = v1; <a name="l02252"></a>02252 vtx_f[1] = v2; <a name="l02253"></a>02253 vtx_f[2] = v3; <a name="l02254"></a>02254 vtx_f[3] = v4; <a name="l02255"></a>02255 <a name="l02256"></a>02256 <a class="code" href="group__glvtable.html#g96c4dc94111a6da2ffe8b302e08e076a">allegro_gl_screen_polygon3d_f</a>(bmp, type, texture, 4, vtx_f); <a name="l02257"></a>02257 } <a name="l02258"></a>02258 <a name="l02259"></a>02259 <a name="l02260"></a>02260 <a name="l02261"></a>02261 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#gd8ffe84bdb8a77b8b2b8b859f6f52cf9">allegro_gl_screen_quad3d</a>(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> type, <a name="l02262"></a>02262 <span class="keyword">struct</span> BITMAP *texture, V3D *v1, V3D *v2, V3D *v3, V3D *v4) { <a name="l02263"></a>02263 <a name="l02264"></a>02264 V3D *vtx[4]; <a name="l02265"></a>02265 vtx[0] = v1; <a name="l02266"></a>02266 vtx[1] = v2; <a name="l02267"></a>02267 vtx[2] = v3; <a name="l02268"></a>02268 vtx[3] = v4; <a name="l02269"></a>02269 <a name="l02270"></a>02270 <a class="code" href="group__glvtable.html#g846d6008860731bc15174ffc0db13831">allegro_gl_screen_polygon3d</a>(bmp, type, texture, 4, vtx); <a name="l02271"></a>02271 } <a name="l02272"></a>02272 <a name="l02273"></a>02273 <a name="l02274"></a><a class="code" href="group__glvtable.html#ge6144517eaa1d07c5916fceb6a642daa">02274</a> <a name="l02275"></a>02275 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g8077770f174942074a4fd482e291bf1f">allegro_gl_screen_triangle3d</a>(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> type, <a name="l02276"></a>02276 <span class="keyword">struct</span> BITMAP *texture, <a name="l02277"></a>02277 V3D *v1, V3D *v2, V3D *v3) { <a name="l02278"></a>02278 V3D *vtx[3]; <a name="l02279"></a>02279 vtx[0] = v1; <a name="l02280"></a>02280 vtx[1] = v2; <a name="l02281"></a>02281 vtx[2] = v3; <a name="l02282"></a>02282 <a name="l02283"></a>02283 <a class="code" href="group__glvtable.html#g846d6008860731bc15174ffc0db13831">allegro_gl_screen_polygon3d</a>(bmp, type, texture, 3, vtx); <a name="l02284"></a>02284 } <a name="l02285"></a>02285 <a name="l02286"></a>02286 <a name="l02287"></a>02287 <a name="l02288"></a>02288 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g69acb6d9581157054e3c75f99a0dcc1a">allegro_gl_screen_triangle3d_f</a>(<span class="keyword">struct</span> BITMAP *bmp, <span class="keywordtype">int</span> type, <a name="l02289"></a><a class="code" href="group__glvtable.html#gd8ffe84bdb8a77b8b2b8b859f6f52cf9">02289</a> <span class="keyword">struct</span> BITMAP *texture, <a name="l02290"></a>02290 V3D_f *v1, V3D_f *v2, V3D_f *v3) { <a name="l02291"></a>02291 V3D_f *vtx_f[3]; <a name="l02292"></a>02292 vtx_f[0] = v1; <a name="l02293"></a>02293 vtx_f[1] = v2; <a name="l02294"></a>02294 vtx_f[2] = v3; <a name="l02295"></a>02295 <a name="l02296"></a>02296 <a class="code" href="group__glvtable.html#g96c4dc94111a6da2ffe8b302e08e076a">allegro_gl_screen_polygon3d_f</a>(bmp, type, texture, 3, vtx_f); <a name="l02297"></a>02297 } <a name="l02298"></a>02298 <a name="l02299"></a>02299 <a name="l02300"></a>02300 <a name="l02301"></a>02301 <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g92174c26d0fca4803d4d5f7cbb8716ec">__allegro_gl__glvtable_update_vtable</a>(GFX_VTABLE ** vtable) <a name="l02302"></a>02302 { <a name="l02303"></a><a class="code" href="group__glvtable.html#g8077770f174942074a4fd482e291bf1f">02303</a> <span class="keywordtype">int</span> maskcolor = (*vtable)->mask_color; <a name="l02304"></a>02304 <span class="keywordtype">int</span> depth = (*vtable)->color_depth; <a name="l02305"></a>02305 <a name="l02306"></a>02306 AGL_LOG(2, <span class="stringliteral">"glvtable.c:__allegro_gl__glvtable_update_vtable\n"</span>); <a name="l02307"></a>02307 <a class="code" href="glvtable_8c.html#fe00121a82e1c2ba4a94e690a1a326f5">allegro_gl_screen_vtable</a>.color_depth = depth; <a name="l02308"></a>02308 <span class="comment">/* makecol_depth is used below instead of the MASK_COLOR_x constants</span> <a name="l02309"></a>02309 <span class="comment"> * because we may have changed the RGB shift values in order to</span> <a name="l02310"></a>02310 <span class="comment"> * use the packed pixels extension</span> <a name="l02311"></a>02311 <span class="comment"> */</span> <a name="l02312"></a>02312 <a class="code" href="glvtable_8c.html#fe00121a82e1c2ba4a94e690a1a326f5">allegro_gl_screen_vtable</a>.mask_color = <a name="l02313"></a>02313 makecol_depth(depth, getr(maskcolor), getg(maskcolor), getb(maskcolor)); <a name="l02314"></a>02314 <a name="l02315"></a>02315 *vtable = &<a class="code" href="glvtable_8c.html#fe00121a82e1c2ba4a94e690a1a326f5">allegro_gl_screen_vtable</a>; <a name="l02316"></a><a class="code" href="group__glvtable.html#g69acb6d9581157054e3c75f99a0dcc1a">02316</a> <a name="l02317"></a>02317 <a class="code" href="alleggl_8c.html#5367a90beaa783cd9c718b9f04581569">__allegro_gl_driver</a>-><a class="code" href="structallegro__gl__driver.html#e9d8e331b2b065b1f6d5e1a3469de0fa">screen_masked_blit</a> = <a class="code" href="group__glvtable.html#g4ebcb4f89dbec9ce336bf9e22341b9bc">screen_masked_blit_standard</a>; <a name="l02318"></a>02318 <span class="keywordflow">if</span> (<a class="code" href="group__extensions.html#g7492f6f6acc608789210560ee63e5436" title="List of OpenGL extensions supported by AllegroGL.">allegro_gl_extensions_GL</a>.NV_register_combiners) { <a name="l02319"></a>02319 <a class="code" href="alleggl_8c.html#5367a90beaa783cd9c718b9f04581569">__allegro_gl_driver</a>-><a class="code" href="structallegro__gl__driver.html#e9d8e331b2b065b1f6d5e1a3469de0fa">screen_masked_blit</a> <a name="l02320"></a>02320 = <a class="code" href="group__glvtable.html#g55c7236cf9729bd83502a5fdea3f5656">screen_masked_blit_nv_register</a>; <a name="l02321"></a>02321 } <a name="l02322"></a>02322 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="structallegro__gl__info.html">allegro_gl_info</a>.num_texture_units >= 3) { <a name="l02323"></a>02323 <a class="code" href="alleggl_8c.html#5367a90beaa783cd9c718b9f04581569">__allegro_gl_driver</a>-><a class="code" href="structallegro__gl__driver.html#e9d8e331b2b065b1f6d5e1a3469de0fa">screen_masked_blit</a> = <a name="l02324"></a>02324 <a class="code" href="group__glvtable.html#ga4da17f4b4f2fad9bd3e623f4da377ce">screen_masked_blit_combine_tex</a>; <a name="l02325"></a>02325 } <a name="l02326"></a>02326 } <a name="l02327"></a>02327 <a name="l02328"></a>02328 <a name="l02329"></a><a class="code" href="group__glvtable.html#g92174c26d0fca4803d4d5f7cbb8716ec">02329</a> <a name="l02330"></a>02330 <span class="comment">/* Saved projection matrix */</span> <a name="l02331"></a>02331 <span class="keyword">static</span> <span class="keywordtype">double</span> <a class="code" href="group__glvtable.html#gf9c51fa0a17c012fa3584b03e45e96e6">allegro_gl_projection_matrix</a>[16]; <a name="l02332"></a>02332 <span class="keyword">static</span> <span class="keywordtype">double</span> <a class="code" href="group__glvtable.html#gb872906d7a4f142647002d3ff5058a0e">allegro_gl_modelview_matrix</a>[16]; <a name="l02333"></a>02333 <a name="l02334"></a>02334 <a name="l02335"></a>02335 <a name="l02366"></a>02366 <span class="keywordtype">void</span> <a class="code" href="group__allegro.html#g7ea7ffd9b72d0d0722cbf982b729efdb" title="Prepares for Allegro drawing to the screen.">allegro_gl_set_allegro_mode</a>(<span class="keywordtype">void</span>) <a name="l02367"></a>02367 { <a name="l02368"></a>02368 AGL_LOG(2, <span class="stringliteral">"glvtable.c:allegro_gl_set_allegro_mode\n"</span>); <a name="l02369"></a>02369 <a name="l02370"></a>02370 <span class="comment">/* Save the OpenGL state then set it up */</span> <a name="l02371"></a>02371 glPushAttrib(GL_ENABLE_BIT | GL_TEXTURE_BIT | GL_TRANSFORM_BIT <a name="l02372"></a>02372 | GL_POINT_BIT | GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); <a name="l02373"></a>02373 glDisable(GL_DEPTH_TEST); <a name="l02374"></a>02374 glDisable(GL_CULL_FACE); <a name="l02375"></a>02375 glDisable(GL_FOG); <a name="l02376"></a>02376 glDisable(GL_LIGHTING); <a name="l02377"></a>02377 glDisable(GL_BLEND); <a name="l02378"></a>02378 glDisable(GL_ALPHA_TEST); <a name="l02379"></a>02379 glDepthMask(GL_FALSE); <a name="l02380"></a>02380 glEnable(GL_TEXTURE_2D); <a name="l02381"></a>02381 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); <a name="l02382"></a>02382 glPointSize(1.); <a name="l02383"></a>02383 <a name="l02384"></a>02384 <span class="comment">/* Create pool texture */</span> <a name="l02385"></a>02385 <span class="keywordflow">if</span> (!<a class="code" href="glvtable_8c.html#d72d761cd04f799d21da8d59cab2182f">__allegro_gl_pool_texture</a>) { <a name="l02386"></a>02386 glGenTextures(1, &<a class="code" href="glvtable_8c.html#d72d761cd04f799d21da8d59cab2182f">__allegro_gl_pool_texture</a>); <a name="l02387"></a>02387 } <a name="l02388"></a>02388 <a name="l02389"></a>02389 glBindTexture(GL_TEXTURE_2D, <a class="code" href="glvtable_8c.html#d72d761cd04f799d21da8d59cab2182f">__allegro_gl_pool_texture</a>); <a name="l02390"></a>02390 <span class="comment">/* Create a texture without defining the data */</span> <a name="l02391"></a>02391 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, <a name="l02392"></a>02392 GL_RGBA, GL_UNSIGNED_BYTE, NULL); <a name="l02393"></a>02393 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); <a name="l02394"></a><a class="code" href="group__allegro.html#g7ea7ffd9b72d0d0722cbf982b729efdb">02394</a> glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); <a name="l02395"></a>02395 <a name="l02396"></a>02396 glBindTexture(GL_TEXTURE_2D, 0); <a name="l02397"></a>02397 <a class="code" href="group__allegro.html#gbaf6024e9d196da357aad02c5dc7589f" title="Prepares for Allegro drawing to the screen.">allegro_gl_set_projection</a>(); <a name="l02398"></a>02398 <a name="l02399"></a>02399 <span class="comment">/* For some reason, ATI Rage Pro isn't able to draw correctly without a</span> <a name="l02400"></a>02400 <span class="comment"> * texture bound. So we bind a dummy 1x1 texture to work around the issue.</span> <a name="l02401"></a>02401 <span class="comment"> */</span> <a name="l02402"></a>02402 <span class="keywordflow">if</span> (<a class="code" href="structallegro__gl__info.html">allegro_gl_info</a>.is_ati_rage_pro) { <a name="l02403"></a>02403 <span class="keywordflow">if</span> (!<a class="code" href="glvtable_8c.html#08de572ca4af6f95d29c93c7011d1479">__allegro_gl_dummy_texture</a>) { <a name="l02404"></a>02404 GLubyte tex[4] = {255, 255, 255, 255}; <a name="l02405"></a>02405 glGenTextures(1, &<a class="code" href="glvtable_8c.html#08de572ca4af6f95d29c93c7011d1479">__allegro_gl_dummy_texture</a>); <a name="l02406"></a>02406 glBindTexture(GL_TEXTURE_2D, <a class="code" href="glvtable_8c.html#08de572ca4af6f95d29c93c7011d1479">__allegro_gl_dummy_texture</a>); <a name="l02407"></a>02407 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, <a name="l02408"></a>02408 GL_RGBA, GL_UNSIGNED_BYTE, tex); <a name="l02409"></a>02409 } <a name="l02410"></a>02410 glBindTexture(GL_TEXTURE_2D, <a class="code" href="glvtable_8c.html#08de572ca4af6f95d29c93c7011d1479">__allegro_gl_dummy_texture</a>); <a name="l02411"></a>02411 } <a name="l02412"></a>02412 <span class="preprocessor">#ifdef ALLEGRO_MACOSX</span> <a name="l02413"></a>02413 <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="l02414"></a>02414 <span class="comment"> *'blit'). This stops it happening.</span> <a name="l02415"></a>02415 <span class="comment"> */</span> <a name="l02416"></a>02416 glBegin(GL_POINTS); <a name="l02417"></a>02417 glEnd(); <a name="l02418"></a>02418 <span class="preprocessor">#endif</span> <a name="l02419"></a>02419 <span class="preprocessor"></span>} <a name="l02420"></a>02420 <a name="l02421"></a>02421 <a name="l02422"></a>02422 <a name="l02435"></a>02435 <span class="keywordtype">void</span> <a class="code" href="group__allegro.html#g00fbbee541046767114bf9746ceb6f8b" title="Restores previous OpenGL settings.">allegro_gl_unset_allegro_mode</a>(<span class="keywordtype">void</span>) <a name="l02436"></a>02436 { <a name="l02437"></a>02437 AGL_LOG(2, <span class="stringliteral">"glvtable.c:allegro_gl_unset_allegro_mode\n"</span>); <a name="l02438"></a>02438 <a name="l02439"></a>02439 <span class="keywordflow">switch</span>(<a class="code" href="structallegro__gl__display__info.html">allegro_gl_display_info</a>.vidmem_policy) { <a name="l02440"></a>02440 <span class="keywordflow">case</span> <a class="code" href="group__settings.html#g5deef983a0f5b2704746d7945c614b7c" title="Keep internal texture in video memory.">AGL_KEEP</a>: <a name="l02441"></a>02441 <span class="keywordflow">break</span>; <a name="l02442"></a>02442 <span class="keywordflow">case</span> <a class="code" href="group__settings.html#g77a6cb708e52f68f893128db6f20bdea" title="Release video memory occupied by internal texture.">AGL_RELEASE</a>: <a name="l02443"></a>02443 <span class="keywordflow">if</span> (<a class="code" href="glvtable_8c.html#d72d761cd04f799d21da8d59cab2182f">__allegro_gl_pool_texture</a>) { <a name="l02444"></a>02444 glDeleteTextures(1, &<a class="code" href="glvtable_8c.html#d72d761cd04f799d21da8d59cab2182f">__allegro_gl_pool_texture</a>); <a name="l02445"></a>02445 <a class="code" href="glvtable_8c.html#d72d761cd04f799d21da8d59cab2182f">__allegro_gl_pool_texture</a> = 0; <a name="l02446"></a>02446 } <a name="l02447"></a>02447 <span class="keywordflow">break</span>; <a name="l02448"></a>02448 } <a name="l02449"></a>02449 <a class="code" href="group__allegro.html#g603f8f3719d02816acdf3dbdcaa1f447" title="Restores previously saved projection.">allegro_gl_unset_projection</a>(); <a name="l02450"></a>02450 glPopAttrib(); <a name="l02451"></a>02451 } <a name="l02452"></a>02452 <a name="l02453"></a>02453 <a name="l02454"></a>02454 <a name="l02484"></a>02484 <span class="keywordtype">void</span> <a class="code" href="group__allegro.html#gbaf6024e9d196da357aad02c5dc7589f" title="Prepares for Allegro drawing to the screen.">allegro_gl_set_projection</a>(<span class="keywordtype">void</span>) <a name="l02485"></a>02485 { <a name="l02486"></a>02486 GLint v[4]; <a name="l02487"></a>02487 AGL_LOG(2, <span class="stringliteral">"glvtable.c:allegro_gl_set_projection\n"</span>); <a name="l02488"></a>02488 <a name="l02489"></a>02489 <span class="comment">/* Setup OpenGL matrices */</span> <a name="l02490"></a>02490 glGetIntegerv(GL_VIEWPORT, &v[0]); <a name="l02491"></a>02491 glMatrixMode(GL_MODELVIEW); <a name="l02492"></a>02492 glGetDoublev(GL_MODELVIEW_MATRIX, allegro_gl_modelview_matrix); <a name="l02493"></a>02493 glLoadIdentity(); <a name="l02494"></a>02494 glMatrixMode(GL_PROJECTION); <a name="l02495"></a>02495 glGetDoublev(GL_PROJECTION_MATRIX, allegro_gl_projection_matrix); <a name="l02496"></a>02496 glLoadIdentity(); <a name="l02497"></a>02497 gluOrtho2D(v[0] - 0.325, v[0] + v[2] - 0.325, v[1] + v[3] - 0.325, v[1] - 0.325); <a name="l02498"></a>02498 } <a name="l02499"></a>02499 <a name="l02500"></a>02500 <a name="l02501"></a>02501 <a name="l02511"></a>02511 <span class="keywordtype">void</span> <a class="code" href="group__allegro.html#g603f8f3719d02816acdf3dbdcaa1f447" title="Restores previously saved projection.">allegro_gl_unset_projection</a>(<span class="keywordtype">void</span>) <a name="l02512"></a><a class="code" href="group__allegro.html#gbaf6024e9d196da357aad02c5dc7589f">02512</a> { <a name="l02513"></a>02513 AGL_LOG(2, <span class="stringliteral">"glvtable.c:allegro_gl_unset_projection\n"</span>); <a name="l02514"></a>02514 glMatrixMode(GL_PROJECTION); <a name="l02515"></a>02515 glLoadMatrixd(allegro_gl_projection_matrix); <a name="l02516"></a>02516 glMatrixMode(GL_MODELVIEW); <a name="l02517"></a>02517 glLoadMatrixd(allegro_gl_modelview_matrix); <a name="l02518"></a>02518 } <a name="l02519"></a>02519 <a name="l02520"></a>02520 <a name="l02521"></a>02521 <a name="l02522"></a>02522 <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#g9f6042da85f5738a43821f83d491a772">allegro_gl_memory_blit_between_formats</a>(<span class="keyword">struct</span> BITMAP *src, <a name="l02523"></a>02523 <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="l02524"></a>02524 <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height) <a name="l02525"></a>02525 { <a name="l02526"></a>02526 AGL_LOG(2, <span class="stringliteral">"AGL::blit_between_formats\n"</span>); <a name="l02527"></a>02527 <a name="l02528"></a>02528 <span class="comment">/* screen -> memory */</span> <a name="l02529"></a>02529 <span class="keywordflow">if</span> (is_screen_bitmap(src)) { <a name="l02530"></a>02530 <a class="code" href="group__glvtable.html#g61116278e2fbfc40e010df442fc7d0cb">allegro_gl_screen_blit_to_memory</a>(src, dest, source_x, source_y, <a name="l02531"></a>02531 dest_x, dest_y, width, height); <a name="l02532"></a>02532 <span class="keywordflow">return</span>; <a name="l02533"></a>02533 } <a name="l02534"></a>02534 <a name="l02535"></a>02535 <span class="comment">/* video -> memory */</span> <a name="l02536"></a>02536 <span class="keywordflow">if</span> (is_video_bitmap(src)) { <a name="l02537"></a>02537 <a class="code" href="videovtb_8c.html#2c259332833f882822e121b3c9849de0">allegro_gl_video_blit_to_memory</a>(src, dest, source_x, source_y, <a name="l02538"></a>02538 dest_x, dest_y, width, height); <a name="l02539"></a><a class="code" href="group__allegro.html#g603f8f3719d02816acdf3dbdcaa1f447">02539</a> <span class="keywordflow">return</span>; <a name="l02540"></a>02540 } <a name="l02541"></a>02541 <a name="l02542"></a>02542 <span class="comment">/* memory -> screen */</span> <a name="l02543"></a>02543 <span class="keywordflow">if</span> (is_screen_bitmap(dest)) { <a name="l02544"></a>02544 <a class="code" href="group__glvtable.html#g131ec6d465e280a411980f664e35c3f2">allegro_gl_screen_blit_from_memory</a>(src, dest, source_x, source_y, <a name="l02545"></a>02545 dest_x, dest_y, width, height); <a name="l02546"></a>02546 <span class="keywordflow">return</span>; <a name="l02547"></a>02547 } <a name="l02548"></a>02548 <a name="l02549"></a>02549 <span class="comment">/* memory -> video */</span> <a name="l02550"></a><a class="code" href="group__glvtable.html#g9f6042da85f5738a43821f83d491a772">02550</a> <span class="keywordflow">if</span> (is_video_bitmap(dest)) { <a name="l02551"></a>02551 <a class="code" href="videovtb_8c.html#205bfda898f1d0c1a78fa3b08634fabf">allegro_gl_video_blit_from_memory</a>(src, dest, source_x, source_y, <a name="l02552"></a>02552 dest_x, dest_y, width, height); <a name="l02553"></a>02553 <span class="keywordflow">return</span>; <a name="l02554"></a>02554 } <a name="l02555"></a>02555 <a name="l02556"></a>02556 <span class="keywordflow">switch</span>(bitmap_color_depth(dest)) { <a name="l02557"></a>02557 <span class="preprocessor"> #ifdef ALLEGRO_COLOR8</span> <a name="l02558"></a>02558 <span class="preprocessor"></span> <span class="keywordflow">case</span> 8: <a name="l02559"></a>02559 <a class="code" href="alleggl_8c.html#d05d1a03b46ff2f05841d3c2cc7ec5bd">__blit_between_formats8</a>(src, dest, source_x, source_y, <a name="l02560"></a>02560 dest_x, dest_y, width, height); <a name="l02561"></a>02561 <span class="keywordflow">return</span>; <a name="l02562"></a>02562 <span class="preprocessor"> #endif</span> <a name="l02563"></a>02563 <span class="preprocessor"></span><span class="preprocessor"> #ifdef ALLEGRO_COLOR16</span> <a name="l02564"></a>02564 <span class="preprocessor"></span> <span class="keywordflow">case</span> 15: <a name="l02565"></a>02565 <a class="code" href="alleggl_8c.html#d93b412d24f734a1f8ac91df7031b8d9">__blit_between_formats15</a>(src, dest, source_x, source_y, <a name="l02566"></a>02566 dest_x, dest_y, width, height); <a name="l02567"></a>02567 <span class="keywordflow">return</span>; <a name="l02568"></a>02568 <span class="keywordflow">case</span> 16: <a name="l02569"></a>02569 <a class="code" href="alleggl_8c.html#61b31e9c00583f1f6a7493a3f9ae57f6">__blit_between_formats16</a>(src, dest, source_x, source_y, <a name="l02570"></a>02570 dest_x, dest_y, width, height); <a name="l02571"></a>02571 <span class="keywordflow">return</span>; <a name="l02572"></a>02572 <span class="preprocessor"> #endif</span> <a name="l02573"></a>02573 <span class="preprocessor"></span><span class="preprocessor"> #ifdef ALLEGRO_COLOR24</span> <a name="l02574"></a>02574 <span class="preprocessor"></span> <span class="keywordflow">case</span> 24: <a name="l02575"></a>02575 <a class="code" href="alleggl_8c.html#dcd1ff2e3c7d2a4e9dd5573a72923554">__blit_between_formats24</a>(src, dest, source_x, source_y, <a name="l02576"></a>02576 dest_x, dest_y, width, height); <a name="l02577"></a>02577 <span class="keywordflow">return</span>; <a name="l02578"></a>02578 <span class="preprocessor"> #endif</span> <a name="l02579"></a>02579 <span class="preprocessor"></span><span class="preprocessor"> #ifdef ALLEGRO_COLOR32</span> <a name="l02580"></a>02580 <span class="preprocessor"></span> <span class="keywordflow">case</span> 32: <a name="l02581"></a>02581 <a class="code" href="alleggl_8c.html#02dbd9fcc2542ce36c900ac579fcd8d9">__blit_between_formats32</a>(src, dest, source_x, source_y, <a name="l02582"></a>02582 dest_x, dest_y, width, height); <a name="l02583"></a>02583 <span class="keywordflow">return</span>; <a name="l02584"></a>02584 <span class="preprocessor"> #endif</span> <a name="l02585"></a>02585 <span class="preprocessor"></span> <span class="keywordflow">default</span>: <a name="l02586"></a>02586 TRACE(<span class="stringliteral">"--== ERROR ==-- AGL::blit_between_formats : %i -> %i bpp\n"</span>, <a name="l02587"></a>02587 bitmap_color_depth(src), bitmap_color_depth(dest)); <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 <a name="l02592"></a>02592 <a name="l02593"></a>02593 <a name="l02594"></a>02594 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="group__glvtable.html#ga61710c66f03d0c47602d22768e4bcc4">dummy_unwrite_bank</a>(<span class="keywordtype">void</span>) <a name="l02595"></a>02595 { <a name="l02596"></a>02596 } <a name="l02597"></a>02597 <a name="l02598"></a>02598 <a name="l02599"></a>02599 <a name="l02600"></a>02600 <span class="keyword">static</span> GFX_VTABLE <a class="code" href="glvtable_8c.html#fe00121a82e1c2ba4a94e690a1a326f5">allegro_gl_screen_vtable</a> = { <a name="l02601"></a>02601 0, <a name="l02602"></a>02602 0, <a name="l02603"></a>02603 <a class="code" href="group__glvtable.html#ga61710c66f03d0c47602d22768e4bcc4">dummy_unwrite_bank</a>, <span class="comment">//void *unwrite_bank;</span> <a name="l02604"></a>02604 NULL, <span class="comment">//AL_METHOD(void, set_clip, (struct BITMAP *bmp));</span> <a name="l02605"></a>02605 <a class="code" href="group__glvtable.html#g702812e50246c61eb9f01fd8aba69325" title="acquire_bitmap(screen) overload.">allegro_gl_screen_acquire</a>, <a name="l02606"></a>02606 <a class="code" href="group__glvtable.html#g6c2b0685587a0feafcb194a9a67d6aa9" title="release_bitmap(screen) overload.">allegro_gl_screen_release</a>, <a name="l02607"></a>02607 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="l02608"></a>02608 NULL, <span class="comment">//AL_METHOD(void, created_sub_bitmap, (struct BITMAP *bmp, struct BITMAP *parent));</span> <a name="l02609"></a>02609 <a class="code" href="group__glvtable.html#g921c990bff3ea0faac62def172b9ac5b">allegro_gl_screen_getpixel</a>, <a name="l02610"></a>02610 <a class="code" href="group__glvtable.html#g709f50a3934bc2339ff583c5d8d7ac4c">allegro_gl_screen_putpixel</a>, <a name="l02611"></a>02611 <a class="code" href="group__glvtable.html#g7a14c4dbc0363e39c33b0416661aee98">allegro_gl_screen_vline</a>, <a name="l02612"></a>02612 <a class="code" href="group__glvtable.html#g134f31b9686555dae42ae0ab1c1a2fff">allegro_gl_screen_hline</a>, <a name="l02613"></a>02613 allegro_gl_screen_hline, <a name="l02614"></a>02614 <a class="code" href="group__glvtable.html#ge401467052c88d9b91a1f80b0e0fa2ff">allegro_gl_screen_line</a>, <a name="l02615"></a>02615 allegro_gl_screen_line, <a name="l02616"></a>02616 <a class="code" href="group__glvtable.html#g694a43ed2653fc57c21e50f2266737e8">allegro_gl_screen_rectfill</a>, <a name="l02617"></a>02617 <a class="code" href="group__glvtable.html#g986ad50a7a2b3ab9aa561c49bf5335e0">allegro_gl_screen_triangle</a>, <a name="l02618"></a>02618 <a class="code" href="group__glvtable.html#g69343ec4e2cffd05868b58f0068beda9">allegro_gl_screen_draw_sprite</a>, <a name="l02619"></a>02619 <a class="code" href="group__glvtable.html#g117ffbc09394307a4c78d9b48ed5b8fc">allegro_gl_screen_draw_256_sprite</a>, <a name="l02620"></a>02620 <a class="code" href="group__glvtable.html#g97666d6e17222004544c2acf152d637d">allegro_gl_screen_draw_sprite_v_flip</a>, <a name="l02621"></a>02621 <a class="code" href="group__glvtable.html#g3293849696eac35e57b39e393532233f">allegro_gl_screen_draw_sprite_h_flip</a>, <a name="l02622"></a><a class="code" href="group__glvtable.html#ga61710c66f03d0c47602d22768e4bcc4">02622</a> <a class="code" href="group__glvtable.html#gcd4a30eff37e1d3a8f877ef49b1e926c">allegro_gl_screen_draw_sprite_vh_flip</a>, <a name="l02623"></a>02623 <a class="code" href="group__glvtable.html#g36e088851faed6b4001e67afbe1affd9">allegro_gl_screen_draw_trans_rgba_sprite</a>, <a name="l02624"></a>02624 allegro_gl_screen_draw_trans_rgba_sprite, <a name="l02625"></a>02625 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="l02626"></a>02626 <a class="code" href="group__glvtable.html#g16f50f04ce8310bb6a110bd4b32fc362">allegro_gl_screen_draw_rle_sprite</a>, <a name="l02627"></a>02627 <a class="code" href="group__glvtable.html#g2c836f850dc542b782acd5e7ca82cbcf">allegro_gl_screen_draw_trans_rgba_rle_sprite</a>, <a name="l02628"></a><a class="code" href="group__glvtable.html#gfe00121a82e1c2ba4a94e690a1a326f5">02628</a> allegro_gl_screen_draw_trans_rgba_rle_sprite, <a name="l02629"></a>02629 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="l02630"></a>02630 <a class="code" href="group__glvtable.html#g9685dcaec7aa65db8e790fa8177a86b0">allegro_gl_screen_draw_character</a>, <a name="l02631"></a>02631 <a class="code" href="group__glvtable.html#g658f4ac879e4b20cca3b60dce4d86846">allegro_gl_screen_draw_glyph</a>, <a name="l02632"></a>02632 <a class="code" href="group__glvtable.html#g131ec6d465e280a411980f664e35c3f2">allegro_gl_screen_blit_from_memory</a>, <a name="l02633"></a>02633 <a class="code" href="group__glvtable.html#g61116278e2fbfc40e010df442fc7d0cb">allegro_gl_screen_blit_to_memory</a>, <a name="l02634"></a>02634 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="l02635"></a>02635 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="l02636"></a>02636 <a class="code" href="group__glvtable.html#g0dc407670ad3a20ca8b69668cafb00a7">allegro_gl_screen_blit_to_self</a>, <a name="l02637"></a>02637 allegro_gl_screen_blit_to_self, <span class="comment">/* ..._forward */</span> <a name="l02638"></a>02638 allegro_gl_screen_blit_to_self, <span class="comment">/* ..._backward */</span> <a name="l02639"></a>02639 <a class="code" href="group__glvtable.html#g9f6042da85f5738a43821f83d491a772">allegro_gl_memory_blit_between_formats</a>, <a name="l02640"></a>02640 <a class="code" href="group__glvtable.html#ge67e14a596e418324f4df3708b8a073a">allegro_gl_screen_masked_blit</a>, <a name="l02641"></a>02641 <a class="code" href="group__glvtable.html#g333283185678bab117599411cb4f39f3">allegro_gl_screen_clear_to_color</a>, <a name="l02642"></a>02642 <a class="code" href="group__glvtable.html#g683899f78545eab4648bddd396303279">allegro_gl_screen_pivot_scaled_sprite_flip</a>, <a name="l02643"></a>02643 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="l02644"></a>02644 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="l02645"></a>02645 NULL, <span class="comment">//AL_METHOD(void, draw_sprite_end, (void));</span> <a name="l02646"></a>02646 NULL, <span class="comment">//AL_METHOD(void, blit_end, (void));</span> <a name="l02647"></a>02647 <a class="code" href="group__glvtable.html#g1a0882cc74dbed492216654cca342a5b">allegro_gl_screen_polygon</a>, <a name="l02648"></a>02648 <a class="code" href="group__glvtable.html#g13a50c4adf518c0e67dd6035ab9b82a4">allegro_gl_screen_rect</a>, <a name="l02649"></a>02649 _soft_circle, <span class="comment">//AL_METHOD(void, circle, (struct BITMAP *bmp, int x, int y, int radius, int color));</span> <a name="l02650"></a>02650 _soft_circlefill, <span class="comment">//AL_METHOD(void, circlefill, (struct BITMAP *bmp, int x, int y, int radius, int color));</span> <a name="l02651"></a>02651 _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="l02652"></a>02652 _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="l02653"></a>02653 _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="l02654"></a>02654 _soft_spline, <span class="comment">//AL_METHOD(void, spline, (struct BITMAP *bmp, AL_CONST int points[8], int color));</span> <a name="l02655"></a>02655 _soft_floodfill, <span class="comment">//AL_METHOD(void, floodfill, (struct BITMAP *bmp, int x, int y, int color));</span> <a name="l02656"></a>02656 <a class="code" href="group__glvtable.html#g846d6008860731bc15174ffc0db13831">allegro_gl_screen_polygon3d</a>, <a name="l02657"></a>02657 <a class="code" href="group__glvtable.html#g96c4dc94111a6da2ffe8b302e08e076a">allegro_gl_screen_polygon3d_f</a>, <a name="l02658"></a>02658 <a class="code" href="group__glvtable.html#g8077770f174942074a4fd482e291bf1f">allegro_gl_screen_triangle3d</a>, <a name="l02659"></a>02659 <a class="code" href="group__glvtable.html#g69acb6d9581157054e3c75f99a0dcc1a">allegro_gl_screen_triangle3d_f</a>, <a name="l02660"></a>02660 <a class="code" href="group__glvtable.html#gd8ffe84bdb8a77b8b2b8b859f6f52cf9">allegro_gl_screen_quad3d</a>, <a name="l02661"></a>02661 <a class="code" href="group__glvtable.html#ge6144517eaa1d07c5916fceb6a642daa">allegro_gl_screen_quad3d_f</a> <a name="l02662"></a>02662 }; <a name="l02663"></a>02663 </pre></div><hr size="1"><address style="text-align: right;"><small>Generated on Mon Nov 12 11:05:31 2007 for AllegroGL by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.2 </small></address> </body> </html>