Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/pdf/splash/SplashScreen.cc
diff options
context:
space:
mode:
Diffstat (limited to 'pdf/splash/SplashScreen.cc')
-rw-r--r--pdf/splash/SplashScreen.cc107
1 files changed, 107 insertions, 0 deletions
diff --git a/pdf/splash/SplashScreen.cc b/pdf/splash/SplashScreen.cc
new file mode 100644
index 0000000..4230856
--- /dev/null
+++ b/pdf/splash/SplashScreen.cc
@@ -0,0 +1,107 @@
+//========================================================================
+//
+// SplashScreen.cc
+//
+//========================================================================
+
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include "gmem.h"
+#include "SplashMath.h"
+#include "SplashScreen.h"
+
+//------------------------------------------------------------------------
+// SplashScreen
+//------------------------------------------------------------------------
+
+// This generates a 45 degree screen using a circular dot spot
+// function. DPI = resolution / ((size / 2) * sqrt(2)).
+// Gamma correction (gamma = 1 / 1.33) is also computed here.
+SplashScreen::SplashScreen(int sizeA) {
+ SplashCoord *dist;
+ SplashCoord u, v, d;
+ int x, y, x1, y1, i;
+
+ size = sizeA >> 1;
+ if (size < 1) {
+ size = 1;
+ }
+
+ // initialize the threshold matrix
+ mat = (SplashCoord *)gmalloc(2 * size * size * sizeof(SplashCoord));
+ for (y = 0; y < 2 * size; ++y) {
+ for (x = 0; x < size; ++x) {
+ mat[y * size + x] = -1;
+ }
+ }
+
+ // build the distance matrix
+ dist = (SplashCoord *)gmalloc(2 * size * size * sizeof(SplashCoord));
+ for (y = 0; y < size; ++y) {
+ for (x = 0; x < size; ++x) {
+ if (x + y < size - 1) {
+ u = (SplashCoord)x + 0.5 - 0; //~ (-0.5);
+ v = (SplashCoord)y + 0.5 - 0;
+ } else {
+ u = (SplashCoord)x + 0.5 - (SplashCoord)size; //~ ((SplashCoord)size - 0.5);
+ v = (SplashCoord)y + 0.5 - (SplashCoord)size;
+ }
+ dist[y * size + x] = u*u + v*v;
+ }
+ }
+ for (y = 0; y < size; ++y) {
+ for (x = 0; x < size; ++x) {
+ if (x < y) {
+ u = (SplashCoord)x + 0.5 - 0; //~ (-0.5);
+ v = (SplashCoord)y + 0.5 - (SplashCoord)size;
+ } else {
+ u = (SplashCoord)x + 0.5 - (SplashCoord)size; //~ ((SplashCoord)size - 0.5);
+ v = (SplashCoord)y + 0.5 - 0;
+ }
+ dist[(size + y) * size + x] = u*u + v*v;
+ }
+ }
+
+ // build the threshold matrix
+ x1 = y1 = 0; // make gcc happy
+ for (i = 1; i <= 2 * size * size; ++i) {
+ d = 2 * size * size;
+ for (y = 0; y < 2 * size; ++y) {
+ for (x = 0; x < size; ++x) {
+ if (mat[y * size + x] < 0 &&
+ dist[y * size + x] < d) {
+ x1 = x;
+ y1 = y;
+ d = dist[y1 * size + x1];
+ }
+ }
+ }
+ u = 1.0 - (SplashCoord)i / (SplashCoord)(2 * size * size + 1);
+ mat[y1 * size + x1] = splashPow(u, 1.33);
+ }
+
+ gfree(dist);
+}
+
+SplashScreen::~SplashScreen() {
+ gfree(mat);
+}
+
+int SplashScreen::test(int x, int y, SplashCoord value) {
+ SplashCoord *mat1;
+ int xx, yy;
+
+ xx = x % (2 * size);
+ yy = y % (2 * size);
+ mat1 = mat;
+ if ((xx / size) ^ (yy / size)) {
+ mat1 += size * size;
+ }
+ xx %= size;
+ yy %= size;
+ return value < mat1[yy * size + xx] ? 0 : 1;
+}