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_ALPHA in "Pixel Overlay" mode on B_RGBA32.
6 *
7 */
8
9#ifndef DRAWING_MODE_ALPHA_PO_SOLID_H
10#define DRAWING_MODE_ALPHA_PO_SOLID_H
11
12#include "DrawingModeAlphaPO.h"
13
14// blend_pixel_alpha_po_solid
15void
16blend_pixel_alpha_po_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	uint16 alpha = c.a * cover;
21	if (alpha == 255 * 255) {
22		ASSIGN_ALPHA_PO(p, c.r, c.g, c.b);
23	} else {
24		BLEND_ALPHA_PO(p, c.r, c.g, c.b, alpha);
25	}
26}
27
28// blend_hline_alpha_po_solid
29void
30blend_hline_alpha_po_solid(int x, int y, unsigned len,
31						   const color_type& c, uint8 cover,
32						   agg_buffer* buffer, const PatternHandler* pattern)
33{
34	uint16 alpha = c.a * cover;
35	if (alpha == 255 * 255) {
36		// cache the color as 32bit values
37		uint32 v;
38		uint8* p8 = (uint8*)&v;
39		p8[0] = c.b;
40		p8[1] = c.g;
41		p8[2] = c.r;
42		p8[3] = 255;
43		// row offset as 32bit pointer
44		uint32* p32 = (uint32*)(buffer->row_ptr(y)) + x;
45		do {
46			*p32 = v;
47			p32++;
48			x++;
49		} while(--len);
50	} else {
51		uint8* p = buffer->row_ptr(y) + (x << 2);
52		if (len < 4) {
53			do {
54				BLEND_ALPHA_CO(p, c.r, c.g, c.b, alpha);
55				x++;
56				p += 4;
57			} while(--len);
58		} else {
59			alpha = alpha >> 8;
60			blend_line32(p, len, c.r, c.g, c.b, alpha);
61		}
62	}
63}
64
65// blend_solid_hspan_alpha_po_solid
66void
67blend_solid_hspan_alpha_po_solid(int x, int y, unsigned len,
68								 const color_type& c, const uint8* covers,
69						 		 agg_buffer* buffer, const PatternHandler* pattern)
70{
71	uint8* p = buffer->row_ptr(y) + (x << 2);
72	do {
73		uint16 alpha = c.a * *covers;
74		if (alpha) {
75			if(alpha == 255 * 255) {
76				ASSIGN_ALPHA_PO(p, c.r, c.g, c.b);
77			} else {
78				BLEND_ALPHA_PO(p, c.r, c.g, c.b, alpha);
79			}
80		}
81		covers++;
82		p += 4;
83		x++;
84	} while(--len);
85}
86
87
88
89// blend_solid_vspan_alpha_po_solid
90void
91blend_solid_vspan_alpha_po_solid(int x, int y, unsigned len,
92								 const color_type& c, const uint8* covers,
93								 agg_buffer* buffer, const PatternHandler* pattern)
94{
95	uint8* p = buffer->row_ptr(y) + (x << 2);
96	do {
97		uint16 alpha = c.a * *covers;
98		if (alpha) {
99			if (alpha == 255 * 255) {
100				ASSIGN_ALPHA_PO(p, c.r, c.g, c.b);
101			} else {
102				BLEND_ALPHA_PO(p, c.r, c.g, c.b, alpha);
103			}
104		}
105		covers++;
106		p += buffer->stride();
107		y++;
108	} while(--len);
109}
110
111#endif // DRAWING_MODE_ALPHA_PO_SOLID_H
112
113