28 #include "../../include/effects/Hue.h"
35 init_effect_details();
42 init_effect_details();
46 void Hue::init_effect_details()
61 std::shared_ptr<Frame>
Hue::GetFrame(std::shared_ptr<Frame> frame, int64_t frame_number)
64 std::shared_ptr<QImage> frame_image = frame->GetImage();
67 double degrees = 360.0 *
hue.
GetValue(frame_number);
68 float cosA = cos(degrees*3.14159265f/180);
69 float sinA = sin(degrees*3.14159265f/180);
72 float matrix[3][3] = {{cosA + (1.0f - cosA) / 3.0f, 1.0f/3.0f * (1.0f - cosA) - sqrtf(1.0f/3.0f) * sinA, 1.0f/3.0f * (1.0f - cosA) + sqrtf(1.0f/3.0f) * sinA},
73 {1.0f/3.0f * (1.0f - cosA) + sqrtf(1.0f/3.0f) * sinA, cosA + 1.0f/3.0f*(1.0f - cosA), 1.0f/3.0f * (1.0f - cosA) - sqrtf(1.0f/3.0f) * sinA},
74 {1.0f/3.0f * (1.0f - cosA) - sqrtf(1.0f/3.0f) * sinA, 1.0f/3.0f * (1.0f - cosA) + sqrtf(1.0f/3.0f) * sinA, cosA + 1.0f/3.0f * (1.0f - cosA)}};
77 unsigned char *pixels = (
unsigned char *) frame_image->bits();
78 for (
int pixel = 0, byte_index=0; pixel < frame_image->width() * frame_image->height(); pixel++, byte_index+=4)
81 int R = pixels[byte_index];
82 int G = pixels[byte_index + 1];
83 int B = pixels[byte_index + 2];
84 int A = pixels[byte_index + 3];
87 float rx =
constrain(R * matrix[0][0] + G * matrix[0][1] + B * matrix[0][2]);
88 float gx =
constrain(R * matrix[1][0] + G * matrix[1][1] + B * matrix[1][2]);
89 float bx =
constrain(R * matrix[2][0] + G * matrix[2][1] + B * matrix[2][2]);
92 pixels[byte_index] = rx;
93 pixels[byte_index + 1] = gx;
94 pixels[byte_index + 2] = bx;
95 pixels[byte_index + 3] = A;
127 bool success = reader.parse( value, root );
130 throw InvalidJSON(
"JSON could not be parsed (or is invalid)",
"");
140 throw InvalidJSON(
"JSON is invalid (missing keys or invalid data types)",
"");
151 if (!root[
"hue"].isNull())
160 root[
"id"] =
add_property_json(
"ID", 0.0,
"string",
Id(), NULL, -1, -1,
true, requested_frame);
161 root[
"position"] =
add_property_json(
"Position",
Position(),
"float",
"", NULL, 0, 1000 * 60 * 30,
false, requested_frame);
163 root[
"start"] =
add_property_json(
"Start",
Start(),
"float",
"", NULL, 0, 1000 * 60 * 30,
false, requested_frame);
164 root[
"end"] =
add_property_json(
"End",
End(),
"float",
"", NULL, 0, 1000 * 60 * 30,
false, requested_frame);
165 root[
"duration"] =
add_property_json(
"Duration",
Duration(),
"float",
"", NULL, 0, 1000 * 60 * 30,
true, requested_frame);
171 return root.toStyledString();