/
gfx_put_trans.c
97 lines (86 loc) · 2.74 KB
/
gfx_put_trans.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/* TRANS drawing method for PUT statement */
#include "fb_gfx.h"
#ifdef HOST_X86
#include "x86/fb_gfx_mmx.h"
extern void fb_hPutTrans1MMX(unsigned char *src, unsigned char *dest, int w, int h, int src_pitch, int dest_pitch, int alpha, BLENDER *blender, void *param);
extern void fb_hPutTrans2MMX(unsigned char *src, unsigned char *dest, int w, int h, int src_pitch, int dest_pitch, int alpha, BLENDER *blender, void *param);
extern void fb_hPutTrans4MMX(unsigned char *src, unsigned char *dest, int w, int h, int src_pitch, int dest_pitch, int alpha, BLENDER *blender, void *param);
#endif
void fb_hPutTrans1C(unsigned char *src, unsigned char *dest, int w, int h, int src_pitch, int dest_pitch, int alpha, BLENDER *blender, void *param)
{
unsigned char *s = (unsigned char *)src;
unsigned char *d;
int x;
src_pitch -= w;
for (; h; h--) {
d = (unsigned char *)dest;
for (x = w; x; x--) {
if (*s)
*d = (unsigned int)*s;
s++;
d++;
}
s += src_pitch;
dest += dest_pitch;
}
}
static void fb_hPutTrans2C(unsigned char *src, unsigned char *dest, int w, int h, int src_pitch, int dest_pitch, int alpha, BLENDER *blender, void *param)
{
unsigned short *s = (unsigned short *)src;
unsigned short *d;
int x;
src_pitch = (src_pitch >> 1) - w;
for (; h; h--) {
d = (unsigned short *)dest;
for (x = w; x; x--) {
if (*s != MASK_COLOR_16)
*d = (unsigned short)*s;
s++;
d++;
}
s += src_pitch;
dest += dest_pitch;
}
}
static void fb_hPutTrans4C(unsigned char *src, unsigned char *dest, int w, int h, int src_pitch, int dest_pitch, int alpha, BLENDER *blender, void *param)
{
unsigned int *s = (unsigned int *)src;
unsigned int *d, c;
int x;
src_pitch = (src_pitch >> 2) - w;
for (; h; h--) {
d = (unsigned int *)dest;
for (x = w; x; x--) {
c = *s & 0x00FFFFFF;
if (c != MASK_COLOR_32)
*d = c;
s++;
d++;
}
s += src_pitch;
dest += dest_pitch;
}
}
/* Not thread-safe; putters should only be called from other gfx functions that
take care of the synchronization */
void fb_hPutTrans(unsigned char *src, unsigned char *dest, int w, int h, int src_pitch, int dest_pitch, int alpha, BLENDER *blender, void *param)
{
static PUTTER *all_putters[] = {
fb_hPutTrans1C, fb_hPutTrans2C, NULL, fb_hPutTrans4C,
#ifdef HOST_X86
fb_hPutTrans1MMX, fb_hPutTrans2MMX, NULL, fb_hPutTrans4MMX,
#endif
};
PUTTER *putter;
FB_GFXCTX *context = fb_hGetContext();
if (!context->putter[PUT_MODE_TRANS]) {
#ifdef HOST_X86
if (__fb_gfx->flags & X86_MMX_ENABLED)
context->putter[PUT_MODE_TRANS] = &all_putters[4];
else
#endif
context->putter[PUT_MODE_TRANS] = &all_putters[0];
}
putter = context->putter[PUT_MODE_TRANS][context->target_bpp - 1];
putter(src, dest, w, h, src_pitch, dest_pitch, alpha, blender, param);
}