예제 #1
0
/* 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;
    }
}
예제 #2
0
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;
	}
}
예제 #3
0
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;
    }
}