TLIGHT_PRODUCTS / WS281X
Committer:
mutech
Date:
Tue Sep 06 22:12:59 2016 +0000
Revision:
27:bc79f444883b
Child:
28:b452e097da53
WS2811/WS2812 support Library;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mutech 27:bc79f444883b 1 /* PixelBuffer.cpp
mutech 27:bc79f444883b 2 * mbed Microcontroller Library
mutech 27:bc79f444883b 3 * Copyright (c) 2016 muetch, t.kuroki
mutech 27:bc79f444883b 4 * Allrights reserved.
mutech 27:bc79f444883b 5 *
mutech 27:bc79f444883b 6 * Rev 0.97 2016-09-07
mutech 27:bc79f444883b 7 */
mutech 27:bc79f444883b 8 #include "PixelBuffer.h"
mutech 27:bc79f444883b 9
mutech 27:bc79f444883b 10 //----------------------------------------------------------------------------
mutech 27:bc79f444883b 11 // 指定されたバッファの先頭からblock_size分をbuf_sizeが満杯になるまで繰り返しコピーする
mutech 27:bc79f444883b 12 template <class T>
mutech 27:bc79f444883b 13 static void repeat_buffer(T *buffer, int buf_size, int block_size = 1)
mutech 27:bc79f444883b 14 {
mutech 27:bc79f444883b 15 if (buffer && block_size > 0 && (uint16_t)block_size < buf_size)
mutech 27:bc79f444883b 16 {
mutech 27:bc79f444883b 17 T *dest = buffer + block_size;
mutech 27:bc79f444883b 18 int left = buf_size - block_size;
mutech 27:bc79f444883b 19 while (left > block_size)
mutech 27:bc79f444883b 20 {
mutech 27:bc79f444883b 21 memcpy(dest, buffer, block_size * sizeof(T));
mutech 27:bc79f444883b 22 dest += block_size;
mutech 27:bc79f444883b 23 left -= block_size;
mutech 27:bc79f444883b 24 block_size <<= 1; // 次回は2倍のサイズの転送
mutech 27:bc79f444883b 25 }
mutech 27:bc79f444883b 26 memcpy(dest, buffer, left * sizeof(T));
mutech 27:bc79f444883b 27 }
mutech 27:bc79f444883b 28 }
mutech 27:bc79f444883b 29
mutech 27:bc79f444883b 30 //----------------------------------------------------------------------------
mutech 27:bc79f444883b 31 RGBPixels::RGBPixels(RGBColor *buffer, int maxPixels)
mutech 27:bc79f444883b 32 : _buf_owner(false)
mutech 27:bc79f444883b 33 {
mutech 27:bc79f444883b 34 _dummyPixel = 0;
mutech 27:bc79f444883b 35 setPixelBuffer(buffer, maxPixels);
mutech 27:bc79f444883b 36 }
mutech 27:bc79f444883b 37
mutech 27:bc79f444883b 38 RGBPixels::RGBPixels(int maxPixels)
mutech 27:bc79f444883b 39 : _buf_owner(false)
mutech 27:bc79f444883b 40 {
mutech 27:bc79f444883b 41 _dummyPixel = 0;
mutech 27:bc79f444883b 42 setPixelBuffer(nullptr, maxPixels);
mutech 27:bc79f444883b 43 }
mutech 27:bc79f444883b 44
mutech 27:bc79f444883b 45 RGBPixels::~RGBPixels()
mutech 27:bc79f444883b 46 {
mutech 27:bc79f444883b 47 if (_buf_owner && _pixels)
mutech 27:bc79f444883b 48 delete[] _pixels;
mutech 27:bc79f444883b 49 }
mutech 27:bc79f444883b 50
mutech 27:bc79f444883b 51 void RGBPixels::setPixelBuffer(RGBColor *buffer, int maxPixels)
mutech 27:bc79f444883b 52 {
mutech 27:bc79f444883b 53 if (_buf_owner && _pixels)
mutech 27:bc79f444883b 54 delete[] _pixels;
mutech 27:bc79f444883b 55
mutech 27:bc79f444883b 56 _buf_owner = false;
mutech 27:bc79f444883b 57 _pixels = buffer;
mutech 27:bc79f444883b 58
mutech 27:bc79f444883b 59 _maxPixels = (maxPixels < 0) ? 0 : (maxPixels > MAX_PIXELS) ? MAX_PIXELS : maxPixels;
mutech 27:bc79f444883b 60 if (!_pixels && _maxPixels > 0)
mutech 27:bc79f444883b 61 {
mutech 27:bc79f444883b 62 _pixels = new RGBColor[_maxPixels];
mutech 27:bc79f444883b 63 _buf_owner = true;
mutech 27:bc79f444883b 64 }
mutech 27:bc79f444883b 65 _numPixels = _maxPixels;
mutech 27:bc79f444883b 66 clear();
mutech 27:bc79f444883b 67 }
mutech 27:bc79f444883b 68
mutech 27:bc79f444883b 69 int RGBPixels::numPixels(int value)
mutech 27:bc79f444883b 70 {
mutech 27:bc79f444883b 71 if (value >= 0)
mutech 27:bc79f444883b 72 _numPixels = (value > _maxPixels) ? _maxPixels : value;
mutech 27:bc79f444883b 73 return _numPixels;
mutech 27:bc79f444883b 74 }
mutech 27:bc79f444883b 75
mutech 27:bc79f444883b 76 // 指定位置のピクセルへ色配列を指定サイズ分をコピーする
mutech 27:bc79f444883b 77 void RGBPixels::setPixels(int index, RGBColor *color, int len)
mutech 27:bc79f444883b 78 {
mutech 27:bc79f444883b 79 if (_pixels && len > 0 && (uint16_t)index < _numPixels)
mutech 27:bc79f444883b 80 {
mutech 27:bc79f444883b 81 if (index + len > _numPixels)
mutech 27:bc79f444883b 82 len = _numPixels - index;
mutech 27:bc79f444883b 83 memcpy(&_pixels[index], color, len * sizeof(_pixels[0]));
mutech 27:bc79f444883b 84 }
mutech 27:bc79f444883b 85 }
mutech 27:bc79f444883b 86
mutech 27:bc79f444883b 87 void RGBPixels::setPixels(int index, HSVColor *color, int len)
mutech 27:bc79f444883b 88 {
mutech 27:bc79f444883b 89 if (_pixels && len > 0 && (uint16_t)index < _numPixels)
mutech 27:bc79f444883b 90 {
mutech 27:bc79f444883b 91 if (index + len > _numPixels)
mutech 27:bc79f444883b 92 len = _numPixels - index;
mutech 27:bc79f444883b 93 RGBColor *dest = &_pixels[index];
mutech 27:bc79f444883b 94 do
mutech 27:bc79f444883b 95 {
mutech 27:bc79f444883b 96 *dest++ = *color++;
mutech 27:bc79f444883b 97 } while (--len);
mutech 27:bc79f444883b 98 }
mutech 27:bc79f444883b 99 }
mutech 27:bc79f444883b 100
mutech 27:bc79f444883b 101 // 指定色を指定位置のピクセルから指定サイズ分書き込む
mutech 27:bc79f444883b 102 void RGBPixels::fillPixels(const RGBColor color, int index, int len)
mutech 27:bc79f444883b 103 {
mutech 27:bc79f444883b 104 if (_pixels && len > 0 && (uint16_t)index < _numPixels)
mutech 27:bc79f444883b 105 {
mutech 27:bc79f444883b 106 if (index + len > _numPixels)
mutech 27:bc79f444883b 107 len = _numPixels - index;
mutech 27:bc79f444883b 108 _pixels[index] = color;
mutech 27:bc79f444883b 109 repeat_buffer<RGBColor>(_pixels + index, len, 1);
mutech 27:bc79f444883b 110 }
mutech 27:bc79f444883b 111 }
mutech 27:bc79f444883b 112
mutech 27:bc79f444883b 113 void RGBPixels::fillPixels(const HSVColor color, int index, int len)
mutech 27:bc79f444883b 114 {
mutech 27:bc79f444883b 115 fillPixels(RGBColor(color), index, len);
mutech 27:bc79f444883b 116 }
mutech 27:bc79f444883b 117
mutech 27:bc79f444883b 118 // 先頭から指定サイズ分のブロックをバッファの最後までコピーする
mutech 27:bc79f444883b 119 void RGBPixels::repeatPixels(int block_size)
mutech 27:bc79f444883b 120 {
mutech 27:bc79f444883b 121 if (_pixels && block_size > 0 && block_size < _numPixels)
mutech 27:bc79f444883b 122 {
mutech 27:bc79f444883b 123 repeat_buffer<RGBColor>(_pixels, _numPixels, block_size);
mutech 27:bc79f444883b 124 }
mutech 27:bc79f444883b 125 }
mutech 27:bc79f444883b 126
mutech 27:bc79f444883b 127 void RGBPixels::repeatPixels(RGBColor *source, int size)
mutech 27:bc79f444883b 128 {
mutech 27:bc79f444883b 129 if (_pixels && source && size > 0)
mutech 27:bc79f444883b 130 {
mutech 27:bc79f444883b 131 if (size > _numPixels)
mutech 27:bc79f444883b 132 size = _numPixels;
mutech 27:bc79f444883b 133 memcpy(_pixels, source, size * sizeof(_pixels[0]));
mutech 27:bc79f444883b 134 repeat_buffer<RGBColor>(_pixels, _numPixels, size);
mutech 27:bc79f444883b 135 }
mutech 27:bc79f444883b 136 }
mutech 27:bc79f444883b 137
mutech 27:bc79f444883b 138 void RGBPixels::repeatPixels(HSVColor *source, int size)
mutech 27:bc79f444883b 139 {
mutech 27:bc79f444883b 140 if (_pixels && source && size > 0)
mutech 27:bc79f444883b 141 {
mutech 27:bc79f444883b 142 if (size > _numPixels)
mutech 27:bc79f444883b 143 size = _numPixels;
mutech 27:bc79f444883b 144 for (int i = 0; i < size; ++i)
mutech 27:bc79f444883b 145 _pixels[i] = *source++;
mutech 27:bc79f444883b 146 repeat_buffer<RGBColor>(_pixels, _numPixels, size);
mutech 27:bc79f444883b 147 }
mutech 27:bc79f444883b 148 }
mutech 27:bc79f444883b 149
mutech 27:bc79f444883b 150 RGBPixels& RGBPixels::operator=(const RGBPixels& rhs)
mutech 27:bc79f444883b 151 {
mutech 27:bc79f444883b 152 if (!rhs._pixels || !rhs._maxPixels)
mutech 27:bc79f444883b 153 {
mutech 27:bc79f444883b 154 // 右辺が空の場合何もしない
mutech 27:bc79f444883b 155 return *this;
mutech 27:bc79f444883b 156 }
mutech 27:bc79f444883b 157 if (!_pixels || !_maxPixels)
mutech 27:bc79f444883b 158 {
mutech 27:bc79f444883b 159 // 自分のバッファなしの場合、、新規確保
mutech 27:bc79f444883b 160 setPixelBuffer(nullptr, rhs._maxPixels);
mutech 27:bc79f444883b 161 }
mutech 27:bc79f444883b 162
mutech 27:bc79f444883b 163 if (_pixels && _maxPixels)
mutech 27:bc79f444883b 164 {
mutech 27:bc79f444883b 165 _numPixels = rhs._numPixels;
mutech 27:bc79f444883b 166 if (_numPixels > rhs._maxPixels)
mutech 27:bc79f444883b 167 _numPixels = rhs._maxPixels;
mutech 27:bc79f444883b 168 if (_numPixels > _maxPixels)
mutech 27:bc79f444883b 169 _numPixels = _maxPixels;
mutech 27:bc79f444883b 170 memcpy(_pixels, rhs._pixels, sizeof(_pixels[0]) * _numPixels);
mutech 27:bc79f444883b 171 }
mutech 27:bc79f444883b 172
mutech 27:bc79f444883b 173 return *this;
mutech 27:bc79f444883b 174 }
mutech 27:bc79f444883b 175
mutech 27:bc79f444883b 176 //----------------------------------------------------------------------------
mutech 27:bc79f444883b 177 //----------------------------------------------------------------------------
mutech 27:bc79f444883b 178 HSVPixels::HSVPixels(HSVColor *buffer, int maxPixels)
mutech 27:bc79f444883b 179 : _buf_owner(false)
mutech 27:bc79f444883b 180 {
mutech 27:bc79f444883b 181 _dummyPixel = 0;
mutech 27:bc79f444883b 182 setPixelBuffer(buffer, maxPixels);
mutech 27:bc79f444883b 183 }
mutech 27:bc79f444883b 184
mutech 27:bc79f444883b 185 HSVPixels::HSVPixels(int maxPixels)
mutech 27:bc79f444883b 186 : _buf_owner(false)
mutech 27:bc79f444883b 187 {
mutech 27:bc79f444883b 188 _dummyPixel = 0;
mutech 27:bc79f444883b 189 setPixelBuffer(nullptr, maxPixels);
mutech 27:bc79f444883b 190 }
mutech 27:bc79f444883b 191
mutech 27:bc79f444883b 192 HSVPixels::~HSVPixels()
mutech 27:bc79f444883b 193 {
mutech 27:bc79f444883b 194 if (_buf_owner && _pixels)
mutech 27:bc79f444883b 195 delete[] _pixels;
mutech 27:bc79f444883b 196 }
mutech 27:bc79f444883b 197
mutech 27:bc79f444883b 198 void HSVPixels::setPixelBuffer(HSVColor *buffer, int maxPixels)
mutech 27:bc79f444883b 199 {
mutech 27:bc79f444883b 200 if (_buf_owner && _pixels)
mutech 27:bc79f444883b 201 delete[] _pixels;
mutech 27:bc79f444883b 202
mutech 27:bc79f444883b 203 _buf_owner = false;
mutech 27:bc79f444883b 204 _pixels = buffer;
mutech 27:bc79f444883b 205
mutech 27:bc79f444883b 206 _maxPixels = (maxPixels < 0) ? 0 : (maxPixels > MAX_PIXELS) ? MAX_PIXELS : maxPixels;
mutech 27:bc79f444883b 207 if (!_pixels && _maxPixels > 0)
mutech 27:bc79f444883b 208 {
mutech 27:bc79f444883b 209 _pixels = new HSVColor[_maxPixels];
mutech 27:bc79f444883b 210 _buf_owner = true;
mutech 27:bc79f444883b 211 }
mutech 27:bc79f444883b 212 _numPixels = _maxPixels;
mutech 27:bc79f444883b 213 clear();
mutech 27:bc79f444883b 214 }
mutech 27:bc79f444883b 215
mutech 27:bc79f444883b 216 int HSVPixels::numPixels(int value)
mutech 27:bc79f444883b 217 {
mutech 27:bc79f444883b 218 if (value >= 0)
mutech 27:bc79f444883b 219 _numPixels = (value > _maxPixels) ? _maxPixels : value;
mutech 27:bc79f444883b 220 return _numPixels;
mutech 27:bc79f444883b 221 }
mutech 27:bc79f444883b 222
mutech 27:bc79f444883b 223 // 指定位置のピクセルへ色配列を指定サイズ分をコピーする
mutech 27:bc79f444883b 224 void HSVPixels::setPixels(int index, HSVColor *color, int len)
mutech 27:bc79f444883b 225 {
mutech 27:bc79f444883b 226 if (_pixels && len > 0 && (uint16_t)index < _numPixels)
mutech 27:bc79f444883b 227 {
mutech 27:bc79f444883b 228 if (index + len > _numPixels)
mutech 27:bc79f444883b 229 len = _numPixels - index;
mutech 27:bc79f444883b 230 memcpy(&_pixels[index], color, len * sizeof(_pixels[0]));
mutech 27:bc79f444883b 231 }
mutech 27:bc79f444883b 232 }
mutech 27:bc79f444883b 233
mutech 27:bc79f444883b 234 void HSVPixels::setPixels(int index, RGBColor *color, int len)
mutech 27:bc79f444883b 235 {
mutech 27:bc79f444883b 236 if (_pixels && len > 0 && (uint16_t)index < _numPixels)
mutech 27:bc79f444883b 237 {
mutech 27:bc79f444883b 238 if (index + len > _numPixels)
mutech 27:bc79f444883b 239 len = _numPixels - index;
mutech 27:bc79f444883b 240 HSVColor *dest = &_pixels[index];
mutech 27:bc79f444883b 241 do
mutech 27:bc79f444883b 242 {
mutech 27:bc79f444883b 243 *dest++ = *color++;
mutech 27:bc79f444883b 244 } while (--len);
mutech 27:bc79f444883b 245 }
mutech 27:bc79f444883b 246 }
mutech 27:bc79f444883b 247
mutech 27:bc79f444883b 248 // 指定色を指定位置のピクセルから指定サイズ分書き込む
mutech 27:bc79f444883b 249 void HSVPixels::fillPixels(const HSVColor color, int index, int len)
mutech 27:bc79f444883b 250 {
mutech 27:bc79f444883b 251 if (_pixels && len > 0 && (uint16_t)index < _numPixels)
mutech 27:bc79f444883b 252 {
mutech 27:bc79f444883b 253 if (index + len > _numPixels)
mutech 27:bc79f444883b 254 len = _numPixels - index;
mutech 27:bc79f444883b 255 _pixels[index] = color;
mutech 27:bc79f444883b 256 repeat_buffer<HSVColor>(_pixels + index, len, 1);
mutech 27:bc79f444883b 257 }
mutech 27:bc79f444883b 258 }
mutech 27:bc79f444883b 259
mutech 27:bc79f444883b 260 void HSVPixels::fillPixels(const RGBColor color, int index, int len)
mutech 27:bc79f444883b 261 {
mutech 27:bc79f444883b 262 fillPixels(HSVColor(color), index, len);
mutech 27:bc79f444883b 263 }
mutech 27:bc79f444883b 264
mutech 27:bc79f444883b 265 // 先頭から指定サイズ分のブロックをバッファの最後までコピーする
mutech 27:bc79f444883b 266 void HSVPixels::repeatPixels(int block_size)
mutech 27:bc79f444883b 267 {
mutech 27:bc79f444883b 268 if (_pixels && block_size > 0 && block_size < _numPixels)
mutech 27:bc79f444883b 269 {
mutech 27:bc79f444883b 270 repeat_buffer<HSVColor>(_pixels, _numPixels, block_size);
mutech 27:bc79f444883b 271 }
mutech 27:bc79f444883b 272 }
mutech 27:bc79f444883b 273
mutech 27:bc79f444883b 274 void HSVPixels::repeatPixels(HSVColor *source, int size)
mutech 27:bc79f444883b 275 {
mutech 27:bc79f444883b 276 if (_pixels && source && size > 0)
mutech 27:bc79f444883b 277 {
mutech 27:bc79f444883b 278 if (size > _numPixels)
mutech 27:bc79f444883b 279 size = _numPixels;
mutech 27:bc79f444883b 280 memcpy(_pixels, source, size * sizeof(_pixels[0]));
mutech 27:bc79f444883b 281 repeat_buffer<HSVColor>(_pixels, _numPixels, size);
mutech 27:bc79f444883b 282 }
mutech 27:bc79f444883b 283 }
mutech 27:bc79f444883b 284
mutech 27:bc79f444883b 285 void HSVPixels::repeatPixels(RGBColor *source, int size)
mutech 27:bc79f444883b 286 {
mutech 27:bc79f444883b 287 if (_pixels && source && size > 0)
mutech 27:bc79f444883b 288 {
mutech 27:bc79f444883b 289 if (size > _numPixels)
mutech 27:bc79f444883b 290 size = _numPixels;
mutech 27:bc79f444883b 291 for (int i = 0; i < size; ++i)
mutech 27:bc79f444883b 292 _pixels[i] = *source++;
mutech 27:bc79f444883b 293 repeat_buffer<HSVColor>(_pixels, _numPixels, size);
mutech 27:bc79f444883b 294 }
mutech 27:bc79f444883b 295 }
mutech 27:bc79f444883b 296
mutech 27:bc79f444883b 297 HSVPixels& HSVPixels::operator=(const HSVPixels& rhs)
mutech 27:bc79f444883b 298 {
mutech 27:bc79f444883b 299 if (!rhs._pixels || !rhs._maxPixels)
mutech 27:bc79f444883b 300 {
mutech 27:bc79f444883b 301 // 右辺が空の場合何もしない
mutech 27:bc79f444883b 302 return *this;
mutech 27:bc79f444883b 303 }
mutech 27:bc79f444883b 304 if (!_pixels || !_maxPixels)
mutech 27:bc79f444883b 305 {
mutech 27:bc79f444883b 306 // 自分のバッファなしの場合、、新規確保
mutech 27:bc79f444883b 307 setPixelBuffer(nullptr, rhs._maxPixels);
mutech 27:bc79f444883b 308 }
mutech 27:bc79f444883b 309
mutech 27:bc79f444883b 310 if (_pixels && _maxPixels)
mutech 27:bc79f444883b 311 {
mutech 27:bc79f444883b 312 _numPixels = rhs._numPixels;
mutech 27:bc79f444883b 313 if (_numPixels > rhs._maxPixels)
mutech 27:bc79f444883b 314 _numPixels = rhs._maxPixels;
mutech 27:bc79f444883b 315 if (_numPixels > _maxPixels)
mutech 27:bc79f444883b 316 _numPixels = _maxPixels;
mutech 27:bc79f444883b 317 memcpy(_pixels, rhs._pixels, sizeof(_pixels[0]) * _numPixels);
mutech 27:bc79f444883b 318 }
mutech 27:bc79f444883b 319
mutech 27:bc79f444883b 320 return *this;
mutech 27:bc79f444883b 321 }
mutech 27:bc79f444883b 322
mutech 27:bc79f444883b 323 //----------------------------------------------------------------------------