TLIGHT_PRODUCTS / WS281X
Revision:
46:2374900f8845
Parent:
36:0fe7917a832a
--- a/PixelBuffer.cpp	Sat Dec 17 00:23:44 2016 +0000
+++ b/PixelBuffer.cpp	Tue Dec 20 03:22:01 2016 +0000
@@ -34,14 +34,14 @@
 RGBPixels::RGBPixels(RGBColor *buffer, int maxPixels)
     : _owned_buffer(false)
 {
-    _dummyPixel = 0;
+    _dummy_pixel = 0;
     setPixelBuffer(buffer, maxPixels);
 }
 
 RGBPixels::RGBPixels(int maxPixels)
     : _owned_buffer(false)
 {
-    _dummyPixel = 0;
+    _dummy_pixel = 0;
     setPixelBuffer(nullptr, maxPixels);
 }
 
@@ -61,43 +61,43 @@
 #endif
     }
     _owned_buffer = false;
-    _maxPixels = (maxPixels < 0) ? 0 : (maxPixels > MAX_PIXELS) ? MAX_PIXELS : maxPixels;
-    _pixels = (!_maxPixels) ? NULL : buffer;
+    _max_pixels = (maxPixels < 0) ? 0 : (maxPixels > MAX_PIXELS) ? MAX_PIXELS : maxPixels;
+    _pixels = (!_max_pixels) ? NULL : buffer;
 
-    if (!_pixels && _maxPixels > 0)
+    if (!_pixels && _max_pixels > 0)
     {
 #if USE_MALLOC
-        _pixels = static_cast<RGBColor*>(malloc(sizeof(RGBColor)*_maxPixels));
+        _pixels = static_cast<RGBColor*>(malloc(sizeof(RGBColor)*_max_pixels));
         if (_pixels)
             _owned_buffer = true;
         else
-            _maxPixels = 0;
+            _max_pixels = 0;
 #else
-        _pixels = new RGBColor[_maxPixels];
+        _pixels = new RGBColor[_max_pixels];
         _owned_buffer = true;
 #endif
     }
-    _numPixels = _maxPixels;
+    _num_pixels = _max_pixels;
     clear();
 }
 
 int RGBPixels::numPixels(int value)
 {
     if (value >= 0)
-        _numPixels = (value > _maxPixels) ? _maxPixels : value;
-    return _numPixels;
+        _num_pixels = (value > _max_pixels) ? _max_pixels : value;
+    return _num_pixels;
 }
 
 // 指定位置のピクセルへ色配列を指定サイズ分をコピーする
 void RGBPixels::setPixels(int index, RGBColor *color, int len)
 {
-    int numPixels = static_cast<int>(_numPixels);
-    if (_pixels && len > 0 && index < numPixels && (index + len) >= 0)
+    int numPixels = static_cast<int>(_num_pixels);
+    if (_pixels && len > 0 && index < numPixels && (index + len) > 0)
     {
         if (index < 0)
 		{
 			len   += index;
-			color -= index;
+			color -= index;			// <- color += -index;
 			index  = 0;
 		}
         if (index + len > numPixels)
@@ -108,8 +108,8 @@
 
 void RGBPixels::setPixels(int index, HSVColor *color, int len)
 {
-    int numPixels = static_cast<int>(_numPixels);
-    if (_pixels && len > 0 && index < numPixels && (index + len) >= 0)
+    int numPixels = static_cast<int>(_num_pixels);
+    if (_pixels && len > 0 && index < numPixels && (index + len) > 0)
     {
         if (index < 0)
 		{
@@ -127,11 +127,60 @@
     }
 }
 
+void RGBPixels::setGammaPixels(int index, RGBColor *color, int len)
+{
+    int numPixels = static_cast<int>(_num_pixels);
+    if (_pixels && len > 0 && index < numPixels && (index + len) > 0)
+    {
+        if (index < 0)
+		{
+			len   += index;
+			color -= index;
+			index  = 0;
+		}
+        if (index + len > numPixels)
+            len = numPixels - index;
+        uint8_t *dst = reinterpret_cast<uint8_t *>(&_pixels[index]);
+        uint8_t *src = reinterpret_cast<uint8_t *>(color);
+		const uint8_t *gammatab = GetGammaTable();
+		len *= 3;
+        do
+        {
+            *dst++ = gammatab[*src++];
+        } while (--len);
+    }
+}
+
+void RGBPixels::setGammaPixels(int index, HSVColor *color, int len)
+{
+    int numPixels = static_cast<int>(_num_pixels);
+    if (_pixels && len > 0 && index < numPixels && (index + len) > 0)
+    {
+        if (index < 0)
+		{
+			len   += index;
+			color -= index;
+			index  = 0;
+		}
+        if (index + len > numPixels)
+            len = numPixels - index;
+        uint8_t *dst = reinterpret_cast<uint8_t *>(&_pixels[index]);
+		const uint8_t *gammatab = GetGammaTable();
+        do
+        {
+			RGBColor col = *color++;
+	    	*dst++ = gammatab[col.r];
+	    	*dst++ = gammatab[col.g];
+	    	*dst++ = gammatab[col.b];
+        } while (--len);
+    }
+}
+
 // 指定色を指定位置のピクセルから指定サイズ分書き込む
 void RGBPixels::fillPixels(int index, const RGBColor color, int len)
 {
-    int numPixels = static_cast<int>(_numPixels);
-    if (_pixels && len > 0 && index < numPixels && (index + len) >= 0)
+    int numPixels = static_cast<int>(_num_pixels);
+    if (_pixels && len > 0 && index < numPixels && (index + len) > 0)
     {
         if (index < 0)
 		{
@@ -153,9 +202,9 @@
 // 先頭から指定サイズ分のブロックをバッファの最後までコピーする
 void RGBPixels::repeatPixels(int block_size)
 {
-    if (_pixels && block_size > 0 && block_size < _numPixels)
+    if (_pixels && block_size > 0 && block_size < _num_pixels)
     {
-        repeat_buffer<RGBColor>(_pixels, _numPixels, block_size);
+        repeat_buffer<RGBColor>(_pixels, _num_pixels, block_size);
     }
 }
 
@@ -163,10 +212,10 @@
 {
     if (_pixels && source && size > 0)
     {
-        if (size > _numPixels)
-            size = _numPixels;
+        if (size > _num_pixels)
+            size = _num_pixels;
         memcpy(_pixels, source, size * sizeof(_pixels[0]));
-        repeat_buffer<RGBColor>(_pixels, _numPixels, size);
+        repeat_buffer<RGBColor>(_pixels, _num_pixels, size);
     }
 }
 
@@ -174,35 +223,35 @@
 {
     if (_pixels && source && size > 0)
     {
-        if (size > _numPixels)
-            size = _numPixels;
+        if (size > _num_pixels)
+            size = _num_pixels;
         for (int i = 0; i < size; ++i)
             _pixels[i] = *source++;
-        repeat_buffer<RGBColor>(_pixels, _numPixels, size);
+        repeat_buffer<RGBColor>(_pixels, _num_pixels, size);
     }
 }
 
 RGBPixels& RGBPixels::operator=(const RGBPixels& rhs)
 {
-    if (!rhs._pixels || !rhs._maxPixels)
+    if (!rhs._pixels || !rhs._max_pixels)
     {
         // 右辺が空の場合何もしない
         return *this;
     }
-    if (!_pixels || !_maxPixels)
+    if (!_pixels || !_max_pixels)
     {
         // 自分のバッファなしの場合、、新規確保
-        setPixelBuffer(nullptr, rhs._maxPixels);
+        setPixelBuffer(nullptr, rhs._max_pixels);
     }
 
-    if (_pixels && _maxPixels)
+    if (_pixels && _max_pixels)
     {
-        _numPixels = rhs._numPixels;
-        if (_numPixels > rhs._maxPixels)
-            _numPixels = rhs._maxPixels;
-        if (_numPixels > _maxPixels)
-            _numPixels = _maxPixels;
-        memcpy(_pixels, rhs._pixels, sizeof(_pixels[0]) * _numPixels);
+        _num_pixels = rhs._num_pixels;
+        if (_num_pixels > rhs._max_pixels)
+            _num_pixels = rhs._max_pixels;
+        if (_num_pixels > _max_pixels)
+            _num_pixels = _max_pixels;
+        memcpy(_pixels, rhs._pixels, sizeof(_pixels[0]) * _num_pixels);
     }
 
     return *this;
@@ -211,12 +260,12 @@
 //----------------------------------------------------------------------------
 void RGBPixels::makeGradation(int index, RGBColor from, RGBColor to, int len)
 {
-    if (!_pixels || len < 1 || index >= _numPixels || (index + len) < 0)
+    if (!_pixels || len < 1 || index >= _num_pixels || (index + len) <= 0)
         return;
 
     int end = len;
-    if (index + end > _numPixels)
-        end = _numPixels - index;
+    if (index + end > _num_pixels)
+        end = _num_pixels - index;
 
     RGBColor color;
     RGBColor *dest = _pixels;
@@ -234,12 +283,12 @@
 
 void RGBPixels::makeRainbow(int index, HSVColor color, int len, int direction)
 {
-    if (!_pixels || len < 1 || index >= _numPixels || (index + len) < 0)
+    if (!_pixels || len < 1 || index >= _num_pixels || (index + len) <= 0)
         return;
 
     int end = len;
-    if (index + end > _numPixels)
-        end = _numPixels - index;
+    if (index + end > _num_pixels)
+        end = _num_pixels - index;
 
     HSVColor hsv(color);
     RGBColor *dest = _pixels;
@@ -258,14 +307,14 @@
 HSVPixels::HSVPixels(HSVColor *buffer, int maxPixels)
     : _owned_buffer(false)
 {
-    _dummyPixel = 0;
+    _dummy_pixel = 0;
     setPixelBuffer(buffer, maxPixels);
 }
 
 HSVPixels::HSVPixels(int maxPixels)
     : _owned_buffer(false)
 {
-    _dummyPixel = 0;
+    _dummy_pixel = 0;
     setPixelBuffer(nullptr, maxPixels);
 }
 
@@ -285,38 +334,38 @@
 #endif
     }
     _owned_buffer = false;
-    _maxPixels = (maxPixels < 0) ? 0 : (maxPixels > MAX_PIXELS) ? MAX_PIXELS : maxPixels;
-    _pixels = (!_maxPixels) ? NULL : buffer;
+    _max_pixels = (maxPixels < 0) ? 0 : (maxPixels > MAX_PIXELS) ? MAX_PIXELS : maxPixels;
+    _pixels = (!_max_pixels) ? NULL : buffer;
 
-    if (!_pixels && _maxPixels > 0)
+    if (!_pixels && _max_pixels > 0)
     {
 #if USE_MALLOC
-        _pixels = static_cast<HSVColor*>(malloc(sizeof(HSVColor)*_maxPixels));
+        _pixels = static_cast<HSVColor*>(malloc(sizeof(HSVColor)*_max_pixels));
         if (_pixels)
             _owned_buffer = true;
         else
-            _maxPixels = 0;
+            _max_pixels = 0;
 #else
-        _pixels = new HSVColor[_maxPixels];
+        _pixels = new HSVColor[_max_pixels];
         _owned_buffer = true;
 #endif
     }
-    _numPixels = _maxPixels;
+    _num_pixels = _max_pixels;
     clear();
 }
 
 int HSVPixels::numPixels(int value)
 {
     if (value >= 0)
-        _numPixels = (value > _maxPixels) ? _maxPixels : value;
-    return _numPixels;
+        _num_pixels = (value > _max_pixels) ? _max_pixels : value;
+    return _num_pixels;
 }
 
 // 指定位置のピクセルへ色配列を指定サイズ分をコピーする
 void HSVPixels::setPixels(int index, HSVColor *color, int len)
 {
-    int numPixels = static_cast<int>(_numPixels);
-    if (_pixels && len > 0 && index < numPixels && (index + len) >= 0)
+    int numPixels = static_cast<int>(_num_pixels);
+    if (_pixels && len > 0 && index < numPixels && (index + len) > 0)
     {
         if (index < 0)
 		{
@@ -332,8 +381,8 @@
 
 void HSVPixels::setPixels(int index, RGBColor *color, int len)
 {
-    int numPixels = static_cast<int>(_numPixels);
-    if (_pixels && len > 0 && index < numPixels && (index + len) >= 0)
+    int numPixels = static_cast<int>(_num_pixels);
+    if (_pixels && len > 0 && index < numPixels && (index + len) > 0)
     {
         if (index < 0)
 		{
@@ -354,8 +403,8 @@
 // 指定色を指定位置のピクセルから指定サイズ分書き込む
 void HSVPixels::fillPixels(int index, const HSVColor color, int len)
 {
-    int numPixels = static_cast<int>(_numPixels);
-    if (_pixels && len > 0 && index < numPixels && (index + len) >= 0)
+    int numPixels = static_cast<int>(_num_pixels);
+    if (_pixels && len > 0 && index < numPixels && (index + len) > 0)
     {
         if (index < 0)
 		{
@@ -377,9 +426,9 @@
 // 先頭から指定サイズ分のブロックをバッファの最後までコピーする
 void HSVPixels::repeatPixels(int block_size)
 {
-    if (_pixels && block_size > 0 && block_size < _numPixels)
+    if (_pixels && block_size > 0 && block_size < _num_pixels)
     {
-        repeat_buffer<HSVColor>(_pixels, _numPixels, block_size);
+        repeat_buffer<HSVColor>(_pixels, _num_pixels, block_size);
     }
 }
 
@@ -387,10 +436,10 @@
 {
     if (_pixels && source && size > 0)
     {
-        if (size > _numPixels)
-            size = _numPixels;
+        if (size > _num_pixels)
+            size = _num_pixels;
         memcpy(_pixels, source, size * sizeof(_pixels[0]));
-        repeat_buffer<HSVColor>(_pixels, _numPixels, size);
+        repeat_buffer<HSVColor>(_pixels, _num_pixels, size);
     }
 }
 
@@ -398,35 +447,35 @@
 {
     if (_pixels && source && size > 0)
     {
-        if (size > _numPixels)
-            size = _numPixels;
+        if (size > _num_pixels)
+            size = _num_pixels;
         for (int i = 0; i < size; ++i)
             _pixels[i] = *source++;
-        repeat_buffer<HSVColor>(_pixels, _numPixels, size);
+        repeat_buffer<HSVColor>(_pixels, _num_pixels, size);
     }
 }
 
 HSVPixels& HSVPixels::operator=(const HSVPixels& rhs)
 {
-    if (!rhs._pixels || !rhs._maxPixels)
+    if (!rhs._pixels || !rhs._max_pixels)
     {
         // 右辺が空の場合何もしない
         return *this;
     }
-    if (!_pixels || !_maxPixels)
+    if (!_pixels || !_max_pixels)
     {
         // 自分のバッファなしの場合、、新規確保
-        setPixelBuffer(nullptr, rhs._maxPixels);
+        setPixelBuffer(nullptr, rhs._max_pixels);
     }
 
-    if (_pixels && _maxPixels)
+    if (_pixels && _max_pixels)
     {
-        _numPixels = rhs._numPixels;
-        if (_numPixels > rhs._maxPixels)
-            _numPixels = rhs._maxPixels;
-        if (_numPixels > _maxPixels)
-            _numPixels = _maxPixels;
-        memcpy(_pixels, rhs._pixels, sizeof(_pixels[0]) * _numPixels);
+        _num_pixels = rhs._num_pixels;
+        if (_num_pixels > rhs._max_pixels)
+            _num_pixels = rhs._max_pixels;
+        if (_num_pixels > _max_pixels)
+            _num_pixels = _max_pixels;
+        memcpy(_pixels, rhs._pixels, sizeof(_pixels[0]) * _num_pixels);
     }
 
     return *this;
@@ -435,12 +484,12 @@
 //----------------------------------------------------------------------------
 void HSVPixels::makeGradation(int index, HSVColor from, HSVColor to, int len)
 {
-    if (!_pixels || len < 1 || index >= _numPixels || (index + len) < 0)
+    if (!_pixels || len < 1 || index >= _num_pixels || (index + len) <= 0)
         return;
 
     int end = len;
-    if (index + end > _numPixels)
-        end = _numPixels - index;
+    if (index + end > _num_pixels)
+        end = _num_pixels - index;
 
     RGBColor rgb_from(from);
     RGBColor rgb_to(to);
@@ -460,12 +509,12 @@
 
 void HSVPixels::makeRainbow(int index, HSVColor color, int len, int direction)
 {
-    if (!_pixels || len < 1 || index >= _numPixels || (index + len) < 0)
+    if (!_pixels || len < 1 || index >= _num_pixels || (index + len) <= 0)
         return;
 
     int end = len;
-    if (index + end > _numPixels)
-        end = _numPixels - index;
+    if (index + end > _num_pixels)
+        end = _num_pixels - index;
 
     HSVColor hsv(color);
     HSVColor *dest = _pixels;