/******************************************************************************
 *
 * Name:     GDALColorTable.cs
 * Project:  GDAL CSharp Interface
 * Purpose:  A sample app for demonstrating the usage of the ColorTable object.
 * Author:   Tamas Szekeres, szekerest@gmail.com
 *
 ******************************************************************************
 * Copyright (c) 2007, Tamas Szekeres
 * Copyright (c) 2026, Paul Harwood
 *
 * SPDX-License-Identifier: MIT
 *****************************************************************************/

using System;

using OSGeo.GDAL;


/**
 * <p>Title: GDAL C# GDALColorTable example.</p>
 * <p>Description: A sample app for demonstrating the usage of the ColorTable object.</p>
 * @author Tamas Szekeres (szekerest@gmail.com)
 * @version 1.0
 */



/// <summary>
/// A C# based sample for demonstrating the usage of the ColorTable object.
/// </summary>

class GDALColorTable
{

    public static void usage()

    {
        Console.WriteLine("usage: gdalcolortable {source dataset} {destination file}");
        System.Environment.Exit(-1);
    }

    public static void Main(string[] args)
    {

        if (args.Length != 2) usage();

        string file = args[0];
        string file_out = args[1];
        try
        {

            /* -------------------------------------------------------------------- */
            /*      Register driver(s).                                             */
            /* -------------------------------------------------------------------- */
            Gdal.AllRegister();

            byte[] buffer;

            /* -------------------------------------------------------------------- */
            /*      Open dataset.                                                   */
            /* -------------------------------------------------------------------- */
            using (Dataset ds = Gdal.Open(file, Access.GA_ReadOnly))
            using (Band band = ds.GetRasterBand(1))
            using (ColorTable ct = band.GetRasterColorTable())
            {
                if (ct != null)
                    Console.WriteLine("Band has a color table with " + ct.GetCount() + " entries.");
                else
                {
                    Console.WriteLine("Data source has no color table");
                    return;
                }

                buffer = new byte[ds.RasterXSize * ds.RasterYSize];
                band.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, buffer,
                    ds.RasterXSize, ds.RasterYSize, 0, 0);

                /* -------------------------------------------------------------------- */
                /*      Get driver                                                      */
                /* -------------------------------------------------------------------- */
                Driver dv = Gdal.GetDriverByName("GTiff");

                using (Dataset ds_out = dv.Create(file_out, ds.RasterXSize, ds.RasterYSize,
                                                   ds.RasterCount, band.DataType, new string[] { }
                                                   ))
                using (Band ba_out = ds_out.GetRasterBand(1))
                using (ColorTable ct_out = new ColorTable(PaletteInterp.GPI_RGB))
                {
                    ba_out.WriteRaster(0, 0, ds.RasterXSize, ds.RasterYSize, buffer,
                        ds.RasterXSize, ds.RasterYSize, 0, 0);

                    /* -------------------------------------------------------------------- */
                    /*      Copying the colortable                                          */
                    /* -------------------------------------------------------------------- */
                    for (int i = 0; i < ct.GetCount(); i++)
                    {
                        ColorEntry ce = null, ce_out = null;

                        ce = ct.GetColorEntry(i);
                        ce_out = new ColorEntry();

                        ce_out.c1 = ce.c1;
                        ce_out.c2 = ce.c2;
                        ce_out.c3 = ce.c3;
                        ce_out.c4 = ce.c4;

                        ct_out.SetColorEntry(i, ce_out);

                        ce.Dispose();
                        ce_out.Dispose();
                    }

                    ba_out.SetRasterColorTable(ct_out);
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("Application error: " + e.Message);
        }
    }
}
