/* Special case code for gray -> rgb */ static inline void fz_paint_affine_alpha_g2rgb_lerp(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int alpha, byte *hp) { while (w--) { int ui = u >> 16; int vi = v >> 16; if (ui >= 0 && ui < sw && vi >= 0 && vi < sh) { int uf = u & 0xffff; int vf = v & 0xffff; byte *a = sample_nearest(sp, sw, sh, 2, ui, vi); byte *b = sample_nearest(sp, sw, sh, 2, ui+1, vi); byte *c = sample_nearest(sp, sw, sh, 2, ui, vi+1); byte *d = sample_nearest(sp, sw, sh, 2, ui+1, vi+1); int y = bilerp(a[1], b[1], c[1], d[1], uf, vf); int x = bilerp(a[0], b[0], c[0], d[0], uf, vf); int t; x = fz_mul255(x, alpha); y = fz_mul255(y, alpha); t = 255 - y; dp[0] = x + fz_mul255(dp[0], t); dp[1] = x + fz_mul255(dp[1], t); dp[2] = x + fz_mul255(dp[2], t); dp[3] = y + fz_mul255(dp[3], t); if (hp) hp[0] = y + fz_mul255(hp[0], t); } dp += 4; if (hp) hp++; u += fa; v += fb; } }
static inline void fz_paint_affine_color_N_lerp(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, byte *color, byte *hp) { int n1 = n - 1; int sa = color[n1]; int k; while (w--) { int ui = u >> 16; int vi = v >> 16; if (ui >= 0 && ui < sw && vi >= 0 && vi < sh) { int uf = u & 0xffff; int vf = v & 0xffff; byte *a = sample_nearest(sp, sw, sh, 1, ui, vi); byte *b = sample_nearest(sp, sw, sh, 1, ui+1, vi); byte *c = sample_nearest(sp, sw, sh, 1, ui, vi+1); byte *d = sample_nearest(sp, sw, sh, 1, ui+1, vi+1); int ma = bilerp(a[0], b[0], c[0], d[0], uf, vf); int masa = FZ_COMBINE(FZ_EXPAND(ma), sa); for (k = 0; k < n1; k++) dp[k] = FZ_BLEND(color[k], dp[k], masa); dp[n1] = FZ_BLEND(255, dp[n1], masa); if (hp) hp[0] = FZ_BLEND(255, hp[0], masa); } dp += n; if (hp) hp++; u += fa; v += fb; } }
static inline void fz_paint_affine_alpha_N_lerp(byte *dp, byte *sp, int sw, int sh, int u, int v, int fa, int fb, int w, int n, int alpha, byte *hp) { int k; int n1 = n-1; while (w--) { int ui = u >> 16; int vi = v >> 16; if (ui >= 0 && ui < sw && vi >= 0 && vi < sh) { int uf = u & 0xffff; int vf = v & 0xffff; byte *a = sample_nearest(sp, sw, sh, n, ui, vi); byte *b = sample_nearest(sp, sw, sh, n, ui+1, vi); byte *c = sample_nearest(sp, sw, sh, n, ui, vi+1); byte *d = sample_nearest(sp, sw, sh, n, ui+1, vi+1); int xa = bilerp(a[n1], b[n1], c[n1], d[n1], uf, vf); int t; xa = fz_mul255(xa, alpha); t = 255 - xa; for (k = 0; k < n1; k++) { int x = bilerp(a[k], b[k], c[k], d[k], uf, vf); dp[k] = fz_mul255(x, alpha) + fz_mul255(dp[k], t); } dp[n1] = xa + fz_mul255(dp[n1], t); if (hp) hp[0] = xa + fz_mul255(hp[0], t); } dp += n; if (hp) hp++; u += fa; v += fb; } }