1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
/* Copyright (C) 1989, 1995, 1996, 1997, 1999 Aladdin Enterprises. All rights reserved.
This software is licensed to a single customer by Artifex Software Inc.
under the terms of a specific OEM agreement.
*/
/*$RCSfile$ $Revision$ */
/* Internal matrix routines for Ghostscript library */
#ifndef gxmatrix_INCLUDED
# define gxmatrix_INCLUDED
#include "gsmatrix.h"
/*
* Define a matrix with a cached fixed-point copy of the translation.
* This is only used by a few routines in gscoord.c; they are responsible
* for ensuring the validity of the cache. Note that the floating point
* tx/ty values may be too large to fit in a fixed values; txy_fixed_valid
* is false if this is the case, and true otherwise.
*/
typedef struct gs_matrix_fixed_s {
_matrix_body;
fixed tx_fixed, ty_fixed;
bool txy_fixed_valid;
} gs_matrix_fixed;
/* Make a gs_matrix_fixed from a gs_matrix. */
int gs_matrix_fixed_from_matrix(P2(gs_matrix_fixed *, const gs_matrix *));
/* Coordinate transformations to fixed point. */
int gs_point_transform2fixed(P4(const gs_matrix_fixed *, floatp, floatp,
gs_fixed_point *));
int gs_distance_transform2fixed(P4(const gs_matrix_fixed *, floatp, floatp,
gs_fixed_point *));
/*
* Define the fixed-point coefficient structure for avoiding
* floating point in coordinate transformations.
* Currently this is used only by the Type 1 font interpreter.
* The setup is in gscoord.c.
*/
typedef struct {
long l;
fixed f;
} coeff1;
typedef struct {
coeff1 xx, xy, yx, yy;
int skewed;
int shift; /* see m_fixed */
int max_bits; /* max bits of coefficient */
fixed round; /* ditto */
} fixed_coeff;
/*
* Multiply a fixed whose integer part usually does not exceed max_bits
* in magnitude by a coefficient from a fixed_coeff.
* We can use a faster algorithm if the fixed is an integer within
* a range that doesn't cause the multiplication to overflow an int.
*/
#define m_fixed(v, c, fc, maxb)\
(((v) + (fixed_1 << (maxb - 1))) &\
((-fixed_1 << maxb) | _fixed_fraction_v) ? /* out of range, or has fraction */\
(fixed2int_var(v) * (fc).c.f +\
arith_rshift(fixed_fraction(v) * (fc).c.f + fixed_half, _fixed_shift)) :\
arith_rshift(fixed2int_var(v) * (fc).c.l + (fc).round, (fc).shift))
#endif /* gxmatrix_INCLUDED */
|