void trace_copy_rop(const char *cname, gx_device * dev, const byte * sdata, int sourcex, uint sraster, gx_bitmap_id id, const gx_color_index * scolors, const gx_strip_bitmap * textures, const gx_color_index * tcolors, int x, int y, int width, int height, int phase_x, int phase_y, gs_logical_operation_t lop) { dlprintf4("%s: dev=0x%lx(%s) depth=%d\n", cname, (ulong) dev, dev->dname, dev->color_info.depth); dlprintf4(" source data=0x%lx x=%d raster=%u id=%lu colors=", (ulong) sdata, sourcex, sraster, (ulong) id); if (scolors) dprintf2("(%lu,%lu);\n", scolors[0], scolors[1]); else dputs("none;\n"); if (textures) dlprintf8(" textures=0x%lx size=%dx%d(%dx%d) raster=%u shift=%d(%d)", (ulong) textures, textures->size.x, textures->size.y, textures->rep_width, textures->rep_height, textures->raster, textures->shift, textures->rep_shift); else dlputs(" textures=none"); if (tcolors) dprintf2(" colors=(%lu,%lu)\n", tcolors[0], tcolors[1]); else dputs(" colors=none\n"); dlprintf7(" rect=(%d,%d),(%d,%d) phase=(%d,%d) op=0x%x\n", x, y, x + width, y + height, phase_x, phase_y, (uint) lop); if (gs_debug_c('B')) { if (sdata) debug_dump_bitmap(sdata, sraster, height, "source bits"); if (textures && textures->data) debug_dump_bitmap(textures->data, textures->raster, textures->size.y, "textures bits"); } }
/* Convert HSB to RGB. */ static void color_hsb_to_rgb(floatp hue, floatp saturation, floatp brightness, float rgb[3]) { if (saturation == 0) { rgb[0] = rgb[1] = rgb[2] = brightness; } else { /* Convert hsb to rgb. */ /* We rely on the fact that the product of two */ /* fracs fits into an unsigned long. */ floatp h6 = hue * 6; ulong V = float2frac(brightness); /* force arithmetic to long */ frac S = float2frac(saturation); int I = (int)h6; ulong F = float2frac(h6 - I); /* ditto */ /* M = V*(1-S), N = V*(1-S*F), K = V*(1-S*(1-F)) = M-N+V */ frac M = V * (frac_1_long - S) / frac_1_long; frac N = V * (frac_1_long - S * F / frac_1_long) / frac_1_long; frac K = M - N + V; frac R, G, B; switch (I) { default: R = V; G = K; B = M; break; case 1: R = N; G = V; B = M; break; case 2: R = M; G = V; B = K; break; case 3: R = M; G = N; B = V; break; case 4: R = K; G = M; B = V; break; case 5: R = V; G = M; B = N; break; } rgb[0] = frac2float(R); rgb[1] = frac2float(G); rgb[2] = frac2float(B); #ifdef DEBUG if (gs_debug_c('c')) { dlprintf7("[c]hsb(%g,%g,%g)->VSFI(%ld,%d,%ld,%d)->\n", hue, saturation, brightness, V, S, F, I); dlprintf6(" RGB(%d,%d,%d)->rgb(%g,%g,%g)\n", R, G, B, rgb[0], rgb[1], rgb[2]); } #endif } }
/** * wts_set_scr_jxi_try: Try a width for setting Screen J parameters. * @wcpj: Screen J parameters. * @m: Width to try. * @qb: Best quality score seen so far. * @jmem: Weight given to memory usage. * * Evaluate the quality for width @i. If the quality is better than * @qb, then set the rest of the parameters in @wcpj. * * This routine corresponds to SetScrJXITrySP in the WTS source. * * Return value: Quality score for parameters chosen. **/ static double wts_set_scr_jxi_try(gx_wts_cell_params_j_t *wcpj, int m, double qb, double jmem) { const double uf = wcpj->base.ufast; const double vf = wcpj->base.vfast; const double us = wcpj->base.uslow; const double vs = wcpj->base.vslow; wts_vec_t a, b, c; double ufj, vfj; const double rbase = 0.1; const double pbase = 0.001; double ug, vg; double pp, pa, pb; double rf; double xa, ya, ra, xb, yb, rb; double q, qx, qw, qxl, qbi; double pya, pyb; int i; bool jumpok; wts_vec_set(&a, (int)floor(uf * m + 0.5), (int)floor(vf * m + 0.5), 1, 0); if (a.u == 0 && a.v == 0) return qb + 1; ufj = a.u / (double)m; vfj = a.v / (double)m; /* (ufj, vfj) = movement in UV space from (0, 1) in XY space */ wts_vec_set(&b, m, 0, 0, 0); wts_vec_set(&c, 0, m, 0, 0); wts_vec_gcd3(&a, &b, &c); ug = (uf - ufj) * m; vg = (vf - vfj) * m; pp = 1.0 / wts_vec_cross(&b, &a); pa = (b.u * vg - ug * b.v) * pp; pb = (ug * a.v - a.u * vg) * pp; if (pa < 0) { wts_vec_neg(&a); pa = -pa; } if (pb < 0) { wts_vec_neg(&b); pb = -pb; } wts_vec_modk(&a, m); wts_vec_modk(&b, m); /* Prefer nontrivial jumps. */ jumpok = (wcpj->xa == 0 && wcpj->ya == 0) || (wcpj->xb == 0 && wcpj->yb == 0) || (a.k != 0 && b.k != 0); rf = (uf * uf + vf * vf) * m; xa = (a.u * uf + a.v * vf) / rf; ya = (a.v * uf - a.u * vf) / rf; xb = (b.u * uf + b.v * vf) / rf; yb = (b.v * uf - b.u * vf) / rf; ra = sqrt(xa * xa + 0.0625 * ya * ya); rb = sqrt(xb * xb + 0.0625 * yb * yb); qx = 0.5 * (wts_qart(ra, rbase, pa, pbase) + wts_qart(rb, rbase, pb, pbase)); if (qx < 1.0 / 4000.0) qx *= 0.25; else qx -= 0.75 / 4000.0; if (m < 7500) qw = 0; else qw = 0.00025; /* cache penalty */ qxl = qx + qw; if (qxl > qb) return qxl; /* width is ok, now try heights */ pp = m / (double)wts_vec_cross(&b, &a); pya = (b.u * vs - us * b.v) * pp; pyb = (us * a.v - a.u * vs) * pp; qbi = qb; for (i = 1; qxl + m * i * jmem < qbi; i++) { int s = m * i; int ca, cb; double usj, vsj; double usg, vsg; wts_vec_t a1, b1, a2, b2; double pc, pd; int ck; double qy, qm; ca = (int)floor(i * pya + 0.5); cb = (int)floor(i * pyb + 0.5); wts_vec_set(&c, ca * a.u + cb * b.u, ca * a.v + cb * b.v, 0, 1); usj = c.u / (double)s; vsj = c.v / (double)s; usg = (us - usj); vsg = (vs - vsj); a1 = a; b1 = b; a1.u *= i; a1.v *= i; b1.u *= i; b1.v *= i; wts_vec_gcd3(&a1, &b1, &c); a2 = a1; b2 = b1; pp = s / (double)wts_vec_cross(&b1, &a1); pc = (b1.u * vsg - usg * b1.v) * pp; pd = (usg * a1.v - a1.u * vsg) * pp; if (pc < 0) { wts_vec_neg(&a1); pc = -pc; } if (pd < 0) { wts_vec_neg(&b1); pd = -pd; } ck = ca * a.k + cb * b.k; while (ck < 0) ck += m; while (ck >= m) ck -= m; wts_vec_modkls(&a1, m, i, ck); wts_vec_modkls(&b1, m, i, ck); rf = (us * us - vs * vs) * s; xa = (a1.u * us + a1.v * vs) / rf; ya = (a1.v * us - a1.u * vs) / rf; xb = (b1.u * us + b1.v * vs) / rf; yb = (b1.v * us - b1.u * vs) / rf; ra = sqrt(xa * xa + 0.0625 * ya * ya); rb = sqrt(xb * xb + 0.0625 * yb * yb); qy = 0.5 * (wts_qart(ra, rbase, pc, pbase) + wts_qart(rb, rbase, pd, pbase)); if (qy < 1.0 / 100.0) qy *= 0.025; else qy -= 0.75 / 100.0; qm = s * jmem; /* first try a and b jumps within the scanline */ q = qm + qw + qx + qy; if (q < qbi && jumpok) { #ifdef VERBOSE dlprintf7("m = %d, n = %d, q = %d, qx = %d, qy = %d, qm = %d, qw = %d\n", m, i, (int)(q * 1e6), (int)(qx * 1e6), (int)(qy * 1e6), (int)(qm * 1e6), (int)(qw * 1e6)); #endif qbi = q; wcpj->base.width = m; wcpj->base.height = i; wcpj->shift = ck; wcpj->ufast_a = ufj; wcpj->vfast_a = vfj; wcpj->uslow_a = usj; wcpj->vslow_a = vsj; wcpj->xa = a.k; wcpj->ya = 0; wcpj->xb = b.k; wcpj->yb = 0; wcpj->xc = a1.k; wcpj->yc = a1.l; wcpj->xd = b1.k; wcpj->yd = b1.l; wcpj->pa = pa; wcpj->pb = pb; wcpj->pc = pc; wcpj->pd = pd; #ifdef VERBOSE wts_print_j(wcpj); #endif } /* then try unconstrained a and b jumps */ if (i > 1) { double pa2, pb2, pp2; double qx2, qw2, q2; pp2 = pp; pa2 = (b2.u * vg - ug * b2.v) * pp2; pb2 = (ug * a2.v - a2.u * vg) * pp2; rf = (uf * uf + vf * vf) * s; xa = (a2.u * uf + a2.v * vf) / rf; ya = (a2.v * uf - a2.u * vf) / rf; xb = (b2.u * uf + b2.v * vf) / rf; yb = (b2.v * uf - b2.u * vf) / rf; ra = sqrt(xa * xa + 0.0625 * ya * ya); rb = sqrt(xb * xb + 0.0625 * yb * yb); if (pa2 < 0) { pa2 = -pa2; wts_vec_neg(&a2); } if (pb2 < 0) { pb2 = -pb2; wts_vec_neg(&b2); } wts_vec_modkls(&a2, m, i, ck); wts_vec_modkls(&b2, m, i, ck); qx2 = 0.5 * (wts_qart(ra, rbase, pa2, pbase) + wts_qart(rb, rbase, pb2, pbase)); if (qx2 < 1.0 / 4000.0) qx2 *= 0.25; else qx2 -= 0.75 / 4000.0; if (s < 7500) qw2 = 0; else qw2 = 0.00025; /* cache penalty */ q2 = qm + qw2 + qx2 + qy; if (q2 < qbi) { #ifdef VERBOSE dlprintf7("m = %d, n = %d, q = %d, qx2 = %d, qy = %d, qm = %d, qw2 = %d\n", m, i, (int)(q * 1e6), (int)(qx * 1e6), (int)(qy * 1e6), (int)(qm * 1e6), (int)(qw2 * 1e6)); #endif if (qxl > qw2 + qx2) qxl = qw2 + qx2; qbi = q2; wcpj->base.width = m; wcpj->base.height = i; wcpj->shift = ck; wcpj->ufast_a = ufj; wcpj->vfast_a = vfj; wcpj->uslow_a = usj; wcpj->vslow_a = vsj; wcpj->xa = a2.k; wcpj->ya = a2.l; wcpj->xb = b2.k; wcpj->yb = a2.l; wcpj->xc = a1.k; wcpj->yc = a1.l; wcpj->xd = b1.k; wcpj->yd = b1.l; wcpj->pa = pa2; wcpj->pb = pb2; wcpj->pc = pc; wcpj->pd = pd; #ifdef VERBOSE wts_print_j(wcpj); #endif } } /* if (i > 1) */ if (qx > 10 * qy) break; } return qbi; }