//--------------------------------------------------------------------//
        //                                                        M e t h o d //
        // g e n e r a t e P a g e                                            //
        //--------------------------------------------------------------------//
        //                                                                    //
        // Write individual test data page sequences to output file.          //
        //                                                                    //
        //--------------------------------------------------------------------//

        private static void generatePage(BinaryWriter prnWriter,
                                         Int32 indxPaperSize,
                                         Int32 indxPaperType,
                                         Int32 indxOrientation,
                                         Boolean formAsMacro,
                                         UInt16 logXOffset,
                                         UInt32 codePoint,
                                         Int32 indxFont,
                                         PCLFonts.eVariant fontVar)
        {
            Int16 posX,
                  posY;

            Int16 ptSize;

            Byte[] utf8Seq = new Byte[4];
            Int32  utf8Len = 0;

            String utf8HexVal = "";

            //----------------------------------------------------------------//

            if (formAsMacro)
            {
                PCLWriter.macroControl(prnWriter, _macroId,
                                       PCLWriter.eMacroControl.Call);
            }
            else
            {
                generateOverlay(prnWriter, false, logXOffset,
                                indxPaperSize, indxOrientation);
            }

            //----------------------------------------------------------------//
            //                                                                //
            // Code-point data.                                               //
            //                                                                //
            //----------------------------------------------------------------//

            ptSize = 18;

            PCLWriter.font(prnWriter, true, "19U",
                           PCLFonts.getPCLFontSelect(_indxFontArial,
                                                     PCLFonts.eVariant.Regular,
                                                     ptSize, 0));

            posX = (Int16)(_posXData - logXOffset);
            posY = _posYData;

            if (codePoint < 0x010000)
            {
                PCLWriter.text(prnWriter, posX, posY, 0, "U+" +
                               codePoint.ToString("x4"));
            }
            else
            {
                PCLWriter.text(prnWriter, posX, posY, 0, "U+" +
                               codePoint.ToString("x6"));
            }

            PrnParseDataUTF8.convertUTF32ToUTF8Bytes(codePoint,
                                                     ref utf8Len,
                                                     ref utf8Seq);

            PrnParseDataUTF8.convertUTF32ToUTF8HexString(codePoint,
                                                         true,
                                                         ref utf8HexVal);

            posY += _lineInc;

            PCLWriter.text(prnWriter, posX, posY, 0, utf8HexVal);

            //----------------------------------------------------------------//
            //                                                                //
            // Font data.                                                     //
            //                                                                //
            //----------------------------------------------------------------//

            posY += _lineInc;

            PCLWriter.text(prnWriter, posX, posY, 0,
                           PCLFonts.getName(indxFont) +
                           " " +
                           Enum.GetName(typeof(PCLFonts.eVariant), fontVar));

            posY += _lineInc;

            ptSize = 36;

            PCLWriter.font(prnWriter, true, "18N",
                           PCLFonts.getPCLFontSelect(indxFont,
                                                     fontVar,
                                                     ptSize, 0));

            PCLWriter.textParsingMethod(
                prnWriter,
                PCLTextParsingMethods.eIndex.m83_UTF8);

            PCLWriter.cursorPosition(prnWriter, posX, posY);

            prnWriter.Write(utf8Seq, 0, utf8Len);

            PCLWriter.formFeed(prnWriter);
        }
        //--------------------------------------------------------------------//
        //                                                        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);
        }