1/*
2 * Copyright 2005, Stephan A��mus <superstippi@gmx.de>. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * DrawingMode implementing B_OP_COPY ignoring the pattern (solid) on B_RGBA32.
6 *
7 */
8
9#ifndef DRAWING_MODE_COPY_SOLID_H
10#define DRAWING_MODE_COPY_SOLID_H
11
12#include "DrawingModeOver.h"
13
14// blend_pixel_copy_solid
15void
16blend_pixel_copy_solid(int x, int y, const color_type& c, uint8 cover,
17					   agg_buffer* buffer, const PatternHandler* pattern)
18{
19	uint8* p = buffer->row_ptr(y) + (x << 2);
20	if (cover == 255) {
21		ASSIGN_OVER(p, c.r, c.g, c.b);
22	} else {
23		BLEND_OVER(p, c.r, c.g, c.b, cover);
24	}
25}
26
27// blend_hline_copy_solid
28void
29blend_hline_copy_solid(int x, int y, unsigned len,
30					   const color_type& c, uint8 cover,
31					   agg_buffer* buffer, const PatternHandler* pattern)
32{
33	if (cover == 255) {
34		uint32 v;
35		uint8* p8 = (uint8*)&v;
36		p8[0] = (uint8)c.b;
37		p8[1] = (uint8)c.g;
38		p8[2] = (uint8)c.r;
39		p8[3] = 255;
40		uint32* p32 = (uint32*)(buffer->row_ptr(y)) + x;
41		do {
42			*p32 = v;
43			p32++;
44			x++;
45		} while(--len);
46	} else {
47		uint8* p = buffer->row_ptr(y) + (x << 2);
48		do {
49			BLEND_OVER(p, c.r, c.g, c.b, cover);
50			x++;
51			p += 4;
52		} while(--len);
53	}
54}
55
56// blend_solid_hspan_copy_solid
57void
58blend_solid_hspan_copy_solid(int x, int y, unsigned len,
59							 const color_type& c, const uint8* covers,
60							 agg_buffer* buffer,
61							 const PatternHandler* pattern)
62{
63	uint8* p = buffer->row_ptr(y) + (x << 2);
64	do {
65		if (*covers) {
66			if (*covers == 255) {
67				ASSIGN_OVER(p, c.r, c.g, c.b);
68			} else {
69				BLEND_OVER(p, c.r, c.g, c.b, *covers);
70			}
71		}
72		covers++;
73		p += 4;
74		x++;
75	} while(--len);
76}
77
78
79
80// blend_solid_vspan_copy_solid
81void
82blend_solid_vspan_copy_solid(int x, int y, unsigned len,
83							 const color_type& c, const uint8* covers,
84							 agg_buffer* buffer,
85							 const PatternHandler* pattern)
86{
87	uint8* p = buffer->row_ptr(y) + (x << 2);
88	do {
89		if (*covers) {
90			if (*covers == 255) {
91				ASSIGN_OVER(p, c.r, c.g, c.b);
92			} else {
93				BLEND_OVER(p, c.r, c.g, c.b, *covers);
94			}
95		}
96		covers++;
97		p += buffer->stride();
98		y++;
99	} while(--len);
100}
101
102
103// blend_color_hspan_copy_solid
104void
105blend_color_hspan_copy_solid(int x, int y, unsigned len,
106							 const color_type* colors, const uint8* covers,
107							 uint8 cover,
108							 agg_buffer* buffer,
109							 const PatternHandler* pattern)
110{
111	uint8* p = buffer->row_ptr(y) + (x << 2);
112	if (covers) {
113		// non-solid opacity
114		do {
115				if (*covers) {
116				if (*covers == 255) {
117					ASSIGN_OVER(p, colors->r, colors->g, colors->b);
118				} else {
119					BLEND_OVER(p, colors->r, colors->g, colors->b, *covers);
120				}
121			}
122			covers++;
123			p += 4;
124			++colors;
125		} while(--len);
126	} else {
127		// solid full opcacity
128		if (cover == 255) {
129			do {
130				ASSIGN_OVER(p, colors->r, colors->g, colors->b);
131				p += 4;
132				++colors;
133			} while(--len);
134		// solid partial opacity
135		} else if (cover) {
136			do {
137				BLEND_OVER(p, colors->r, colors->g, colors->b, cover);
138				p += 4;
139				++colors;
140			} while(--len);
141		}
142	}
143}
144
145#endif // DRAWING_MODE_COPY_SOLID_H
146
147