// $Id: x02c.c 12288 2013-01-30 04:40:35Z airwin $
//
//      Multiple window and color map 0 demo.
//

#include "plcdemos.h"

//--------------------------------------------------------------------------
// main
//
// Demonstrates multiple windows and color map 0 palette, both default and
// user-modified.
//--------------------------------------------------------------------------

void demo1( void );
void demo2( void );
void draw_windows( int nw, int cmap0_offset );

int
main( int argc, const char *argv[] )
{
// Parse and process command line arguments
    (void) plparseopts( &argc, argv, PL_PARSE_FULL );

// Initialize plplot
    plinit();

// Run demos
    demo1();
    demo2();

    plend();
    exit( 0 );
}

//--------------------------------------------------------------------------
// demo1
//
// Demonstrates multiple windows and default color map 0 palette.
//--------------------------------------------------------------------------

void demo1( void )
{
    plbop();

// Divide screen into 16 regions
    plssub( 4, 4 );

    draw_windows( 16, 0 );

    pleop();
}

//--------------------------------------------------------------------------
// demo2
//
// Demonstrates multiple windows, user-modified color map 0 palette, and
// HLS -> RGB translation.
//--------------------------------------------------------------------------

void demo2( void )
{
// Set up cmap0
// Use 100 custom colors in addition to base 16
    PLINT r[116], g[116], b[116];

// Min & max lightness values
    PLFLT lmin = 0.15, lmax = 0.85;

    int   i;

    plbop();

// Divide screen into 100 regions

    plssub( 10, 10 );

    for ( i = 0; i <= 99; i++ )
    {
        PLFLT h, l, s;
        PLFLT r1, g1, b1;

        // Bounds on HLS, from plhlsrgb() commentary --
        //	hue		[0., 360.]	degrees
        //	lightness	[0., 1.]	magnitude
        //	saturation	[0., 1.]	magnitude
        //

        // Vary hue uniformly from left to right
        h = ( 360. / 10. ) * ( i % 10 );
        // Vary lightness uniformly from top to bottom, between min & max
        l = lmin + ( lmax - lmin ) * ( i / 10 ) / 9.;
        // Use max saturation
        s = 1.0;

        plhlsrgb( h, l, s, &r1, &g1, &b1 );
        //printf("%3d %15.9f %15.9f %15.9f %15.9f %15.9f %15.9f\n",
        //     i+16,h,l,s,r1,g1,b1);

        // Use 255.001 to avoid close truncation decisions in this example.
        r[i + 16] = (PLINT) ( r1 * 255.001 );
        g[i + 16] = (PLINT) ( g1 * 255.001 );
        b[i + 16] = (PLINT) ( b1 * 255.001 );
    }

// Load default cmap0 colors into our custom set
    for ( i = 0; i <= 15; i++ )
        plgcol0( i, &r[i], &g[i], &b[i] );

//    for (i = 0; i < 116; i++)
//      printf("%3d %3d %3d %3d \n", i, r[i], g[i], b[i]);
// Now set cmap0 all at once (faster, since fewer driver calls)
    plscmap0( r, g, b, 116 );

    draw_windows( 100, 16 );

    pleop();
}

//--------------------------------------------------------------------------
// draw_windows
//
// Draws a set of numbered boxes with colors according to cmap0 entry.
//--------------------------------------------------------------------------

void draw_windows( int nw, int cmap0_offset )
{
    int   i, j;
    PLFLT vmin, vmax;
    char  text[3];

    plschr( 0.0, 3.5 );
    plfont( 4 );

    for ( i = 0; i < nw; i++ )
    {
        plcol0( i + cmap0_offset );
        sprintf( text, "%d", i );
        pladv( 0 );
        vmin = 0.1;
        vmax = 0.9;
        for ( j = 0; j <= 2; j++ )
        {
            plwidth( j + 1 );
            plvpor( vmin, vmax, vmin, vmax );
            plwind( 0.0, 1.0, 0.0, 1.0 );
            plbox( "bc", 0.0, 0, "bc", 0.0, 0 );
            vmin = vmin + 0.1;
            vmax = vmax - 0.1;
        }
        plwidth( 1 );
        plptex( 0.5, 0.5, 1.0, 0.0, 0.5, text );
    }
}
