diff options
Diffstat (limited to 'psprint/source')
-rw-r--r-- | psprint/source/printergfx/bitmap_gfx.cxx | 112 | ||||
-rw-r--r-- | psprint/source/printergfx/printerjob.cxx | 20 |
2 files changed, 75 insertions, 57 deletions
diff --git a/psprint/source/printergfx/bitmap_gfx.cxx b/psprint/source/printergfx/bitmap_gfx.cxx index 4deeee794b93..b13dfa75f82c 100644 --- a/psprint/source/printergfx/bitmap_gfx.cxx +++ b/psprint/source/printergfx/bitmap_gfx.cxx @@ -2,9 +2,9 @@ * * $RCSfile: bitmap_gfx.cxx,v $ * - * $Revision: 1.2 $ + * $Revision: 1.3 $ * - * last change: $Author: cp $ $Date: 2001-05-18 13:54:05 $ + * last change: $Author: cp $ $Date: 2001-05-31 11:43:15 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -470,15 +470,31 @@ PrinterGfx::DrawBitmap (const Rectangle& rDest, const Rectangle& rSrc, if (mnPSLevel >= 2) { if (rBitmap.GetDepth() == 1) + { DrawPS2MonoImage (rBitmap, rSrc); + } else if (rBitmap.GetDepth() == 8 && mbColor) - DrawPS2PaletteImage (rBitmap, rSrc); + { + // if the palette is larger than the image itself print it as a truecolor + // image to save diskspace. This is important for printing transparent + // bitmaps that are disassembled into small pieces + sal_Int32 nImageSz = rSrc.GetWidth() * rSrc.GetHeight(); + sal_Int32 nPaletteSz = rBitmap.GetPaletteEntryCount(); + if ((nImageSz < nPaletteSz) || (nImageSz < 24) ) + DrawPS2TrueColorImage (rBitmap, rSrc); + else + DrawPS2PaletteImage (rBitmap, rSrc); + } else if (rBitmap.GetDepth() == 24 && mbColor) + { DrawPS2TrueColorImage (rBitmap, rSrc); + } else + { DrawPS2GrayImage (rBitmap, rSrc); + } } else { @@ -574,36 +590,25 @@ PrinterGfx::writePS2ImageHeader (const Rectangle& rArea, psp::ImageType nType) { sal_Int32 nChar = 0; sal_Char pImage [512]; - sal_Int32 nBitsPerComponent = (nType == psp::MonochromeImage) ? 1 : 8; - sal_Char *pDecodeArray; + + sal_Int32 nDictType; switch (nType) { - case psp::TrueColorImage: pDecodeArray = "[0 1 0 1 0 1]"; break; - case psp::MonochromeImage: pDecodeArray = "[0 255]"; break; - case psp::PaletteImage: pDecodeArray = "[0 255]"; break; - case psp::GrayScaleImage: pDecodeArray = "[0 1]"; break; + case psp::TrueColorImage: nDictType = 0; break; + case psp::PaletteImage: nDictType = 1; break; + case psp::GrayScaleImage: nDictType = 2; break; + case psp::MonochromeImage: nDictType = 3; break; } + sal_Int32 nCompressType = mbCompressBmp ? 1 : 0; - nChar += psp::appendStr ("<<\n", pImage + nChar); - nChar += psp::appendStr ("/ImageType 1\n", pImage + nChar); - nChar += psp::appendStr ("/Width ", pImage + nChar); - nChar += psp::getValueOf (rArea.GetWidth(), pImage + nChar); - nChar += psp::appendStr ("\n/Height ", pImage + nChar); - nChar += psp::getValueOf (rArea.GetHeight(), pImage + nChar); - nChar += psp::appendStr ("\n/BitsPerComponent ", pImage + nChar); - nChar += psp::getValueOf (nBitsPerComponent, pImage + nChar); - nChar += psp::appendStr ("\n/Decode\n", pImage + nChar); - nChar += psp::appendStr (pDecodeArray, pImage + nChar); - nChar += psp::appendStr ("\n/ImageMatrix ", pImage + nChar); - nChar += psp::appendStr ("[ 1 0 0 1 0 ", pImage + nChar); - nChar += psp::getValueOf (rArea.GetHeight(), pImage + nChar); - nChar += psp::appendStr ("]\n", pImage + nChar); - nChar += psp::appendStr ("/DataSource currentfile\n", pImage + nChar); - nChar += psp::appendStr ("/ASCII85Decode filter\n", pImage + nChar); - if (mbCompressBmp) - nChar += psp::appendStr ("/LZWDecode filter\n", pImage + nChar); - nChar += psp::appendStr (">>\n", pImage + nChar); - nChar += psp::appendStr ("image\n", pImage + nChar); + nChar += psp::getValueOf (rArea.GetWidth(), pImage + nChar); + nChar += psp::appendStr (" ", pImage + nChar); + nChar += psp::getValueOf (rArea.GetHeight(), pImage + nChar); + nChar += psp::appendStr (" ", pImage + nChar); + nChar += psp::getValueOf (nDictType, pImage + nChar); + nChar += psp::appendStr (" ", pImage + nChar); + nChar += psp::getValueOf (nCompressType, pImage + nChar); + nChar += psp::appendStr (" psp_imagedict image\n", pImage + nChar); WritePS (mpPageBody, pImage); } @@ -611,53 +616,50 @@ PrinterGfx::writePS2ImageHeader (const Rectangle& rArea, psp::ImageType nType) void PrinterGfx::writePS2Colorspace(const PrinterBmp& rBitmap, psp::ImageType nType) { - sal_Int32 nChar = 0; - sal_Char pImage [4096]; - switch (nType) { case psp::GrayScaleImage: - nChar += psp::appendStr ("/DeviceGray setcolorspace\n", pImage); + + WritePS (mpPageBody, "/DeviceGray setcolorspace\n"); break; case psp::TrueColorImage: - nChar += psp::appendStr ("/DeviceRGB setcolorspace\n", pImage); + + WritePS (mpPageBody, "/DeviceRGB setcolorspace\n"); break; case psp::MonochromeImage: case psp::PaletteImage: - nChar += psp::appendStr ("[/Indexed /DeviceRGB ", pImage + nChar); + sal_Int32 nChar = 0; + sal_Char pImage [4096]; + + sal_Int32 nSize = rBitmap.GetPaletteEntryCount() - 1; + + nChar += psp::appendStr ("[/Indexed /DeviceRGB ", pImage + nChar); nChar += psp::getValueOf (rBitmap.GetPaletteEntryCount() - 1, pImage + nChar); - nChar += psp::appendStr ("\n<", pImage + nChar ); + if (mbCompressBmp) + nChar += psp::appendStr ("\npsp_lzwstring\n", pImage + nChar); + else + nChar += psp::appendStr ("\npsp_ascii85string\n", pImage + nChar); + WritePS (mpPageBody, pImage); - sal_Int32 nColumn = 0; + ByteEncoder* pEncoder = mbCompressBmp ? new LZWEncoder(mpPageBody) + : new Ascii85Encoder(mpPageBody); for (sal_Int32 i = 0; i < rBitmap.GetPaletteEntryCount(); i++) { PrinterColor aColor = rBitmap.GetPaletteColor(i); - nChar += psp::getHexValueOf (aColor.GetRed(), pImage + nChar); - nChar += psp::getHexValueOf (aColor.GetGreen(), pImage + nChar); - nChar += psp::getHexValueOf (aColor.GetBlue(), pImage + nChar); - - if (++nColumn > (nLineLength / 7)) // each entry accounts for 7 Bytes - { - nChar += psp::appendStr ("\n", pImage + nChar); - nColumn = 0; - } - else - { - nChar += psp::appendStr (" ", pImage + nChar); - } - + pEncoder->EncodeByte (aColor.GetRed()); + pEncoder->EncodeByte (aColor.GetGreen()); + pEncoder->EncodeByte (aColor.GetBlue()); } + delete pEncoder; + + WritePS (mpPageBody, "pop ] setcolorspace\n"); - nChar += psp::appendStr (">\n", pImage + nChar); - nChar += psp::appendStr ("] setcolorspace\n", pImage + nChar); break; } - - WritePS (mpPageBody, pImage); } void diff --git a/psprint/source/printergfx/printerjob.cxx b/psprint/source/printergfx/printerjob.cxx index a706ba09eadd..9d1fb6e64c37 100644 --- a/psprint/source/printergfx/printerjob.cxx +++ b/psprint/source/printergfx/printerjob.cxx @@ -2,9 +2,9 @@ * * $RCSfile: printerjob.cxx,v $ * - * $Revision: 1.5 $ + * $Revision: 1.6 $ * - * last change: $Author: cp $ $Date: 2001-05-23 11:49:05 $ + * last change: $Author: cp $ $Date: 2001-05-31 11:42:45 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -826,6 +826,22 @@ bool PrinterJob::writeProlog (osl::File* pFile) "/rectfill { rectangle fill } def\n" "/rectstroke { rectangle stroke } def } if\n" "\n" + "/psp_lzwfilter { currentfile /ASCII85Decode filter /LZWDecode filter } def\n" + "/psp_ascii85filter { currentfile /ASCII85Decode filter } def\n" + "/psp_lzwstring { psp_lzwfilter 1024 string readstring } def\n" + "/psp_ascii85string { psp_ascii85filter 1024 string readstring } def\n" + "/psp_imagedict {\n" + "/psp_bitspercomponent { 3 eq { 1 }{ 8 } ifelse } def\n" + "/psp_decodearray { [ [0 1 0 1 0 1] [0 255] [0 1] [0 255] ] exch get }\n" + "def 7 dict dup\n" + "/ImageType 1 put dup\n" + "/Width 7 -1 roll put dup\n" + "/Height 5 index put dup\n" + "/BitsPerComponent 4 index psp_bitspercomponent put dup\n" + "/Decode 5 -1 roll psp_decodearray put dup\n" + "/ImageMatrix [1 0 0 1 0 0] dup 5 8 -1 roll put put dup\n" + "/DataSource 4 -1 roll 1 eq { psp_lzwfilter } { psp_ascii85filter } ifelse put\n" + "} def\n" "%%EndProlog\n" }; WritePS (pFile, pProlog); |