Beispiel #1
0
int
gs_idtransform(gs_state * pgs, floatp dx, floatp dy, gs_point * pt)
{				/* If the matrix isn't skewed, we get more accurate results */
    /* by using transform_inverse than by using the inverse matrix. */
    if (!is_skewed(&pgs->ctm)) {
        return gs_distance_transform_inverse(dx, dy,
                                             &ctm_only(pgs), pt);
    } else {
        ensure_inverse_valid(pgs);
        return gs_distance_transform(dx, dy, &pgs->ctm_inverse, pt);
    }
}
Beispiel #2
0
/*
 * Set *pdist to the distance (dx,dy), in the space defined by *pmat.
 */
static int
set_text_distance(gs_point *pdist, floatp dx, floatp dy, const gs_matrix *pmat)
{
    int code = gs_distance_transform_inverse(dx, dy, pmat, pdist);
    double rounded;

    if (code == gs_error_undefinedresult) {
        /* The CTM is degenerate.
           Can't know the distance in user space.
           Set zero because we believe it is not important for rendering.
           We want to copy the text to PDF to make it searchable.
           Bug 689006.
         */
        pdist->x = pdist->y = 0;
    } else if (code < 0)
        return code;
    /* If the distance is very close to integers, round it. */
    if (fabs(pdist->x - (rounded = floor(pdist->x + 0.5))) < 0.0005)
        pdist->x = rounded;
    if (fabs(pdist->y - (rounded = floor(pdist->y + 0.5))) < 0.0005)
        pdist->y = rounded;
    return 0;
}
Beispiel #3
0
int
gs_imager_idtransform(const gs_imager_state * pis, floatp dx, floatp dy,
                      gs_point * pt)
{
    return gs_distance_transform_inverse(dx, dy, &ctm_only(pis), pt);
}