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_><>><>><>><>>><>><>=><=>><>><>>><>><>><>><>><>><>><>><>><>><>><>><>><>><> |