+ return 0;
+}
+
+inline void _unscale_levels(double *r, double *g, double *b)
+{
+ if (scale_levels)
+ return;
+ /* scale up, so 0 becomes black level */
+ if (black_level > 0.0 || white_level < 1.0) {
+ *r = black_level + *r * (white_level - black_level);
+ *g = black_level + *g * (white_level - black_level);
+ *b = black_level + *b * (white_level - black_level);
+ }
+}
+
+/* modified YUV space */
+void yuv2rgb_pixle_mod(double y, double u, double v, double *r, double *g, double *b)
+{
+ double r_, g_, b_, y_;
+ double max, scale;
+ double is_dist, must_dist;
+
+ if (_scale_levels(&y, r, g, b))
+ return;
+
+ /* 1. get RGB from U and V with maximum lightness */
+ /* 1.1 U and V conversion without Y */
+ r_ = v/0.877;
+ g_ = -0.395*u - 0.581*v;
+ b_ = u/0.492;
+ /* 1.2 find maximum value */
+ max = max_rgb(r_, g_, b_);
+ /* 1.3 maximize RGB */
+ r_ = 1.0-max+r_;
+ g_ = 1.0-max+g_;
+ b_ = 1.0-max+b_;
+
+ /* 2. calculate scale factor to scale RGB (with max lightness) to target Y */
+ /* 2.1 calculate Y of scaled RGB */
+ y_ = 0.299*r_ + 0.587*g_ + 0.114*b_;
+ /* 2.2 calculate scale factor */
+ scale = y/y_;
+
+ /* 3. scale RGB (with max lightness) to target Y and clip (by reducing saturation), if needed */
+ /* 3.1 scale RGB with factor */
+ r_ *= scale;
+ g_ *= scale;
+ b_ *= scale;
+ /* 3.2 finx max value to clip if needed */
+ max = max_rgb(r_, g_, b_);
+ /* 3.3 clip by reducing saturation */
+ if (max > 1.0) {
+ is_dist = max-y;
+ must_dist = 1-y;
+ *r = (r_-y)/is_dist*must_dist + y;
+ *g = (g_-y)/is_dist*must_dist + y;
+ *b = (b_-y)/is_dist*must_dist + y;
+ } else {
+ *r = r_;
+ *g = g_;
+ *b = b_;
+ }
+
+ _unscale_levels(r, g, b);
+}
+
+//#define SCALE_LEVEL
+void yuv2rgb_pixle(double y, double u, double v, double *r, double *g, double *b)
+{
+ double nu, nv, uv, nuv;
+ double fade;
+
+ if (yuv_mod) {
+ yuv2rgb_pixle_mod(y, u, v, r, g, b);
+ return;
+ }
+
+ if (_scale_levels(&y, r, g, b))
+ return;
+