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