Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: PixelBuffer.cpp
- Revision:
- 46:2374900f8845
- Parent:
- 36:0fe7917a832a
diff -r 1ec0f097fa0d -r 2374900f8845 PixelBuffer.cpp
--- 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;