xref: /haiku/src/system/boot/platform/riscv/graphics.cpp (revision 17889a8c70dbb3d59c1412f6431968753c767bab)
1 /*
2  * Copyright 2021, Haiku, Inc.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include "graphics.h"
8 
9 
10 RasBuf32 gFramebuf = {NULL, 0, 0, 0};
11 
12 
13 void
14 Clear(RasBuf32 vb, uint32_t c)
15 {
16 	vb.stride -= vb.width;
17 	for (; vb.height > 0; vb.height--) {
18 		for (int x = 0; x < vb.width; x++) {
19 			*vb.colors = c;
20 			vb.colors++;
21 		}
22 		vb.colors += vb.stride;
23 	}
24 }
25 
26 
27 template <typename Color>
28 RasBuf<Color>
29 RasBuf<Color>::Clip(int x, int y, int w, int h) const
30 {
31 	RasBuf<Color> vb = *this;
32 	if (x < 0) {w += x; x = 0;}
33 	if (y < 0) {h += y; y = 0;}
34 	if (x + w > vb.width) {w = vb.width - x;}
35 	if (y + h > vb.height) {h = vb.height - y;}
36 	if (w > 0 && h > 0) {
37 		vb.colors += y*vb.stride + x;
38 		vb.width = w;
39 		vb.height = h;
40 	} else {
41 		vb.colors = 0;
42 		vb.width = 0;
43 		vb.height = 0;
44 	}
45 	return vb;
46 }
47 
48 template class RasBuf<uint8>;
49 template class RasBuf<uint32>;
50 
51 
52 RasBuf8
53 Font::ThisGlyph(uint32 ch)
54 {
55 	if (ch < firstChar || ch >= firstChar + charCnt)
56 		return ThisGlyph(' ');
57 
58 	RasBuf8 rb;
59 	rb.colors = data + (ch - firstChar) * charWidth * charHeight;
60 	rb.stride = charWidth;
61 	rb.width = charWidth;
62 	rb.height = charHeight;
63 	return rb;
64 }
65 
66 
67 void
68 BlitMaskRgb(RasBuf32 dst, RasBuf8 src, int32 x, int32 y, uint32_t c)
69 {
70 	int dstW, dstH;
71 	uint32_t dc, a;
72 	dstW = dst.width; dstH = dst.height;
73 	dst = dst.Clip(x, y, src.width, src.height);
74 	src = src.Clip(-x, -y, dstW, dstH);
75 	dst.stride -= dst.width;
76 	src.stride -= src.width;
77 	for (; dst.height > 0; dst.height--) {
78 		for (x = dst.width; x > 0; x--) {
79 			dc = *dst.colors;
80 			a = *src.colors;
81 			if (a != 0) {
82 				*dst.colors =
83 					  ((((dc >>  0) % 0x100) * (0xff - a) / 0xff
84 						+ ((c >>  0) % 0x100) * a / 0xff) <<  0)
85 					+ ((((dc >>  8) % 0x100) * (0xff - a) / 0xff
86 						+ ((c >>  8) % 0x100) * a / 0xff) <<  8)
87 					+ ((((dc >> 16) % 0x100) * (0xff - a) / 0xff
88 						+ ((c >> 16) % 0x100) * a / 0xff) << 16)
89 					+ (dc & 0xff000000);
90 			}
91 			dst.colors++;
92 			src.colors++;
93 		}
94 		dst.colors += dst.stride;
95 		src.colors += src.stride;
96 	}
97 }
98