+static inline struct rgbvec interp_prism(const LUT3DContext *lut3d,
+ const struct rgbvec *s)
+{
+ const int lutsize2 = lut3d->lutsize2;
+ const int lutsize = lut3d->lutsize;
+ const int prev[] = {PREV(s->r), PREV(s->g), PREV(s->b)};
+ const int next[] = {NEXT(s->r), NEXT(s->g), NEXT(s->b)};
+ const struct rgbvec d = {s->r - prev[0], s->g - prev[1], s->b - prev[2]};
+ const struct rgbvec c000 = lut3d->lut[prev[0] * lutsize2 + prev[1] * lutsize + prev[2]];
+ const struct rgbvec c010 = lut3d->lut[prev[0] * lutsize2 + next[1] * lutsize + prev[2]];
+ const struct rgbvec c101 = lut3d->lut[next[0] * lutsize2 + prev[1] * lutsize + next[2]];
+ const struct rgbvec c111 = lut3d->lut[next[0] * lutsize2 + next[1] * lutsize + next[2]];
+ struct rgbvec c;
+
+ if (d.b > d.r) {
+ const struct rgbvec c001 = lut3d->lut[prev[0] * lutsize2 + prev[1] * lutsize + next[2]];
+ const struct rgbvec c011 = lut3d->lut[prev[0] * lutsize2 + next[1] * lutsize + next[2]];
+
+ c.r = c000.r + (c001.r - c000.r) * d.b + (c101.r - c001.r) * d.r + (c010.r - c000.r) * d.g +
+ (c000.r - c010.r - c001.r + c011.r) * d.b * d.g +
+ (c001.r - c011.r - c101.r + c111.r) * d.r * d.g;
+ c.g = c000.g + (c001.g - c000.g) * d.b + (c101.g - c001.g) * d.r + (c010.g - c000.g) * d.g +
+ (c000.g - c010.g - c001.g + c011.g) * d.b * d.g +
+ (c001.g - c011.g - c101.g + c111.g) * d.r * d.g;
+ c.b = c000.b + (c001.b - c000.b) * d.b + (c101.b - c001.b) * d.r + (c010.b - c000.b) * d.g +
+ (c000.b - c010.b - c001.b + c011.b) * d.b * d.g +
+ (c001.b - c011.b - c101.b + c111.b) * d.r * d.g;
+ } else {
+ const struct rgbvec c110 = lut3d->lut[next[0] * lutsize2 + next[1] * lutsize + prev[2]];
+ const struct rgbvec c100 = lut3d->lut[next[0] * lutsize2 + prev[1] * lutsize + prev[2]];
+
+ c.r = c000.r + (c101.r - c100.r) * d.b + (c100.r - c000.r) * d.r + (c010.r - c000.r) * d.g +
+ (c100.r - c110.r - c101.r + c111.r) * d.b * d.g +
+ (c000.r - c010.r - c100.r + c110.r) * d.r * d.g;
+ c.g = c000.g + (c101.g - c100.g) * d.b + (c100.g - c000.g) * d.r + (c010.g - c000.g) * d.g +
+ (c100.g - c110.g - c101.g + c111.g) * d.b * d.g +
+ (c000.g - c010.g - c100.g + c110.g) * d.r * d.g;
+ c.b = c000.b + (c101.b - c100.b) * d.b + (c100.b - c000.b) * d.r + (c010.b - c000.b) * d.g +
+ (c100.b - c110.b - c101.b + c111.b) * d.b * d.g +
+ (c000.b - c010.b - c100.b + c110.b) * d.r * d.g;
+ }
+
+ return c;
+}
+