Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1769 yogev_ezra 1
#ifndef __SSE2_LIVE_H_INCLUDED_
2
#define __SSE2_LIVE_H_INCLUDED_
3
 
4
//
5
// In DLL:
6
//
7
// void __stdcall OneGeneration(int w, int h, void *dest, const void *src, int flag);
8
//
9
 
10
inline int GetDataWidth(int w) {return (w + 63) & ~63;}
11
inline int GetDataHeight(int h) {return (h + 7) & ~7;}
12
inline int GetDataNBlock(int w) {return GetDataWidth(w) / 64;}
13
inline int GetDataPeriod(int h) {return GetDataHeight(h) * 8;}
14
inline int GetDataSize(int w, int h) {return GetDataNBlock(w) * GetDataPeriod(h);}
15
const int DataMemAdd = 16;  // using: new char[GetDataSize(w, h) + DataMemAdd];
16
inline void *GetDataAddress(void *data) {return (void*)(((unsigned int)data + 15) & ~15);}
17
 
18
inline bool GetDataBit(unsigned int w0, unsigned int h0, const void *data0, unsigned int x, unsigned int y)
19
{			// w0 = GetDataWidth(w); h0 = GetDataHeight(h); data0 = GetDataAddress(data);
20
	unsigned int nblk = w0 >> 6, sblk = h0 >> 1;
21
	unsigned int x1 = x % nblk, x2 = x / nblk;
22
	unsigned int y1 = y % sblk, y2 = y / sblk;
23
	unsigned int index = ((x1*sblk + y1) << 2) + (y2 << 1) + (x2 >> 5);
24
	return (((const unsigned int*)data0)[index] >> (x2 & 31)) & 1;
25
}
26
 
27
inline void Set0DataBit(unsigned int w0, unsigned int h0, void *data0, unsigned int x, unsigned int y)
28
{			// w0 = GetDataWidth(w); h0 = GetDataHeight(h); data0 = GetDataAddress(data);
29
	unsigned int nblk = w0 >> 6, sblk = h0 >> 1;
30
	unsigned int x1 = x % nblk, x2 = x / nblk;
31
	unsigned int y1 = y % sblk, y2 = y / sblk;
32
	unsigned int index = ((x1*sblk + y1) << 2) + (y2 << 1) + (x2 >> 5);
33
	((unsigned int*)data0)[index] &= ~(1U << (x2 & 31));
34
}
35
 
36
inline void Set1DataBit(unsigned int w0, unsigned int h0, void *data0, unsigned int x, unsigned int y)
37
{			// w0 = GetDataWidth(w); h0 = GetDataHeight(h); data0 = GetDataAddress(data);
38
	unsigned int nblk = w0 >> 6, sblk = h0 >> 1;
39
	unsigned int x1 = x % nblk, x2 = x / nblk;
40
	unsigned int y1 = y % sblk, y2 = y / sblk;
41
	unsigned int index = ((x1*sblk + y1) << 2) + (y2 << 1) + (x2 >> 5);
42
	((unsigned int*)data0)[index] |= 1U << (x2 & 31);
43
}
44
 
45
inline void SetCDataBit(unsigned int w0, unsigned int h0, void *data0, unsigned int x, unsigned int y)
46
{			// w0 = GetDataWidth(w); h0 = GetDataHeight(h); data0 = GetDataAddress(data);
47
	unsigned int nblk = w0 >> 6, sblk = h0 >> 1;
48
	unsigned int x1 = x % nblk, x2 = x / nblk;
49
	unsigned int y1 = y % sblk, y2 = y / sblk;
50
	unsigned int index = ((x1*sblk + y1) << 2) + (y2 << 1) + (x2 >> 5);
51
	((unsigned int*)data0)[index] ^= 1U << (x2 & 31);
52
}
53
 
54
inline void SetDataBit(unsigned int w0, unsigned int h0, void *data0, unsigned int x, unsigned int y, bool bit)
55
{
56
	if (bit) Set1DataBit(w0, h0, data0, x, y);
57
	else Set0DataBit(w0, h0, data0, x, y);
58
}
59
 
60
struct APosPixel
61
{
62
	int nblk, sblk;
63
	void *data;
64
	unsigned int x1, y1, value, *item;
65
 
66
	APosPixel(int w = 0, int h = 0, void *data = 0, int x = 0, int y = 0)
67
			: nblk(GetDataWidth(w) >> 6), sblk(GetDataHeight(h) >> 1),
68
			data(GetDataAddress(data)) {SetTo(x, y);}
69
	void SetTo(int x, int y)
70
	{
71
		unsigned int x2, y2;
72
		x1 = x % nblk; x2 = x / nblk;
73
		y1 = y % sblk; y2 = y / sblk;
74
		item = ((unsigned int*)data) + ((x1*sblk + y1) << 2) + (y2 << 1) + (x2 >> 5);
75
		value = 1U << (x2 & 31);
76
	}
77
 
78
	bool GetPixel() const {return *item & value;}
79
	void Set1Pixel() const {*item |= value;}
80
	void Set0Pixel() const {*item &= ~value;}
81
	void SetCPixel() const {*item ^= value;}
82
	void SetPixel(bool c) const {if (c) Set1Pixel(); else Set0Pixel();}
83
 
84
	void AddX1()
85
	{
86
		if (int(++x1) < nblk) {item += sblk << 2; return;}
87
		x1 = 0; item -= (nblk-1) * sblk << 2;
88
		if (!(value <<= 1)) {value = 1; item++;}
89
	}
90
	void SubX1()
91
	{
92
		if (int(--x1) >= 0) {item -= sblk << 2; return;}
93
		x1 = nblk-1; item += (nblk-1) * sblk << 2;
94
		if (!(value >>= 1)) {value = 0x80000000; item--;}
95
	}
96
	void AddY1()
97
	{
98
		if (int(++y1) < sblk) {item += 1 << 2; return;}
99
		y1 = 0; item -= ((sblk-1) << 2) - 2;
100
	}
101
	void SubY1()
102
	{
103
		if (int(--y1) >= 0) {item -= 1 << 2; return;}
104
		y1 = sblk-1; item += ((sblk-1) << 2) - 2;
105
	}
106
};
107
 
108
#endif  // __SSE2_LIVE_H_INCLUDED_