summaryrefslogtreecommitdiff
path: root/psprint/source
diff options
context:
space:
mode:
Diffstat (limited to 'psprint/source')
-rw-r--r--psprint/source/printergfx/bitmap_gfx.cxx112
-rw-r--r--psprint/source/printergfx/printerjob.cxx20
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);