/***********************************************************************
The following function displays an image using progressive refinement
via gridded sampling.  It assumes the existence of two functions:

    SetColor (x, y)
        Sets the current color to the color at image location x,y.

    Rectangle (x, y, width, height)
        Draws a rectangular region filled with the current color.  The
        rectangle ranges from x to (x+width-1), and from y to
        (y+height-1).

The parameters given are the subdivision start level (a power of two),
and the X and Y dimensions of the entire image.
***********************************************************************/

void SetColor(int x, int y) {}
void Rectangle(int x, int y, int sx, int sy) {}
void  PIR_Display  (start_level, Xdim, Ydim)
    int  start_level;      /* Starting Subdivision Level */
    int  Xdim, Ydim;       /* Image Dimensions */
{
    auto int size, size2;  /* Current Region Size & size/2 */
    auto int Ix, Iy;       /* Image Space Indices */


    /* Initialization loop:  display the initial coarse image tiling. */

    size = 1 << start_level;

    for (Iy=0;  Iy <= Ydim;  Iy += size)
    {   for (Ix=0;  Ix <= Xdim;  Ix += size)
        {   SetColor  (Ix, Iy);
            Rectangle (Ix, Iy, size, size);
        }
    }

    /* Sampling and Gridding Loop */

    size2 = size / 2;

    while (size > 1)       /* Subdivide down to the pixel level. */
    {
        for (Iy=0;  Iy <= Ydim;  Iy += size)
        {   for (Ix=0;  Ix <= Xdim;  Ix += size)
            {
                /* Draw the three new subpixel regions. */

                SetColor  (Ix, Iy + size2);
                Rectangle (Ix, Iy + size2, size2, size2);

                SetColor  (Ix + size2, Iy + size2);
                Rectangle (Ix + size2, Iy + size2, size2, size2);

                SetColor  (Ix + size2, Iy);
                Rectangle (Ix + size2, Iy, size2, size2);
            }
        }

        /* The new region edge length is half the old edge length. */

        size  = size2;
        size2 = size2 / 2;
    }
}
