FreeBASIC  0.91.0
gfx_put_preset.c
Go to the documentation of this file.
1 /* PRESET drawing method for PUT statement */
2 
3 #include "fb_gfx.h"
4 
5 
6 #ifdef HOST_X86
7 
8 #include "x86/fb_gfx_mmx.h"
9 
10 extern void fb_hPutPResetMMX(unsigned char *src, unsigned char *dest, int w, int h, int src_pitch, int dest_pitch, int alpha, BLENDER *blender, void *param);
11 
12 #endif
13 
14 
15 /*:::::*/
16 static void fb_hPutPResetC(unsigned char *src, unsigned char *dest, int w, int h, int src_pitch, int dest_pitch, int alpha, BLENDER *blender, void *param)
17 {
18  int x;
20 
21  w <<= (context->target_bpp >> 1);
22  src_pitch -= w;
23  dest_pitch -= w;
24  for (; h; h--) {
25  if (w & 1)
26  *dest++ = 0xFF ^ *src++;
27  if (w & 2) {
28  *(unsigned short *)dest = 0xFFFF ^ *(unsigned short *)src;
29  dest += 2;
30  src += 2;
31  }
32  for (x = w >> 2; x; x--) {
33  *(unsigned int *)dest = 0xFFFFFFFF ^ *(unsigned int *)src;
34  dest += 4;
35  src += 4;
36  }
37  src += src_pitch;
38  dest += dest_pitch;
39  }
40 }
41 
42 /*:::::*/
43 void fb_hPutPReset(unsigned char *src, unsigned char *dest, int w, int h, int src_pitch, int dest_pitch, int alpha, BLENDER *blender, void *param)
44 {
45  static PUTTER *all_putters[] = {
47 #ifdef HOST_X86
48  fb_hPutPResetMMX, fb_hPutPResetMMX, NULL, fb_hPutPResetMMX,
49 #endif
50  };
51  PUTTER *putter;
53 
54  if (!context->putter[PUT_MODE_PRESET]) {
55 #ifdef HOST_X86
56  if (__fb_gfx->flags & HAS_MMX)
57  context->putter[PUT_MODE_PRESET] = &all_putters[4];
58  else
59 #endif
60  context->putter[PUT_MODE_PRESET] = &all_putters[0];
61  }
62  putter = context->putter[PUT_MODE_PRESET][context->target_bpp - 1];
63 
64  putter(src, dest, w, h, src_pitch, dest_pitch, alpha, blender, param);
65 }