1/* ______ ___ ___ 2 * /\ _ \ /\_ \ /\_ \ 3 * \ \ \L\ \\//\ \ \//\ \ __ __ _ __ ___ 4 * \ \ __ \ \ \ \ \ \ \ /'__`\ /'_ `\/\`'__\/ __`\ 5 * \ \ \/\ \ \_\ \_ \_\ \_/\ __//\ \L\ \ \ \//\ \L\ \ 6 * \ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/ 7 * \/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/ 8 * /\____/ 9 * \_/__/ 10 * 11 * Graphics inline functions (generic C). 12 * 13 * By Shawn Hargreaves. 14 * 15 * See readme.txt for copyright information. 16 */ 17 18 19#ifndef ALLEGRO_GFX_INL 20#define ALLEGRO_GFX_INL 21 22#include "allegro/debug.h" 23 24#define ALLEGRO_IMPORT_GFX_ASM 25#include "asm.inl" 26#undef ALLEGRO_IMPORT_GFX_ASM 27 28#ifdef __cplusplus 29 extern "C" { 30#endif 31 32 33#ifdef ALLEGRO_NO_ASM 34 35 /* use generic C versions */ 36 37AL_INLINE(int, _default_ds, (void), 38{ 39 return 0; 40}) 41 42#ifdef ALLEGRO_BCC32 43 44 /* BCC32 is a somewhat unusual platform because it mixes a MSVC/MinGW generated DLL 45 * (for which ALLEGRO_NO_ASM is not defined) with Borland C++ compiled programs for 46 * which ALLEGRO_NO_ASM is defined. As a result, Borland C++ compiled programs can't 47 * use the inlined version of bmp_write_line(), bmp_read_line() and bmp_unwrite_line() 48 * because the write_bank() and read_bank() methods of the BITMAP class don't expect 49 * the same calling convention on both sides. 50 */ 51 52AL_FUNC(uintptr_t, bmp_write_line, (BITMAP *bmp, int lyne)); 53AL_FUNC(uintptr_t, bmp_read_line, (BITMAP *bmp, int lyne)); 54AL_FUNC(void, bmp_unwrite_line, (BITMAP *bmp)); 55 56#else 57 58typedef AL_METHOD(uintptr_t, _BMP_BANK_SWITCHER, (BITMAP *bmp, int lyne)); 59typedef AL_METHOD(void, _BMP_UNBANK_SWITCHER, (BITMAP *bmp)); 60 61 62AL_INLINE(uintptr_t, bmp_write_line, (BITMAP *bmp, int lyne), 63{ 64 _BMP_BANK_SWITCHER switcher = (_BMP_BANK_SWITCHER)bmp->write_bank; 65 return switcher(bmp, lyne); 66}) 67 68 69AL_INLINE(uintptr_t, bmp_read_line, (BITMAP *bmp, int lyne), 70{ 71 _BMP_BANK_SWITCHER switcher = (_BMP_BANK_SWITCHER)bmp->read_bank; 72 return switcher(bmp, lyne); 73}) 74 75 76AL_INLINE(void, bmp_unwrite_line, (BITMAP *bmp), 77{ 78 _BMP_UNBANK_SWITCHER switcher = (_BMP_UNBANK_SWITCHER)bmp->vtable->unwrite_bank; 79 switcher(bmp); 80}) 81 82#endif /* defined ALLEGRO_BCC32 */ 83 84#endif /* C vs. inline asm */ 85 86 87AL_INLINE(int, is_windowed_mode, (void), 88{ 89 ASSERT (gfx_driver); 90 91 return gfx_driver->windowed; 92}) 93 94 95 96AL_INLINE(void, clear_to_color, (BITMAP *bitmap, int color), 97{ 98 ASSERT(bitmap); 99 100 bitmap->vtable->clear_to_color(bitmap, color); 101}) 102 103 104AL_INLINE(int, bitmap_color_depth, (BITMAP *bmp), 105{ 106 ASSERT(bmp); 107 108 return bmp->vtable->color_depth; 109}) 110 111 112AL_INLINE(int, bitmap_mask_color, (BITMAP *bmp), 113{ 114 ASSERT(bmp); 115 116 return bmp->vtable->mask_color; 117}) 118 119 120AL_INLINE(int, is_same_bitmap, (BITMAP *bmp1, BITMAP *bmp2), 121{ 122 unsigned long m1; 123 unsigned long m2; 124 125 if ((!bmp1) || (!bmp2)) 126 return FALSE; 127 128 if (bmp1 == bmp2) 129 return TRUE; 130 131 m1 = bmp1->id & BMP_ID_MASK; 132 m2 = bmp2->id & BMP_ID_MASK; 133 134 return ((m1) && (m1 == m2)); 135}) 136 137 138AL_INLINE(int, is_linear_bitmap, (BITMAP *bmp), 139{ 140 ASSERT(bmp); 141 142 return (bmp->id & BMP_ID_PLANAR) == 0; 143}) 144 145 146AL_INLINE(int, is_planar_bitmap, (BITMAP *bmp), 147{ 148 ASSERT(bmp); 149 150 return (bmp->id & BMP_ID_PLANAR) != 0; 151}) 152 153 154AL_INLINE(int, is_memory_bitmap, (BITMAP *bmp), 155{ 156 ASSERT(bmp); 157 158 return (bmp->id & (BMP_ID_VIDEO | BMP_ID_SYSTEM)) == 0; 159}) 160 161 162AL_INLINE(int, is_screen_bitmap, (BITMAP *bmp), 163{ 164 ASSERT(bmp); 165 166 return is_same_bitmap(bmp, screen); 167}) 168 169 170AL_INLINE(int, is_video_bitmap, (BITMAP *bmp), 171{ 172 ASSERT(bmp); 173 174 return (bmp->id & BMP_ID_VIDEO) != 0; 175}) 176 177 178AL_INLINE(int, is_system_bitmap, (BITMAP *bmp), 179{ 180 ASSERT(bmp); 181 182 return (bmp->id & BMP_ID_SYSTEM) != 0; 183}) 184 185 186AL_INLINE(int, is_sub_bitmap, (BITMAP *bmp), 187{ 188 ASSERT(bmp); 189 190 return (bmp->id & BMP_ID_SUB) != 0; 191}) 192 193 194#ifdef ALLEGRO_MPW 195 196 #define acquire_bitmap(bmp) 197 #define release_bitmap(bmp) 198 #define acquire_screen() 199 #define release_screen() 200 201#else 202 203AL_INLINE(void, acquire_bitmap, (BITMAP *bmp), 204{ 205 ASSERT(bmp); 206 207 if (bmp->vtable->acquire) 208 bmp->vtable->acquire(bmp); 209}) 210 211 212AL_INLINE(void, release_bitmap, (BITMAP *bmp), 213{ 214 ASSERT(bmp); 215 216 if (bmp->vtable->release) 217 bmp->vtable->release(bmp); 218}) 219 220 221AL_INLINE(void, acquire_screen, (void), 222{ 223 acquire_bitmap(screen); 224}) 225 226 227AL_INLINE(void, release_screen, (void), 228{ 229 release_bitmap(screen); 230}) 231 232#endif 233 234 235AL_INLINE(int, is_inside_bitmap, (BITMAP *bmp, int x, int y, int clip), 236{ 237 ASSERT(bmp); 238 239 if (clip) { 240 if (bmp->clip) 241 /* internal clipping is inclusive-exclusive */ 242 return (x >= bmp->cl) && (y >= bmp->ct) && (x < bmp->cr) && (y < bmp->cb); 243 else 244 return TRUE; 245 } 246 else 247 /* bitmap dimensions are always non-negative */ 248 return (unsigned int)x < (unsigned int)bmp->w && (unsigned int)y < (unsigned int)bmp->h; 249}) 250 251 252AL_INLINE(void, get_clip_rect, (BITMAP *bitmap, int *x1, int *y_1, int *x2, int *y2), 253{ 254 ASSERT(bitmap); 255 256 /* internal clipping is inclusive-exclusive */ 257 *x1 = bitmap->cl; 258 *y_1 = bitmap->ct; 259 *x2 = bitmap->cr-1; 260 *y2 = bitmap->cb-1; 261}) 262 263AL_INLINE(void, set_clip_state, (BITMAP *bitmap, int state), 264{ 265 ASSERT(bitmap); 266 267 bitmap->clip = state; 268}) 269 270AL_INLINE(int, get_clip_state, (BITMAP *bitmap), 271{ 272 ASSERT(bitmap); 273 274 return bitmap->clip; 275}) 276 277 278#ifdef __cplusplus 279 } 280#endif 281 282#endif /* ifndef ALLEGRO_GFX_INL */ 283 284 285