//======================================================================== // // SplashScreen.cc // //======================================================================== #include #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; }