Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  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_
  109.