예제 #1
0
/* Set up the next sample */
static int
screen_sample(i_ctx_t *i_ctx_p)
{
    os_ptr op = osp;
    gs_screen_enum *penum = senum;
    gs_point pt;
    int code = gs_screen_currentpoint(penum, &pt);
    ref proc;

    switch (code) {
        default:
            return code;
        case 1:
            /* All done */
            if (real_opproc(esp - 2) != 0)
                code = (*real_opproc(esp - 2)) (i_ctx_p);
            esp -= snumpush;
            screen_cleanup(i_ctx_p);
            return (code < 0 ? code : o_pop_estack);
        case 0:
            ;
    }
    push(2);
    make_real(op - 1, pt.x);
    make_real(op, pt.y);
    proc = sproc;
    push_op_estack(set_screen_continue);
    *++esp = proc;
    return o_push_estack;
}
예제 #2
0
/* Record next halftone sample */
int
gs_screen_next(gs_screen_enum * penum, floatp value)
{
    if (penum->order.wse) {
        return gs_wts_screen_enum_next (penum->order.wse, value);
    } else {
        ht_sample_t sample;
        int width = penum->order.width;
        gx_ht_bit *bits = (gx_ht_bit *)penum->order.bit_data;

        if (value < -1.0 || value > 1.0)
            return_error(gs_error_rangecheck);
        sample = (ht_sample_t) ((value + 1) * max_ht_sample);
#ifdef DEBUG
        if (gs_debug_c('H')) {
            gs_point pt;

            gs_screen_currentpoint(penum, &pt);
            dlprintf6("[H]sample x=%d y=%d (%f,%f): %f -> %u\n",
                      penum->x, penum->y, pt.x, pt.y, value, sample);
        }
#endif
        bits[penum->y * width + penum->x].mask = sample;
        if (++(penum->x) >= width)
            penum->x = 0, ++(penum->y);
        return 0;
    }
}