//----------------------------------------------------------------------------
bool GpuGaussianBlur3::OnInitialize ()
{
    if (!WindowApplication3::OnInitialize())
    {
        return false;
    }

    // Get any command-line parameters.
    bool useDirichlet = false;
    if (TheCommand)
    {
        // usage for Dirichlet:  GpuGaussianBlur3 -d
        // usage for Neumann:    GpuGaussianBlur3
        useDirichlet = TheCommand->GetBoolean("d") != 0;
    }

    // Load the image to be blurred.  The image is known to be 128x128x64.
#ifdef WM5_LITTLE_ENDIAN
    std::string imageName = Environment::GetPathR(
        "Head.x128y128z64.short.le.raw");
#else
    std::string imageName = Environment::GetPathR(
        "Head.x128y128z64.short.be.raw");
#endif
    assertion(imageName != "", "Cannot find or open image file\n");
    FILE* inFile = fopen(imageName.c_str(), "rb");
    int numVoxels = 128*128*64;
    short* rawData = new1<short>(numVoxels);
    fread(rawData, sizeof(short), numVoxels, inFile);
    fclose(inFile);

    // For the test image, smin = -1117 and smax = 2248.  Let us compute them
    // anyway (you would do this generally for any input image).
    short smin = rawData[0], smax = rawData[0];
    int i;
    for (int i = 1; i < numVoxels; ++i)
    {
        if (rawData[i] < smin)
        {
            smin = rawData[i];
        }
        else if (rawData[i] > smax)
        {
            smax = rawData[i];
        }
    }
    float trn = (float)smin;
    float mult = 1.0f/((float)smax - (float)smin);

    Float4* imageData = new1<Float4>(numVoxels);
    for (i = 0; i < numVoxels; ++i)
    {
        float gray = ((float)rawData[i] - trn)*mult;
        imageData[i] = Float4(gray, gray, gray, gray);
    }
    delete1(rawData);

    // Create the image processor.
    mIP = new0 ImageProcessing3(128, 128, 8, 8, imageData,
        CreateBlurPixelShader(), Float4(0.0f, 1.0f, 0.0f, 0.0f),
        useDirichlet);

    delete1(imageData);
    SetBlurInput();
#ifdef WM5_USE_OPENGL
    mIP->Initialize(mRenderer, true);
#else
    mIP->Initialize(mRenderer);
#endif
    return true;
}
//----------------------------------------------------------------------------
bool GpuGaussianBlur2::OnInitialize ()
{
    if (!WindowApplication3::OnInitialize())
    {
        return false;
    }

    bool useDirichlet = false;
    if (TheCommand)
    {
        // usage for Dirichlet:  GpuGaussianBlur2 -d
        // usage for Neumann:    GpuGaussianBlur2
        useDirichlet = TheCommand->GetBoolean("d") != 0;
    }

    // Load the image to be blurred.  The image is known to be 256x256.
#ifdef WM5_LITTLE_ENDIAN
    std::string imageName = Environment::GetPathR(
        "Head.x256y256.short.le.raw");
#else
    std::string imageName = Environment::GetPathR(
        "Head.x256y256.short.be.raw");
#endif
    assertion(imageName != "", "Cannot find or open image file\n");
    FILE* inFile = fopen(imageName.c_str(), "rb");
    int numPixels = 256*256;
    short* rawData = new1<short>(numPixels);
    fread(rawData, sizeof(short), numPixels, inFile);
    fclose(inFile);

    // For the test image, smin = 0 and smax = 1024.  Let us compute them
    // anyway (you would do this generally for any input image).
    short smin = rawData[0], smax = rawData[0];
    int i;
    for (int i = 1; i < numPixels; ++i)
    {
        if (rawData[i] < smin)
        {
            smin = rawData[i];
        }
        else if (rawData[i] > smax)
        {
            smax = rawData[i];
        }
    }
    float trn = (float)smin;
    float mult = 1.0f/((float)smax - (float)smin);

    Float4* imageData = new1<Float4>(numPixels);
    for (i = 0; i < numPixels; ++i)
    {
        float gray = ((float)rawData[i] - trn)*mult;
        imageData[i] = Float4(gray, gray, gray, gray);
    }
    delete1(rawData);

    // Create the screen objects for image processing.
    mIP = new0 ImageProcessing2(256, 256, imageData,
        CreateBlurPixelShader(), useDirichlet);

    delete1(imageData);
    SetBlurInput();
    mIP->Initialize(mRenderer);
    return true;
}