109 lines
2.2 KiB
Plaintext
109 lines
2.2 KiB
Plaintext
//
|
|
// begin license header
|
|
//
|
|
// This file is part of Pixy CMUcam5 or "Pixy" for short
|
|
//
|
|
// All Pixy source code is provided under the terms of the
|
|
// GNU General Public License v2 (http://www.gnu.org/licenses/gpl-2.0.html).
|
|
// Those wishing to use Pixy source code, software and/or
|
|
// technologies under different licensing terms should contact us at
|
|
// cmucam@cs.cmu.edu. Such licensing terms are available for
|
|
// all portions of the Pixy codebase presented here.
|
|
//
|
|
// end license header
|
|
//
|
|
|
|
#include "calc.h"
|
|
|
|
void hsvc(uint8_t r, uint8_t g, uint8_t b, uint8_t *h, uint8_t *s, uint8_t *v, uint8_t *c)
|
|
{
|
|
uint8_t min, max, delta;
|
|
int hue;
|
|
min = MIN(r, g);
|
|
min = MIN(min, b);
|
|
max = MAX(r, g);
|
|
max = MAX(max, b);
|
|
|
|
*v = max;
|
|
delta = max - min;
|
|
if (max>50)
|
|
{
|
|
//if (delta>50)
|
|
*s = ((int)delta<<8)/max;
|
|
//else
|
|
// *s = 0;
|
|
}
|
|
else
|
|
*s = 0;
|
|
if (max==0 || delta==0)
|
|
{
|
|
*s = 0;
|
|
*h = 0;
|
|
*c = 0;
|
|
return;
|
|
}
|
|
if (r==max)
|
|
hue = (((int)g - (int)b)<<8)/delta; // between yellow & magenta
|
|
else if (g==max)
|
|
hue = (2<<8) + (((int)b - (int)r)<<8)/delta; // between cyan & yellow
|
|
else
|
|
hue = (4<<8) + (((int)r - (int)g)<<8)/delta; // between magenta & cyan
|
|
if(hue < 0)
|
|
hue += 6<<8;
|
|
hue /= 6;
|
|
*h = hue;
|
|
*c = delta;
|
|
}
|
|
|
|
uint32_t lighten(uint32_t color, uint8_t factor)
|
|
{
|
|
uint32_t r, g, b;
|
|
|
|
rgbUnpack(color, &r, &g, &b);
|
|
|
|
r += factor;
|
|
g += factor;
|
|
b += factor;
|
|
|
|
return rgbPack(r, g, b);
|
|
}
|
|
|
|
uint32_t rgbPack(uint32_t r, uint32_t g, uint32_t b)
|
|
{
|
|
if (r>0xff)
|
|
r = 0xff;
|
|
if (g>0xff)
|
|
g = 0xff;
|
|
if (b>0xff)
|
|
b = 0xff;
|
|
return (r<<16) | (g<<8) | b;
|
|
}
|
|
|
|
void rgbUnpack(uint32_t color, uint32_t *r, uint32_t *g, uint32_t *b)
|
|
{
|
|
*b = color&0xff;
|
|
color >>= 8;
|
|
*g = color&0xff;
|
|
color >>= 8;
|
|
*r = color&0xff;
|
|
}
|
|
|
|
uint32_t saturate(uint32_t color)
|
|
{
|
|
float m;
|
|
uint32_t max, r, g, b;
|
|
|
|
rgbUnpack(color, &r, &g, &b);
|
|
|
|
max = MAX(r, g);
|
|
max = MAX(max, b);
|
|
|
|
// saturate while maintaining ratios
|
|
m = 255.0f/max;
|
|
r = (uint8_t)(m*r);
|
|
g = (uint8_t)(m*g);
|
|
b = (uint8_t)(m*b);
|
|
|
|
return rgbPack(r, g, b);
|
|
}
|