]>
git.ipfire.org Git - thirdparty/cups.git/blob - pdftops/SplashScreen.cxx
1 //========================================================================
5 //========================================================================
10 #pragma implementation
15 #include "SplashMath.h"
16 #include "SplashScreen.h"
18 //------------------------------------------------------------------------
20 //------------------------------------------------------------------------
22 // This generates a 45 degree screen using a circular dot spot
23 // function. DPI = resolution / ((size / 2) * sqrt(2)).
24 // Gamma correction (gamma = 1 / 1.33) is also computed here.
25 SplashScreen::SplashScreen(int sizeA
) {
27 SplashCoord u
, v
, d
, val
;
28 int size2
, x
, y
, x1
, y1
, i
;
36 // initialize the threshold matrix
37 mat
= (SplashCoord
*)gmallocn(size
* size
, sizeof(SplashCoord
));
38 for (y
= 0; y
< size
; ++y
) {
39 for (x
= 0; x
< size
; ++x
) {
40 mat
[y
* size
+ x
] = -1;
44 // build the distance matrix
45 dist
= (SplashCoord
*)gmallocn(size
* size2
, sizeof(SplashCoord
));
46 for (y
= 0; y
< size2
; ++y
) {
47 for (x
= 0; x
< size2
; ++x
) {
48 if (x
+ y
< size2
- 1) {
49 u
= (SplashCoord
)x
+ 0.5 - 0;
50 v
= (SplashCoord
)y
+ 0.5 - 0;
52 u
= (SplashCoord
)x
+ 0.5 - (SplashCoord
)size2
;
53 v
= (SplashCoord
)y
+ 0.5 - (SplashCoord
)size2
;
55 dist
[y
* size2
+ x
] = u
*u
+ v
*v
;
58 for (y
= 0; y
< size2
; ++y
) {
59 for (x
= 0; x
< size2
; ++x
) {
61 u
= (SplashCoord
)x
+ 0.5 - 0;
62 v
= (SplashCoord
)y
+ 0.5 - (SplashCoord
)size2
;
64 u
= (SplashCoord
)x
+ 0.5 - (SplashCoord
)size2
;
65 v
= (SplashCoord
)y
+ 0.5 - 0;
67 dist
[(size2
+ y
) * size2
+ x
] = u
*u
+ v
*v
;
71 // build the threshold matrix
74 x1
= y1
= 0; // make gcc happy
75 for (i
= 1; i
<= size
* size2
; ++i
) {
77 for (y
= 0; y
< size
; ++y
) {
78 for (x
= 0; x
< size2
; ++x
) {
79 if (mat
[y
* size
+ x
] < 0 &&
80 dist
[y
* size2
+ x
] < d
) {
83 d
= dist
[y1
* size2
+ x1
];
87 u
= (SplashCoord
)1 - (SplashCoord
)i
/ (SplashCoord
)(size
* size2
+ 1);
88 val
= splashPow(u
, 1.33);
95 mat
[y1
* size
+ x1
] = val
;
97 mat
[(y1
+ size2
) * size
+ x1
+ size2
] = val
;
99 mat
[(y1
- size2
) * size
+ x1
+ size2
] = val
;
106 SplashScreen::SplashScreen(SplashScreen
*screen
) {
110 n
= size
* size
* sizeof(SplashCoord
);
111 mat
= (SplashCoord
*)gmalloc(n
);
112 memcpy(mat
, screen
->mat
, n
);
113 minVal
= screen
->minVal
;
114 maxVal
= screen
->maxVal
;
117 SplashScreen::~SplashScreen() {
121 int SplashScreen::test(int x
, int y
, SplashCoord value
) {
124 if (value
< minVal
) {
127 if (value
>= maxVal
) {
130 if ((xx
= x
% size
) < 0) {
133 if ((yy
= y
% size
) < 0) {
136 return value
< mat
[yy
* size
+ xx
] ? 0 : 1;
139 GBool
SplashScreen::isStatic(SplashCoord value
) {
140 return value
< minVal
|| value
>= maxVal
;