5
* Created by Jens Ayton on 2009-10-01.
6
* Copyright 2009 Jens Ayton. All rights reserved.
10
#include "FPMQuantize.h"
11
#include "FPMImageOperations.h"
14
static float QuantizeComponentClip(float v, float srcToStepsFactor, float srcToStepsOffset, float stepsToTargetFactor, float stepMax, float targetMin)
16
v = v * srcToStepsFactor - srcToStepsOffset;
17
v = fmaxf(0.0f, fminf(v, stepMax));
20
v = v * stepsToTargetFactor + targetMin;
26
static float QuantizeComponent(float v, float srcToStepsFactor, float srcToStepsOffset, float stepsToTargetFactor, float targetMin)
28
v = v * srcToStepsFactor - srcToStepsOffset;
31
v = v * stepsToTargetFactor + targetMin;
37
void FPMQuantize(FloatPixMapRef pm, float srcMin, float srcMax, float targetMin, float targetMax, unsigned steps, FPMQuantizeFlags options)
39
if (pm == NULL) return;
41
float srcScale = srcMax - srcMin;
42
float targetScale = targetMax - targetMin;
43
float stepMax = steps - 1;
44
float srcToStepsFactor = stepMax / srcScale;
45
float srcToStepsOffset = srcToStepsFactor * srcMin;
46
bool clip = options & kFMPQuantizeClip;
47
float stepsToTargetFactor = targetScale / stepMax;
49
// FIXME: implement dithering and jitter.
52
FPM_FOR_EACH_PIXEL(pm, true)
53
pixel->r = QuantizeComponentClip(pixel->r, srcToStepsFactor, srcToStepsOffset, stepsToTargetFactor, stepMax, targetMin);
54
pixel->g = QuantizeComponentClip(pixel->g, srcToStepsFactor, srcToStepsOffset, stepsToTargetFactor, stepMax, targetMin);
55
pixel->b = QuantizeComponentClip(pixel->b, srcToStepsFactor, srcToStepsOffset, stepsToTargetFactor, stepMax, targetMin);
56
pixel->a = QuantizeComponentClip(pixel->a, srcToStepsFactor, srcToStepsOffset, stepsToTargetFactor, stepMax, targetMin);
57
FPM_END_FOR_EACH_PIXEL
61
FPM_FOR_EACH_PIXEL(pm, true)
62
pixel->r = QuantizeComponent(pixel->r, srcToStepsFactor, srcToStepsOffset, stepsToTargetFactor, targetMin);
63
pixel->g = QuantizeComponent(pixel->g, srcToStepsFactor, srcToStepsOffset, stepsToTargetFactor, targetMin);
64
pixel->b = QuantizeComponent(pixel->b, srcToStepsFactor, srcToStepsOffset, stepsToTargetFactor, targetMin);
65
pixel->a = QuantizeComponent(pixel->a, srcToStepsFactor, srcToStepsOffset, stepsToTargetFactor, targetMin);
66
FPM_END_FOR_EACH_PIXEL