//--------------------------------------------------------------------//
        //                                                        M e t h o d //
        // g e n e r a t e I m a g e T r a i l e r                            //
        //--------------------------------------------------------------------//
        //                                                                    //
        // Write image termination sequences to output file.                  //
        //                                                                    //
        //--------------------------------------------------------------------//

        private static void generateImageTrailer(BinaryWriter prnWriter)
        {
            PCLWriter.rasterEnd(prnWriter);

            PCLWriter.palettePushPop(prnWriter, PCLWriter.ePushPop.Pop);
        }
        //--------------------------------------------------------------------//
        //                                                        M e t h o d //
        // g e n e r a t e I m a g e H e a d e r                              //
        //--------------------------------------------------------------------//
        //                                                                    //
        // Write image initialisation sequences to output file.               //
        //                                                                    //
        //--------------------------------------------------------------------//

        private static void generateImageHeader(BinaryWriter prnWriter,
                                                UInt16 srcBitsPerPixel,
                                                Int32 srcWidth,
                                                Int32 srcHeight,
                                                Int32 srcResX,
                                                Int32 srcResY,
                                                Single destPosX,
                                                Single destPosY,
                                                Int32 destScalePercentX,
                                                Int32 destScalePercentY,
                                                Int32 rasterResolution,
                                                UInt32 srcPaletteEntries,
                                                Boolean srcBlackWhite)
        {
            Int16 coordX,
                  coordY;

            UInt32 paletteEntries = 0;

            Byte bitsPerIndex = 0x00;

            Boolean indexed = true;

            //----------------------------------------------------------------//
            //                                                                //
            // Set position.                                                  //
            //                                                                //
            //----------------------------------------------------------------//

            coordX = (Int16)(destPosX * 600);
            coordY = (Int16)(destPosY * 600);

            PCLWriter.palettePushPop(prnWriter, PCLWriter.ePushPop.Push);

            PCLWriter.cursorPosition(prnWriter, coordX, coordY);

            //----------------------------------------------------------------//
            //                                                                //
            // Set colour space, etc.                                         //
            //                                                                //
            // Note that we only support the following bitmap types:          //
            //                                                                //
            //   -  1-bit black and white:                                    //
            //      Colour space: Gray (1 plane)                              //
            //      Encoding:     indirect-pixel                              //
            //      Palette:      elements = 2 (= 2^1)                        //
            //                    planes   = 1                                //
            //                    length   = 2 (= 2 * 1) bytes.               //
            //      Image data:   Each image pixel is defined by 1 bit        //
            //                    which is used an an index into the          //
            //                    2-element palette.                          //
            //                                                                //
            //   -  1-bit colour                                              //
            //      Colour space: RGB (3 plane)                               //
            //      Encoding:     indirect-pixel                              //
            //      Palette:      elements = 2 (= 2^1)                        //
            //                    planes   = 3                                //
            //                    length   = 6 (= 2 * 3) bytes.               //
            //      Image data:   Each image pixel is defined by 1 bit        //
            //                    which is used an an index into the          //
            //                    2-element palette.                          //
            //                                                                //
            //   -  4-bit:                                                    //
            //      Colour space: RGB (3-plane)                               //
            //      Encoding:     indirect-pixel                              //
            //      Palette:      elements = 16 (= 2^4)                       //
            //                    planes   = 3                                //
            //                    length   = 48 (= 16 * 3) bytes.             //
            //      Image data:   Each group of 4 bits defines an image       //
            //                    pixel by use as an index into the           //
            //                    16-element palette.                         //
            //                                                                //
            //   -  24-bit:                                                   //
            //      Colour space: RGB (3-plane)                               //
            //      Encoding:     direct-pixel                                //
            //      Palette:      none                                        //
            //      Image data:   Each group of 24 bits defines an image      //
            //                    pixel as three 8-bit values, directly       //
            //                    specifying the RGB values.                  //
            //                                                                //
            //----------------------------------------------------------------//

            if (srcBlackWhite)
            {
                indexed        = true;
                bitsPerIndex   = 0x01;
                paletteEntries = 0;
            }
            else if (srcBitsPerPixel == 1)
            {
                indexed      = true;
                bitsPerIndex = 0x01;
                //  paletteEntries = 0x00000001 << 1;
                paletteEntries = srcPaletteEntries;
            }
            else if (srcBitsPerPixel == 4)
            {
                indexed      = true;
                bitsPerIndex = 0x04;
                //  paletteEntries = 0x00000001 << 4;
                paletteEntries = srcPaletteEntries;
            }
            else if (srcBitsPerPixel == 24)
            {
                indexed        = false;
                bitsPerIndex   = 0x00;
                paletteEntries = 0;
            }

            if (srcBlackWhite)
            {
                PCLWriter.paletteSimple(prnWriter, PCLWriter.eSimplePalette.K);
            }
            else
            {
                if (indexed)
                {
                    PCLWriter.configureImageData(prnWriter,
                                                 0x02,  // ColourSpace = sRGB
                                                 0x01,  // PEM = Indexed by Pixel
                                                 bitsPerIndex,
                                                 0x00,  // Not used
                                                 0x00,  // Bits per component
                                                 0x00); // Bits per component
                }
                else
                {
                    PCLWriter.configureImageData(prnWriter,
                                                 0x02,  // ColourSpace = sRGB
                                                 0x03,  // PEM = Direct by Pixel
                                                 0x00,  // Not used
                                                 0x08,  // Bits per component
                                                 0x08,  // Bits per component
                                                 0x08); // Bits per component
                }

                if (paletteEntries != 0)
                {
                    Byte red   = 0x00,
                         green = 0x00,
                         blue  = 0x00;

                    for (Int16 i = 0; i < paletteEntries; i++)
                    {
                        ToolImageBitmapCore.getBmpPaletteEntry(i,
                                                               ref red,
                                                               ref green,
                                                               ref blue);

                        PCLWriter.paletteEntry(prnWriter, i, red, green, blue);
                    }
                }
            }


            //----------------------------------------------------------------//
            //                                                                //
            // Generate raster definition and start sequences.                //
            //                                                                //
            //----------------------------------------------------------------//

            PCLWriter.rasterResolution(prnWriter,
                                       rasterResolution,
                                       true);

            PCLWriter.rasterBegin(prnWriter,
                                  srcWidth,
                                  srcHeight,
                                  srcResX,
                                  srcResY,
                                  destScalePercentX,
                                  destScalePercentY,
                                  0);
        }