diff --git a/src/effects/Saturation.cpp b/src/effects/Saturation.cpp index 06bcb02c2..7e14d4d89 100644 --- a/src/effects/Saturation.cpp +++ b/src/effects/Saturation.cpp @@ -69,44 +69,36 @@ std::shared_ptr Saturation::GetFrame(std::shared_ptr frame, int64_ if (!frame_image) return frame; + int pixel_count = frame_image->width() * frame_image->height(); + // Get keyframe values for this frame float saturation_value = saturation.GetValue(frame_number); // Constants used for color saturation formula - double pR = .299; - double pG = .587; - double pB = .114; + const double pR = .299; + const double pG = .587; + const double pB = .114; // Loop through pixels unsigned char *pixels = (unsigned char *) frame_image->bits(); - for (int pixel = 0, byte_index=0; pixel < frame_image->width() * frame_image->height(); pixel++, byte_index+=4) + + #pragma omp parallel for shared (pixels) + for (int pixel = 0; pixel < pixel_count; ++pixel) { // Get the RGB values from the pixel - int R = pixels[byte_index]; - int G = pixels[byte_index + 1]; - int B = pixels[byte_index + 2]; - int A = pixels[byte_index + 3]; + int R = pixels[pixel * 4]; + int G = pixels[pixel * 4 + 1]; + int B = pixels[pixel * 4 + 2]; // Calculate the saturation multiplier double p = sqrt( (R * R * pR) + (G * G * pG) + (B * B * pB) ); - // Adjust the saturation - R = p + (R - p) * saturation_value; - G = p + (G - p) * saturation_value; - B = p + (B - p) * saturation_value; - - // Constrain the value from 0 to 255 - R = constrain(R); - G = constrain(G); - B = constrain(B); - - // Set all pixels to new value - pixels[byte_index] = R; - pixels[byte_index + 1] = G; - pixels[byte_index + 2] = B; - pixels[byte_index + 3] = A; // leave the alpha value alone + // Apply adjusted and constrained saturation + pixels[pixel * 4] = constrain(p + (R - p) * saturation_value); + pixels[pixel * 4 + 1] = constrain(p + (G - p) * saturation_value); + pixels[pixel * 4 + 2] = constrain(p + (B - p) * saturation_value); } // return the modified frame