//--------------------------------------------------------------------// // 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); }
//--------------------------------------------------------------------// // 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, UInt32 srcPaletteEntries, Boolean srcBlackWhite) { const Int32 sizeStd = 256; Byte[] bufStd = new Byte[sizeStd]; Int32 indStd = 0; Int32 destWidth = 0, destHeight = 0; UInt32 paletteEntries = 0, paletteSize = 0; Byte colourDepth = 0, colourMapping = 0, colourSpace = 0; //----------------------------------------------------------------// // // // Calculate destination size. // // // //----------------------------------------------------------------// if (srcResX == 0) { srcResX = 96; // DefaultSourceBitmapResolution; } else { srcResX = (Int32)(srcResX / 39.37); } if (srcResY == 0) { srcResY = 96; // DefaultSourceBitmapResolution; } else { srcResY = (Int32)(srcResY / 39.37); } destWidth = ((srcWidth * PCLXLWriter._sessionUPI) / srcResX) * (destScalePercentX / 100); destHeight = ((srcHeight * PCLXLWriter._sessionUPI) / srcResY) * (destScalePercentY / 100); //----------------------------------------------------------------// // // // Set position. // // // //----------------------------------------------------------------// PCLXLWriter.addAttrSint16XY(ref bufStd, ref indStd, PCLXLAttributes.eTag.Point, (Int16)(destPosX * PCLXLWriter._sessionUPI), (Int16)(destPosY * PCLXLWriter._sessionUPI)); PCLXLWriter.addOperator(ref bufStd, ref indStd, PCLXLOperators.eTag.SetCursor); //----------------------------------------------------------------// // // // Set colour space. // // // // 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) { colourSpace = (Byte)PCLXLAttrEnums.eVal.eGray; colourDepth = (Byte)PCLXLAttrEnums.eVal.e1Bit; colourMapping = (Byte)PCLXLAttrEnums.eVal.eIndexedPixel; paletteEntries = 2; paletteSize = 2; } else if (srcBitsPerPixel == 1) { colourSpace = (Byte)PCLXLAttrEnums.eVal.eRGB; colourDepth = (Byte)PCLXLAttrEnums.eVal.e1Bit; colourMapping = (Byte)PCLXLAttrEnums.eVal.eIndexedPixel; paletteEntries = 0x00000001 << 1; paletteSize = 3 * paletteEntries; // one per plane } else if (srcBitsPerPixel == 4) { colourSpace = (Byte)PCLXLAttrEnums.eVal.eRGB; colourDepth = (Byte)PCLXLAttrEnums.eVal.e4Bit; colourMapping = (Byte)PCLXLAttrEnums.eVal.eIndexedPixel; paletteEntries = 0x00000001 << 4; paletteSize = 3 * paletteEntries; // one per plane } else if (srcBitsPerPixel == 24) { colourSpace = (Byte)PCLXLAttrEnums.eVal.eRGB; colourDepth = (Byte)PCLXLAttrEnums.eVal.e8Bit; colourMapping = (Byte)PCLXLAttrEnums.eVal.eDirectPixel; paletteEntries = 0; paletteSize = 0; } PCLXLWriter.addOperator(ref bufStd, ref indStd, PCLXLOperators.eTag.PushGS); PCLXLWriter.addAttrUbyte(ref bufStd, ref indStd, PCLXLAttributes.eTag.ColorSpace, colourSpace); if (paletteEntries != 0) { PCLXLWriter.addAttrUbyte(ref bufStd, ref indStd, PCLXLAttributes.eTag.PaletteDepth, (byte)PCLXLAttrEnums.eVal.e8Bit); if (srcBlackWhite) { byte[] tempUByteArray = new byte[2]; tempUByteArray[0] = 0; tempUByteArray[1] = 255; PCLXLWriter.addAttrUbyteArray(ref bufStd, ref indStd, PCLXLAttributes.eTag.PaletteData, 2, tempUByteArray); } else { Int32 offset; Byte red = 0x00, green = 0x00, blue = 0x00; Byte[] tempUByteArray = new Byte[paletteSize]; for (Int32 i = 0; i < srcPaletteEntries; i++) { offset = i * 3; ToolImageBitmapCore.getBmpPaletteEntry(i, ref red, ref green, ref blue); tempUByteArray[offset] = red; tempUByteArray[offset + 1] = green; tempUByteArray[offset + 2] = blue; } PCLXLWriter.addAttrUbyteArray(ref bufStd, ref indStd, PCLXLAttributes.eTag.PaletteData, (Int16)paletteSize, tempUByteArray); } } PCLXLWriter.addOperator(ref bufStd, ref indStd, PCLXLOperators.eTag.SetColorSpace); //------------------------------------------------------------// // // // Generate BeginImage operator. // // // //------------------------------------------------------------// PCLXLWriter.addAttrUbyte(ref bufStd, ref indStd, PCLXLAttributes.eTag.ColorMapping, colourMapping); PCLXLWriter.addAttrUbyte(ref bufStd, ref indStd, PCLXLAttributes.eTag.ColorDepth, colourDepth); PCLXLWriter.addAttrUint16(ref bufStd, ref indStd, PCLXLAttributes.eTag.SourceWidth, (UInt16)srcWidth); PCLXLWriter.addAttrUint16(ref bufStd, ref indStd, PCLXLAttributes.eTag.SourceHeight, (UInt16)srcHeight); PCLXLWriter.addAttrUint16XY(ref bufStd, ref indStd, PCLXLAttributes.eTag.DestinationSize, (UInt16)destWidth, (UInt16)destHeight); PCLXLWriter.addOperator(ref bufStd, ref indStd, PCLXLOperators.eTag.BeginImage); prnWriter.Write(bufStd, 0, indStd); }