// Object part of VDisplay class

/*

    Copyright (C) 1991-2001 The National Gallery

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

 */

/*

    These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk

 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif /*HAVE_CONFIG_H*/
#include <vips/intl.h>

#include <cstdlib>
#include <cstring>

#include <vips/vips.h>
#include <vips/internal.h>

#include <vips/vipscpp.h>

#ifdef WITH_DMALLOC
#include <dmalloc.h>
#endif /*WITH_DMALLOC*/

VIPS_NAMESPACE_START

/* Refcounting stuff first.
 */

// Free an im_col_display
static void
free_display( im_col_display *d )
{
	if( d->d_name )
		im_free( d->d_name );
	im_free( d );
}

// Dupe an im_col_display
static im_col_display *
dup_display( im_col_display *in ) throw( VError )
{
	im_col_display *out;

	if( !(out = IM_NEW( NULL, im_col_display )) )
		verror();

	*out = *in;
	if( in->d_name )
		if( !(out->d_name = strdup( in->d_name )) ) {
			free_display( out );
			verror( "out of memory" );
		}

	return( out );
}

// Remove lut
void VDisplay::refblock::cleanlut()
{
	if( luts ) {
		im_free( luts );
		luts = 0;
	}
}

// Remove attached things
void VDisplay::refblock::cleanref()
{
	if( disp && priv ) {
		free_display( disp );
		disp = 0;
		priv = 0;
	}
	cleanlut();
}

// Get ready to write to disp
void VDisplay::refblock::wready() throw( VError )
{
	cleanlut();
	if( !priv ) {
		disp = dup_display( disp );
		priv = 1;
	}
}

// Check that luts are up-to-date
void VDisplay::refblock::cluts() throw( VError )
{
	if( !luts )
		if( !(luts = im_col_make_tables_RGB( NULL, disp )) )
			verror();
}

VDisplay::~VDisplay()
{
	ref->nrefs--;
	if( !ref->nrefs ) 
		delete ref;
}

VDisplay &VDisplay::operator=( const VDisplay &a )
{ 
	ref->nrefs--;

	if( ref->nrefs > 0 ) 
		// Need fresh
		ref = new refblock;
	else 
		// Recycle old
		ref->cleanref();

	ref = a.ref; 
	ref->nrefs++; 
	
	return( *this ); 
}

VDisplay::VDisplay( const char *name ) throw( VError )
{
	// Search for a matching name in the VIPS colour list
        im_col_display *scr = im_col_display_name( name );
 
	if( !scr ) {
		VError err;

		err.app( "VDisplay error: " );
		err.app( "unknown display type \"" ).app( name ).app( "\"\n" );
		err.app( "display should be one of:" );

		for( int i = 0; (scr = im_col_displays( i )); i++ ) {
			err.app( " \"" );
			err.app( im_col_displays( i )->d_name );
			err.app( "\"" );
		}

		err.app( "\n" );

		throw( err );
	}

	// Install display
	ref = new refblock;
	ref->disp = scr;
}

VDisplay::VDisplay()
{
	// Just use sRGB
	ref = new refblock;
	ref->disp = im_col_displays( 7 );
}

/*

Setters and getters. We used to have a lot of code of the form:
 
float &VDisplay::YCW()
	{ ref->wready(); return( ((im_col_display*)ref->disp)->d_YCW ); }

This should be split to separate setters/getters so we can exploit const. Too 
annoying to do this on such a useless class (I'm certain no one used these 
functions anyway), fix in vips8.

 */

VIPS_NAMESPACE_END

