TLIGHT_PRODUCTS / WS281X
Committer:
mutech
Date:
Fri Nov 04 13:19:38 2016 +0000
Revision:
34:5a141ed5d52a
Parent:
32:64c391617f6c
Child:
35:dffa06d09fdc
WS28111/WS2812 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 28:b452e097da53 7 * Rev 0.98 2016-09-08
mutech 27:bc79f444883b 8 */
mutech 27:bc79f444883b 9 #include "PixelBuffer.h"
mutech 27:bc79f444883b 10
mutech 32:64c391617f6c 11 #define USE_MALLOC 1 // 0:new, 1:malloc
mutech 32:64c391617f6c 12
mutech 27:bc79f444883b 13 //----------------------------------------------------------------------------
mutech 27:bc79f444883b 14 // 指定されたバッファの先頭からblock_size分をbuf_sizeが満杯になるまで繰り返しコピーする
mutech 27:bc79f444883b 15 template <class T>
mutech 27:bc79f444883b 16 static void repeat_buffer(T *buffer, int buf_size, int block_size = 1)
mutech 27:bc79f444883b 17 {
mutech 27:bc79f444883b 18 if (buffer && block_size > 0 && (uint16_t)block_size < buf_size)
mutech 27:bc79f444883b 19 {
mutech 27:bc79f444883b 20 T *dest = buffer + block_size;
mutech 27:bc79f444883b 21 int left = buf_size - block_size;
mutech 27:bc79f444883b 22 while (left > block_size)
mutech 27:bc79f444883b 23 {
mutech 27:bc79f444883b 24 memcpy(dest, buffer, block_size * sizeof(T));
mutech 27:bc79f444883b 25 dest += block_size;
mutech 27:bc79f444883b 26 left -= block_size;
mutech 27:bc79f444883b 27 block_size <<= 1; // 次回は2倍のサイズの転送
mutech 27:bc79f444883b 28 }
mutech 27:bc79f444883b 29 memcpy(dest, buffer, left * sizeof(T));
mutech 27:bc79f444883b 30 }
mutech 28:b452e097da53 31 }
mutech 27:bc79f444883b 32
mutech 27:bc79f444883b 33 //----------------------------------------------------------------------------
mutech 27:bc79f444883b 34 RGBPixels::RGBPixels(RGBColor *buffer, int maxPixels)
mutech 32:64c391617f6c 35 : _owned_buffer(false)
mutech 27:bc79f444883b 36 {
mutech 27:bc79f444883b 37 _dummyPixel = 0;
mutech 27:bc79f444883b 38 setPixelBuffer(buffer, maxPixels);
mutech 27:bc79f444883b 39 }
mutech 27:bc79f444883b 40
mutech 27:bc79f444883b 41 RGBPixels::RGBPixels(int maxPixels)
mutech 32:64c391617f6c 42 : _owned_buffer(false)
mutech 27:bc79f444883b 43 {
mutech 27:bc79f444883b 44 _dummyPixel = 0;
mutech 27:bc79f444883b 45 setPixelBuffer(nullptr, maxPixels);
mutech 27:bc79f444883b 46 }
mutech 27:bc79f444883b 47
mutech 27:bc79f444883b 48 RGBPixels::~RGBPixels()
mutech 27:bc79f444883b 49 {
mutech 32:64c391617f6c 50 setPixelBuffer(0, 0);
mutech 27:bc79f444883b 51 }
mutech 27:bc79f444883b 52
mutech 27:bc79f444883b 53 void RGBPixels::setPixelBuffer(RGBColor *buffer, int maxPixels)
mutech 27:bc79f444883b 54 {
mutech 32:64c391617f6c 55 if (_owned_buffer && _pixels)
mutech 32:64c391617f6c 56 {
mutech 32:64c391617f6c 57 #if USE_MALLOC
mutech 32:64c391617f6c 58 free(_pixels);
mutech 32:64c391617f6c 59 #else
mutech 27:bc79f444883b 60 delete[] _pixels;
mutech 32:64c391617f6c 61 #endif
mutech 32:64c391617f6c 62 }
mutech 32:64c391617f6c 63 _owned_buffer = false;
mutech 32:64c391617f6c 64 _maxPixels = (maxPixels < 0) ? 0 : (maxPixels > MAX_PIXELS) ? MAX_PIXELS : maxPixels;
mutech 32:64c391617f6c 65 _pixels = (!_maxPixels) ? NULL : buffer;
mutech 27:bc79f444883b 66
mutech 27:bc79f444883b 67 if (!_pixels && _maxPixels > 0)
mutech 27:bc79f444883b 68 {
mutech 32:64c391617f6c 69 #if USE_MALLOC
mutech 32:64c391617f6c 70 _pixels = static_cast<RGBColor*>(malloc(sizeof(RGBColor)*_maxPixels));
mutech 32:64c391617f6c 71 if (_pixels)
mutech 32:64c391617f6c 72 _owned_buffer = true;
mutech 32:64c391617f6c 73 else
mutech 32:64c391617f6c 74 _maxPixels = 0;
mutech 32:64c391617f6c 75 #else
mutech 27:bc79f444883b 76 _pixels = new RGBColor[_maxPixels];
mutech 32:64c391617f6c 77 _owned_buffer = true;
mutech 32:64c391617f6c 78 #endif
mutech 27:bc79f444883b 79 }
mutech 27:bc79f444883b 80 _numPixels = _maxPixels;
mutech 27:bc79f444883b 81 clear();
mutech 27:bc79f444883b 82 }
mutech 27:bc79f444883b 83
mutech 27:bc79f444883b 84 int RGBPixels::numPixels(int value)
mutech 27:bc79f444883b 85 {
mutech 27:bc79f444883b 86 if (value >= 0)
mutech 27:bc79f444883b 87 _numPixels = (value > _maxPixels) ? _maxPixels : value;
mutech 27:bc79f444883b 88 return _numPixels;
mutech 27:bc79f444883b 89 }
mutech 27:bc79f444883b 90
mutech 27:bc79f444883b 91 // 指定位置のピクセルへ色配列を指定サイズ分をコピーする
mutech 27:bc79f444883b 92 void RGBPixels::setPixels(int index, RGBColor *color, int len)
mutech 27:bc79f444883b 93 {
mutech 27:bc79f444883b 94 if (_pixels && len > 0 && (uint16_t)index < _numPixels)
mutech 27:bc79f444883b 95 {
mutech 27:bc79f444883b 96 if (index + len > _numPixels)
mutech 27:bc79f444883b 97 len = _numPixels - index;
mutech 34:5a141ed5d52a 98
mutech 34:5a141ed5d52a 99 if (index < 0)
mutech 34:5a141ed5d52a 100 {
mutech 34:5a141ed5d52a 101 len = len - (-index);
mutech 34:5a141ed5d52a 102 color += (-index);
mutech 34:5a141ed5d52a 103 index = 0;
mutech 34:5a141ed5d52a 104 }
mutech 27:bc79f444883b 105 memcpy(&_pixels[index], color, len * sizeof(_pixels[0]));
mutech 27:bc79f444883b 106 }
mutech 27:bc79f444883b 107 }
mutech 27:bc79f444883b 108
mutech 27:bc79f444883b 109 void RGBPixels::setPixels(int index, HSVColor *color, int len)
mutech 27:bc79f444883b 110 {
mutech 27:bc79f444883b 111 if (_pixels && len > 0 && (uint16_t)index < _numPixels)
mutech 27:bc79f444883b 112 {
mutech 27:bc79f444883b 113 if (index + len > _numPixels)
mutech 27:bc79f444883b 114 len = _numPixels - index;
mutech 34:5a141ed5d52a 115
mutech 34:5a141ed5d52a 116 if (index < 0)
mutech 34:5a141ed5d52a 117 {
mutech 34:5a141ed5d52a 118 len = len - (-index);
mutech 34:5a141ed5d52a 119 color += (-index);
mutech 34:5a141ed5d52a 120 index = 0;
mutech 34:5a141ed5d52a 121 }
mutech 34:5a141ed5d52a 122
mutech 27:bc79f444883b 123 RGBColor *dest = &_pixels[index];
mutech 27:bc79f444883b 124 do
mutech 27:bc79f444883b 125 {
mutech 27:bc79f444883b 126 *dest++ = *color++;
mutech 27:bc79f444883b 127 } while (--len);
mutech 27:bc79f444883b 128 }
mutech 27:bc79f444883b 129 }
mutech 27:bc79f444883b 130
mutech 27:bc79f444883b 131 // 指定色を指定位置のピクセルから指定サイズ分書き込む
mutech 28:b452e097da53 132 void RGBPixels::fillPixels(int index, const RGBColor color, int len)
mutech 27:bc79f444883b 133 {
mutech 27:bc79f444883b 134 if (_pixels && len > 0 && (uint16_t)index < _numPixels)
mutech 27:bc79f444883b 135 {
mutech 27:bc79f444883b 136 if (index + len > _numPixels)
mutech 27:bc79f444883b 137 len = _numPixels - index;
mutech 27:bc79f444883b 138 _pixels[index] = color;
mutech 27:bc79f444883b 139 repeat_buffer<RGBColor>(_pixels + index, len, 1);
mutech 27:bc79f444883b 140 }
mutech 27:bc79f444883b 141 }
mutech 27:bc79f444883b 142
mutech 28:b452e097da53 143 void RGBPixels::fillPixels(int index, const HSVColor color, int len)
mutech 27:bc79f444883b 144 {
mutech 29:a362df191524 145 fillPixels(index, RGBColor(color), len);
mutech 27:bc79f444883b 146 }
mutech 27:bc79f444883b 147
mutech 27:bc79f444883b 148 // 先頭から指定サイズ分のブロックをバッファの最後までコピーする
mutech 27:bc79f444883b 149 void RGBPixels::repeatPixels(int block_size)
mutech 27:bc79f444883b 150 {
mutech 27:bc79f444883b 151 if (_pixels && block_size > 0 && block_size < _numPixels)
mutech 27:bc79f444883b 152 {
mutech 27:bc79f444883b 153 repeat_buffer<RGBColor>(_pixels, _numPixels, block_size);
mutech 27:bc79f444883b 154 }
mutech 27:bc79f444883b 155 }
mutech 27:bc79f444883b 156
mutech 27:bc79f444883b 157 void RGBPixels::repeatPixels(RGBColor *source, int size)
mutech 27:bc79f444883b 158 {
mutech 27:bc79f444883b 159 if (_pixels && source && size > 0)
mutech 27:bc79f444883b 160 {
mutech 27:bc79f444883b 161 if (size > _numPixels)
mutech 27:bc79f444883b 162 size = _numPixels;
mutech 27:bc79f444883b 163 memcpy(_pixels, source, size * sizeof(_pixels[0]));
mutech 27:bc79f444883b 164 repeat_buffer<RGBColor>(_pixels, _numPixels, size);
mutech 27:bc79f444883b 165 }
mutech 27:bc79f444883b 166 }
mutech 27:bc79f444883b 167
mutech 27:bc79f444883b 168 void RGBPixels::repeatPixels(HSVColor *source, int size)
mutech 27:bc79f444883b 169 {
mutech 27:bc79f444883b 170 if (_pixels && source && size > 0)
mutech 27:bc79f444883b 171 {
mutech 27:bc79f444883b 172 if (size > _numPixels)
mutech 27:bc79f444883b 173 size = _numPixels;
mutech 27:bc79f444883b 174 for (int i = 0; i < size; ++i)
mutech 27:bc79f444883b 175 _pixels[i] = *source++;
mutech 27:bc79f444883b 176 repeat_buffer<RGBColor>(_pixels, _numPixels, size);
mutech 27:bc79f444883b 177 }
mutech 27:bc79f444883b 178 }
mutech 27:bc79f444883b 179
mutech 27:bc79f444883b 180 RGBPixels& RGBPixels::operator=(const RGBPixels& rhs)
mutech 27:bc79f444883b 181 {
mutech 27:bc79f444883b 182 if (!rhs._pixels || !rhs._maxPixels)
mutech 27:bc79f444883b 183 {
mutech 27:bc79f444883b 184 // 右辺が空の場合何もしない
mutech 27:bc79f444883b 185 return *this;
mutech 27:bc79f444883b 186 }
mutech 27:bc79f444883b 187 if (!_pixels || !_maxPixels)
mutech 27:bc79f444883b 188 {
mutech 27:bc79f444883b 189 // 自分のバッファなしの場合、、新規確保
mutech 27:bc79f444883b 190 setPixelBuffer(nullptr, rhs._maxPixels);
mutech 27:bc79f444883b 191 }
mutech 27:bc79f444883b 192
mutech 27:bc79f444883b 193 if (_pixels && _maxPixels)
mutech 27:bc79f444883b 194 {
mutech 27:bc79f444883b 195 _numPixels = rhs._numPixels;
mutech 27:bc79f444883b 196 if (_numPixels > rhs._maxPixels)
mutech 27:bc79f444883b 197 _numPixels = rhs._maxPixels;
mutech 27:bc79f444883b 198 if (_numPixels > _maxPixels)
mutech 27:bc79f444883b 199 _numPixels = _maxPixels;
mutech 27:bc79f444883b 200 memcpy(_pixels, rhs._pixels, sizeof(_pixels[0]) * _numPixels);
mutech 27:bc79f444883b 201 }
mutech 27:bc79f444883b 202
mutech 27:bc79f444883b 203 return *this;
mutech 27:bc79f444883b 204 }
mutech 27:bc79f444883b 205
mutech 27:bc79f444883b 206 //----------------------------------------------------------------------------
mutech 28:b452e097da53 207 void RGBPixels::makeGradation(int index, RGBColor from, RGBColor to, int len)
mutech 28:b452e097da53 208 {
mutech 28:b452e097da53 209 if (!_pixels || len < 1 || index >= _numPixels || (index + len) < 0)
mutech 28:b452e097da53 210 return;
mutech 28:b452e097da53 211
mutech 28:b452e097da53 212 int end = len;
mutech 28:b452e097da53 213 if (index + end > _numPixels)
mutech 28:b452e097da53 214 end = _numPixels - index;
mutech 28:b452e097da53 215
mutech 28:b452e097da53 216 RGBColor color;
mutech 28:b452e097da53 217 RGBColor *dest = _pixels;
mutech 28:b452e097da53 218 if (index > 0)
mutech 28:b452e097da53 219 dest += index;
mutech 28:b452e097da53 220 for (int i = (index < 0) ? -index : 0; i < end; ++i)
mutech 28:b452e097da53 221 {
mutech 28:b452e097da53 222 int j = len - i;
mutech 28:b452e097da53 223 color.red = ((from.red * j) + (to.red * i)) / len;
mutech 28:b452e097da53 224 color.green = ((from.green * j) + (to.green * i)) / len;
mutech 28:b452e097da53 225 color.blue = ((from.blue * j) + (to.blue * i)) / len;
mutech 28:b452e097da53 226 *dest++ = GammaColor(color);
mutech 28:b452e097da53 227 }
mutech 28:b452e097da53 228 }
mutech 28:b452e097da53 229
mutech 28:b452e097da53 230 void RGBPixels::makeRainbow(int index, HSVColor color, int len, int direction)
mutech 28:b452e097da53 231 {
mutech 28:b452e097da53 232 if (!_pixels || len < 1 || index >= _numPixels || (index + len) < 0)
mutech 28:b452e097da53 233 return;
mutech 28:b452e097da53 234
mutech 28:b452e097da53 235 int end = len;
mutech 28:b452e097da53 236 if (index + end > _numPixels)
mutech 28:b452e097da53 237 end = _numPixels - index;
mutech 28:b452e097da53 238
mutech 28:b452e097da53 239 HSVColor hsv(color);
mutech 28:b452e097da53 240 RGBColor *dest = _pixels;
mutech 28:b452e097da53 241 if (index > 0)
mutech 28:b452e097da53 242 dest += index;
mutech 28:b452e097da53 243 direction = (direction >= 0) ? -3600 : 3600;
mutech 28:b452e097da53 244 for (int i = (index < 0) ? -index : 0; i < end; ++i)
mutech 28:b452e097da53 245 {
mutech 28:b452e097da53 246 hsv.hue = color.hue + direction * i / len;
mutech 28:b452e097da53 247 *dest++ = GammaColor(hsv);
mutech 28:b452e097da53 248 }
mutech 28:b452e097da53 249 }
mutech 28:b452e097da53 250
mutech 28:b452e097da53 251 //----------------------------------------------------------------------------
mutech 27:bc79f444883b 252 //----------------------------------------------------------------------------
mutech 27:bc79f444883b 253 HSVPixels::HSVPixels(HSVColor *buffer, int maxPixels)
mutech 32:64c391617f6c 254 : _owned_buffer(false)
mutech 27:bc79f444883b 255 {
mutech 27:bc79f444883b 256 _dummyPixel = 0;
mutech 27:bc79f444883b 257 setPixelBuffer(buffer, maxPixels);
mutech 27:bc79f444883b 258 }
mutech 27:bc79f444883b 259
mutech 27:bc79f444883b 260 HSVPixels::HSVPixels(int maxPixels)
mutech 32:64c391617f6c 261 : _owned_buffer(false)
mutech 27:bc79f444883b 262 {
mutech 27:bc79f444883b 263 _dummyPixel = 0;
mutech 27:bc79f444883b 264 setPixelBuffer(nullptr, maxPixels);
mutech 27:bc79f444883b 265 }
mutech 27:bc79f444883b 266
mutech 27:bc79f444883b 267 HSVPixels::~HSVPixels()
mutech 27:bc79f444883b 268 {
mutech 32:64c391617f6c 269 setPixelBuffer(0, 0);
mutech 27:bc79f444883b 270 }
mutech 27:bc79f444883b 271
mutech 27:bc79f444883b 272 void HSVPixels::setPixelBuffer(HSVColor *buffer, int maxPixels)
mutech 27:bc79f444883b 273 {
mutech 32:64c391617f6c 274 if (_owned_buffer && _pixels)
mutech 32:64c391617f6c 275 {
mutech 32:64c391617f6c 276 #if USE_MALLOC
mutech 32:64c391617f6c 277 free(_pixels);
mutech 32:64c391617f6c 278 #else
mutech 27:bc79f444883b 279 delete[] _pixels;
mutech 32:64c391617f6c 280 #endif
mutech 32:64c391617f6c 281 }
mutech 32:64c391617f6c 282 _owned_buffer = false;
mutech 32:64c391617f6c 283 _maxPixels = (maxPixels < 0) ? 0 : (maxPixels > MAX_PIXELS) ? MAX_PIXELS : maxPixels;
mutech 32:64c391617f6c 284 _pixels = (!_maxPixels) ? NULL : buffer;
mutech 27:bc79f444883b 285
mutech 27:bc79f444883b 286 if (!_pixels && _maxPixels > 0)
mutech 27:bc79f444883b 287 {
mutech 32:64c391617f6c 288 #if USE_MALLOC
mutech 32:64c391617f6c 289 _pixels = static_cast<HSVColor*>(malloc(sizeof(HSVColor)*_maxPixels));
mutech 32:64c391617f6c 290 if (_pixels)
mutech 32:64c391617f6c 291 _owned_buffer = true;
mutech 32:64c391617f6c 292 else
mutech 32:64c391617f6c 293 _maxPixels = 0;
mutech 32:64c391617f6c 294 #else
mutech 27:bc79f444883b 295 _pixels = new HSVColor[_maxPixels];
mutech 32:64c391617f6c 296 _owned_buffer = true;
mutech 32:64c391617f6c 297 #endif
mutech 27:bc79f444883b 298 }
mutech 27:bc79f444883b 299 _numPixels = _maxPixels;
mutech 27:bc79f444883b 300 clear();
mutech 27:bc79f444883b 301 }
mutech 27:bc79f444883b 302
mutech 27:bc79f444883b 303 int HSVPixels::numPixels(int value)
mutech 27:bc79f444883b 304 {
mutech 27:bc79f444883b 305 if (value >= 0)
mutech 27:bc79f444883b 306 _numPixels = (value > _maxPixels) ? _maxPixels : value;
mutech 27:bc79f444883b 307 return _numPixels;
mutech 27:bc79f444883b 308 }
mutech 27:bc79f444883b 309
mutech 27:bc79f444883b 310 // 指定位置のピクセルへ色配列を指定サイズ分をコピーする
mutech 27:bc79f444883b 311 void HSVPixels::setPixels(int index, HSVColor *color, int len)
mutech 27:bc79f444883b 312 {
mutech 27:bc79f444883b 313 if (_pixels && len > 0 && (uint16_t)index < _numPixels)
mutech 27:bc79f444883b 314 {
mutech 27:bc79f444883b 315 if (index + len > _numPixels)
mutech 27:bc79f444883b 316 len = _numPixels - index;
mutech 34:5a141ed5d52a 317
mutech 34:5a141ed5d52a 318 if (index < 0)
mutech 34:5a141ed5d52a 319 {
mutech 34:5a141ed5d52a 320 len = len - (-index);
mutech 34:5a141ed5d52a 321 color += (-index);
mutech 34:5a141ed5d52a 322 index = 0;
mutech 34:5a141ed5d52a 323 }
mutech 34:5a141ed5d52a 324
mutech 27:bc79f444883b 325 memcpy(&_pixels[index], color, len * sizeof(_pixels[0]));
mutech 27:bc79f444883b 326 }
mutech 27:bc79f444883b 327 }
mutech 27:bc79f444883b 328
mutech 27:bc79f444883b 329 void HSVPixels::setPixels(int index, RGBColor *color, int len)
mutech 27:bc79f444883b 330 {
mutech 27:bc79f444883b 331 if (_pixels && len > 0 && (uint16_t)index < _numPixels)
mutech 27:bc79f444883b 332 {
mutech 27:bc79f444883b 333 if (index + len > _numPixels)
mutech 27:bc79f444883b 334 len = _numPixels - index;
mutech 34:5a141ed5d52a 335
mutech 34:5a141ed5d52a 336 if (index < 0)
mutech 34:5a141ed5d52a 337 {
mutech 34:5a141ed5d52a 338 len = len - (-index);
mutech 34:5a141ed5d52a 339 color += (-index);
mutech 34:5a141ed5d52a 340 index = 0;
mutech 34:5a141ed5d52a 341 }
mutech 34:5a141ed5d52a 342
mutech 27:bc79f444883b 343 HSVColor *dest = &_pixels[index];
mutech 27:bc79f444883b 344 do
mutech 27:bc79f444883b 345 {
mutech 27:bc79f444883b 346 *dest++ = *color++;
mutech 27:bc79f444883b 347 } while (--len);
mutech 27:bc79f444883b 348 }
mutech 27:bc79f444883b 349 }
mutech 27:bc79f444883b 350
mutech 27:bc79f444883b 351 // 指定色を指定位置のピクセルから指定サイズ分書き込む
mutech 29:a362df191524 352 void HSVPixels::fillPixels(int index, const HSVColor color, int len)
mutech 27:bc79f444883b 353 {
mutech 27:bc79f444883b 354 if (_pixels && len > 0 && (uint16_t)index < _numPixels)
mutech 27:bc79f444883b 355 {
mutech 27:bc79f444883b 356 if (index + len > _numPixels)
mutech 27:bc79f444883b 357 len = _numPixels - index;
mutech 27:bc79f444883b 358 _pixels[index] = color;
mutech 27:bc79f444883b 359 repeat_buffer<HSVColor>(_pixels + index, len, 1);
mutech 27:bc79f444883b 360 }
mutech 27:bc79f444883b 361 }
mutech 27:bc79f444883b 362
mutech 29:a362df191524 363 void HSVPixels::fillPixels(int index, const RGBColor color, int len)
mutech 27:bc79f444883b 364 {
mutech 29:a362df191524 365 fillPixels(index, HSVColor(color), len);
mutech 27:bc79f444883b 366 }
mutech 27:bc79f444883b 367
mutech 27:bc79f444883b 368 // 先頭から指定サイズ分のブロックをバッファの最後までコピーする
mutech 27:bc79f444883b 369 void HSVPixels::repeatPixels(int block_size)
mutech 27:bc79f444883b 370 {
mutech 27:bc79f444883b 371 if (_pixels && block_size > 0 && block_size < _numPixels)
mutech 27:bc79f444883b 372 {
mutech 27:bc79f444883b 373 repeat_buffer<HSVColor>(_pixels, _numPixels, block_size);
mutech 27:bc79f444883b 374 }
mutech 27:bc79f444883b 375 }
mutech 27:bc79f444883b 376
mutech 27:bc79f444883b 377 void HSVPixels::repeatPixels(HSVColor *source, int size)
mutech 27:bc79f444883b 378 {
mutech 27:bc79f444883b 379 if (_pixels && source && size > 0)
mutech 27:bc79f444883b 380 {
mutech 27:bc79f444883b 381 if (size > _numPixels)
mutech 27:bc79f444883b 382 size = _numPixels;
mutech 27:bc79f444883b 383 memcpy(_pixels, source, size * sizeof(_pixels[0]));
mutech 27:bc79f444883b 384 repeat_buffer<HSVColor>(_pixels, _numPixels, size);
mutech 27:bc79f444883b 385 }
mutech 27:bc79f444883b 386 }
mutech 27:bc79f444883b 387
mutech 27:bc79f444883b 388 void HSVPixels::repeatPixels(RGBColor *source, int size)
mutech 27:bc79f444883b 389 {
mutech 27:bc79f444883b 390 if (_pixels && source && size > 0)
mutech 27:bc79f444883b 391 {
mutech 27:bc79f444883b 392 if (size > _numPixels)
mutech 27:bc79f444883b 393 size = _numPixels;
mutech 27:bc79f444883b 394 for (int i = 0; i < size; ++i)
mutech 27:bc79f444883b 395 _pixels[i] = *source++;
mutech 27:bc79f444883b 396 repeat_buffer<HSVColor>(_pixels, _numPixels, size);
mutech 27:bc79f444883b 397 }
mutech 27:bc79f444883b 398 }
mutech 27:bc79f444883b 399
mutech 27:bc79f444883b 400 HSVPixels& HSVPixels::operator=(const HSVPixels& rhs)
mutech 27:bc79f444883b 401 {
mutech 27:bc79f444883b 402 if (!rhs._pixels || !rhs._maxPixels)
mutech 27:bc79f444883b 403 {
mutech 27:bc79f444883b 404 // 右辺が空の場合何もしない
mutech 27:bc79f444883b 405 return *this;
mutech 27:bc79f444883b 406 }
mutech 27:bc79f444883b 407 if (!_pixels || !_maxPixels)
mutech 27:bc79f444883b 408 {
mutech 27:bc79f444883b 409 // 自分のバッファなしの場合、、新規確保
mutech 27:bc79f444883b 410 setPixelBuffer(nullptr, rhs._maxPixels);
mutech 27:bc79f444883b 411 }
mutech 27:bc79f444883b 412
mutech 27:bc79f444883b 413 if (_pixels && _maxPixels)
mutech 27:bc79f444883b 414 {
mutech 27:bc79f444883b 415 _numPixels = rhs._numPixels;
mutech 27:bc79f444883b 416 if (_numPixels > rhs._maxPixels)
mutech 27:bc79f444883b 417 _numPixels = rhs._maxPixels;
mutech 27:bc79f444883b 418 if (_numPixels > _maxPixels)
mutech 27:bc79f444883b 419 _numPixels = _maxPixels;
mutech 27:bc79f444883b 420 memcpy(_pixels, rhs._pixels, sizeof(_pixels[0]) * _numPixels);
mutech 27:bc79f444883b 421 }
mutech 27:bc79f444883b 422
mutech 27:bc79f444883b 423 return *this;
mutech 27:bc79f444883b 424 }
mutech 27:bc79f444883b 425
mutech 27:bc79f444883b 426 //----------------------------------------------------------------------------
mutech 28:b452e097da53 427 void HSVPixels::makeGradation(int index, HSVColor from, HSVColor to, int len)
mutech 28:b452e097da53 428 {
mutech 28:b452e097da53 429 if (!_pixels || len < 1 || index >= _numPixels || (index + len) < 0)
mutech 28:b452e097da53 430 return;
mutech 28:b452e097da53 431
mutech 28:b452e097da53 432 int end = len;
mutech 28:b452e097da53 433 if (index + end > _numPixels)
mutech 28:b452e097da53 434 end = _numPixels - index;
mutech 28:b452e097da53 435
mutech 28:b452e097da53 436 RGBColor rgb_from(from);
mutech 28:b452e097da53 437 RGBColor rgb_to(to);
mutech 28:b452e097da53 438 RGBColor color;
mutech 28:b452e097da53 439 HSVColor *dest = _pixels;
mutech 28:b452e097da53 440 if (index > 0)
mutech 28:b452e097da53 441 dest += index;
mutech 28:b452e097da53 442 for (int i = (index < 0) ? -index : 0; i < end; ++i)
mutech 28:b452e097da53 443 {
mutech 28:b452e097da53 444 int j = len - i;
mutech 28:b452e097da53 445 color.red = ((rgb_from.red * j) + (rgb_to.red * i)) / len;
mutech 28:b452e097da53 446 color.green = ((rgb_from.green * j) + (rgb_to.green * i)) / len;
mutech 28:b452e097da53 447 color.blue = ((rgb_from.blue * j) + (rgb_to.blue * i)) / len;
mutech 28:b452e097da53 448 *dest++ = GammaColor(color);
mutech 28:b452e097da53 449 }
mutech 28:b452e097da53 450 }
mutech 28:b452e097da53 451
mutech 28:b452e097da53 452 void HSVPixels::makeRainbow(int index, HSVColor color, int len, int direction)
mutech 28:b452e097da53 453 {
mutech 28:b452e097da53 454 if (!_pixels || len < 1 || index >= _numPixels || (index + len) < 0)
mutech 28:b452e097da53 455 return;
mutech 28:b452e097da53 456
mutech 28:b452e097da53 457 int end = len;
mutech 28:b452e097da53 458 if (index + end > _numPixels)
mutech 28:b452e097da53 459 end = _numPixels - index;
mutech 28:b452e097da53 460
mutech 28:b452e097da53 461 HSVColor hsv(color);
mutech 28:b452e097da53 462 HSVColor *dest = _pixels;
mutech 28:b452e097da53 463 if (index > 0)
mutech 28:b452e097da53 464 dest += index;
mutech 28:b452e097da53 465 direction = (direction >= 0) ? -3600 : 3600;
mutech 28:b452e097da53 466 for (int i = (index < 0) ? -index : 0; i < end; ++i)
mutech 28:b452e097da53 467 {
mutech 28:b452e097da53 468 hsv.hue = color.hue + direction * i / len;
mutech 29:a362df191524 469 *dest++ = GammaColor(hsv);
mutech 28:b452e097da53 470 }
mutech 28:b452e097da53 471 }
mutech 28:b452e097da53 472
mutech 28:b452e097da53 473 //----------------------------------------------------------------------------