File: graph2.c

package info (click to toggle)
xsystem35 2.17.0-1
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 8,096 kB
  • sloc: ansic: 38,159; java: 4,085; xml: 249; sh: 134; python: 15; makefile: 12
file content (108 lines) | stat: -rw-r--r-- 2,895 bytes parent folder | download | duplicates (2)
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
98
99
100
101
102
103
104
105
106
107
108
void gr_fill_alpha_overborder(surface_t *dst, int dx, int dy, int dw, int dh, int s, int d) {
	uint8_t *dp;
	int x, y;
	
	if (dst == NULL) return;
	if (!gr_clip_xywh(dst, &dx, &dy, &dw, &dh)) return;
	
	dp = GETOFFSET_ALPHA(dst, dx, dy);
	if (dp == NULL) return;
	
	for (y = 0; y < dh; y++) {
		for (x = 0; x < dw; x++) {
			if (*(dp + x) >= (uint8_t)s) *(dp + x) = (uint8_t)d;
		}
		dp += dst->width;
	}
}

void gr_fill_alpha_underborder(surface_t *dst, int dx, int dy, int dw, int dh, int s, int d) {
	uint8_t *dp;
	int x, y;

	if (dst == NULL) return;
	if (!gr_clip_xywh(dst, &dx, &dy, &dw, &dh)) return;
	
	dp = GETOFFSET_ALPHA(dst, dx, dy);
	if (dp == NULL) return;
	
	for (y = 0; y < dh; y++) {
		for (x = 0; x < dw; x++) {
			if (*(dp + x) <= (uint8_t)s) *(dp + x) = (uint8_t)d;
		}
		dp += dst->width;
	}
}

void gr_copy_alpha_map_sprite(surface_t *dst, int dx, int dy, surface_t *src, int sx, int sy, int sw, int sh, int cl) {
	uint8_t *sp, *dp;
	int x, y;
	
	if (!gr_clip(src, &sx, &sy, &sw, &sh, dst, &dx, &dy)) return;
	
	sp = GETOFFSET_ALPHA(src, sx, sy);
	dp = GETOFFSET_ALPHA(dst, dx, dy);
	
	if (src == dst) {
		if (sy <= dy && dy < (sy + sh)) {
			sp += (sh -1) * src->width;
			dp += (sh -1) * dst->width;
			for (y = 0; y < sh; y++) {
				for (x = 0; x < sw; x++) {
					if (*(sp + x) != cl) *(dp + x) = *(sp + x);
				}
				sp -= src->width;
				dp -= dst->width;
			}
		} else {
			for (y = 0; y < sh; y++) {
				for (x = 0; x < sw; x++) {
					if (*(sp + x) != cl) *(dp + x) = *(sp + x);
				}
				sp += src->width;
				dp += dst->width;
			}
		}
	} else {
		for (y = 0; y < sh; y++) {
			for (x = 0; x < sw; x++) {
				if (*(sp + x) != cl) *(dp + x) = *(sp + x);
			}
			sp += src->width;
			dp += dst->width;
		}
	}
}

void gr_blend_alpha_wds_stretch2x2(surface_t *src1, int sx1, int sy1, surface_t *src2, int sx2, int sy2, int sw, int sh, surface_t *dst, int dx, int dy) {
	surface_t *t = sf_create_surface(sw * 2, sh * 2);
	
	gr_copy_stretch(t, 0, 0, sw * 2, sh * 2, src2, sx2, sy2, sw, sh);
	gr_blend_alpha_wds(t, 0, 0, src1, sx1, sy1, sw * 2, sh * 2, dst, dx, dy);
	
	sf_free(t);

}

void gr_blend_alpha_wds(surface_t *src1, int sx1, int sy1, surface_t *src2, int sx2, int sy2, int sw, int sh, surface_t *dst, int dx, int dy) {
	int x, y;
	uint8_t *sp1, *sp2, *dp, *sa;
	
	sp1  = GETOFFSET_PIXEL(src1, sx1, sy1);
	sp2  = GETOFFSET_PIXEL(src2, sx2, sy2);
	sa   = GETOFFSET_ALPHA(src1, sx1, sy1);
	dp   = GETOFFSET_PIXEL(dst, dx, dy);
	
	for (y = 0; y < sh; y++) {
		uint32_t *yls1 = (uint32_t *)(sp1  + y * src1->sdl_surface->pitch);
		uint32_t *yls2 = (uint32_t *)(sp2  + y * src2->sdl_surface->pitch);
		uint32_t *yld  = (uint32_t *)(dp   + y * dst->sdl_surface->pitch);
		uint8_t  *yla  = (uint8_t  *)(sa   + y * src1->width);
		
		for (x = 0; x < sw; x++) {
			*yld = SUTURADD24(*yls1, ALPHABLEND24(*yls1, *yls2, *yla));
			yls1++; yls2++; yld++; yla++;
		}
	}
}