xref: /haiku/src/servers/app/drawing/drawing_support.h (revision 4c8e85b316c35a9161f5a1c50ad70bc91c83a76f)
1 /*
2  * Copyright 2005-2007, Haiku.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Stephan Aßmus <superstippi@gmx.de>
7  */
8 #ifndef DRAWING_SUPPORT_H
9 #define DRAWING_SUPPORT_H
10 
11 
12 #include <SupportDefs.h>
13 #include <string.h>
14 
15 class BRect;
16 
17 
18 // gfxset32
19 // * numBytes is expected to be a multiple of 4
20 static inline void
21 gfxset32(uint8* dst, uint32 color, int32 numBytes)
22 {
23 	uint64 s64 = ((uint64)color << 32) | color;
24 	while (numBytes >= 8) {
25 		*(uint64*)dst = s64;
26 		numBytes -= 8;
27 		dst += 8;
28 	}
29 	if (numBytes == 4) {
30 		*(uint32*)dst = color;
31 	}
32 }
33 
34 union pixel32 {
35 	uint32	data32;
36 	uint8	data8[4];
37 };
38 
39 // blend_line32
40 static inline void
41 blend_line32(uint8* buffer, int32 pixels, uint8 r, uint8 g, uint8 b, uint8 a)
42 {
43 	pixel32 p;
44 
45 	r = (r * a) >> 8;
46 	g = (g * a) >> 8;
47 	b = (b * a) >> 8;
48 	a = 255 - a;
49 
50 	uint8 tempBuffer[pixels * 4];
51 
52 	uint8* t = tempBuffer;
53 	uint8* s = buffer;
54 
55 	for (int32 i = 0; i < pixels; i++) {
56 		p.data32 = *(uint32*)s;
57 
58 		t[0] = ((p.data8[0] * a) >> 8) + b;
59 		t[1] = ((p.data8[1] * a) >> 8) + g;
60 		t[2] = ((p.data8[2] * a) >> 8) + r;
61 
62 		t += 4;
63 		s += 4;
64 	}
65 
66 	memcpy(buffer, tempBuffer, pixels * 4);
67 }
68 
69 void align_rect_to_pixels(BRect* rect);
70 
71 #endif	// DRAWING_SUPPORT_H
72