From 1af13123fa79ad1c6747aad60ed458bbd69da12d Mon Sep 17 00:00:00 2001 From: Roland Mainz Date: Wed, 21 Apr 2004 10:03:41 +0000 Subject: [PATCH] Fix for http://pdx.freedesktop.org/cgi-bin/bugzilla/show_bug.cgi?id=530 - Land XPRINT branch on XORG-CURRENT --- XpConfig/C/print/Xprinters | 8 +- XpConfig/C/print/attributes/document | 12 +- XpConfig/C/print/attributes/printer | 18 +- .../C/print/models/CANONBJ10E-GS/model-config | 23 + .../C/print/models/GSdefault/model-config | 137 ++++ .../print/models/HPDJ1600C/fonts/fonts.alias | 1 - .../C/print/models/HPDJ1600C/model-config | 34 +- .../C/print/models/HPLJ4050-PS/model-config | 36 + .../models/HPLJ4family/fonts/fonts.alias | 1 - .../C/print/models/HPLJ4family/model-config | 35 +- .../models/PS2PDFspooldir-GS/model-config | 72 ++ .../PS2PDFspooldir-GS/ps2pdf_spooltodir.sh | 130 ++++ .../PSdefault/fonts/AvantGarde-Book.pmf | Bin 0 -> 6716 bytes .../fonts/AvantGarde-BookOblique.pmf | Bin 0 -> 6728 bytes .../PSdefault/fonts/AvantGarde-Demi.pmf | Bin 0 -> 6712 bytes .../fonts/AvantGarde-DemiOblique.pmf | Bin 0 -> 6724 bytes .../models/PSdefault/fonts/Courier-Bold.pmf | Bin 0 -> 6612 bytes .../PSdefault/fonts/Courier-BoldOblique.pmf | Bin 0 -> 6636 bytes .../PSdefault/fonts/Courier-Oblique.pmf | Bin 0 -> 6608 bytes .../print/models/PSdefault/fonts/Courier.pmf | Bin 0 -> 6592 bytes .../models/PSdefault/fonts/Helvetica-Bold.pmf | Bin 0 -> 6680 bytes .../PSdefault/fonts/Helvetica-BoldOblique.pmf | Bin 0 -> 6692 bytes .../PSdefault/fonts/Helvetica-Oblique.pmf | Bin 0 -> 6688 bytes .../models/PSdefault/fonts/Helvetica.pmf | Bin 0 -> 6672 bytes .../PSdefault/fonts/LubalinGraph-Book.pmf | Bin 0 -> 6628 bytes .../fonts/LubalinGraph-BookOblique.pmf | Bin 0 -> 6640 bytes .../PSdefault/fonts/LubalinGraph-Demi.pmf | Bin 0 -> 6624 bytes .../fonts/LubalinGraph-DemiOblique.pmf | Bin 0 -> 6636 bytes .../PSdefault/fonts/NewCenturySchlbk-Bold.pmf | Bin 0 -> 6644 bytes .../fonts/NewCenturySchlbk-BoldItalic.pmf | Bin 0 -> 6656 bytes .../fonts/NewCenturySchlbk-Italic.pmf | Bin 0 -> 6652 bytes .../fonts/NewCenturySchlbk-Roman.pmf | Bin 0 -> 6648 bytes .../models/PSdefault/fonts/Souvenir-Demi.pmf | Bin 0 -> 6680 bytes .../PSdefault/fonts/Souvenir-DemiItalic.pmf | Bin 0 -> 6692 bytes .../models/PSdefault/fonts/Souvenir-Light.pmf | Bin 0 -> 6684 bytes .../PSdefault/fonts/Souvenir-LightItalic.pmf | Bin 0 -> 6696 bytes .../C/print/models/PSdefault/fonts/Symbol.pmf | Bin 0 -> 6556 bytes .../models/PSdefault/fonts/Times-Bold.pmf | Bin 0 -> 6660 bytes .../PSdefault/fonts/Times-BoldItalic.pmf | Bin 0 -> 6672 bytes .../models/PSdefault/fonts/Times-Italic.pmf | Bin 0 -> 6668 bytes .../models/PSdefault/fonts/Times-Roman.pmf | Bin 0 -> 6664 bytes .../models/PSdefault/fonts/ZapfDingbats.pmf | Bin 0 -> 6676 bytes .../C/print/models/PSdefault/model-config | 136 ++++ .../C/print/models/PSspooldir/model-config | 71 ++ .../C/print/models/PSspooldir/spooltodir.sh | 127 ++++ XpConfig/C/print/models/SPSPARC2/model-config | 25 +- XpConfig/en_US/print/attributes/document | 13 + Xprint/AttrValid.c | 6 +- Xprint/AttrValid.h | 11 +- Xprint/DiPrint.h | 2 - Xprint/Init.c | 284 ++++--- Xprint/Oid.c | 21 +- Xprint/Oid.h | 3 +- Xprint/OidDefs.h | 8 + Xprint/OidStrs.h | 268 +++---- Xprint/attributes.c | 138 +++- Xprint/attributes.h | 49 +- Xprint/ddxInit.c | 39 +- Xprint/etc/Xsession.d/cde_xsessiond_xprint.sh | 30 + Xprint/etc/profile.d/xprint.csh | 16 + Xprint/etc/profile.d/xprint.sh | 16 + Xprint/mediaSizes.c | 28 +- Xprint/ps/Ps.h | 94 ++- Xprint/ps/PsArea.c | 148 ++-- Xprint/ps/PsAttVal.c | 99 ++- Xprint/ps/PsAttr.c | 2 +- Xprint/ps/PsCache.c | 186 ++--- Xprint/ps/PsColor.c | 2 +- Xprint/ps/PsFTFonts.c | 80 ++ Xprint/ps/PsFonts.c | 696 +++++++++++++++++- Xprint/ps/PsGC.c | 24 +- Xprint/ps/PsInit.c | 49 +- Xprint/ps/PsLine.c | 1 - Xprint/ps/PsMisc.c | 1 - Xprint/ps/PsPixel.c | 1 - Xprint/ps/PsPixmap.c | 12 +- Xprint/ps/PsPolygon.c | 4 +- Xprint/ps/PsPrint.c | 43 +- Xprint/ps/PsText.c | 322 +++++--- Xprint/ps/PsWindow.c | 16 +- Xprint/ps/psout.c | 379 ++++++---- Xprint/ps/psout.h | 101 ++- Xprint/ps/psout_ft.c | 330 +++++++++ Xprint/ps/psout_ftpstype1.c | 180 +++++ Xprint/ps/psout_ftpstype3.c | 463 ++++++++++++ Xprint/raster/Raster.h | 5 +- Xprint/spooler.c | 190 +++++ Xprint/spooler.h | 72 ++ dix/dispatch.c | 4 +- dix/main.c | 4 +- hw/darwin/darwin.c | 10 +- hw/vfb/InitOutput.c | 5 + hw/xfree86/common/xf86Init.c | 5 + hw/xnest/Args.c | 5 + hw/xwin/InitOutput.c | 5 + include/os.h | 6 +- os/utils.c | 13 +- 97 files changed, 4447 insertions(+), 908 deletions(-) create mode 100644 XpConfig/C/print/models/CANONBJ10E-GS/model-config create mode 100644 XpConfig/C/print/models/GSdefault/model-config create mode 100644 XpConfig/C/print/models/HPLJ4050-PS/model-config create mode 100644 XpConfig/C/print/models/PS2PDFspooldir-GS/model-config create mode 100755 XpConfig/C/print/models/PS2PDFspooldir-GS/ps2pdf_spooltodir.sh create mode 100644 XpConfig/C/print/models/PSdefault/fonts/AvantGarde-Book.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/AvantGarde-BookOblique.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/AvantGarde-Demi.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/AvantGarde-DemiOblique.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/Courier-Bold.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/Courier-BoldOblique.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/Courier-Oblique.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/Courier.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/Helvetica-Bold.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/Helvetica-BoldOblique.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/Helvetica-Oblique.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/Helvetica.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/LubalinGraph-Book.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/LubalinGraph-BookOblique.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/LubalinGraph-Demi.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/LubalinGraph-DemiOblique.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/NewCenturySchlbk-Bold.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/NewCenturySchlbk-BoldItalic.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/NewCenturySchlbk-Italic.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/NewCenturySchlbk-Roman.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/Souvenir-Demi.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/Souvenir-DemiItalic.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/Souvenir-Light.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/Souvenir-LightItalic.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/Symbol.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/Times-Bold.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/Times-BoldItalic.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/Times-Italic.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/Times-Roman.pmf create mode 100644 XpConfig/C/print/models/PSdefault/fonts/ZapfDingbats.pmf create mode 100644 XpConfig/C/print/models/PSdefault/model-config create mode 100644 XpConfig/C/print/models/PSspooldir/model-config create mode 100755 XpConfig/C/print/models/PSspooldir/spooltodir.sh create mode 100644 XpConfig/en_US/print/attributes/document create mode 100644 Xprint/etc/Xsession.d/cde_xsessiond_xprint.sh create mode 100644 Xprint/etc/profile.d/xprint.csh create mode 100644 Xprint/etc/profile.d/xprint.sh create mode 100644 Xprint/ps/PsFTFonts.c create mode 100644 Xprint/ps/psout_ft.c create mode 100644 Xprint/ps/psout_ftpstype1.c create mode 100644 Xprint/ps/psout_ftpstype3.c create mode 100644 Xprint/spooler.c create mode 100644 Xprint/spooler.h diff --git a/XpConfig/C/print/Xprinters b/XpConfig/C/print/Xprinters index 9290636fb..a32c02dc2 100644 --- a/XpConfig/C/print/Xprinters +++ b/XpConfig/C/print/Xprinters @@ -28,6 +28,13 @@ ######################################################################## #Augment_Printer_List %none% +######################################################################## +# Preconfigured entry for the PSspooldir model +# (which sends jobs to /tmp/Xprintjobs instead to a physical printer) +######################################################################## +#Printer xp_pdf_spooldir_tmp_Xprintjobs +Printer xp_ps_spooldir_tmp_Xprintjobs + ######################################################################## # Add individual printers to the list of printers managed by the # server. These are aliases, determined by driver name. @@ -40,4 +47,3 @@ # Printer xppclpr # Printer xppclmonopr # Printer xprasterpr - diff --git a/XpConfig/C/print/attributes/document b/XpConfig/C/print/attributes/document index e0be64553..039fade82 100644 --- a/XpConfig/C/print/attributes/document +++ b/XpConfig/C/print/attributes/document @@ -21,9 +21,17 @@ *copy-count: 1 *default-medium: iso-a4 *default-printer-resolution: 300 -*document-format: {Postscript 2} -*plex: duplex +# "PSspooldir" jobs should always be 300 DPI +# (to be compatible to DPS-based PostScript viewers such as sdtimage) +PSspooldir.default-printer-resolution: 300 + +# "PS2PDFspooldir-GS" jobs should always be 600 DPI +PS2PDFspooldir-GS.default-printer-resolution: 600 + +# Some resolution defaults to make applications happy which are too lazy +# to pick an own default in absence of "default-printer-resolution" +HPLJ4050-PS.default-printer-resolution: 600 # EXAMPLES # diff --git a/XpConfig/C/print/attributes/printer b/XpConfig/C/print/attributes/printer index a49afa5f0..41e13b44b 100644 --- a/XpConfig/C/print/attributes/printer +++ b/XpConfig/C/print/attributes/printer @@ -16,8 +16,24 @@ # Set this attribute for all printers. # Example: "*.document-formats-ready: {pcl 5}" +# Remove this line and replace them with per printer settings +# if you want to use more than one DDX!! +*xp-model-identifier: PSdefault -*xp-ddx-identifier: XP-POSTSCRIPT + +# Sample entry for the "PSspooldir" model +# Just add a printer called "xp_ps_spooldir_tmp_Xprintjobs" to "Xprinters" +# and you will get an extra printer which files the PostScript jobs +# in the "/tmp/Xprintjobs/" directory. +xp_ps_spooldir_tmp_Xprintjobs.xp-model-identifier: PSspooldir + +# Sample entry for the "PS2PDFspooldir-GS" model +# Just add a printer called "xp_pdf_spooldir_tmp_Xprintjobs" to "Xprinters" +# and you will get an extra printer which convertes the PostScript jobs +# to PDF using "ps2pdf" and files them into the "/tmp/Xprintjobs/" directory. +# NOTE: Future versions of Xprint will use the PDF DDX instead directly +# instead of relying on GhostScript/ps2pdf... +xp_pdf_spooldir_tmp_Xprintjobs.xp-model-identifier: PS2PDFspooldir-GS # IMPORTANT EXAMPLES diff --git a/XpConfig/C/print/models/CANONBJ10E-GS/model-config b/XpConfig/C/print/models/CANONBJ10E-GS/model-config new file mode 100644 index 000000000..97bfd8196 --- /dev/null +++ b/XpConfig/C/print/models/CANONBJ10E-GS/model-config @@ -0,0 +1,23 @@ +# $Xprint.org: CANONBJ10E-GS model-config,v 1.4 2003/02/10 14:48:04 gisburn Exp $ + +*content-orientations-supported: portrait landscape +*descriptor: Canon BJ-10e (GhostScript) +*document-formats-supported: {POSTSCRIPT 2} +*input-trays-supported: +*medium-source-sizes-supported: \ +{ '' \ + {iso-b5 FALSE {6.35 169.65 6.35 243.65}}\ + {iso-a4 FALSE {6.35 203.65 6.35 290.65}}\ + {na-letter FALSE {6.35 209.55 6.35 273.05}}\ + {na-legal FALSE {6.35 209.55 6.35 349.25}}\ +} + +*plexes-supported: simplex +*printer-model: "Canon BJ-10e (GhostScript)" +*printer-resolutions-supported: 360 +*xp-ddx-identifier: XP-POSTSCRIPT +*xp-listfonts-modes-supported: xp-list-internal-printer-fonts xp-list-glyph-fonts +*xp-embedded-formats-supported: {POSTSCRIPT 2} +*xp-raw-formats-supported: {POSTSCRIPT 2} +*xp-setup-proviso: setup-optional +# EOF. diff --git a/XpConfig/C/print/models/GSdefault/model-config b/XpConfig/C/print/models/GSdefault/model-config new file mode 100644 index 000000000..61dac18b8 --- /dev/null +++ b/XpConfig/C/print/models/GSdefault/model-config @@ -0,0 +1,137 @@ +# $Xprint.org: GSdefault model-config,v 1.1 2003/02/10 14:48:04 gisburn Exp $ +# Generic default model-config for the PostScript DDX when using GhostScript +# as printer driver +# +# DO NOT MODIFY THIS FILE!! +# +# If you want to make customisations for your printer create a copy +# of this printer model. +# Example (for creating a model config "MYCOMPANYlaserxx"): +# 1. Create model config dir: +# % mkdir MYCOMPANYlaserxx +# 2. Link (or copy) the PMF (printer font metrics) for the +# printer buildin fonts: +# % ln -s GSdefault/fonts MYCOMPANYlaserxx/. +# 3. Copy the model config file: +# % cp GSdefault/model-config MYCOMPANYlaserxx/. +# 4. Customize MYCOMPANYlaserxx/model-config to match your needs. +# + +# Attributes supported for this printer model +# You may want to cut the lists here down to the attributes supported +# by your printer. +*content-orientations-supported: portrait landscape reverse-portrait reverse-landscape +*descriptor: GhostScript default model +*document-formats-supported: {POSTSCRIPT 2} +*input-trays-supported: +*medium-source-sizes-supported: \ +{ '' \ + {na-letter FALSE {6.35 209.55 6.35 273.05}}\ + {na-legal FALSE {6.35 209.55 6.35 349.25}}\ + {executive FALSE {6.35 177.80 6.35 260.35}}\ + {folio FALSE {6.35 204.47 6.35 323.85}}\ + {invoice FALSE {6.35 133.35 6.35 209.55}}\ + {ledger FALSE {6.35 273.05 6.35 425.45}}\ + {quarto FALSE {6.35 209.55 6.35 268.732}}\ + {a FALSE {6.35 209.55 6.35 273.05}}\ + {b FALSE {6.35 273.05 6.35 425.45}}\ + {c FALSE {6.35 425.45 6.35 552.45}}\ + {d FALSE {6.35 552.45 6.35 857.25}}\ + {e FALSE {6.35 857.25 6.35 1111.25}}\ + {na-6x9-envelope FALSE {6.35 146.05 6.35 222.25}}\ + {na-10x15-envelope FALSE {6.35 247.65 6.35 374.65}}\ + {monarch-envelope FALSE {6.35 91.948 6.35 184.15}}\ + {na-10x13-envelope FALSE {6.35 247.65 6.35 323.85}}\ + {na-9x12-envelope FALSE {6.35 222.25 6.35 298.45}}\ + {na-number-10-envelope FALSE {6.35 98.425 6.35 234.95}}\ + {na-7x9-envelope FALSE {6.35 171.45 6.35 222.25}}\ + {na-9x11-envelope FALSE {6.35 222.25 6.35 273.05}}\ + {na-10x14-envelope FALSE {6.35 247.65 6.35 349.25}}\ + {na-number-9-envelope FALSE {6.35 92.075 6.35 219.075}}\ + {iso-a0 FALSE {6.35 834.65 6.35 1182.65}}\ + {iso-a1 FALSE {6.35 587.65 6.35 834.65}}\ + {iso-a2 FALSE {6.35 413.65 6.35 587.65}}\ + {iso-a3 FALSE {6.35 290.65 6.35 413.65}}\ + {iso-a4 FALSE {6.35 203.65 6.35 290.65}}\ + {iso-a5 FALSE {6.35 141.65 6.35 203.65}}\ + {iso-a6 FALSE {6.35 98.65 6.35 141.65}}\ + {iso-a7 FALSE {6.35 67.65 6.35 98.65}}\ + {iso-a8 FALSE {6.35 45.65 6.35 67.65}}\ + {iso-a9 FALSE {6.35 30.65 6.35 45.65}}\ + {iso-a10 FALSE {6.35 19.65 6.35 30.65}}\ + {iso-b1 FALSE {6.35 700.65 6.35 993.65}}\ + {iso-b2 FALSE {6.35 493.65 6.35 700.65}}\ + {iso-b3 FALSE {6.35 346.65 6.35 493.65}}\ + {iso-b4 FALSE {6.35 243.65 6.35 346.65}}\ + {iso-b5 FALSE {6.35 169.65 6.35 243.65}}\ + {iso-b6 FALSE {6.35 118.65 6.35 169.65}}\ + {iso-b7 FALSE {6.35 81.65 6.35 118.65}}\ + {iso-b8 FALSE {6.35 55.65 6.35 81.65}}\ + {iso-b9 FALSE {6.35 37.65 6.35 55.65}}\ + {iso-b10 FALSE {6.35 24.65 6.35 37.65}}\ + {jis-b1 FALSE {6.35 721.65 6.35 1023.65}}\ + {jis-b2 FALSE {6.35 508.65 6.35 721.65}}\ + {jis-b3 FALSE {6.35 357.65 6.35 508.65}}\ + {jis-b4 FALSE {6.35 250.65 6.35 357.65}}\ + {jis-b5 FALSE {6.35 175.65 6.35 250.65}}\ + {jis-b6 FALSE {6.35 121.65 6.35 175.65}}\ + {jis-b7 FALSE {6.35 84.65 6.35 121.65}}\ + {jis-b8 FALSE {6.35 57.65 6.35 84.65}}\ + {jis-b9 FALSE {6.35 38.65 6.35 57.65}}\ + {jis-b10 FALSE {6.35 25.65 6.35 38.65}}\ + {iso-c3 FALSE {6.35 317.65 6.35 451.65}}\ + {iso-c4 FALSE {6.35 222.65 6.35 317.65}}\ + {iso-c5 FALSE {6.35 155.65 6.35 222.65}}\ + {iso-c6 FALSE {6.35 107.65 6.35 155.65}}\ + {iso-designated-long FALSE {6.35 103.65 6.35 213.65}}\ + {hp-2x-postcard FALSE {6.35 141.65 6.35 193.65}}\ + {hp-european-edp FALSE {6.35 298.45 6.35 349.25}}\ + {hp-mini FALSE {6.35 133.35 6.35 209.55}}\ + {hp-postcard FALSE {6.35 93.65 6.35 141.65}}\ + {hp-tabloid FALSE {6.35 273.05 6.35 425.45}}\ + {hp-us-edp FALSE {6.35 273.05 6.35 349.25}}\ + {hp-us-government-legal FALSE {6.35 196.85 6.35 323.85}}\ + {hp-us-government-letter FALSE {6.35 196.85 6.35 247.65}}\ +} +# If you have more than one tray use the following example: +# 1. List the supported trays +#*input-trays-supported: main manual +# 2. Define each tray and it's paper sizes +#*medium-source-sizes-supported: \ +#{ main \ +# {na-letter FALSE {6.35 209.55 6.35 273.05}} \ +# {na-legal FALSE {6.35 209.55 6.35 349.25}} \ +# {iso-a4 FALSE {6.35 203.65 6.35 290.65}} \ +#} \ +#{ manual \ +# {iso-a5 FALSE {6.35 141.65 6.35 203.65}} \ +# {iso-c5 FALSE {6.35 155.65 6.35 222.65}} \ +# {iso-designated-long FALSE {6.35 103.65 6.35 213.65}} \ +# {jis-b5 FALSE {6.35 175.65 6.35 250.65}} \ +# {monarch-envelope FALSE {6.35 91.948 6.35 184.15}} \ +# {na-legal FALSE {6.35 209.55 6.35 349.25}} \ +# {na-number-10-envelope FALSE {6.35 98.425 6.35 234.95}} \ +# {executive FALSE {6.35 177.8 6.35 260.35}} \ +# {iso-a3 FALSE {6.35 290.65 6.35 413.65}} \ +# {iso-a0 FALSE {6.35 834.65 6.35 1182.65}} \ +#} +*plexes-supported: simplex duplex tumble +*printer-model: "GhostScript default model" +# 75, 100, 120, 150, 180, 200, 240, 300, 360, 400, 600, 720, +# 940, 1200 and 2440 are supported DPI values, we limit it here +# to some common values: +*printer-resolutions-supported: 300 360 400 600 +*xp-ddx-identifier: XP-POSTSCRIPT +*xp-listfonts-modes-supported: xp-list-internal-printer-fonts xp-list-glyph-fonts +*xp-embedded-formats-supported: {POSTSCRIPT 2} +*xp-raw-formats-supported: {POSTSCRIPT 2} +*xp-setup-proviso: setup-optional + +# NOTE: xp-psddx-* attributes are EXPERIMENTAL for now. +# xp-psddx-download-fonts defines which fonts should be downloaded as outlines +# (valid types are "pfa", "pfb", "ttf", "ttc", "otf", "otc") +*xp-psddx-download-fonts: pfa pfb ttf ttc otf otc +# xp-psddx-download-font-type defines which font type is used to download outlines +# (valid values are "bitmap", "pstype1" and "pstype3") +*xp-psddx-download-font-type: pstype1 +# EOF. diff --git a/XpConfig/C/print/models/HPDJ1600C/fonts/fonts.alias b/XpConfig/C/print/models/HPDJ1600C/fonts/fonts.alias index 1499aa845..e69de29bb 100644 --- a/XpConfig/C/print/models/HPDJ1600C/fonts/fonts.alias +++ b/XpConfig/C/print/models/HPDJ1600C/fonts/fonts.alias @@ -1 +0,0 @@ -! So the file isn't empty diff --git a/XpConfig/C/print/models/HPDJ1600C/model-config b/XpConfig/C/print/models/HPDJ1600C/model-config index f3bd8af3a..5d45d4495 100644 --- a/XpConfig/C/print/models/HPDJ1600C/model-config +++ b/XpConfig/C/print/models/HPDJ1600C/model-config @@ -1,28 +1,16 @@ -# $Xorg: model-config,v 1.3 2000/08/17 19:48:04 cpqbld Exp $ +# $Xprint.org: HPDJ1600C model-config,v 1.4 2002/11/07 19:48:04 gisburn Exp $ # This is the configuration file for the HP DeskJet 1600C printer. # # The CDEnext SI supports two 1600C drivers XP-PCL-MONO and # XP-PCL-COLOR, which work with this configuration file. # -# Attribute IDs must be qualified using either the printer-model -# identifier or an asterisk ('*'). For example, if "HPDJ1600C" is the -# printer-model, then to initialize the 'plexes-supported' attribute -# to 'simplex', use: "HPDJ1600C.plexes-supported: simplex". For the -# asterisk, use: "*.plexes-supported: simplex". If the same attribute -# is specified using each method, the printer-model qualified entry -# takes precedence. - -HPDJ1600C.printer-model: "Hewlett-Packard DeskJet 1600C" -HPDJ1600C.printer-resolutions-supported: 300 -HPDJ1600C.content-orientations-supported: portrait landscape -HPDJ1600C.document-formats-supported: {PCL 5} {PostScript 2} -HPDJ1600C.plexes-supported: simplex duplex -HPDJ1600C.xp-ddx-identifier: XP-PCL-COLOR -HPDJ1600C.xp-embedded-formats-supported: { PCL 5 } { PostScript 2 } -HPDJ1600C.xp-setup-proviso: setup-optional +*content-orientations-supported: portrait landscape +*descriptor: Hewlett-Packard DeskJet 1600C +*document-formats-supported: {PCL 5} {PostScript 2} +*input-trays-supported: # 1/4" unprintable margins -HPDJ1600C.medium-source-sizes-supported:\ +*medium-source-sizes-supported:\ { '' \ {na-letter FALSE {6.35 209.55 6.35 273.05}}\ {executive FALSE {6.35 177.75 6.35 260.35}}\ @@ -41,4 +29,12 @@ HPDJ1600C.medium-source-sizes-supported:\ {hp-japanese-postcard FALSE {6 94 6 142 }}\ {hp-japanese-doublepostcard FALSE {6 142 6 194 }}\ } - +*plexes-supported: simplex duplex +*printer-model: "Hewlett-Packard DeskJet 1600C" +*printer-resolutions-supported: 300 +*xp-ddx-identifier: XP-PCL-COLOR +*xp-listfonts-modes-supported: xp-list-internal-printer-fonts xp-list-glyph-fonts +*xp-embedded-formats-supported: { PCL 5 } { PostScript 2 } +*xp-raw-formats-supported: { PCL 5 } +*xp-setup-proviso: setup-optional +# EOF. diff --git a/XpConfig/C/print/models/HPLJ4050-PS/model-config b/XpConfig/C/print/models/HPLJ4050-PS/model-config new file mode 100644 index 000000000..159206de2 --- /dev/null +++ b/XpConfig/C/print/models/HPLJ4050-PS/model-config @@ -0,0 +1,36 @@ +# $Xprint.org: HPLJ4050-PS model-config,v 1.1 2003/12/16 00:48:04 gisburn Exp $ +# model-config for the HP LaserJet 4050 PostScript printer series +# +*content-orientations-supported: portrait landscape reverse-portrait reverse-landscape +*descriptor: Hewlett-Packard LaserJet 4050 PostScript printer +*document-formats-supported: {POSTSCRIPT 2} +*input-trays-supported: +*medium-source-sizes-supported: \ +{ '' \ + {na-letter FALSE {6.35 209.55 6.35 273.05}}\ + {na-legal FALSE {6.35 209.55 6.35 349.25}}\ + {executive FALSE {6.35 177.80 6.35 260.35}}\ + {iso-a4 FALSE {6.35 203.65 6.35 290.65}}\ + {iso-a5 FALSE {6.35 141.65 6.35 203.65}}\ + {iso-b5 FALSE {6.35 169.65 6.35 243.65}}\ + {jis-b5 FALSE {6.35 175.65 6.35 250.65}}\ +} + +# Duplex unit is optional for HPLJ4050 series +*plexes-supported: simplex +*printer-model: "Hewlett-Packard LaserJet 4050 PostScript printer" +*printer-resolutions-supported: 600 1200 +*xp-ddx-identifier: XP-POSTSCRIPT +*xp-listfonts-modes-supported: xp-list-internal-printer-fonts xp-list-glyph-fonts +*xp-embedded-formats-supported: {POSTSCRIPT 2} +*xp-raw-formats-supported: {POSTSCRIPT 2} +*xp-setup-proviso: setup-optional + +# NOTE: xp-psddx-* attributes are EXPERIMENTAL for now. +# xp-psddx-download-fonts defines which fonts should be downloaded as outlines +# (valid types are "pfa", "pfb", "ttf", "ttc", "otf", "otc") +*xp-psddx-download-fonts: pfa pfb ttf ttc otf otc +# xp-psddx-download-font-type defines which font type is used to download outlines +# (valid values are "bitmap", "pstype1" and "pstype3") +*xp-psddx-download-font-type: pstype1 +# EOF. diff --git a/XpConfig/C/print/models/HPLJ4family/fonts/fonts.alias b/XpConfig/C/print/models/HPLJ4family/fonts/fonts.alias index 1499aa845..e69de29bb 100644 --- a/XpConfig/C/print/models/HPLJ4family/fonts/fonts.alias +++ b/XpConfig/C/print/models/HPLJ4family/fonts/fonts.alias @@ -1 +0,0 @@ -! So the file isn't empty diff --git a/XpConfig/C/print/models/HPLJ4family/model-config b/XpConfig/C/print/models/HPLJ4family/model-config index f69e25718..1ac997ebe 100644 --- a/XpConfig/C/print/models/HPLJ4family/model-config +++ b/XpConfig/C/print/models/HPLJ4family/model-config @@ -1,28 +1,15 @@ -# $Xorg: model-config,v 1.3 2000/08/17 19:48:04 cpqbld Exp $ +# $Xprint.org: HPLJ4family model-config,v 1.4 2002/11/07 19:48:04 gisburn Exp $ # This is the configuration file for the HP LaserJet 4 Printers. # # Though not a deliverable for the CDEnext SI, the XP-PCL-MONO # driver should be able to support the LaserJet 4 printers. # -# Attribute IDs must be qualified using either the printer-model -# identifier or an asterisk ('*'). For example, if "HPLJ4family" is the -# printer-model, then to initialize the 'plexes-supported' attribute -# to 'simplex', use: "HPLJ4family.plexes-supported: simplex". For the -# asterisk, use: "*.plexes-supported: simplex". If the same attribute -# is specified using each method, the printer-model qualified entry -# takes precedence. - -HPLJ4family.printer-model: "Hewlett-Packard LaserJet 4 Series" -HPLJ4family.printer-resolutions-supported: 300 600 -HPLJ4family.content-orientations-supported: portrait landscape -HPLJ4family.document-formats-supported: {PCL 5} {PostScript 2} -HPLJ4family.plexes-supported: simplex duplex -HPLJ4family.xp-ddx-identifier: XP-PCL-MONO -HPLJ4family.xp-embedded-formats-supported: { PCL 5 } { PostScript 2 } -HPLJ4family.xp-setup-proviso: setup-optional - +*content-orientations-supported: portrait landscape +*descriptor: Hewlett-Packard LaserJet 4 Series +*document-formats-supported: {PCL 5} {PostScript 2} +*input-trays-supported: # 1/4" unprintable margins -HPLJ4family.medium-source-sizes-supported:\ +*medium-source-sizes-supported:\ { '' \ {na-letter FALSE {6.35 209.55 6.35 273.05}}\ {executive FALSE {6.35 177.75 6.35 260.35}}\ @@ -41,4 +28,12 @@ HPLJ4family.medium-source-sizes-supported:\ {hp-japanese-postcard FALSE {6 94 6 142 }}\ {hp-japanese-doublepostcard FALSE {6 142 6 194 }}\ } - +*plexes-supported: simplex duplex +*printer-model: "Hewlett-Packard LaserJet 4 Series" +*printer-resolutions-supported: 300 600 +*xp-ddx-identifier: XP-PCL-MONO +*xp-listfonts-modes-supported: xp-list-internal-printer-fonts xp-list-glyph-fonts +*xp-embedded-formats-supported: { PCL 5 } { PostScript 2 } +*xp-raw-formats-supported: { PCL 5 } +*xp-setup-proviso: setup-optional +# EOF. diff --git a/XpConfig/C/print/models/PS2PDFspooldir-GS/model-config b/XpConfig/C/print/models/PS2PDFspooldir-GS/model-config new file mode 100644 index 000000000..1d74b8676 --- /dev/null +++ b/XpConfig/C/print/models/PS2PDFspooldir-GS/model-config @@ -0,0 +1,72 @@ +# $Xprint.org: PS2PDFspooldir-GS model-config,v 1.1 2003/11/20 03:48:04 gisburn Exp $ +# PostScript DDX model-config which converts jobs to PDF via GhostScript's "ps2pdf" +# and then sends them to a spool dir instead to a print queue +# +# This model is basically a cut-down GSdefault model with a custom *xp-spooler-command +# +# DO NOT MODIFY THIS FILE!! +# +# If you want to make customisations for your printer create a copy +# of this printer model. +# Example (for creating a model config "MYCOMPANYlaserxx"): +# 1. Create model config dir: +# % mkdir MYCOMPANYlaserxx +# 2. Link (or copy) the PMF (printer font metrics) for the +# printer buildin fonts: +# % ln -s PS2PDFspooldir-GS/fonts MYCOMPANYlaserxx/. +# 3. Copy the model config file: +# % cp PS2PDFspooldir-GS/model-config MYCOMPANYlaserxx/. +# 4. Customize MYCOMPANYlaserxx/model-config to match your needs. +# +# Attributes supported for this printer model +*content-orientations-supported: portrait landscape reverse-portrait reverse-landscape +*descriptor: PDF job spool dir /tmp/Xprintjobs +*document-formats-supported: {POSTSCRIPT 2} +*input-trays-supported: +*medium-source-sizes-supported: \ +{ '' \ + {na-letter FALSE {6.35 209.55 6.35 273.05}}\ + {na-legal FALSE {6.35 209.55 6.35 349.25}}\ + {executive FALSE {6.35 177.80 6.35 260.35}}\ + {ledger FALSE {6.35 273.05 6.35 425.45}}\ + {quarto FALSE {6.35 209.55 6.35 268.732}}\ + {iso-a3 FALSE {6.35 290.65 6.35 413.65}}\ + {iso-a4 FALSE {6.35 203.65 6.35 290.65}}\ + {iso-a5 FALSE {6.35 141.65 6.35 203.65}}\ + {iso-b3 FALSE {6.35 346.65 6.35 493.65}}\ + {iso-b4 FALSE {6.35 243.65 6.35 346.65}}\ + {iso-b5 FALSE {6.35 169.65 6.35 243.65}}\ + {jis-b3 FALSE {6.35 357.65 6.35 508.65}}\ + {jis-b4 FALSE {6.35 250.65 6.35 357.65}}\ + {jis-b5 FALSE {6.35 175.65 6.35 250.65}}\ + {iso-c3 FALSE {6.35 317.65 6.35 451.65}}\ + {iso-c4 FALSE {6.35 222.65 6.35 317.65}}\ + {iso-c5 FALSE {6.35 155.65 6.35 222.65}}\ +} + +*plexes-supported: simplex duplex tumble +*printer-model: "PDF job spool dir /tmp/Xprintjobs" +# 75, 100, 120, 150, 180, 200, 240, 300, 360, 400, 600, 720, +# 940, 1200 and 2440 are supported DPI values, we limit it here +# to some common values: +*printer-resolutions-supported: 300 360 400 600 +*xp-ddx-identifier: XP-POSTSCRIPT +*xp-listfonts-modes-supported: xp-list-internal-printer-fonts xp-list-glyph-fonts +*xp-embedded-formats-supported: {POSTSCRIPT 2} +*xp-raw-formats-supported: {POSTSCRIPT 2} +*xp-setup-proviso: setup-optional + +# Use custom spooler script which sends the output to a dir instead to a printer queue +# Note that "%xpconfigdir%" is currently only supported in Xprt servers build +# from xprint.mozdev.org sources, other platforms have replace it with the +# absolute path name to the script +*xp-spooler-command: %xpconfigdir%/C/print/models/PS2PDFspooldir-GS/ps2pdf_spooltodir.sh -d /tmp/Xprintjobs -s .pdf -u 077 -p %printer-name% -c %copy-count% -t %job-name% -o "%options%" + +# NOTE: xp-psddx-* attributes are EXPERIMENTAL for now. +# xp-psddx-download-fonts defines which fonts should be downloaded as outlines +# (valid types are "pfa", "pfb", "ttf", "ttc", "otf", "otc") +*xp-psddx-download-fonts: pfa pfb ttf ttc otf otc +# xp-psddx-download-font-type defines which font type is used to download outlines +# (valid values are "bitmap", "pstype1" and "pstype3") +*xp-psddx-download-font-type: pstype1 +# EOF. diff --git a/XpConfig/C/print/models/PS2PDFspooldir-GS/ps2pdf_spooltodir.sh b/XpConfig/C/print/models/PS2PDFspooldir-GS/ps2pdf_spooltodir.sh new file mode 100755 index 000000000..5739807d8 --- /dev/null +++ b/XpConfig/C/print/models/PS2PDFspooldir-GS/ps2pdf_spooltodir.sh @@ -0,0 +1,130 @@ +#!/bin/sh +PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/local/bin +export PATH + +verbose_msgs="false" +DEFAULT_SPOOLDIR=/tmp/Xprintjobs + +usage() +{ + printf "Usage: ${0}: [options]\n" + printf "-v\tbe verbose\n" + printf "-d dirname\tdefine spool dir\n" + printf "-p string\tname of printer selected by user\n" + printf "-c integer\tnumber of copies\n" + printf "-t string\tjob title\n" + printf "-s string\tfile name suffix\n" + printf "-o string\tspooler options\n" + printf "-u mask\tpermission mask for new files (see umask)\n" + exit 2 +} + +verbose() +{ + if ${verbose_msgs} ; then + echo "$1" + fi +} + +spooldir="${DEFAULT_SPOOLDIR}" +printername= +num_job_copies= +job_title= +filename_suffix= +spooler_options= +permmask= +while getopts va:b:d:p:c:t:s:o:u: i +do + case $i in + v) + verbose_msgs="true" + ;; + d) + spooldir="$OPTARG" + ;; + p) + printername="$OPTARG" + ;; + c) + num_job_copies="$OPTARG" + ;; + t) + job_title="$OPTARG" + ;; + s) + filename_suffix="$OPTARG" + ;; + o) + spooler_options="$OPTARG" + ;; + u) + permmask="$OPTARG" + ;; + ?) usage + ;; + esac +done + +verbose "# spooldir=\"$spooldir\"" +verbose "# printername=\"$printername\"" +verbose "# num_job_copies=\"$num_job_copies\"" +verbose "# job_title=\"$job_title\"" +verbose "# spooler_options=\"$spooler_options\"" +verbose "# umask=\"$permmask\"" + +if [ ! -d "${DEFAULT_SPOOLDIR}" ] ; then + mkdir "${DEFAULT_SPOOLDIR}" + chmod a+rwxt "${DEFAULT_SPOOLDIR}" +fi + +if [ "${permmask}" != "" ] ; then + umask ${permmask} +fi + +if [ ! -d "$spooldir" ] ; then + echo "$0: spooldir \"$spooldir\" does not exits." >&2 + exit 1 +fi +if [ ! -w "$spooldir" ] ; then + echo "$0: Cannot write to spooldir \"$spooldir\"." >&2 + exit 1 +fi + +# Create first part of the output file name (prefix and an "unique" +# id(=date and time))... +filename="Xpjob_`date +%Y%m%d%H%M%S`" + +# ... then add options ... +if [ "${printername}" != "" ] ; then + filename="${filename}_${printername}" +fi +if [ "${num_job_copies}" != "" -a "${num_job_copies}" != "1" ] ; then + filename="${filename}_copies_${num_job_copies}" +fi +if [ "${job_title}" != "" ] ; then + filename="${filename}_title_${job_title}" +fi + +# ... mangle output file name and filter chars (like whitespaces) +# which may screw-up further processing by other shell scripts ... +filename="`echo \"${filename}\" | tr '[:blank:]' '_' | tr -c -d '[:alnum:]_.-'`" + +# ... add path and suffix ... +filename="${spooldir}/${filename}${filename_suffix}" + +verbose "# File name is \"$filename\"." + +# ... and finally capture stdin to the file (we are using "gs" directly to +# avoid the problem that "ps2pdf" is not available in all Linux +# distributions by default). +#ps2pdf - - | cat >"${filename}" +gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite "-sOutputFile=-" -dCompatibilityLevel=1.2 -c .setpdfwrite -f - | cat >"${filename}" + +if ${verbose_msgs} ; then + printf "# File is " ; ls -l "${filename}" +fi + +verbose "# Done." + +exit 0 +# EOF. diff --git a/XpConfig/C/print/models/PSdefault/fonts/AvantGarde-Book.pmf b/XpConfig/C/print/models/PSdefault/fonts/AvantGarde-Book.pmf new file mode 100644 index 0000000000000000000000000000000000000000..331178985b79d55487cd9c0c1c3172c5023157a1 GIT binary patch literal 6716 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 aWGi*Dm0_VF^R+za`2~iC=^x|#_kRHdm`tt! literal 0 HcmV?d00001 diff --git a/XpConfig/C/print/models/PSdefault/fonts/AvantGarde-BookOblique.pmf b/XpConfig/C/print/models/PSdefault/fonts/AvantGarde-BookOblique.pmf new file mode 100644 index 0000000000000000000000000000000000000000..61bcb22b9f98b12c3453dc01d077702d55ff5277 GIT binary patch literal 6728 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 HzyJL|AK7>N literal 0 HcmV?d00001 diff --git a/XpConfig/C/print/models/PSdefault/fonts/AvantGarde-Demi.pmf b/XpConfig/C/print/models/PSdefault/fonts/AvantGarde-Demi.pmf new file mode 100644 index 0000000000000000000000000000000000000000..88ccf083450a31fa1aab778f57db30328506481e GIT binary patch literal 6712 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 WrEbT~(^IAQ{$EA^o8-Sb|NSS4V3NuJ literal 0 HcmV?d00001 diff --git a/XpConfig/C/print/models/PSdefault/fonts/Courier-BoldOblique.pmf b/XpConfig/C/print/models/PSdefault/fonts/Courier-BoldOblique.pmf new file mode 100644 index 0000000000000000000000000000000000000000..8db974018eb4769e3b86d98f0bd9120117f7a8b7 GIT binary patch literal 6636 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 literal 0 HcmV?d00001 diff --git a/XpConfig/C/print/models/PSdefault/fonts/Courier-Oblique.pmf b/XpConfig/C/print/models/PSdefault/fonts/Courier-Oblique.pmf new file mode 100644 index 0000000000000000000000000000000000000000..87aee16cce34df1dc92957cadd6a5ecd31893099 GIT binary patch literal 6608 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 literal 0 HcmV?d00001 diff --git a/XpConfig/C/print/models/PSdefault/fonts/Helvetica-BoldOblique.pmf b/XpConfig/C/print/models/PSdefault/fonts/Helvetica-BoldOblique.pmf new file mode 100644 index 0000000000000000000000000000000000000000..89619516f20110950dad1032c4186a59124be1de GIT binary patch literal 6692 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%0ALZQ&^?4?Pg1R zDCR09(oQ~akQVDx+#mdp|+E&?i*;}zo z<*ZY{Du1YLK(A}1_t<6abgz}(<2w^js{y35*>u)TSMpQ}8QU$T9oMGcwf5N`YS~xX z?ZBezztvbOXLFfqB{I(b0y^I+iMec{pLE4_?LvBxLAyY&>+G=$y_QSKPU|#evX<@I zrL4+ya5#wLX8P=Wwva8@^jEUEoSk?4hzm|x7k6N=IA9lW?f$GXWM{}*Y1b)`vHM-y z)}`}nR^IQFD!OnkuBx$9um`MMpKmW9mcq*G9L4-<#C#`Wezp2?_5oskK4YVaiMc9|u{cdt zhvL3;+?S5mNXJLTl0H+?XG+#EB}bX!oeA1}iz%N!<@2X%_)`JHs93&|D`$(jK~hd| z1m5LKclpv?HPT(9V%>ggXCl?!MyWJlxkXg!RloF`tQtYfH*1Z`TRIb#O}d&1+n2U| zX}d<+9u>>_Oj(~P7#cd+>I^vOes+0)f^X6B`5m9%sZr_#45MP1?7nPCjc3Oni4|YA f;>%WQWGkaWgMMpyz;O!4$+ literal 0 HcmV?d00001 diff --git a/XpConfig/C/print/models/PSdefault/fonts/Helvetica-Oblique.pmf b/XpConfig/C/print/models/PSdefault/fonts/Helvetica-Oblique.pmf new file mode 100644 index 0000000000000000000000000000000000000000..2a0de8afc048917610bdbe10f50df24285645692 GIT binary patch literal 6688 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 literal 0 HcmV?d00001 diff --git a/XpConfig/C/print/models/PSdefault/fonts/Helvetica.pmf b/XpConfig/C/print/models/PSdefault/fonts/Helvetica.pmf new file mode 100644 index 0000000000000000000000000000000000000000..b1fd475bba133f24cd5c0b65f60625f9f2cdefed GIT binary patch literal 6672 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 literal 0 HcmV?d00001 diff --git a/XpConfig/C/print/models/PSdefault/fonts/LubalinGraph-Book.pmf b/XpConfig/C/print/models/PSdefault/fonts/LubalinGraph-Book.pmf new file mode 100644 index 0000000000000000000000000000000000000000..aff4b494946697f5d1e21f580382898bfeefbd1a GIT binary patch literal 6628 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 O;d(`;8uAZu{`)_yHWP>d literal 0 HcmV?d00001 diff --git a/XpConfig/C/print/models/PSdefault/fonts/LubalinGraph-BookOblique.pmf b/XpConfig/C/print/models/PSdefault/fonts/LubalinGraph-BookOblique.pmf new file mode 100644 index 0000000000000000000000000000000000000000..b5b77f353374d2e4de6f476992d60668b18de509 GIT binary patch literal 6640 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 GfBy^kGEnIN literal 0 HcmV?d00001 diff --git a/XpConfig/C/print/models/PSdefault/fonts/LubalinGraph-Demi.pmf b/XpConfig/C/print/models/PSdefault/fonts/LubalinGraph-Demi.pmf new file mode 100644 index 0000000000000000000000000000000000000000..100339854962d18d2fc7f9db79477970a0dd47e7 GIT binary patch literal 6624 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 literal 0 HcmV?d00001 diff --git a/XpConfig/C/print/models/PSdefault/fonts/NewCenturySchlbk-Bold.pmf b/XpConfig/C/print/models/PSdefault/fonts/NewCenturySchlbk-Bold.pmf new file mode 100644 index 0000000000000000000000000000000000000000..ab22aabf5ba537eb6ba21e711af104927415cda4 GIT binary patch literal 6644 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 literal 0 HcmV?d00001 diff --git a/XpConfig/C/print/models/PSdefault/fonts/NewCenturySchlbk-Italic.pmf b/XpConfig/C/print/models/PSdefault/fonts/NewCenturySchlbk-Italic.pmf new file mode 100644 index 0000000000000000000000000000000000000000..390f223cbf174420d2193020fdbe5487f8411f6b GIT binary patch literal 6652 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 literal 0 HcmV?d00001 diff --git a/XpConfig/C/print/models/PSdefault/fonts/Souvenir-DemiItalic.pmf b/XpConfig/C/print/models/PSdefault/fonts/Souvenir-DemiItalic.pmf new file mode 100644 index 0000000000000000000000000000000000000000..094b348cc9cb00eaf4c09ef1a1c74f577c52a2b8 GIT binary patch literal 6692 zcmb`M3vgW3dB=a>y=#b}$UGX0K!O%hopDxakYCTU9>OX z-8B|5=8+PUQYt8cI6%Oqfz&j0c$rW_(v&8dgbmP&lF^Jp#vjW}6 zz;fHig%fAMHMal4k#OSi#(>hV^?kzF0!~(clx+n*tH61{`3j_feg!TCG71F1gaVVm zH401tH!BVI19vK2%6HY7{u=N|1ir7Be+)bg95n$vrzpPx-VhK6B&NW0kktwdg8V1o zz6_4y<&)sdP?YDuIY}9v3C6gZav$2r2+GBU3+FGY4(AnEJ)UW1FXR$OH24mxu_*t2=<8u}*oPVzR zd!G8cXkI*_f)^i{ELZ$|Ii4zHieaf3dKEuAD;`hea`Ap8TaNepWk1~HXJ@6-o$)9e z@t_>{;-Nnllq-JdXXBO7%ldgQoQM}kFe2JUv0+)21wPta+K3HPDnP)(>~Ex z+J}ut?g6U6npzFGy0*V|gj%QaL)j(w=#h``SR3EdqH3F(XDd6T1En9fb3i(3s}+=K z(k2~-MMT;p&k{|)M7Biy5=c4146sc)YD=}mcDBoMx;4Iy?Xt|`9nvO?YGa!IytMM~ zwF4TjV~PbNHU5RPa#KxL4*Hm4srBtQJS59mrFq_yHd&_VwHn`P@^eNLHva2*iQ7b< zuCbvz5w6vEUD{;6){Yz((N!U8U@~mu5$li76pvV+Uy)YcVVag!^ZHipNsXK7&+vQ{ zD_J5Fb-Y><^*DD(s_uirHZS7KM4kQ_IkS#GEiHB2DI282_#m659MO4zoe`GfI4JY& z+|y0Aj+fRt&)4L(I=)!?>p0!y^J1A@r?1m%Afe_folQDh8*!6UoAh^RohJSrT93hx z%C5R^L$a{0zq1L?k|QEIyP2x5v3sRe)N!YtX8J*8x3*i;_pz_GACuv9(^`F1TG(rI z`lhs)bp<@jOYE_}9TBZJ;6)BZbPn>6ETdnMWjY7hYcOv$@fVqrbFBU+G}ipQ&cV8^ zO?r=*IOOH-x<7A7o5jN0(h}K~nbOK$di1=0tNk~4H&3ZkO+P>3`G}uec}QkhA6}QX zI{jyjxyWJ}iRdzo19cyM$!qLkKu&o_9Ar)s~}_*Z&w{)5I>ay7TscDzsaE`BN}>v{`Uvr{^1otj_m>sM;; zYWyhQl#beU8b7G<7d0-iP0pyDqVc;r&Sq__)a$=b(^XBov$j*?>v;*-pz+owonQVS z|7$hbCc9*r-Q!w{r&ik524$WLCdOhNZI|N+#l^bTbH!Y zx)w$HRb6Vvk$y#wP8(H=EDw)0;lE{P#LqrK>uPucZv z&Yic^%nqq(sxC!3566*CMYno%U5fmf-Bb@xkQO=L+Im%5YT|Ar=fJ5zQ3o%MPpa&%KYd_&r-pSl)V zJ@3cHuA!TG863?^o$qg&wWn*^a~!LC>imsjbvTaZqUe#HU-FuqZt9Y%hqBDp!2P@? z=P0`V-if2Wpv)sUxWt&o5gf_Kn9flg&F^pwEzICpj^lVv;CJ~rGil{SKEX+x%qRI2 zr_e^6Q#p-K^Lw1m8Jx*koXt6WhI46W7N2D{bC}ELn8$n;a2^X;#9}&F!uc#^8Ouqq zf=;?fvXWJFli~tavxW=lp_e|^($4^C23f~NtY?S~{5}_R376LXA0CFe437~qWbqkg zjBx@kXM!Ag3KS`^k&rSKs%+v4HZ#eUe4Z^_#a6E78m{F!zQ7-FJzr!SH}EC?kQ@0U zZsL!b;%08)Pq>vYa~rqw6}IzL?%+=D;%nT^J?!95xtBlV>)glve1kt{ClBx!e3QRq z7vJJR9^zph;Zb(;7~ke`{)#8~4o~vk`tQ^4fvg3Yv_J0d1J&GX!Oejz1sO9>k6T zSyy9xPNE)l$@H&RUl7; znom6@E5Pltacu`}%g(?4R&iJIHtv!C`mJKq1@djHTgCodOZ!*QF;TSJZCh&fL^(Ri z(yhFTMbwmT74r{j?n^e#DhEwX*=uepPf-puR(;!)5A|`CC);!`_SjfQF+c3B)}GFT zx@>4_Q4XTFmQ!&%OkVeGP7aBy;%&F_Za?Jr8~S882ABz)3Y-PZ1{Q<z!!k)fo;H-0Ckq#WG`@TL47mAZT1f5KGg3Bco29T_#5B{z>k{laGnA7 z=&@`qFw1_-Eh+;9r3Kz^_1m`KT|wmw{IRbvyJQsPAI*`Jhhdw}E%nMG!~} z$jKmQg3JY32(lPtiQV(dLDU{l>u)7UH^>DbYe0HH`at^CnGdoKWIf0Rkc&Ys1-T4l z1SAVG3Nj9&_MfULn?SAvxgO+ZkUK$kfb0Z$800aK?}PjpRyHpqKsk2%MJ z(+ZB-=VyU4&#skja8{dr>SV#mfwLK$>%h4MoV&pJIyeu5^Vi_~2%MjR^H1RH2j^9A z-T>z(FSB*14DMENw}E>zxL*PHZg3v} zcekxwPl5XraGwSDAHn@KxUYbF0Nnoq_dSRm39%N4eH>z^LhM|KeGX!aA+{1?YauoW zv5O&=f!O5`+XS(zAa(=9Zh_c#h}{FR`yuu)#J&r$A3*GBi2b5m@-jaD=1k7Zv$0yN z_}P&hg=&7p56i(=fow6C^Fm5~nDGl0ynM+I%U&UiS1Oh(VX-vsQ}RN;kn=|?2I=c5 zJavZ@lqV?Vs%0|8eBL7;6sl#VD=20u=e+Xx2cGhoVy;-A?B@f6a(=mtzp?7&7z=%` z;)iUk`ek+Hgje}Up8+GGmznS@+UXH5Ghv*u)Mx^kAjkw^rkbZ($ogS9Qw)8^LT{7* zk&b<(-M1D)(`&L+33Aye6WQVw1$4Ys5OYCcj7&8Q{X%AvNx#5ISe)<+BVI_^&*(5@ z1J4ira-bq@F9<1y*-<|q6oP`!ST)Gy{Cv^OxKOO<(rT?Rjw$Ot2%KZmGRK`>pd@1t@z}tD)-)4=#|E8f|dX37Lkmf4RSe;Vxb|G_sW@S z?hwyREQ$q{=uqXjSn$Wa+^Df~M?lwnF4rc@JCs=<^@chh4m_8R_P!{6J)-)k8fV)<&W5|nb2^cF{Q z!N#i3pphOl(t}OXgAK7EGn(%1?eC#n9{0i$D)eeynjx=A&@*PehPFxj9-|EH-x|M&gx{{SySDa-%> literal 0 HcmV?d00001 diff --git a/XpConfig/C/print/models/PSdefault/fonts/Souvenir-Light.pmf b/XpConfig/C/print/models/PSdefault/fonts/Souvenir-Light.pmf new file mode 100644 index 0000000000000000000000000000000000000000..0bb62bde6dc6f4d13b8b774e3c7aa7716b945332 GIT binary patch literal 6684 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 K#`FK*|NbwlJ4*)u literal 0 HcmV?d00001 diff --git a/XpConfig/C/print/models/PSdefault/fonts/Souvenir-LightItalic.pmf b/XpConfig/C/print/models/PSdefault/fonts/Souvenir-LightItalic.pmf new file mode 100644 index 0000000000000000000000000000000000000000..3c19a7fbfbbeffa595477fcbaf955782f4c4ecff GIT binary patch literal 6696 zcmb`M4U|;ndB=axz2gU=qA|t|f;z^uK*Lf%h|7n-usg7$xC^_p%2LgGcjoTy!0g=N z&dkaNaS$~o^*hFf`bpD(!M16%HK8d6-mAE#wrhh=Qmn=KiCsV6C(}tK=qV%pwbfwABn@nGy>PUB*xk3<*dU+BZ9Rt1T z{xwNMWo>GGa?L<*YD1E>-Knm$fj!CI?lpbsRCm|F`sSN{de&Q_mS zs?S9W;t7?$c<*?r?2ne>sX`_Qi$Um>{p_50Jdw}Gdz5S`-s6}2aLmunNu}H4Q9%AN9gb@n9&PDwO@O;FWVh!OO?f<3)eS%lPqjYatgD=FpS4 zen970r&-^rRM+nkz3s`aw4UflHt?wlUX^IKHH#cOWu=&9&{Qkd4|M9K!MeUghpm#@ zi;YVj1~vluS`E0dcBFQ;+E((2JRuM3nGbMT8{g5Q)w+Uys?#o|RN1S;i>H3feV2PeGPjT;-@Nt*z4Z z*QJHmHG%|HX3?N;t?kk?v#B!M`gVvLWd(CI{S7ASc6Tu$%dMUhnr^PQn|R)8;`vu5 zWU2O9cumud|1U8i3z@8iPd3Rao+!rURC&t!b1hZ&Sf7tc3vV$=%f2QpJXSlPaWnlX zo{91-3mSQoPfD9CF)qsma;Yq|c)HAu?8;(E)amC*OC3+*WF60tM4f*`Hbivpp<2iP z!C_fw;+6R_qfY;&Ofk4tlWkJ6bdhzEl7%K-nJ1~b{;3f^N{^y1Q(nu(O*(%jXV&@8 zZt}TJ$D(pBGEMXA{L6jvMBTU5(iZt9bDD5dyxgkSgQ@(JOo)2qsmsu{KfJ5#*3@$c z4s*D6gimRlpen0tGc?}MYaHSXjbGrXEVuY;9IVsdFY6`sq+`vDO0S@{aV(XhaUZek;9OQdef0e4N zz^vA3(jr&czO=oG{*JV8Z|xZ^v7RdbX=C4~_Ehbcntr%xe;s2&&aJ(w=rTv|M{_Ct z=d(!P9O1Yu(f$Zq*(uX&AJP0Pqdirtv4g#`v}XFxeeC49+K;sCt9ox9(|7{~?x=mS zNmlnXHd2+zy5B;Ty|TpWY3^5#>pr-mz#pVfGPF=?q?qVW%-8iCBz``YAC^|V`U zPByWtHbJN657b(!sTVc)e3SnVH2jwha!a(%WvB^{G_dM3QJ!^gF&f{CjmL&=A~E{j1N7I+I&$<^y`c+?Q#`joRMZeQv-HR*_k5jGVJyaupc2SM^Wm&!N znO?NRtYO`Yw%fj;`cgB#r-{C!3Eye3?$19m>;IIVrutH(=X4zDRP@`ePSuxgu`!<8 z=!g7-qq4;Aul?GZ*=wic%bVy^oAC4|JlkODlnwR$X!?@MzwSlSqIuqnjebLqbn5kK z`#?#pRg3RtOfI*0D`PU<;$s|_W!9hPnUJZ9ZhDci`#xCPwR9bq#gPx{`S`us37t9B z(_Y~mjrViX#=?7WBUdNudJdpsH+$+`-ER$6^yv!g_nkQE4a!`CgG-DvIFqwDn@N0# z$@~`QFoknDj}LP`AK?N%%7wJ>F{W}6)0oc1T*9Tqxr~o7tvptfPls z()4j1*R!5}Ht_r0z>R#m_Wy7(z)g4zk|B%F5W|d+V*QKrHeH?xIt zKEqaSVH>wnWjnXAgWI`-JNYbk@i{)vA8WusmkMJmu z@i|7zU@$4EHv0=UKW7YB(2x^N^uM-@Mk4iDZA%cVtJ&Mnk@A>^T1h&TepC z0_PWYex<>6KTd$N51eh_=E0q0hQ6O<=QdhdrDGqsKg8%(`d3o-SNpAEIbq{D!^9^q z8a_=|`B3zgAQ##kv>JY8U&q;M<~99(bUa#4$sDoqTx9LMcxvvV9KI)CDnH83u&sg8 zt9()Zx=nSt-_nN7yz)`!Y`3u^=CoT$80Lu2XMm^(i2h?-U&jEGh^DBEGGzDZD$PD$H1EdXPG00MoWuV@RMCGXiWEDs! z$kiZg)EN@UT96))G{|-KNNEGe4IrNexd~(tBnvVGG6J#@Bo8tM@)=O?CGr5sqaeFL z_JTYM@(qv!AU^|**x6P52{MxRW^T25V=Mr#cg0sNZxD%Xf?B2|p<0)qgI6J_3 z5S+)r`3gACg7aN)z7NjdgYz%oya~=b;QSXjKL=+5+!(l%!EFKe2(g_IdlF)M zAoeW8z74S#Aoe1}{;5>-GCuy6Ox_!1b0sMI*}*)8%IKgUmU6=dvOzxYg%tfT;}^`>GLT(b%>NJZK9a3l*k05qaLHVLZzg1<$^4w zyjL1|-=};g$Oi>V{%Fpiyk9EeZ?1TGhC|;g`yrbveo37<;gvtoYrtUWWj6U`?ew6R z*<_rt)F^;VE|vUnIQBT4!tq|13mVYcHdeI&0UkFaxR~ZDv=FtE}-+R zl9^9FgxUr<_fuj&u}G| z&-gm{ra7ksg!+2 zE2{S1aOf3BY=M>k>KKuXpUvg-9zmfYHR_czmHa85nOp<~Rp?OFI4JldUVg~fv&2%p z@;XNeQ;mdiB4MgEl=rugF!@Y05|ap39urC0BZrbkI%%YnP14DRSjsS^3{$F!Db-*~ zraS2}7P}39x8d(@;_tQ$4YAQmzML!O$LS6R^SR9xpFShqXQca@r286T{bn}Z+1=Ac zsWjq+MO5n5x-?T>lb~nJdJTC`XTtNzM49l7v~Q&SCTYJRmNQH_!(_LHPIj)rj}74-9|Mq%^P$4Y6!)ELT$dIWRl1Vq_~uw$db9X$Xy*+44vb78q~PqyK8^*Z+O~ F`@ghpKu7=p literal 0 HcmV?d00001 diff --git a/XpConfig/C/print/models/PSdefault/fonts/Symbol.pmf b/XpConfig/C/print/models/PSdefault/fonts/Symbol.pmf new file mode 100644 index 0000000000000000000000000000000000000000..48925f8161118ca45d4973bce56283c1cc6da5c6 GIT binary patch literal 6556 zcmb`L3zSsVm4?54Zz;Y-2SJ7gyJ<{NDBdWbqD6N#-4VL5yIOe|o7+{ly9?^k+^PcF zWYjQ4Bygt-AzOdx1UMxG)wceuz+0!l zWw!pI1NWW=H`w|UBjC<6Ob5!ovX>rf`U1wOAJw-46BRgLIibMCK%D|H;7SFq2Ch*c z4dfNr1Z-9o_5j~hwv_L;0w=x;D5(bbEAm6Y!%DIj_@$B@2HsHMJ>`Ue90#&Yft4UX z1>6CUN0j9%kmr=-D9B5y({n-I0!IHk$OmGA=BQ|L5;$tOryc}ntRmNeGf_45tLTQ? zBlWRG(e`Dr)_7}OOVhG=dqb=_-W*vPrL{NHkxSDMYiq7=S%H_#b@((ymNqR}(XI)3 zL%1s1w74;DL>WJsDrRV15^0VT&>D?j)l?sEG>zF@knz$)>g(HE<13a#jg)0g%cD!$ zTbou!Sr%(*jvLq#ZH+Byi#NrZ+m}~XR?xaEQrFbHm>wcmMq46_qwTs6>KY?0tSD`Qw5WJcm+R>bQeEAJ>dA@os%OrhH+QP~y-@$oSHJUT zR7X@$t6O{X1wWIoZptQdK~FC53Vw20b#)}2uGSXv)q$V)gY|xL8ZD8l+I7Tqz;sOo zZKxJ$t&29tbwho07=JQU4UswQEbZutyFO<3UP`ge_~0MpqfRp@CgXG&Pq3RUHw=r7B8gn_bLrpRg; z#p#M7Q>0PGaDwLV#TH*6#sWqHZi90yJAv(1E$x>hTfp=wO zd0bK_F{!cse>7xASjjdS&m!IOrlfhsaw_CbJj=OD`)uaM6C9Rtv}^t|+)cm5M;PQ~+O+(7wsOek{kIGb zanu}8hlMJyG9dFT=XKtr-}>+@hk3!u|5@`*zlRy%UoAe!VX3v8gPP-MoA2npPSp6v zdTkorBfQ582Fqv(^MS>uOO0K>>MZS(Ix`lj)$-NWPM=(A$GDweN)=1Bd;)Q);&P2E z_Fn5)n)to-Pu3I!dDhqj? zQ#5`|7BXP=B3{;VW9b!H$ZzZ(wMX{z631(s*URl?%xesadW})O-S8*!4K{AqvsY?L zWuqd$?OJJcj?TFu<#&kD*i&N5bs0{_m$xF0wXn;c=cW^=V6L4m?_VV+ap$ zvc_r;e5mxQ#wvz;)Sg)?Nu%r;+7HiWQ1&rfapaKfp;-E%=6@)oySMwEqiwQ&c7#toS*46lJ&er^?75mIc3CnalS8HXdIh#r)jkTYpl6bOFs!BI% z-9}j@moPmWON7Ve$ z=QDa<*)^r*8*R)VrcV|qJEamE*eVwhS2dX=OJ!WeSjuspAxnn*KS#oH3DdL}cd$#g z*mHk0yX0$3`ZM_s%`vCn7|k)e=JpDCl0Mm@U+$rkKG|yR7`Zt~#%Q^*Q{gk$QjkrA zb-%l$MsB25<65baot&%j_qE*U{$G5q^sUn8%CY$Wi_b9oN&|~&q=_$ZIZIedGclHN z1ue7^r;RJQish_eC9AlaFLF)k|Dn*%YCJkfki@5xF1ksvhP9;0kR?YC>j=nGpvZbQ zu#sM_srGW4;wz5U8)f9G?NcAc9c6TtzIx<m}w(`y&R!ThKq z2mc9`Pv~@TUp79J|7E+;(>|8{QaM!qKV$8egz?F)9M>Vy;rNZuzvy6Tg&snA>ai--IKgxZ(3dheywg? z0CjEhAHV?cwmw_ocfjw}w*c@5)b{~=2oeJI{wL!=J`XYrWFDw~1OW_70n(gG3(xe`RpcXh>cHOMs}t3f(Ik|3QR-5_f~(jeiQt|G?hJ4* z26r*ImxJ2^?h0^MgPR675AJo~ZUI-VubaWW4P3QfJpk^{!F?RuUx3>O?u+2Q3GUnA zz7OtygF6VJ5fC~JLT5p!20~LIG#f$-Ak+Y%DG^F3a|$KRMpdl}Xha|J)yktSQrbofC&)s-cgOQ*en9zRI<*#cgs z#}D#eHi_4h%NK%NPq$Bx7x>w<-&rt7-|yh%3x1Hwucaql%#+AvG9H;!wwPD8Qn@7g zw3qKb=82xjrE^*GekNs5+Rx|l*A=}qU4icv{D5^uKVL}YvUr8hbmVsgUSh3Z&`x)F ziM7TVD=iNokxC^}L86$Um`(aYK9LK2x&m*#|Cx?>W!<+u2BucgQz4a3mNSveZOEeI zt%8_NWxGfegTT)wdg=AEbOgDzezwC4$omN$hGfd~13#Zqk+yeq6;1!mwJVm@cGx(!IoT9qH7%qEDOAZZq0#720jXYAZ}@ zyfN0&Og`W31wE+Ht9fafyb49nbn6Z4dpZ)HPof+N-)Q?r+po~}ht*Pslrki{G<2|2 z!=$X~EoZnn!_8F~%vr*)N;0)Rl~-#yXI5d+=oXD`u|l^vtki2-3*EUu9l+&F3{yV+ H4)=cmQ;R)_ literal 0 HcmV?d00001 diff --git a/XpConfig/C/print/models/PSdefault/fonts/Times-Bold.pmf b/XpConfig/C/print/models/PSdefault/fonts/Times-Bold.pmf new file mode 100644 index 0000000000000000000000000000000000000000..cf46ca03fcfc117be4d0cce279ec6f9ca0b83222 GIT binary patch literal 6660 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 Si0Lg4dwzkD2K@uv|NbBJuaCh1 literal 0 HcmV?d00001 diff --git a/XpConfig/C/print/models/PSdefault/fonts/Times-Italic.pmf b/XpConfig/C/print/models/PSdefault/fonts/Times-Italic.pmf new file mode 100644 index 0000000000000000000000000000000000000000..865433f83a7224b24721a004baa04ab7cf79c3bd GIT binary patch literal 6668 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 YrEybR8VkY#<8^uUznI$f=g)ut7X+A3qW}N^ literal 0 HcmV?d00001 diff --git a/XpConfig/C/print/models/PSdefault/fonts/ZapfDingbats.pmf b/XpConfig/C/print/models/PSdefault/fonts/ZapfDingbats.pmf new file mode 100644 index 0000000000000000000000000000000000000000..1ae9a7688e64e62b3e65be398c18a96eb3d3e286 GIT binary patch literal 6676 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 cDBDQLHd;cHVQYQN^VI&2 + exit 1 +fi +if [ ! -w "$spooldir" ] ; then + echo "$0: Cannot write to spooldir \"$spooldir\"." >&2 + exit 1 +fi + +# Create first part of the output file name (prefix and an "unique" +# id(=date and time))... +filename="Xpjob_`date +%Y%m%d%H%M%S`" + +# ... then add options ... +if [ "${printername}" != "" ] ; then + filename="${filename}_${printername}" +fi +if [ "${num_job_copies}" != "" -a "${num_job_copies}" != "1" ] ; then + filename="${filename}_copies_${num_job_copies}" +fi +if [ "${job_title}" != "" ] ; then + filename="${filename}_title_${job_title}" +fi + +# ... mangle output file name and filter chars (like whitespaces) +# which may screw-up further processing by other shell scripts ... +filename="`echo \"${filename}\" | tr '[:blank:]' '_' | tr -c -d '[:alnum:]_.-'`" + +# ... add path and suffix ... +filename="${spooldir}/${filename}${filename_suffix}" + +verbose "# File name is \"$filename\"." + +# ... and finally capture stdin to the file. +cat >"${filename}" + +if ${verbose_msgs} ; then + printf "# File is " ; ls -l "${filename}" +fi + +verbose "# Done." + +exit 0 +# EOF. diff --git a/XpConfig/C/print/models/SPSPARC2/model-config b/XpConfig/C/print/models/SPSPARC2/model-config index 959e9ff7b..9f29b9992 100644 --- a/XpConfig/C/print/models/SPSPARC2/model-config +++ b/XpConfig/C/print/models/SPSPARC2/model-config @@ -1,13 +1,18 @@ -# $Xorg: model-config,v 1.3 2000/08/17 19:48:04 cpqbld Exp $ -SPSPARC2.printer-model: "SunPics SPARCprinter II" -SPSPARC2.printer-resolutions-supported: 300 -SPSPARC2.content-orientations-supported: portrait landscape -SPSPARC2.document-formats-supported: {PostScript 2} -SPSPARC2.plexes-supported: simplex -SPSPARC2.xp-ddx-identifier: XP-POSTSCRIPT -SPSPARC2.xp-embedded-formats-supported: { PostScript 2 } -*xp-setup-proviso: setup-optional -SPSPARC2.medium-source-sizes-supported: \ +# $Xprint.org: SPSPARC2 model-config,v 1.4 2002/11/07 19:48:04 gisburn Exp $ +*content-orientations-supported: portrait landscape +*descriptor: SunPics SPARCprinter II +*document-formats-supported: {POSTSCRIPT 2} +*input-trays-supported: +*medium-source-sizes-supported: \ { '' {na-letter FALSE {6.35 209.55 6.35 273.05}} \ {na-legal FALSE {6.35 209.55 6.35 349.25}} \ {iso-a4 FALSE {6.35 203.65 6.35 290.65}}} +*plexes-supported: simplex +*printer-model: "SunPics SPARCprinter II" +*printer-resolutions-supported: 300 +*xp-ddx-identifier: XP-POSTSCRIPT +*xp-listfonts-modes-supported: xp-list-internal-printer-fonts xp-list-glyph-fonts +*xp-embedded-formats-supported: {POSTSCRIPT 2} +*xp-raw-formats-supported: {POSTSCRIPT 2} +*xp-setup-proviso: setup-optional +# EOF. diff --git a/XpConfig/en_US/print/attributes/document b/XpConfig/en_US/print/attributes/document new file mode 100644 index 000000000..253c46bce --- /dev/null +++ b/XpConfig/en_US/print/attributes/document @@ -0,0 +1,13 @@ +# $Xorg: document,v 1.2 2002/11/30 22:10:03 gisburn Exp $ +# Document DPA-Object initial attribute values for en_US(-like) locales +# +# Note that the defaults (for all locales) are set in +# ${XPCONFIGDIR}/C/print/attributes/document +# Values in ${XPCONFIGDIR}/${LANG}/print/attributes/document are used to +# set/override these defaults for a specific locale on demand + +# US and some other countries use US-Letter as default paper size +# ("C"-locale default is "ISO-A4") +*default-medium: na-letter + +# EOF. diff --git a/Xprint/AttrValid.c b/Xprint/AttrValid.c index a3046c159..86bfd14e5 100644 --- a/Xprint/AttrValid.c +++ b/Xprint/AttrValid.c @@ -30,8 +30,6 @@ not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from said copyright holders. */ -/* $XFree86: xc/programs/Xserver/Xprint/AttrValid.c,v 1.4 2001/01/17 22:36:27 dawes Exp $ */ - #include #include "attributes.h" @@ -46,7 +44,7 @@ static XpOidMediumDiscreteSizeList DefaultMediumSizeList = { &DefaultMediumSize, 1 }; static XpOidMediumSourceSize DefaultMediumSourceSize = { - xpoid_unspecified, XpOidMediumSS_DISCRETE, { &DefaultMediumSizeList } + xpoid_unspecified, XpOidMediumSS_DISCRETE, &DefaultMediumSizeList }; static XpOidMediumSS DefaultMediumSS = { &DefaultMediumSourceSize, 1 @@ -298,7 +296,7 @@ XpPutMediumSSAttr(XpContextPtr pContext, } const XpOidMediumSS* -XpGetDefaultMediumSS(void) +XpGetDefaultMediumSS() { return &DefaultMediumSS; } diff --git a/Xprint/AttrValid.h b/Xprint/AttrValid.h index 8e431c285..8e27ae01a 100644 --- a/Xprint/AttrValid.h +++ b/Xprint/AttrValid.h @@ -30,7 +30,6 @@ not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from said copyright holders. */ -/* $XFree86: xc/programs/Xserver/Xprint/AttrValid.h,v 1.6 2001/10/31 22:50:27 tsi Exp $ */ #ifndef _Xp_AttrValid_h #define _Xp_AttrValid_h @@ -85,7 +84,7 @@ typedef struct #define XpPutStringAttr(pContext, pool, oid, value) \ XpPutOneAttribute(pContext, pool, XpOidString(oid), value) -#ifdef _XP_PRINT_SERVER_ /* needed for XpContextPtr in Printstr.h */ +#ifdef _XP_PRINT_SERVER_ /* needed for XpContextPtr in Printstr.h */ /* * XpOid-valued attribute access @@ -179,7 +178,7 @@ void XpPutMediumSSAttr(XpContextPtr pContext, XPAttributes pool, XpOid oid, const XpOidMediumSS* msss); -const XpOidMediumSS* XpGetDefaultMediumSS(void); +const XpOidMediumSS* XpGetDefaultMediumSS(); /* * XpOidTrayMediumList-valued attribute access @@ -193,15 +192,12 @@ void XpPutTrayMediumListAttr(XpContextPtr pContext, XPAttributes pool, XpOid oid, const XpOidTrayMediumList* tm); -BOOL XpOidTrayMediumListHasTray(const XpOidTrayMediumList* list, XpOid tray); - /* * Attribute pool validation */ void XpValidateAttributePool(XpContextPtr pContext, XPAttributes pool, const XpValidatePoolsRec* vpr); -void XpValidateNotificationProfile(XpContextPtr pContext); void XpValidatePrinterPool(XpContextPtr pContext, const XpValidatePoolsRec* vpr); void XpValidateJobPool(XpContextPtr pContext, @@ -210,9 +206,6 @@ void XpValidateDocumentPool(XpContextPtr pContext, const XpValidatePoolsRec* vpr); void XpValidatePagePool(XpContextPtr pContext, const XpValidatePoolsRec* vpr); -void XpValidatePrinterMediaAttrs(XpContextPtr pContext, - const XpOidList* valid_trays, - const XpOidList* valid_sizes); #endif /* _XP_PRINT_SERVER_ */ diff --git a/Xprint/DiPrint.h b/Xprint/DiPrint.h index d6364af26..0b781f2fc 100644 --- a/Xprint/DiPrint.h +++ b/Xprint/DiPrint.h @@ -30,8 +30,6 @@ not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from said copyright holders. */ -/* $XFree86: xc/programs/Xserver/Xprint/DiPrint.h,v 1.3 1999/12/16 02:26:24 robin Exp $ */ - /* * The XpDiListEntry struct is the type of each element of the array * handed back to the extension code to handle a GetPrinterList request. diff --git a/Xprint/Init.c b/Xprint/Init.c index 0deafda7c..d773ccf62 100644 --- a/Xprint/Init.c +++ b/Xprint/Init.c @@ -50,7 +50,6 @@ copyright holders. ** ********************************************************* ** ********************************************************************/ -/* $XFree86: xc/programs/Xserver/Xprint/Init.c,v 1.14tsi Exp $ */ #include #include @@ -91,6 +90,7 @@ typedef char *XPointer; #include "attributes.h" #include "os.h" +#include "spooler.h" static void GenericScreenInit( int index, @@ -116,57 +116,6 @@ static Bool InitPrintDrivers( #define MODELDIRNAME "/models" #define FONTDIRNAME "/fonts" -/* - * The string LIST_QUEUES is fed to a shell to generate an ordered - * list of available printers on the system. These string definitions - * are taken from the file PrintSubSys.C within the code for the - * dtprintinfo program. - */ -#ifdef AIXV4 -const char *LIST_QUEUES = "lsallq | grep -v '^bsh$' | sort"; -#else -#ifdef hpux -const char *LIST_QUEUES = "LANG=C lpstat -v | " - "awk '" - " $2 == \"for\" " - " { " - " x = match($3, /:/); " - " print substr($3, 1, x-1)" - " }' | sort"; -#else -#ifdef __osf__ - const char *LIST_QUEUES = "LANG=C lpstat -v | " - "nawk '" - " $2 == \"for\" " - " { print $4 }' " - " | sort"; -#else -#ifdef __uxp__ -const char *LIST_QUEUES = "LANG=C lpstat -v | " - "nawk '" - " $4 == \"for\" " - " { " - " x = match($5, /:/); " - " print substr($5, 1, x-1)" - " }' | sort"; -#else -#if defined(CSRG_BASED) || defined(linux) || defined(ISC) || defined(__GNUC__) -const char *LIST_QUEUES = "LANG=C lpc status | grep -v '^\t' | " - "sed -e /:/s/// | sort"; -#else -const char *LIST_QUEUES = "LANG=C lpstat -v | " - "nawk '" - " $2 == \"for\" " - " { " - " x = match($3, /:/); " - " print substr($3, 1, x-1)" - " }' | sort"; -#endif -#endif -#endif -#endif -#endif - #ifdef XPRASTERDDX static @@ -183,9 +132,9 @@ PixmapFormatRec RasterPixmapFormats[] = { static PixmapFormatRec ColorPclPixmapFormats[] = { - { 1, 1, BITMAP_SCANLINE_PAD }, - { 8, 8, BITMAP_SCANLINE_PAD }, - { 24,32, BITMAP_SCANLINE_PAD } + { 1, 1, BITMAP_SCANLINE_PAD }, + { 8, 8, BITMAP_SCANLINE_PAD }, + { 24, 32, BITMAP_SCANLINE_PAD } }; #define NUMCPCLFORMATS (sizeof ColorPclPixmapFormats)/(sizeof ColorPclPixmapFormats[0]) @@ -211,9 +160,9 @@ PixmapFormatRec MonoPclPixmapFormats[] = { static PixmapFormatRec PSPixmapFormats[] = { - { 1, 1, BITMAP_SCANLINE_PAD }, - { 8, 8, BITMAP_SCANLINE_PAD }, - { 24,32, BITMAP_SCANLINE_PAD } + { 1, 1, BITMAP_SCANLINE_PAD }, + { 8, 8, BITMAP_SCANLINE_PAD }, + { 24, 32, BITMAP_SCANLINE_PAD } }; #define NUMPSFORMATS (sizeof PSPixmapFormats)/(sizeof PSPixmapFormats[0]) @@ -325,10 +274,64 @@ typedef struct _driverMapping { int screenNum; } DriverMapEntry, *DriverMapPtr; +static const char configFilePath[] = +"/etc/dt/config/print:/usr/dt/config/print"; + +static const char printServerConfigDir[] = "XPSERVERCONFIGDIR"; + +static int printScreenPrivIndex, + printWindowPrivIndex, + printGCPrivIndex; +static unsigned long printGeneration = 0; static char *configFileName = (char *)NULL; static Bool freeDefaultFontPath = FALSE; static char *origFontPath = (char *)NULL; +static Bool xprintInitGlobalsCalled = FALSE; +/* + * This function is responsible for doing initalisation of any global + * variables at an very early point of server startup (even before + * |ProcessCommandLine()|. + */ +void XprintInitGlobals(void) +{ + xprintInitGlobalsCalled = TRUE; + +#ifdef SMART_SCHEDULE + /* Somehow the XF86 "smart scheduler" completely kills the Xprint DDX + * (see http://xprint.freedesktop.org/cgi-bin/bugzilla/show_bug.cgi?id=467 + * ("Xfree86's "smart scheduler" breaks Xprt") */ + SmartScheduleDisable = TRUE; +#endif /* SMART_SCHEDULE */ +} + +/* + * XprintUseMsg() prints usage for the Xprint-specific options + */ +void XprintUseMsg() +{ + XpSpoolerTypePtr curr = xpstm; + + /* Option '-XpFile' */ + ErrorF("-XpFile file specifies an alternate `Xprinters' file, rather\n"); + ErrorF(" than the default one (e.g.\n"); + ErrorF(" `${XPCONFIGDIR}/${LANG}/print/Xprinters') or\n"); + ErrorF(" `${XPCONFIGDIR}/C/print/Xprinters'.\n"); + + /* Option '-XpSpoolerType' */ + ErrorF("-XpSpoolerType string specifies a spooler type.\n"); + ErrorF(" Supported values are:\n"); + + while( curr->name != NULL ) + { + ErrorF(" - '%s'\n", curr->name); + curr++; + } + ErrorF(" (multiple values can be specified, seperated by ':',\n"); + ErrorF(" the first active spooler will be chosen).\n"); + ErrorF(" default is '%s'.\n", XPDEFAULTSPOOLERNAMELIST); +} + /* * XprintOptions checks argv[i] to see if it is our command line * option specifying a configuration file name. It returns the index @@ -340,6 +343,7 @@ XprintOptions( char **argv, int i) { + extern void ddxUseMsg(); if(strcmp(argv[i], "-XpFile") == 0) { if ((i + 1) >= argc) { @@ -349,8 +353,19 @@ XprintOptions( configFileName = argv[i + 1]; return i + 2; } + else if(strcmp(argv[i], "-XpSpoolerType") == 0) + { + if ((i + 1) >= argc) { + ddxUseMsg (); + return i + 2; + } + XpSetSpoolerTypeNameList(argv[i + 1]); + return i + 2; + } else + { return i; + } } /************************************************************ @@ -417,7 +432,7 @@ FreePrinterDb(void) { PrinterDbPtr pCurEntry, pNextEntry; - for(pCurEntry = printerDb, pNextEntry = 0; + for(pCurEntry = printerDb, pNextEntry = (PrinterDbPtr)NULL; pCurEntry != (PrinterDbPtr)NULL; pCurEntry = pNextEntry) { pNextEntry = pCurEntry->next; @@ -429,7 +444,7 @@ FreePrinterDb(void) */ xfree(pCurEntry); } - printerDb = 0; + printerDb = (PrinterDbPtr)NULL; } /* @@ -460,11 +475,12 @@ AddPrinterDbName(char *name) return TRUE; } -static void +static int AugmentPrinterDb(const char *command) { FILE *fp; char name[256]; + int num_printers = 0; /* Number of printers we found */ fp = popen(command, "r"); /* XXX is a 256 character limit overly restrictive for printer names? */ @@ -472,8 +488,10 @@ AugmentPrinterDb(const char *command) { name[strlen(name) - 1] = (char)'\0'; /* strip the \n */ AddPrinterDbName(name); + num_printers++; } pclose(fp); + return num_printers; } /* @@ -592,7 +610,7 @@ StoreDriverNames(void) "xp-ddx-identifier"); if(pEntry->driverName == (char *)NULL || strlen(pEntry->driverName) == 0 || - GetInitFunc(pEntry->driverName) == 0) + GetInitFunc(pEntry->driverName) == (Bool(*)())NULL) { if (pEntry->driverName && (strlen(pEntry->driverName) != 0)) { ErrorF("Xp Extension: Can't load driver %s\n", @@ -650,7 +668,7 @@ GetConfigFileName(void) /* * Check for a LANG-specific file. */ - if ((dirName = XpGetConfigDir(TRUE)) != 0) + if(dirName = XpGetConfigDir(TRUE)) { filePath = (char *)xalloc(strlen(dirName) + strlen(XPRINTERSFILENAME) + 2); @@ -669,7 +687,7 @@ GetConfigFileName(void) xfree(filePath); } - if ((dirName = XpGetConfigDir(FALSE)) != 0) + if(dirName = XpGetConfigDir(FALSE)) { filePath = (char *)xalloc(strlen(dirName) + strlen(XPRINTERSFILENAME) + 2); @@ -701,6 +719,7 @@ GetConfigFileName(void) static PrinterDbPtr BuildPrinterDb(void) { + char *printerList, *augmentCmd = (char *)NULL; Bool defaultAugment = TRUE, freeConfigFileName; if(configFileName && access(configFileName, R_OK) != 0) @@ -727,7 +746,7 @@ BuildPrinterDb(void) { while((tok = strtok((char *)NULL, " \t")) != (char *)NULL) { - if ((ptr = MbStrchr(tok, '\012')) != 0) + if(ptr = MbStrchr(tok, '\012')) *ptr = (char)'\0'; AddPrinterDbName(tok); } @@ -768,7 +787,43 @@ BuildPrinterDb(void) if(defaultAugment == TRUE) { - AugmentPrinterDb(LIST_QUEUES); + XpSpoolerTypePtr curr_spooler_type; /* spooler we are currently probing for queues */ + int num_printers_found; /* number of printers found by |AugmentPrinterDb()| */ + char *tok_lasts; /* strtok_r() position token */ + char *spnamelist; /* list of spooler names, seperated by ":" */ + char *spname; /* spooler name */ + + spnamelist = strdup(XpGetSpoolerTypeNameList()); /* strtok_r() modifies string so dup' it first */ + + for( spname = strtok_r(spnamelist, ":", &tok_lasts) ; + spname != NULL ; + spname = strtok_r(NULL, ":", &tok_lasts) ) + { + curr_spooler_type = XpSpoolerNameToXpSpoolerType(spname); + if(!curr_spooler_type) + { + FatalError("BuildPrinterDb: No spooler type entry found for '%s'.\n", spname); + } + + if(curr_spooler_type->list_queues_command == NULL || + strlen(curr_spooler_type->list_queues_command) == 0) + { + continue; + } + + num_printers_found = AugmentPrinterDb(curr_spooler_type->list_queues_command); + /* Did we found a spooler which works ? */ + if(num_printers_found > 0) + { + spooler_type = curr_spooler_type; +#ifdef DEBUG_gisburn + fprintf(stderr, "BuildPrinterDb: using '%s'.\n", spooler_type->name); +#endif /* DEBUG_gisburn */ + break; + } + } + + free(spnamelist); } MergeNameMap(); @@ -951,7 +1006,7 @@ FindFontDir( return (char *)NULL; configDir = XpGetConfigDir(TRUE); - if ((fontDir = ValidateFontDir(configDir, modelName)) != 0) + if(fontDir = ValidateFontDir(configDir, modelName)) { xfree(configDir); return fontDir; @@ -1013,8 +1068,8 @@ AddToFontPath( static void AugmentFontPath(void) { - char *modelID, **allIDs = (char **)NULL; - PrinterDbPtr pDbEntry; + char *newPath, *modelID, **allIDs = (char **)NULL; + PrinterDbPtr pDb, pDbEntry; int numModels, i; if(!origFontPath) @@ -1072,7 +1127,7 @@ AugmentFontPath(void) for(i = 0; allIDs != (char **)NULL && allIDs[i] != (char *)NULL; i ++) { char *fontDir; - if ((fontDir = FindFontDir(allIDs[i])) != 0) + if(fontDir = FindFontDir(allIDs[i])) { AddToFontPath(fontDir); xfree(fontDir); @@ -1162,7 +1217,7 @@ XpClientIsPrintClient( * fpe->name. */ if(fpe->name_length < PATH_PREFIX_LEN || - (strlen(fontDir) != (unsigned)(fpe->name_length - PATH_PREFIX_LEN)) || + (strlen(fontDir) != (fpe->name_length - PATH_PREFIX_LEN)) || strncmp(fontDir, fpe->name + PATH_PREFIX_LEN, fpe->name_length - PATH_PREFIX_LEN)) { @@ -1235,6 +1290,18 @@ PrinterInitOutput( char **driverNames; char *configDir; + /* This should NEVER happen, but... */ + if( !xprintInitGlobalsCalled ) + { + FatalError("Internal error: XprintInitGlobals() not called."); + } +#ifdef SMART_SCHEDULE + if( SmartScheduleDisable != TRUE ) + { + FatalError("Internal error: XF86 smart scheduler incompatible to Xprint DDX."); + } +#endif /* SMART_SCHEDULE */ + /* * this little test is just a warning at startup to make sure * that the config directory exists. @@ -1254,10 +1321,9 @@ PrinterInitOutput( xfree(configDir); } else { - ErrorF("Xp Extension: could not find config dir %s\n", - configDir ? configDir : XPRINTDIR); - - if (configDir) xfree(configDir); + /* Refuse to start when we do not have our config dir... */ + FatalError("Xp Extension: could not find config dir %s\n", + configDir ? configDir : XPRINTDIR); } if(printerDb != (PrinterDbPtr)NULL) @@ -1414,7 +1480,7 @@ InitPrintDrivers( } if(callInit == TRUE) { - pBFunc initFunc; + Bool (*initFunc)(); initFunc = GetInitFunc(pDb->driverName); if(initFunc(index, pScreen, argc, argv) == FALSE) { @@ -1451,9 +1517,10 @@ GenericScreenInit( int argc, char **argv) { + int i; float fWidth, fHeight, maxWidth, maxHeight; unsigned short width, height; - PrinterDbPtr pDb; + PrinterDbPtr pDb, pDb2; int res, maxRes; /* @@ -1477,6 +1544,7 @@ GenericScreenInit( { if(pDb->screenNum == index) { + XpValidatePoolsRec *pValRec; pVFunc dimensionsFunc; @@ -1505,6 +1573,57 @@ GenericScreenInit( (unsigned short)(maxHeight + 0.5); } +/* + * QualifyName - takes an unqualified file name such as X6printers and + * a colon-separated list of directory path names such as + * /etc/opt/dt:/opt/dt/config. + * + * Returns a fully qualified file path name such as /etc/opt/dt/X6printers. + * The returned value is malloc'd, and the caller is responsible for + * freeing the associated memory. + */ +static char * +QualifyName(fileName, searchPath) + char *fileName; + char *searchPath; +{ + char * curPath = searchPath; + char * nextPath; + char * chance; + FILE *pFile; + + if (fileName == NULL || searchPath == NULL) + return NULL; + + while (1) { + if ((nextPath = strchr(curPath, ':')) != NULL) + *nextPath = 0; + + chance = (char *)xalloc(strlen(curPath) + strlen(fileName) + 2); + sprintf(chance,"%s/%s",curPath,fileName); + + /* see if we can read from the file */ + if((pFile = fopen(chance, "r")) != (FILE *)NULL) + { + fclose(pFile); + /* ... restore the colon, .... */ + if (nextPath) + *nextPath = ':'; + + return chance; + } + + xfree(chance); + + if (nextPath == NULL) /* End of path list? */ + break; + + /* try the next path */ + curPath = nextPath + 1; + } + return NULL; +} + /* * FillPrinterListEntry fills in a single XpDiListEntry element with data * derived from the supplied PrinterDbPtr element. @@ -1548,12 +1667,11 @@ GetPrinterListInfo( int localeLen, char *locale) { - PrinterDbPtr pDb; + PrinterDbPtr pDb, pDb2; for(pDb = printerDb; pDb != (PrinterDbPtr)NULL; pDb = pDb->next) { - if (strlen(pDb->name) == (unsigned)nameLen - && !strncmp(pDb->name, name, nameLen)) + if(strlen(pDb->name) == nameLen && !strncmp(pDb->name, name, nameLen)) { FillPrinterListEntry(pEntry, pDb, localeLen, locale); return TRUE; @@ -1598,7 +1716,7 @@ XpDiGetPrinterList( if(!nameLen || name == (char *)NULL) { int i; - PrinterDbPtr pDb; + PrinterDbPtr pDb, pDb2; for(pDb = printerDb, i = 0; pDb != (PrinterDbPtr)NULL; pDb = pDb->next, i++) @@ -1648,11 +1766,12 @@ WindowPtr XpDiValidatePrinter(char *printerName, int printerNameLen) { PrinterDbPtr pCurEntry; + WindowPtr pWin; for(pCurEntry = printerDb; pCurEntry != (PrinterDbPtr)NULL; pCurEntry = pCurEntry->next) { - if(strlen(pCurEntry->name) == (unsigned)printerNameLen && + if(strlen(pCurEntry->name) == printerNameLen && !strncmp(pCurEntry->name, printerName, printerNameLen)) return WindowTable[pCurEntry->screenNum]; } @@ -1680,3 +1799,4 @@ XpDiGetDriverName(int index, char *printerName) return (char *)NULL; /* XXX Should we supply a default driverName? */ } + diff --git a/Xprint/Oid.c b/Xprint/Oid.c index 311d177d0..32be3efb1 100644 --- a/Xprint/Oid.c +++ b/Xprint/Oid.c @@ -30,7 +30,6 @@ not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from said copyright holders. */ -/* $XFree86: xc/programs/Xserver/Xprint/Oid.c,v 1.5tsi Exp $ */ #include "attributes.h" @@ -274,7 +273,7 @@ XpOidParse(const char* value_string, */ if(ptr_return != (const char**)NULL) *ptr_return = ptr+length; - return (XpOid)i; + return i; } /* @@ -751,7 +750,7 @@ XpOidLinkedListFirstOid(XpOidLinkedList* me) XpOid XpOidLinkedListNextOid(XpOidLinkedList* me) { - if(me->current ? (me->current = me->current->next) != 0 : xFalse) + if(me->current ? me->current = me->current->next : xFalse) return me->current->oid; else return xpoid_none; @@ -1652,6 +1651,8 @@ TrayMediumListValidate(XpOidTrayMediumList* me, const XpOidMediumSS* msss) { int i_mss, i_ds, i_itm; + XpOidMediumDiscreteSizeList* ds_list; + int tray_count; XpOid current_tray, current_medium; XpOidMediumDiscreteSizeList* unspecified_tray_ds; XpOidMediumDiscreteSizeList* tray_ds; @@ -1711,7 +1712,6 @@ TrayMediumListValidate(XpOidTrayMediumList* me, * list */ if(tray_ds == (XpOidMediumDiscreteSizeList*)NULL) - { if(unspecified_tray_ds == (XpOidMediumDiscreteSizeList*)NULL) { /* @@ -1722,10 +1722,7 @@ TrayMediumListValidate(XpOidTrayMediumList* me, continue; } else - { tray_ds = unspecified_tray_ds; - } - } /* * loop through the discrete sizes list, looking for a size that * matches the medium for the current input tray @@ -2107,13 +2104,15 @@ const char* XpOidNotifyString(XpOidNotify notify) { switch(notify) { - default: case XPOID_NOTIFY_UNSUPPORTED: return (const char*)NULL; + break; case XPOID_NOTIFY_NONE: return NOTIFY_NONE_STR; + break; case XPOID_NOTIFY_EMAIL: return NOTIFY_EMAIL_STR; + break; } } @@ -2238,7 +2237,7 @@ XpOidDocFmtNext(XpOidDocFmt* doc_fmt, const char* first_nonws_ptr; const char* format; const char* variant; - const char* version = 0; + const char* version; int format_len; int variant_len; int version_len; @@ -2551,12 +2550,10 @@ XpOidDocFmtListHasFmt(const XpOidDocFmtList* list, * variants must both be NULL or match */ if(fmt->variant == (char*)NULL) - { if(list->list[i].variant == (char*)NULL) return xTrue; else continue; - } if(list->list[i].variant == (char*)NULL) continue; if(strcmp(fmt->variant, list->list[i].variant) != 0) @@ -2565,12 +2562,10 @@ XpOidDocFmtListHasFmt(const XpOidDocFmtList* list, * versions must both be NULL or match */ if(fmt->version == (char*)NULL) - { if(list->list[i].version == (char*)NULL) return xTrue; else continue; - } if(list->list[i].version == (char*)NULL) continue; if(strcmp(fmt->version, list->list[i].version) == 0) diff --git a/Xprint/Oid.h b/Xprint/Oid.h index e2a97869f..70bd8d3e5 100644 --- a/Xprint/Oid.h +++ b/Xprint/Oid.h @@ -30,7 +30,6 @@ not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from said copyright holders. */ -/* $XFree86: xc/programs/Xserver/Xprint/Oid.h,v 1.3 1999/12/16 02:26:24 robin Exp $ */ #ifndef _Xp_Oid_h #define _Xp_Oid_h @@ -206,7 +205,7 @@ char* XpOidListString(const XpOidList*); /* * XpOidLinkedList public methods */ -XpOidLinkedList* XpOidLinkedListNew(void); +XpOidLinkedList* XpOidLinkedListNew(); void XpOidLinkedListDelete(XpOidLinkedList*); #define XpOidLinkedListCount(l) ((l) ? (l)->count : 0) XpOid XpOidLinkedListGetOid(XpOidLinkedList* list, int i); diff --git a/Xprint/OidDefs.h b/Xprint/OidDefs.h index 03e530cb2..55b6568f0 100644 --- a/Xprint/OidDefs.h +++ b/Xprint/OidDefs.h @@ -133,6 +133,14 @@ typedef enum { xpoid_val_medium_size_jis_b8, xpoid_val_medium_size_jis_b9, xpoid_val_medium_size_jis_b10, + xpoid_val_medium_size_hp_2x_postcard, + xpoid_val_medium_size_hp_european_edp, + xpoid_val_medium_size_hp_mini, + xpoid_val_medium_size_hp_postcard, + xpoid_val_medium_size_hp_tabloid, + xpoid_val_medium_size_hp_us_edp, + xpoid_val_medium_size_hp_us_government_legal, + xpoid_val_medium_size_hp_us_government_letter, xpoid_val_plex_simplex, xpoid_val_plex_duplex, xpoid_val_plex_tumble, diff --git a/Xprint/OidStrs.h b/Xprint/OidStrs.h index 6489ae533..1792a6e16 100644 --- a/Xprint/OidStrs.h +++ b/Xprint/OidStrs.h @@ -30,140 +30,144 @@ not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from said copyright holders. */ -/* $XFree86: xc/programs/Xserver/Xprint/OidStrs.h,v 1.4 2001/01/17 22:36:28 dawes Exp $ */ +/* This is an automatically-generated file. Do not edit. */ static int XpOidStringMapCount = 127; -#define OIDATA(name) { name, sizeof(name)-1, 0, 0, 0 } - static const XpOidStringMapEntry XpOidStringMap[] = { - OIDATA(""), - OIDATA(""), - OIDATA("descriptor"), - OIDATA("content-orientation"), - OIDATA("copy-count"), - OIDATA("default-printer-resolution"), - OIDATA("default-input-tray"), - OIDATA("default-medium"), - OIDATA("document-format"), - OIDATA("plex"), - OIDATA("xp-listfonts-modes"), - OIDATA("job-name"), - OIDATA("job-owner"), - OIDATA("notification-profile"), - OIDATA("xp-setup-state"), - OIDATA("xp-spooler-command-options"), - OIDATA("content-orientations-supported"), - OIDATA("document-formats-supported"), - OIDATA("dt-pdm-command"), - OIDATA("input-trays-medium"), - OIDATA("medium-source-sizes-supported"), - OIDATA("plexes-supported"), - OIDATA("printer-model"), - OIDATA("printer-name"), - OIDATA("printer-resolutions-supported"), - OIDATA("xp-embedded-formats-supported"), - OIDATA("xp-listfonts-modes-supported"), - OIDATA("xp-page-attributes-supported"), - OIDATA("xp-raw-formats-supported"), - OIDATA("xp-setup-proviso"), - OIDATA("document-attributes-supported"), - OIDATA("job-attributes-supported"), - OIDATA("locale"), - OIDATA("multiple-documents-supported"), - OIDATA("available-compression"), - OIDATA("available-compressions-supported"), - OIDATA("portrait"), - OIDATA("landscape"), - OIDATA("reverse-portrait"), - OIDATA("reverse-landscape"), - OIDATA("iso-a0"), - OIDATA("iso-a1"), - OIDATA("iso-a2"), - OIDATA("iso-a3"), - OIDATA("iso-a4"), - OIDATA("iso-a5"), - OIDATA("iso-a6"), - OIDATA("iso-a7"), - OIDATA("iso-a8"), - OIDATA("iso-a9"), - OIDATA("iso-a10"), - OIDATA("iso-b0"), - OIDATA("iso-b1"), - OIDATA("iso-b2"), - OIDATA("iso-b3"), - OIDATA("iso-b4"), - OIDATA("iso-b5"), - OIDATA("iso-b6"), - OIDATA("iso-b7"), - OIDATA("iso-b8"), - OIDATA("iso-b9"), - OIDATA("iso-b10"), - OIDATA("na-letter"), - OIDATA("na-legal"), - OIDATA("executive"), - OIDATA("folio"), - OIDATA("invoice"), - OIDATA("ledger"), - OIDATA("quarto"), - OIDATA("iso-c3"), - OIDATA("iso-c4"), - OIDATA("iso-c5"), - OIDATA("iso-c6"), - OIDATA("iso-designated-long"), - OIDATA("na-10x13-envelope"), - OIDATA("na-9x12-envelope"), - OIDATA("na-number-10-envelope"), - OIDATA("na-7x9-envelope"), - OIDATA("na-9x11-envelope"), - OIDATA("na-10x14-envelope"), - OIDATA("na-number-9-envelope"), - OIDATA("na-6x9-envelope"), - OIDATA("na-10x15-envelope"), - OIDATA("monarch-envelope"), - OIDATA("a"), - OIDATA("b"), - OIDATA("c"), - OIDATA("d"), - OIDATA("e"), - OIDATA("jis-b0"), - OIDATA("jis-b1"), - OIDATA("jis-b2"), - OIDATA("jis-b3"), - OIDATA("jis-b4"), - OIDATA("jis-b5"), - OIDATA("jis-b6"), - OIDATA("jis-b7"), - OIDATA("jis-b8"), - OIDATA("jis-b9"), - OIDATA("jis-b10"), - OIDATA("simplex"), - OIDATA("duplex"), - OIDATA("tumble"), - OIDATA("top"), - OIDATA("middle"), - OIDATA("bottom"), - OIDATA("envelope"), - OIDATA("manual"), - OIDATA("large-capacity"), - OIDATA("main"), - OIDATA("side"), - OIDATA("event-report-job-completed"), - OIDATA("electronic-mail"), - OIDATA("xp-setup-mandatory"), - OIDATA("xp-setup-optional"), - OIDATA("xp-setup-ok"), - OIDATA("xp-setup-incomplete"), - OIDATA("xp-list-glyph-fonts"), - OIDATA("xp-list-internal-printer-fonts"), - OIDATA("0"), - OIDATA("01"), - OIDATA("02"), - OIDATA("03"), - OIDATA("012"), - OIDATA("013"), - OIDATA("023"), - OIDATA("0123") + { "", 0 }, + { "", 0 }, + { "descriptor", 10 }, + { "content-orientation", 19 }, + { "copy-count", 10 }, + { "default-printer-resolution", 26 }, + { "default-input-tray", 18 }, + { "default-medium", 14 }, + { "document-format", 15 }, + { "plex", 4 }, + { "xp-listfonts-modes", 18 }, + { "job-name", 8 }, + { "job-owner", 9 }, + { "notification-profile", 20 }, + { "xp-setup-state", 14 }, + { "xp-spooler-command-options", 26 }, + { "content-orientations-supported", 30 }, + { "document-formats-supported", 26 }, + { "dt-pdm-command", 14 }, + { "input-trays-medium", 18 }, + { "medium-source-sizes-supported", 29 }, + { "plexes-supported", 16 }, + { "printer-model", 13 }, + { "printer-name", 12 }, + { "printer-resolutions-supported", 29 }, + { "xp-embedded-formats-supported", 29 }, + { "xp-listfonts-modes-supported", 28 }, + { "xp-page-attributes-supported", 28 }, + { "xp-raw-formats-supported", 24 }, + { "xp-setup-proviso", 16 }, + { "document-attributes-supported", 29 }, + { "job-attributes-supported", 24 }, + { "locale", 6 }, + { "multiple-documents-supported", 28 }, + { "available-compression", 21 }, + { "available-compressions-supported", 32 }, + { "portrait", 8 }, + { "landscape", 9 }, + { "reverse-portrait", 16 }, + { "reverse-landscape", 17 }, + { "iso-a0", 6 }, + { "iso-a1", 6 }, + { "iso-a2", 6 }, + { "iso-a3", 6 }, + { "iso-a4", 6 }, + { "iso-a5", 6 }, + { "iso-a6", 6 }, + { "iso-a7", 6 }, + { "iso-a8", 6 }, + { "iso-a9", 6 }, + { "iso-a10", 7 }, + { "iso-b0", 6 }, + { "iso-b1", 6 }, + { "iso-b2", 6 }, + { "iso-b3", 6 }, + { "iso-b4", 6 }, + { "iso-b5", 6 }, + { "iso-b6", 6 }, + { "iso-b7", 6 }, + { "iso-b8", 6 }, + { "iso-b9", 6 }, + { "iso-b10", 7 }, + { "na-letter", 9 }, + { "na-legal", 8 }, + { "executive", 9 }, + { "folio", 5 }, + { "invoice", 7 }, + { "ledger", 6 }, + { "quarto", 6 }, + { "iso-c3", 6 }, + { "iso-c4", 6 }, + { "iso-c5", 6 }, + { "iso-c6", 6 }, + { "iso-designated-long", 19 }, + { "na-10x13-envelope", 17 }, + { "na-9x12-envelope", 16 }, + { "na-number-10-envelope", 21 }, + { "na-7x9-envelope", 15 }, + { "na-9x11-envelope", 16 }, + { "na-10x14-envelope", 17 }, + { "na-number-9-envelope", 20 }, + { "na-6x9-envelope", 15 }, + { "na-10x15-envelope", 17 }, + { "monarch-envelope", 16 }, + { "a", 1 }, + { "b", 1 }, + { "c", 1 }, + { "d", 1 }, + { "e", 1 }, + { "jis-b0", 6 }, + { "jis-b1", 6 }, + { "jis-b2", 6 }, + { "jis-b3", 6 }, + { "jis-b4", 6 }, + { "jis-b5", 6 }, + { "jis-b6", 6 }, + { "jis-b7", 6 }, + { "jis-b8", 6 }, + { "jis-b9", 6 }, + { "jis-b10", 7 }, + { "hp-2x-postcard", 14 }, + { "hp-european-edp", 15 }, + { "hp-mini", 7 }, + { "hp-postcard", 11 }, + { "hp-tabloid", 10 }, + { "hp-us-edp", 9 }, + { "hp-us-government-legal", 22 }, + { "hp-us-government-letter", 23 }, + { "simplex", 7 }, + { "duplex", 6 }, + { "tumble", 6 }, + { "top", 3 }, + { "middle", 6 }, + { "bottom", 6 }, + { "envelope", 8 }, + { "manual", 6 }, + { "large-capacity", 14 }, + { "main", 4 }, + { "side", 4 }, + { "event-report-job-completed", 26 }, + { "electronic-mail", 15 }, + { "xp-setup-mandatory", 18 }, + { "xp-setup-optional", 17 }, + { "xp-setup-ok", 11 }, + { "xp-setup-incomplete", 19 }, + { "xp-list-glyph-fonts", 19 }, + { "xp-list-internal-printer-fonts", 30 }, + { "0", 1 }, + { "01", 2 }, + { "02", 2 }, + { "03", 2 }, + { "012", 3 }, + { "013", 3 }, + { "023", 3 }, + { "0123", 4 } }; - -#undef OIDATA diff --git a/Xprint/attributes.c b/Xprint/attributes.c index 5dfd90f8c..d02c54e37 100644 --- a/Xprint/attributes.c +++ b/Xprint/attributes.c @@ -1,4 +1,3 @@ -/* $XdotOrg: attributes.c,v 1.3 2000/08/17 19:48:07 cpqbld Exp $ */ /* $Xorg: attributes.c,v 1.3 2000/08/17 19:48:07 cpqbld Exp $ */ /* (c) Copyright 1996 Hewlett-Packard Company @@ -45,18 +44,15 @@ copyright holders. ** ********************************************************* ** ********************************************************************/ -/* $XFree86: xc/programs/Xserver/Xprint/attributes.c,v 1.20 2003/10/29 22:11:54 tsi Exp $ */ -#include +#include #include #include -#include #include #include #if (defined(sun) && defined(SVR4)) || (defined(SCO)) #include #endif - #include "scrnintstr.h" #include @@ -67,11 +63,13 @@ copyright holders. #include "Xresource.h" #include "Xrm.c" +#include "spooler.h" + static XrmDatabase CopyDb(XrmDatabase inDb); extern XrmDatabase XpSpoolerGetServerAttributes(void); -static unsigned long attrGeneration = 0; +static int attrGeneration = 0; typedef struct { XrmDatabase *pDb; @@ -137,6 +135,26 @@ static const char XPMODELDIR[] = "/models"; static char NULL_STRING[] = "\0"; +/* + * XpGetConfigDirBase returns a string containing the path name of the base + * where the print server configuration directory is localed. + */ +static +char *XpGetConfigDirBase() +{ + char **configDir; + + /* + * If the XPCONFIGDIR environment variable is not set, then use the + * compile-time constant XPRINTDIR. XPRINTDIR is passed in on the + * compile command line, and is defined in $(TOP)/config/cf/Project.tmpl. + */ + if((configDir = getenv("XPCONFIGDIR")) == (char *)NULL) + configDir = XPRINTDIR; + + return configDir; +} + /* * XpGetConfigDir returns a string containing the path name of the print * server configuration directory. If the useLocale parameter is False @@ -165,13 +183,7 @@ XpGetConfigDir(Bool useLocale) } } - /* - * If the XPCONFIGDIR environment variable is not set, then use the - * compile-time constant XPRINTDIR. XPRINTDIR is passed in on the - * compile command line, and is defined in $(TOP)/config/cf/Project.tmpl. - */ - if((configDir = getenv("XPCONFIGDIR")) == (char *)NULL) - configDir = XPRINTDIR; + configDir = XpGetConfigDirBase(); dirName = (char *)xalloc(strlen(configDir) + strlen(XPDIR) + strlen(langDir) + 1); @@ -307,7 +319,7 @@ BuildPrinterAttrs( if(systemAttributes.printers != (XrmDatabase)NULL) { - char *fileName; + char *dirName, *fileName; XrmDatabase modelDB = (XrmDatabase)NULL; XrmName xrm_name[5], xrm_class[2]; XrmRepresentation rep_type; @@ -607,6 +619,7 @@ XpGetOneAttribute( { ContextAttrPtr pCtxtAttrs; XrmDatabase db = (XrmDatabase)NULL; + char *retVal; XrmName xrm_name[3]; XrmRepresentation rep_type; XrmValue value; @@ -670,10 +683,10 @@ XpGetOneAttribute( */ void XpPutOneAttribute( - XpContextPtr pContext, - XPAttributes class, - const char* attributeName, - const char* value) + XpContextPtr pContext, + XPAttributes class, + const char* attributeName, + const char* value) { ContextAttrPtr pCtxtAttrs; XrmDatabase db; @@ -798,7 +811,7 @@ AppendEntry( char *s, c; if (*type != XrmQString) - return False; + return; for (firstNameSeen = False; *quarks; bindings++, quarks++) { if (*bindings == XrmBindLoosely) { @@ -857,6 +870,7 @@ XpGetAttributes( { ContextAttrPtr pCtxtAttrs; XrmDatabase db = (XrmDatabase)NULL; + char *retVal; StringDbStruct enumStruct; XrmQuark empty = NULLQUARK; @@ -1064,6 +1078,34 @@ XpSpoolerGetServerAttributes(void) return db; } +/* + * ExecuteCommand takes two pointers - the command to execute, + * and the "argv" style NULL-terminated vector of arguments for the command. + * We wait for the command to terminate before continuing to ensure that + * we don't delete the job file before the spooler has made a copy. + */ +static void +ExecCommand(pCommand, argVector) + char *pCommand; + char **argVector; +{ + pid_t childPid; + int status; + + if((childPid = fork()) == 0) + { + /* return BadAlloc? */ + if (execv(pCommand, argVector) == -1) { + FatalError("unable to exec '%s'", pCommand); + } + } + else + { + (void) waitpid(childPid, &status, 0); + } + return; +} + /* * SendFileToCommand takes three character pointers - the file name, * the command to execute, @@ -1120,7 +1162,9 @@ SendFileToCommand( */ if(userName) { - if(geteuid() == (uid_t)0) + uid_t myUid; + + if((myUid = geteuid()) == (uid_t)0) { struct passwd *pPasswd; @@ -1137,6 +1181,8 @@ SendFileToCommand( } else { + int res; + (void) close(pipefd[0]); outPipe = fdopen(pipefd[1], "w"); @@ -1156,6 +1202,7 @@ SendFileToCommand( * store for the supplied print context. The ReplaceAnyString utility * routine is used to perform the actual replacements. */ +extern char *ReplaceAnyString(char *, char *, char *); static char * ReplaceAllKeywords( @@ -1197,6 +1244,10 @@ ReplaceAllKeywords( else command = ReplaceAnyString(command, "%options%", ""); + /* New in xprint.mozdev.org release 007 - replace "%xpconfigdir%" with + * location of $XPCONFIGDIR */ + command = ReplaceAnyString(command, "%xpconfigdir%", XpGetConfigDirBase()); + return command; } @@ -1367,43 +1418,58 @@ VectorizeCommand( char ***pVector, XpContextPtr pContext) { - char *cmdName; + char *cmdName, *curTok; + int i, numChars; if(command == (char *)NULL) return (char *)NULL; - (void) GetToken(command, &cmdName); + numChars = GetToken(command, &cmdName); + + if(cmdName == (char *)NULL) + return (char *)NULL; + + /* Mangle the command name, too... */ + cmdName = ReplaceAllKeywords(pContext, cmdName); if(cmdName == (char *)NULL) return (char *)NULL; *pVector = BuildArgVector(command, pContext); - + return cmdName; } -#ifdef hpux -static char DEFAULT_SPOOL_COMMAND[] = "/usr/bin/lp -d %printer-name% -o raw -n %copy-count% -t %job-name% %options%"; -#else -static char DEFAULT_SPOOL_COMMAND[] = "/usr/bin/lp -d %printer-name% -n %copy-count% -t %job-name% %options%"; -#endif - int -XpSubmitJob( - char *fileName, - XpContextPtr pContext) +XpSubmitJob(fileName, pContext) + char *fileName; + XpContextPtr pContext; { - char **vector, *cmdNam, *command, *userName; + char **vector, *cmdNam, *cmdOpt, *command, *userName; int i; command = XpGetOneAttribute(pContext, XPPrinterAttr, "xp-spooler-command"); if(command == (char *)NULL || strlen(command) == 0) - command = strdup(DEFAULT_SPOOL_COMMAND); + { + if( spooler_type ) + { + command = strdup(spooler_type->spool_command); + } + else + { + ErrorF("XpSubmitJob: No default spool command defined.\n"); + } + } else + { command = strdup(command); + } if(command == (char *)NULL) + { + ErrorF("XpSubmitJob: No spooler command found, cannot submit job.\n"); return BadAlloc; - + } + cmdNam = VectorizeCommand(command, &vector, pContext); xfree(command); @@ -1431,7 +1497,6 @@ XpSubmitJob( FreeVector(vector); xfree(cmdNam); - return Success; } /* @@ -1504,6 +1569,7 @@ XpGetTrayMediumFromContext(XpContextPtr pCon, { char *defMedium, *defTray; char *t, *m; + char *pS, *pE, *pLast; defMedium = XpGetOneAttribute( pCon, XPPageAttr, "default-medium" ); diff --git a/Xprint/attributes.h b/Xprint/attributes.h index b43d76af5..c4e30d274 100644 --- a/Xprint/attributes.h +++ b/Xprint/attributes.h @@ -30,7 +30,6 @@ not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from said copyright holders. */ -/* $XFree86: xc/programs/Xserver/Xprint/attributes.h,v 1.5 2001/08/01 00:44:45 tsi Exp $ */ #ifndef _Xp_attributes_h #define _Xp_attributes_h 1 @@ -49,11 +48,11 @@ typedef void (*pVFunc)(VFuncArgs); */ void XpInitAttributes(XpContextPtr pContext); void XpBuildAttributeStore(char *printerName, - char *qualifierName); + char *qualifierName); void XpAddPrinterAttribute(char *printerName, - char *printerQualifier, - char *attributeName, - char *attributeValue); + char *printerQualifier, + char *attributeName, + char *attributeValue); void XpDestroyAttributes(XpContextPtr pContext); char *XpGetConfigDir(Bool useLocale); char *XpGetOneAttribute(XpContextPtr pContext, @@ -98,33 +97,33 @@ void XpGetMediumDimensions(XpContextPtr pContext, void XpGetReproductionArea(XpContextPtr pContext, xRectangle *pRect); void XpGetMaxWidthHeightRes(const char *printer_name, - const XpValidatePoolsRec* vpr, - float *width, - float *height, - int* resolution); + const XpValidatePoolsRec* vpr, + float *width, + float *height, + int* resolution); /* Util.c */ -char * ReplaceAnyString(char *string, - char *target, - char *replacement); -char * ReplaceFileString(char *string, - char *inFileName, - char *outFileName); +char *ReplaceAnyString(char *string, + char *target, + char *replacement); +char *ReplaceFileString(char *string, + char *inFileName, + char *outFileName); void ExecCommand(char *pCommand, - char **argVector); + char **argVector); int TransferBytes(FILE *pSrcFile, - FILE *pDstFile, - int numBytes); + FILE *pDstFile, + int numBytes); Bool CopyContentsAndDelete(FILE **ppSrcFile, - char **pSrcFileName, - FILE *pDstFile); + char **pSrcFileName, + FILE *pDstFile); int XpSendDocumentData(ClientPtr client, - FILE *fp, - int fileLen, - int maxBufSize); + FILE *fp, + int fileLen, + int maxBufSize); int XpFinishDocData(ClientPtr client); Bool XpOpenTmpFile(char *mode, - char **fname, - FILE **stream); + char **fname, + FILE **stream); #endif /* _Xp_attributes_h */ diff --git a/Xprint/ddxInit.c b/Xprint/ddxInit.c index 4c0f20b0b..55b73ea0b 100644 --- a/Xprint/ddxInit.c +++ b/Xprint/ddxInit.c @@ -30,13 +30,12 @@ not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from said copyright holders. */ -/* $XFree86: xc/programs/Xserver/Xprint/ddxInit.c,v 1.13 2001/06/11 16:59:02 dawes Exp $ */ #include "X.h" +#include "Xos.h" #include "Xproto.h" #include "windowstr.h" #include "servermd.h" -#include "Xos.h" #include "DiPrint.h" /*- @@ -68,10 +67,13 @@ copyright holders. void InitOutput( - ScreenInfo *pScreenInfo, - int argc, - char **argv) + ScreenInfo *pScreenInfo, + int argc, + char **argv) + { + int i; + pScreenInfo->imageByteOrder = IMAGE_BYTE_ORDER; pScreenInfo->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT; pScreenInfo->bitmapScanlinePad = BITMAP_SCANLINE_PAD; @@ -168,10 +170,10 @@ PointerProc( void InitInput( - int argc, + int argc, char **argv) { - DeviceIntPtr ptr, kbd; + DevicePtr ptr, kbd; ptr = AddInputDevice((DeviceProc)PointerProc, TRUE); kbd = AddInputDevice((DeviceProc)KeyboardProc, TRUE); @@ -215,6 +217,7 @@ OsVendorFatalError(void) } #endif + #ifdef DDXTIME CARD32 GetTimeInMillis(void) @@ -226,6 +229,12 @@ GetTimeInMillis(void) } #endif +/* ddxInitGlobals - called by |InitGlobals| from os/util.c */ +void ddxInitGlobals(void) +{ + XprintInitGlobals(); +} + /**************************************** * ddxUseMsg() * @@ -235,7 +244,11 @@ GetTimeInMillis(void) void ddxUseMsg(void) { - /* Right now, let's just do nothing */ +/* Enable |XprintUseMsg()| only if |XprintOptions()| is called + * by |ddxProcessArgument|, too (see below...) */ +#ifdef PRINT_ONLY_SERVER + XprintUseMsg(); +#endif /* PRINT_ONLY_SERVER */ } void AbortDDX (void) @@ -269,12 +282,12 @@ extern int BadDevice; int ChangePointerDevice ( - DeviceIntPtr old_dev, - DeviceIntPtr new_dev, - unsigned char x, - unsigned char y) + DeviceIntPtr old_dev, + DeviceIntPtr new_dev, + unsigned char x, + unsigned char y) { - return (BadDevice); + return (BadDevice); } int diff --git a/Xprint/etc/Xsession.d/cde_xsessiond_xprint.sh b/Xprint/etc/Xsession.d/cde_xsessiond_xprint.sh new file mode 100644 index 000000000..3fb6bba7c --- /dev/null +++ b/Xprint/etc/Xsession.d/cde_xsessiond_xprint.sh @@ -0,0 +1,30 @@ +#!/bin/sh +##################################################################### +### File: 0018.xprint +### +### Default Location: /usr/dt/config/Xsession.d/ +### +### Purpose: Setup Xprint env vars +### +### Description: This script is invoked by means of the Xsession file +### at user login. +### +### Invoked by: /usr/dt/bin/Xsession +### +### (c) Copyright 2003-2004 Roland Mainz +### +### please send bugfixes or comments to http://xprint.mozdev.org/ +### +##################################################################### + + +# +# Obtain list of Xprint servers +# + +if [ -f "/etc/init.d/xprint" ] ; then + XPSERVERLIST="`/bin/sh /etc/init.d/xprint get_xpserverlist`" + export XPSERVERLIST +fi + +########################## eof ##################### diff --git a/Xprint/etc/profile.d/xprint.csh b/Xprint/etc/profile.d/xprint.csh new file mode 100644 index 000000000..7cc675840 --- /dev/null +++ b/Xprint/etc/profile.d/xprint.csh @@ -0,0 +1,16 @@ +# +# /etc/profile.d/xprint.csh +# +# Copyright (c) 2002-2004 by Roland Mainz +# please send bugfixes or comments to http://xprint.mozdev.org/ + + +# +# Obtain list of Xprint servers +# + +if ( -f /etc/init.d/xprint ) then + setenv XPSERVERLIST "`/bin/sh /etc/init.d/xprint get_xpserverlist`" +endif + +# /etc/profile.d/xprint.csh ends here. diff --git a/Xprint/etc/profile.d/xprint.sh b/Xprint/etc/profile.d/xprint.sh new file mode 100644 index 000000000..b5b46c1e7 --- /dev/null +++ b/Xprint/etc/profile.d/xprint.sh @@ -0,0 +1,16 @@ +# +# /etc/profile.d/xprint.sh +# +# Copyright (c) 2002-2004 by Roland Mainz +# please send bugfixes or comments to http://xprint.mozdev.org/ + +# +# Obtain list of Xprint servers +# + +if [ -f "/etc/init.d/xprint" ] ; then + XPSERVERLIST="`/bin/sh /etc/init.d/xprint get_xpserverlist`" + export XPSERVERLIST +fi + +# /etc/profile.d/xprint.sh ends here. diff --git a/Xprint/mediaSizes.c b/Xprint/mediaSizes.c index b24f5c6c0..12482b281 100644 --- a/Xprint/mediaSizes.c +++ b/Xprint/mediaSizes.c @@ -30,8 +30,6 @@ not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from said copyright holders. */ -/* $XFree86: xc/programs/Xserver/Xprint/mediaSizes.c,v 1.4 2001/01/17 22:36:28 dawes Exp $ */ - /******************************************************************* ** ** ********************************************************* @@ -130,6 +128,14 @@ static PageDimensionsRec PageDimensions[] = {xpoid_val_medium_size_jis_b8, 64, 91}, {xpoid_val_medium_size_jis_b9, 45, 64}, {xpoid_val_medium_size_jis_b10, 32, 45}, + {xpoid_val_medium_size_hp_2x_postcard, 148, 200}, + {xpoid_val_medium_size_hp_european_edp, 304.8, 355.6}, + {xpoid_val_medium_size_hp_mini, 139.7, 215.9}, + {xpoid_val_medium_size_hp_postcard, 100, 148}, + {xpoid_val_medium_size_hp_tabloid, 279.4, 431.8}, + {xpoid_val_medium_size_hp_us_edp, 279.4, 355.6}, + {xpoid_val_medium_size_hp_us_government_legal, 203.2, 330.2}, + {xpoid_val_medium_size_hp_us_government_letter, 203.2, 254}, {xpoid_val_medium_size_iso_c3, 324, 458}, {xpoid_val_medium_size_iso_c4, 229, 324}, {xpoid_val_medium_size_iso_c5, 162, 229}, @@ -145,7 +151,8 @@ static PageDimensionsRec PageDimensions[] = * attributes pools have been validated. */ int -XpGetResolution(XpContextPtr pContext) +XpGetResolution( + XpContextPtr pContext) { unsigned long resolution; @@ -185,7 +192,8 @@ XpGetResolution(XpContextPtr pContext) * attributes pools have been validated. */ XpOid -XpGetContentOrientation(XpContextPtr pContext) +XpGetContentOrientation( + XpContextPtr pContext) { XpOid orientation; @@ -415,7 +423,7 @@ XpGetMediumMillimeters( float *width, /* return */ float *height) /* return */ { - unsigned i; + int i; *width = *height = 0; for(i = 0; i < XpNumber(PageDimensions); i++) @@ -739,7 +747,9 @@ XpGetMaxWidthHeightRes( } FontResolutionPtr -XpGetClientResolutions(ClientPtr client, int *num) +XpGetClientResolutions(client, num) + ClientPtr client; + int *num; { static struct _FontResolution res; int resolution = XpGetResolution(XpContextOfClient(client)); @@ -755,13 +765,15 @@ XpGetClientResolutions(ClientPtr client, int *num) } -void XpSetFontResFunc(ClientPtr client) +void XpSetFontResFunc(client) + ClientPtr client; { client->fontResFunc = XpGetClientResolutions; } -void XpUnsetFontResFunc(ClientPtr client) +void XpUnsetFontResFunc(client) + ClientPtr client; { client->fontResFunc = NULL; } diff --git a/Xprint/ps/Ps.h b/Xprint/ps/Ps.h index d33f301fa..e8fc615a6 100644 --- a/Xprint/ps/Ps.h +++ b/Xprint/ps/Ps.h @@ -7,6 +7,7 @@ Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting +documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. @@ -73,7 +74,6 @@ in this Software without prior written authorization from The Open Group. ** ********************************************************* ** ********************************************************************/ -/* $XFree86: xc/programs/Xserver/Xprint/ps/Ps.h,v 1.13 2001/12/21 21:02:05 dawes Exp $ */ #ifndef _PS_H_ #define _PS_H_ @@ -113,6 +113,7 @@ typedef char *XPointer; #include #include "attributes.h" + /* * Public index variables from PsInit.c */ @@ -249,6 +250,63 @@ typedef struct Bool (*DestroyWindow)(WindowPtr); } PsScreenPrivRec, *PsScreenPrivPtr; +typedef struct PsFontTypeInfoRec PsFontTypeInfoRec; + +/* Structure to hold information about one font on disk + * Notes: + * - multiple XLFD names can refer to the same |PsFontTypeInfoRec| (if + * they all use the same font on the disk) + * - the FreeType font download code uses multiple |PsFontTypeInfoRec| + * records for one font on disk if they differ in the encoding being + * used (this is an exception from the + * 'one-|PsFontTypeInfoRec|-per-font-on-disk'-design; maybe it it is better + * to rework that in a later step and add a new per-encoding structure). + */ +struct PsFontTypeInfoRec +{ + PsFontTypeInfoRec *next; /* Next record in list... */ + char *adobe_ps_name; /* PostScript font name (from the + * "_ADOBE_POSTSCRIPT_FONTNAME" atom) */ + char *download_ps_name; /* PostScript font name used for font download */ + char *filename; /* File name of font */ +#ifdef XP_USE_FREETYPE + char *ft_download_encoding; /* encoding used for download */ + PsFTDownloadFontType ft_download_font_type; /* PS font type used for download (e.g. Type1/Type3/CID/etc.) */ +#endif /* XP_USE_FREETYPE */ + int is_iso_encoding; /* Is this font encoded in ISO Latin 1 ? */ + int font_type; /* See PSFTI_FONT_TYPE_* below... */ + Bool downloadableFont; /* Font can be downloaded */ + Bool alreadyDownloaded[256]; /* Font has been downloaded (for 256 8bit "sub"-font) */ +}; + +#define PSFTI_FONT_TYPE_OTHER (0) +#define PSFTI_FONT_TYPE_PMF (1) +#define PSFTI_FONT_TYPE_PS_TYPE1_PFA (2) +#define PSFTI_FONT_TYPE_PS_TYPE1_PFB (3) +#define PSFTI_FONT_TYPE_TRUETYPE (4) +/* PSFTI_FONT_TYPE_FREETYPE is means the font is handled by the freetype engine */ +#define PSFTI_FONT_TYPE_FREETYPE (5) + +typedef struct PsFontInfoRec PsFontInfoRec; + +/* Structure which represents our context info for a single XLFD font + * Note that multiple |PsFontInfoRec| records can share the same + * |PsFontTypeInfoRec| record - the |PsFontInfoRec| records represent + * different appearances of the same font on disk(=|PsFontTypeInfoRec|)). + */ +struct PsFontInfoRec +{ + PsFontInfoRec *next; /* Next record in list... */ + /* |font| and |font_fontPrivate| are used by |PsFindFontInfoRec()| to + * identify a font */ + FontPtr font; /* The font this record is for */ + pointer font_fontPrivate; + PsFontTypeInfoRec *ftir; /* Record about the font file on disk */ + const char *dfl_name; /* XLFD for this font */ + int size; /* Font size. Use |mtx| if |size==0| */ + float mtx[4]; /* Transformation matrix (see |size|) */ +}; + typedef struct { char *jobFileName; @@ -259,6 +317,8 @@ typedef struct ClientPtr getDocClient; int getDocBufSize; PsOutPtr pPsOut; + PsFontTypeInfoRec *fontTypeInfoRecords; + PsFontInfoRec *fontInfoRecords; } PsContextPrivRec, *PsContextPrivPtr; typedef struct @@ -291,6 +351,7 @@ typedef struct extern Bool InitializePsDriver(int ndx, ScreenPtr pScreen, int argc, char **argv); +static Bool PsDestroyContext(XpContextPtr pCon); extern XpContextPtr PsGetContextFromWindow(WindowPtr win); /* @@ -314,6 +375,10 @@ extern int PsGetDocumentData(XpContextPtr pCon, ClientPtr client, */ extern Bool PsCreateGC(GCPtr pGC); +static int PsGetDrawablePrivateStuff(DrawablePtr pDrawable, GC *gc, + unsigned long *valid, PsOutPtr *psOut, + ColormapPtr *cMap); +extern PsContextPrivPtr PsGetPsContextPriv( DrawablePtr pDrawable ); extern int PsUpdateDrawableGC(GCPtr pGC, DrawablePtr pDrawable, PsOutPtr *psOut, ColormapPtr *cMap); extern void PsValidateGC(GCPtr pGC, unsigned long changes, DrawablePtr pDrawable); @@ -366,9 +431,8 @@ extern void PsPutScaledImage(DrawablePtr pDrawable, GCPtr pGC, int depth, extern void PsPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y, int w, int h, int leftPad, int format, char *pImage); -extern void PsPutImageMask(DrawablePtr pDrawable, GCPtr pGC, int depth, - int x, int y, int w, int h, int leftPad, int format, - char *pImage); +extern void PsPutImageMask(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y, + int w, int h, int leftPad, int format, char *pImage); extern RegionPtr PsCopyArea(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy, int width, int height, int dstx, int dsty); @@ -456,7 +520,19 @@ extern Bool PsUnrealizeFont(ScreenPtr pscr, FontPtr pFont); extern char *PsGetFontName(FontPtr pFont); extern int PsGetFontSize(FontPtr pFont, float *mtx); extern char *PsGetPSFontName(FontPtr pFont); +extern char *PsGetPSFaceOrFontName(FontPtr pFont); extern int PsIsISOLatin1Encoding(FontPtr pFont); +extern char *PsGetEncodingName(FontPtr pFont); +extern PsFontInfoRec *PsGetFontInfoRec(DrawablePtr pDrawable, FontPtr pFont); +extern void PsFreeFontInfoRecords(PsContextPrivPtr priv); +extern PsFTDownloadFontType PsGetFTDownloadFontType(void); + +/* + * Functions in PsFTFonts.c + */ + +extern char *PsGetFTFontFileName(FontPtr pFont); +extern Bool PsIsFreeTypeFont(FontPtr pFont); /* * Functions in PsAttr.c @@ -503,14 +579,4 @@ extern PsElmPtr PsCreateFillElementList(PixmapPtr pix, int *nElms); extern PsElmPtr PsCloneFillElementList(int nElms, PsElmPtr elms); extern void PsDestroyFillElementList(int nElms, PsElmPtr elms); -/* - * Functions in PsCache.c - */ - -#ifdef BM_CACHE -extern int PsBmIsImageCached(int gWidth, int gHeight, char *pBuffer); -extern int PsBmPutImageInCache(int gWidth, int gHeight, char *pBuffer); -extern void PsBmClearImageCache(void); -#endif - #endif /* _PS_H_ */ diff --git a/Xprint/ps/PsArea.c b/Xprint/ps/PsArea.c index eed650ada..134686a87 100644 --- a/Xprint/ps/PsArea.c +++ b/Xprint/ps/PsArea.c @@ -228,7 +228,7 @@ error: return; } -static void +void PsPutScaledImageIM(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y, int w, int h, int leftPad, int format, int imageRes, char *pImage) { @@ -269,9 +269,9 @@ PsPutScaledImageIM(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y, ColormapPtr cMap; int pageRes, sw, sh; #ifdef BM_CACHE - long cache_id = 0; + long cache_id = 0; #endif - + if( PsUpdateDrawableGC(pGC, pDrawable, &psOut, &cMap)==FALSE ) return; if (!imageRes) { sw = w; @@ -296,100 +296,100 @@ PsPutScaledImageIM(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y, PsOut_BeginImageCache(psOut, cache_id); #endif - if( depth==24 ) - { - PsOut_BeginImageIM(psOut, 0, 0, x, y, w, h, sw, sh, 3); - if( format==XYPixmap ) + if( depth==24 ) { - int rowsiz = PixmapBytePad(w, depth); - char *planes[3]; - planes[0] = pImage; - planes[1] = &pImage[rowsiz*h]; - planes[2] = &pImage[rowsiz*h*2]; - for( r=0 ; rbgPixel), - PsGetPixelColor(cMap, pGC->fgPixel), - x, y, w, h, sw, sh, 1); - for( r=0 ; r>j)&1)<<(7-j)); } - else - iv_ = iv; - c = iv_; - PsOut_OutImageBytes(psOut, 1, &c); + PsOut_OutImageBytes(psOut, 3, &ipt[1]); } } PsOut_EndImage(psOut); } - } + else if( depth==1 ) + { + { + int rowsiz = BitmapBytePad(w); + int psrsiz = (w+7)/8; + PsOut_BeginImageIM(psOut, PsGetPixelColor(cMap, pGC->bgPixel), + PsGetPixelColor(cMap, pGC->fgPixel), + x, y, w, h, sw, sh, 1); + for( r=0 ; r>j)&1)<<(7-j)); } + else + iv_ = iv; + c = iv_; + PsOut_OutImageBytes(psOut, 1, &c); + } + } + PsOut_EndImage(psOut); + } + } #ifdef BM_CACHE - PsOut_EndImageCache(psOut); + PsOut_EndImageCache(psOut); } PsOut_ImageCache(psOut, x, y, cache_id, PsGetPixelColor(cMap, pGC->bgPixel), PsGetPixelColor(cMap, pGC->fgPixel)); diff --git a/Xprint/ps/PsAttVal.c b/Xprint/ps/PsAttVal.c index 4a7865af6..5ebd0d3b9 100644 --- a/Xprint/ps/PsAttVal.c +++ b/Xprint/ps/PsAttVal.c @@ -32,7 +32,6 @@ not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from said copyright holders. */ -/* $XFree86: xc/programs/Xserver/Xprint/ps/PsAttVal.c,v 1.4 2001/01/17 22:36:31 dawes Exp $ */ #include "Ps.h" #include "AttrValid.h" @@ -73,7 +72,16 @@ static XpOidList DefaultPlexes = { }; static unsigned long ValidPrinterResolutionsCards[] = { + 75, + 100, + 120, + 150, + 180, + 200, + 240, 300, + 360, + 400, 600, 720, 940, @@ -86,7 +94,20 @@ static XpOidCardList ValidPrinterResolutions = { }; static unsigned long DefaultPrinterResolutionsCards[] = { - 300 + 75, + 100, + 120, + 150, + 180, + 200, + 240, + 300, + 360, + 400, + 600, + 720, + 940, + 1200 }; static XpOidCardList DefaultPrinterResolutions = { DefaultPrinterResolutionsCards, XpNumber(DefaultPrinterResolutionsCards) @@ -143,13 +164,6 @@ static XpOidDocFmtList DefaultEmbeddedFormatsSupported = { DefaultEmbeddedFormatsSupportedFmts, XpNumber(DefaultEmbeddedFormatsSupportedFmts) }; -/* -** So filtered printers that accept other raw formats can be -** used with this driver. -** -** Noah Roberts (jik-) -*/ -#if 0 static XpOidDocFmt ValidRawFormatsSupportedFmts[] = { { "Postscript", "2", NULL } @@ -157,7 +171,6 @@ static XpOidDocFmt ValidRawFormatsSupportedFmts[] = { static XpOidDocFmtList ValidRawFormatsSupported = { ValidRawFormatsSupportedFmts, XpNumber(ValidRawFormatsSupportedFmts) }; -#endif static XpOidDocFmt DefaultRawFormatsSupportedFmts[] = { { "Postscript", "2", NULL } @@ -178,12 +191,74 @@ static XpOidList ValidInputTrays = { }; static XpOid ValidMediumSizesOids[] = { + xpoid_val_medium_size_iso_a0, + xpoid_val_medium_size_iso_a1, + xpoid_val_medium_size_iso_a2, + xpoid_val_medium_size_iso_a3, xpoid_val_medium_size_iso_a4, + xpoid_val_medium_size_iso_a5, + xpoid_val_medium_size_iso_a6, + xpoid_val_medium_size_iso_a7, + xpoid_val_medium_size_iso_a8, + xpoid_val_medium_size_iso_a9, + xpoid_val_medium_size_iso_a10, + xpoid_val_medium_size_iso_b0, + xpoid_val_medium_size_iso_b1, + xpoid_val_medium_size_iso_b2, + xpoid_val_medium_size_iso_b3, + xpoid_val_medium_size_iso_b4, + xpoid_val_medium_size_iso_b5, + xpoid_val_medium_size_iso_b6, + xpoid_val_medium_size_iso_b7, + xpoid_val_medium_size_iso_b8, + xpoid_val_medium_size_iso_b9, + xpoid_val_medium_size_iso_b10, xpoid_val_medium_size_na_letter, xpoid_val_medium_size_na_legal, xpoid_val_medium_size_executive, + xpoid_val_medium_size_folio, + xpoid_val_medium_size_invoice, + xpoid_val_medium_size_ledger, + xpoid_val_medium_size_quarto, + xpoid_val_medium_size_iso_c3, + xpoid_val_medium_size_iso_c4, + xpoid_val_medium_size_iso_c5, + xpoid_val_medium_size_iso_c6, xpoid_val_medium_size_iso_designated_long, - xpoid_val_medium_size_na_number_10_envelope + xpoid_val_medium_size_na_10x13_envelope, + xpoid_val_medium_size_na_9x12_envelope, + xpoid_val_medium_size_na_number_10_envelope, + xpoid_val_medium_size_na_7x9_envelope, + xpoid_val_medium_size_na_9x11_envelope, + xpoid_val_medium_size_na_10x14_envelope, + xpoid_val_medium_size_na_number_9_envelope, + xpoid_val_medium_size_na_6x9_envelope, + xpoid_val_medium_size_na_10x15_envelope, + xpoid_val_medium_size_monarch_envelope, + xpoid_val_medium_size_a, + xpoid_val_medium_size_b, + xpoid_val_medium_size_c, + xpoid_val_medium_size_d, + xpoid_val_medium_size_e, + xpoid_val_medium_size_jis_b0, + xpoid_val_medium_size_jis_b1, + xpoid_val_medium_size_jis_b2, + xpoid_val_medium_size_jis_b3, + xpoid_val_medium_size_jis_b4, + xpoid_val_medium_size_jis_b5, + xpoid_val_medium_size_jis_b6, + xpoid_val_medium_size_jis_b7, + xpoid_val_medium_size_jis_b8, + xpoid_val_medium_size_jis_b9, + xpoid_val_medium_size_jis_b10, + xpoid_val_medium_size_hp_2x_postcard, + xpoid_val_medium_size_hp_european_edp, + xpoid_val_medium_size_hp_mini, + xpoid_val_medium_size_hp_postcard, + xpoid_val_medium_size_hp_tabloid, + xpoid_val_medium_size_hp_us_edp, + xpoid_val_medium_size_hp_us_government_legal, + xpoid_val_medium_size_hp_us_government_letter, }; static XpOidList ValidMediumSizes = { ValidMediumSizesOids, XpNumber(ValidMediumSizesOids) @@ -205,7 +280,7 @@ XpValidatePoolsRec PsValidatePoolsRec = { &ValidPrinterResolutions, &DefaultPrinterResolutions, &ValidEmbeddedFormatsSupported, &DefaultEmbeddedFormatsSupported, &ValidListfontsModes, &DefaultListfontsModes, - NULL /* Any raw format specified (NR)*/, &DefaultRawFormatsSupported, + &ValidRawFormatsSupported, &DefaultRawFormatsSupported, &ValidSetupProviso, &DefaultDocumentFormat }; diff --git a/Xprint/ps/PsAttr.c b/Xprint/ps/PsAttr.c index f276c180f..8a5bee9e3 100644 --- a/Xprint/ps/PsAttr.c +++ b/Xprint/ps/PsAttr.c @@ -57,7 +57,6 @@ in this Software without prior written authorization from The Open Group. * or other dealings in this Software without prior written authorization * from said copyright holders. */ -/* $XFree86: xc/programs/Xserver/Xprint/ps/PsAttr.c,v 1.4 2001/01/17 22:36:32 dawes Exp $ */ /******************************************************************* ** @@ -76,6 +75,7 @@ in this Software without prior written authorization from The Open Group. ********************************************************************/ #include "Ps.h" +#include "attributes.h" char * PsGetAttributes( diff --git a/Xprint/ps/PsCache.c b/Xprint/ps/PsCache.c index b688fbba1..8c9f4a926 100644 --- a/Xprint/ps/PsCache.c +++ b/Xprint/ps/PsCache.c @@ -79,21 +79,21 @@ in this Software without prior written authorization from The Open Group. #include "fntfil.h" #include "fntfilst.h" -#define GET 0 -#define RESET 1 +#define GET 0 +#define RESET 1 struct bm_cache_list { - struct bm_cache_list *next; - struct bm_cache_list *prev; + struct bm_cache_list *next; + struct bm_cache_list *prev; int height; - long id; + long id; char *pBuffer; }; struct bm_cache_head { - struct bm_cache_list *head; - int width; - struct bm_cache_head *next; + struct bm_cache_list *head; + int width; + struct bm_cache_head *next; struct bm_cache_head *prev; }; @@ -106,14 +106,14 @@ PsBmUniqueId(int func) if(func == RESET) { - unique_id = 0; - return 0; + unique_id = 0; + return 0; } else - return ++unique_id; + return ++unique_id; } -int +int PsBmIsImageCached( int gWidth, int gHeight, @@ -126,28 +126,28 @@ PsBmIsImageCached( { if(pList->width == gWidth) { - struct bm_cache_list *pItem = pList->head; + struct bm_cache_list *pItem = pList->head; - while(pItem != NULL) - { - if(pItem->height == gHeight) - { - int length = 4*(gWidth/32+(gWidth%32!=0))*gHeight; + while(pItem != NULL) + { + if(pItem->height == gHeight) + { + int length = 4*(gWidth/32+(gWidth%32!=0))*gHeight; - if(!memcmp(pItem->pBuffer, pBuffer, sizeof(char)*length)) - { - return_val = pItem->id; - break; - } - } - else if(pItem->height > gHeight) - break; + if(!memcmp(pItem->pBuffer, pBuffer, sizeof(char)*length)) + { + return_val = pItem->id; + break; + } + } + else if(pItem->height > gHeight) + break; - pItem = pItem->next; - } + pItem = pItem->next; + } } - else if(pList->width > gWidth) - break; + else if(pList->width > gWidth) + break; pList = pList->next; } @@ -180,39 +180,39 @@ PsBmPutImageInCache( while(pList != NULL) { if(pList->width == gWidth) - { - struct bm_cache_list *pItem = pList->head; + { + struct bm_cache_list *pItem = pList->head; - while(pItem != NULL) - { - if(pItem->height >= gHeight) - { - pNew->next = pItem; - pNew->prev = pItem->prev; - if(pItem->prev != NULL) - pItem->prev->next = pNew; + while(pItem != NULL) + { + if(pItem->height >= gHeight) + { + pNew->next = pItem; + pNew->prev = pItem->prev; + if(pItem->prev != NULL) + pItem->prev->next = pNew; else - pList->head = pNew; + pList->head = pNew; pItem->prev = pNew; - return_val = pNew->id; + return_val = pNew->id; - break; - } - else if(pItem->next == NULL) - { - pNew->prev = pItem; - pItem->next = pNew; + break; + } + else if(pItem->next == NULL) + { + pNew->prev = pItem; + pItem->next = pNew; - return_val = pNew->id; + return_val = pNew->id; - break; - } + break; + } - pItem = pItem->next; - } + pItem = pItem->next; + } - break; + break; } pList = pList->next; @@ -223,50 +223,50 @@ PsBmPutImageInCache( struct bm_cache_head *pNewList; pNewList = (struct bm_cache_head *)malloc(sizeof(struct bm_cache_head)); - + pNewList->next = NULL; pNewList->prev = NULL; pNewList->width = gWidth; pNewList->head = pNew; - + if(bm_cache == NULL) { - bm_cache = pNewList; - return_val = pNew->id; + bm_cache = pNewList; + return_val = pNew->id; } else { - pList = bm_cache; + pList = bm_cache; - while(pList != NULL) - { - if(pList->width > gWidth) - { - pNewList->next = pList; - pNewList->prev = pList->prev; + while(pList != NULL) + { + if(pList->width > gWidth) + { + pNewList->next = pList; + pNewList->prev = pList->prev; - if(pList->prev != NULL) - pList->prev->next = pNewList; + if(pList->prev != NULL) + pList->prev->next = pNewList; else - bm_cache = pNewList; - pList->prev = pNewList; + bm_cache = pNewList; + pList->prev = pNewList; - return_val = pNew->id; + return_val = pNew->id; - break; - } - else if(pList->next == NULL) + break; + } + else if(pList->next == NULL) { - pNewList->prev = pList; - pList->next = pNewList; + pNewList->prev = pList; + pList->next = pNewList; - return_val = pNew->id; + return_val = pNew->id; - break; - } + break; + } - pList = pList->next; - } + pList = pList->next; + } } } @@ -280,35 +280,35 @@ PsBmClearImageCacheItem( { if(pItem != NULL) { - if(pItem->pBuffer != NULL) - free(pItem->pBuffer); + if(pItem->pBuffer != NULL) + free(pItem->pBuffer); pItem->pBuffer = NULL; - if(pItem->next) - PsBmClearImageCacheItem(pItem->next); + if(pItem->next) + PsBmClearImageCacheItem(pItem->next); pItem->next = NULL; - free(pItem); - pItem = NULL; + free(pItem); + pItem = NULL; } } -static void +static void PsBmClearImageCacheList( struct bm_cache_head *pList) { if(pList != NULL) { - if(pList->head) - PsBmClearImageCacheItem(pList->head); + if(pList->head) + PsBmClearImageCacheItem(pList->head); pList->head = NULL; - if(pList->next) - PsBmClearImageCacheList(pList->next); + if(pList->next) + PsBmClearImageCacheList(pList->next); pList->next = NULL; - free(pList); - pList = NULL; + free(pList); + pList = NULL; } } diff --git a/Xprint/ps/PsColor.c b/Xprint/ps/PsColor.c index 6417410ee..9c76904d6 100644 --- a/Xprint/ps/PsColor.c +++ b/Xprint/ps/PsColor.c @@ -73,7 +73,6 @@ in this Software without prior written authorization from The Open Group. ** ********************************************************* ** ********************************************************************/ -/* $XFree86: xc/programs/Xserver/Xprint/ps/PsColor.c,v 1.2 2001/10/28 03:32:56 tsi Exp $ */ #include "Ps.h" #include "gcstruct.h" @@ -86,6 +85,7 @@ PsCreateColormap(ColormapPtr pColor) int i; unsigned short rgb; VisualPtr pVisual = pColor->pVisual; + Pixel pix; if( pVisual->class==TrueColor ) { diff --git a/Xprint/ps/PsFTFonts.c b/Xprint/ps/PsFTFonts.c new file mode 100644 index 000000000..cfdee93d1 --- /dev/null +++ b/Xprint/ps/PsFTFonts.c @@ -0,0 +1,80 @@ + +/* +Copyright (c) 2003-2004 Roland Mainz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#include +#include +#include + +#include "regionstr.h" +#include "fontstruct.h" +#include "dixfontstr.h" +#include "scrnintstr.h" +#include "fontxlfd.h" +#include "fntfil.h" +#include "fntfilst.h" + +#include "Ps.h" + +#include +#include FT_FREETYPE_H + +#include "ft.h" +#include "ftfuncs.h" + +char * +PsGetFTFontFileName(FontPtr pFont) +{ + FTFontPtr tf = (FTFontPtr)pFont->fontPrivate; + return tf->instance->face->filename; +} + +Bool +PsIsFreeTypeFont(FontPtr pFont) +{ + int i; + int nprops = pFont->info.nprops; + FontPropPtr props = pFont->info.props; + /* "RASTERIZER_NAME" must match the rasterizer name set in + * xc/lib/font/FreeType/ftfuncs.c */ + Atom name = MakeAtom("RASTERIZER_NAME", 15, True); + Atom value = (Atom)0; + char *rv; + + for( i=0 ; i +#include +#include + Bool PsRealizeFont( ScreenPtr pscr, @@ -110,7 +115,7 @@ PsGetFontName(FontPtr pFont) for( i=0 ; iinfo.nprops; FontPropPtr props = pFont->info.props; - Atom name = MakeAtom("PRINTER_RESIDENT_FONT", 21, True); + /* "_ADOBE_POSTSCRIPT_FONTNAME" maps directly to a PMF OBJ_NAME attribute + * name - changing the name will break printer-builtin fonts. */ + Atom name = MakeAtom("_ADOBE_POSTSCRIPT_FONTNAME", 26, True); Atom value = (Atom)0; for( i=0 ; iinfo.nprops; + FontPropPtr props = pFont->info.props; + Atom fnt = MakeAtom("FONT", 4, True); + Atom reg = MakeAtom("CHARSET_REGISTRY", 16, True); + Atom enc = MakeAtom("CHARSET_ENCODING", 16, True); + Atom fv = 0, rv = 0, ev = 0; + char *fp = 0; + char *rp = 0; + char *ep = 0; + char *encname; + + for( i=0 ; ifpe->name == "tcp/:7100")) + */ +static +Bool IsFPEaReadableDir(FontPtr pFont) +{ + const char *fpe_name = pFont->fpe->name; + if (!fpe_name) + return False; + +#define MODEL_FONTPATH_PREFIX "PRINTER:" +#define MODEL_FONTPATH_PREFIX_LEN 8 + /* Strip model-specific font path prefix if there is one... */ + if (!strncmp(fpe_name, MODEL_FONTPATH_PREFIX, MODEL_FONTPATH_PREFIX_LEN)) + fpe_name += MODEL_FONTPATH_PREFIX_LEN; + + if (access(fpe_name, F_OK) == 0) + { + return True; + } + + return False; +} + +static +char *getFontFilename(FontPtr pFont) +{ + FontDirectoryPtr dir; + const char *dlfnam; + FILE *file; + struct stat statb; + int count, i, status; + char buf[512]; + char *front, *end, *fn; + char font_dir_fname[PATH_MAX], /* Full path of fonts.dir */ + font_file_fname[PATH_MAX]; /* Name of font file (excluding path) */ + +#ifdef XP_USE_FREETYPE + if( PsIsFreeTypeFont(pFont) ) + { + const char *fontname = PsGetFTFontFileName(pFont); + +#ifdef DEBUG_gisburn + fprintf(stderr, "getFontFilename: freetype font, file='%s'\n", fontname?fontname:""); +#endif /* DEBUG_gisburn */ + + if( !fontname ) + return NULL; + + return strdup(fontname); + } +#endif /* XP_USE_FREETYPE */ + + if (!IsFPEaReadableDir(pFont)) + { +#ifdef DEBUG_gisburn + fprintf(stderr, "getFontFilename: '%s' no valid font path on disk\n", pFont->fpe->name); +#endif /* DEBUG_gisburn */ + return NULL; + } + + dir = pFont->fpe->private; + sprintf(font_dir_fname, "%s%s", dir->directory, "fonts.dir"); + + if (!(dlfnam = PsGetFontName(pFont))) + return NULL; + + file = fopen(font_dir_fname, "r"); + if (file) + { + if (fstat (fileno(file), &statb) == -1) + return NULL; + + while( fgets(buf, sizeof(buf)-1, file) ) + { + if ((fn = strstr(buf, " -"))) + { + strcpy(font_file_fname, buf); + font_file_fname[fn - buf] = '\0'; + fn++; + if ((front = str_case_str(fn, "normal-"))) + { + fn[front - fn] = '\0'; + if (str_case_str(dlfnam, fn)) + { + char full_font_file_path[PATH_MAX]; + + fclose(file); + + sprintf(full_font_file_path, "%s%s", dir->directory, font_file_fname); + +#ifdef xDEBUG_gisburn + fprintf(stderr, "getFontFilename: returning '%s'\n", full_font_file_path); +#endif /* DEBUG_gisburn */ + return strdup(full_font_file_path); + } + } + } + } + } + font_file_fname[0] = '\0'; + fclose(file); + +#ifdef DEBUG_gisburn + fprintf(stderr, "getFontFilename: returning NULL\n"); +#endif /* DEBUG_gisburn */ + + return NULL; +} + +static +PsFontTypeInfoRec *PsFindFontTypeInfoRec(DrawablePtr pDrawable, FontPtr pFont) +{ + PsContextPrivRec *cPriv = PsGetPsContextPriv(pDrawable); + PsFontTypeInfoRec *rec; + const char *psname; + char *font_filename; + char *encname; +#ifdef XP_USE_FREETYPE + Bool is_freetypefont; +#endif /* XP_USE_FREETYPE */ + +#ifdef XP_USE_FREETYPE + is_freetypefont = PsIsFreeTypeFont(pFont); +#endif /* XP_USE_FREETYPE */ + encname = PsGetEncodingName(pFont); + + /* First try: Search by PostScript font name */ + psname = PsGetPSFontName(pFont); + if (psname) + { + for( rec = cPriv->fontTypeInfoRecords ; rec != NULL ; rec = rec->next ) + { +#ifdef XP_USE_FREETYPE + if (is_freetypefont) + { + if (rec->adobe_ps_name) + { + if ((rec->font_type == PSFTI_FONT_TYPE_FREETYPE) && + (!strcmp(rec->adobe_ps_name, psname)) && + (!strcmp(rec->ft_download_encoding, encname))) + { + return rec; + } + } + } + else +#endif /* XP_USE_FREETYPE */ + { + if (rec->adobe_ps_name) + { + if ((rec->font_type != PSFTI_FONT_TYPE_FREETYPE) && + (!strcmp(rec->adobe_ps_name, psname))) + { + return rec; + } + } + } + } + } + + /* Last attempt: Search by filename */ + font_filename = getFontFilename(pFont); + if (font_filename) + { + for( rec = cPriv->fontTypeInfoRecords ; rec != NULL ; rec = rec->next ) + { + if (rec->filename) + { +#ifdef XP_USE_FREETYPE + if (is_freetypefont) + { + if ( (rec->font_type == PSFTI_FONT_TYPE_FREETYPE) && + (!strcasecmp(rec->filename, font_filename)) && + (!strcasecmp(rec->ft_download_encoding, encname)) ) + { + free(font_filename); + return rec; + } + } + else +#endif /* XP_USE_FREETYPE */ + { + if ( (rec->font_type != PSFTI_FONT_TYPE_FREETYPE) && + (!strcasecmp(rec->filename, font_filename)) ) + { + free(font_filename); + return rec; + } + } + } + } + + free(font_filename); + } + + return NULL; +} + +static +void PsAddFontTypeInfoRec(DrawablePtr pDrawable, PsFontTypeInfoRec *add_rec) +{ + PsContextPrivRec *cPriv = PsGetPsContextPriv(pDrawable); + + /* ToDO: Always move the last used entry to the top that the list get's + * sorted in an efficient order... :-) */ + add_rec->next = cPriv->fontTypeInfoRecords; + cPriv->fontTypeInfoRecords = add_rec; +} + +static +Bool strcaseendswith(const char *str, const char *suffix) +{ + const char *s; + + s = str + strlen(str) - strlen(suffix); + + if (!strcasecmp(s, suffix)) + return True; + + return False; +} + + +static +int getFontFileType( const char *filename ) +{ + int type; + + /* Is this a Adobe PostScript Type 1 binary font (PFB) ? */ + if( strcaseendswith(filename, ".pfb") ) + { + type = PSFTI_FONT_TYPE_PS_TYPE1_PFB; + } + /* Is this a Adobe PostScript ASCII font (PFA) ? */ + else if( strcaseendswith(filename, ".pfa") ) + { + type = PSFTI_FONT_TYPE_PS_TYPE1_PFA; + } + /* Is this a PMF(=Printer Metrics File) ? */ + else if( strcaseendswith(filename, ".pmf") ) + { + type = PSFTI_FONT_TYPE_PMF; + } + /* Is this a TrueType font file ? */ + else if( strcaseendswith(filename, ".ttf") || + strcaseendswith(filename, ".ttc") || + strcaseendswith(filename, ".otf") || + strcaseendswith(filename, ".otc") ) + { + type = PSFTI_FONT_TYPE_TRUETYPE; + } + else + { + type = PSFTI_FONT_TYPE_OTHER; + } + +#ifdef XP_USE_FREETYPE + { + XpContextPtr pCon; + char *downloadfonts; + pCon = XpGetPrintContext(requestingClient); + downloadfonts = XpGetOneAttribute(pCon, XPPrinterAttr, "xp-psddx-download-fonts"); + if( downloadfonts ) + { + /* Should we download PS Type1 fonts as PS Type1||Type3 ? */ + if( (type == PSFTI_FONT_TYPE_PS_TYPE1_PFA) && + (strstr(downloadfonts, "pfa") != NULL) ) + { + type = PSFTI_FONT_TYPE_FREETYPE; + } + + if( (type == PSFTI_FONT_TYPE_PS_TYPE1_PFB) && + (strstr(downloadfonts, "pfb") != NULL) ) + { + type = PSFTI_FONT_TYPE_FREETYPE; + } + + /* Should we download TrueType fonts as PS Type1||Type3 ? */ + if( (type == PSFTI_FONT_TYPE_TRUETYPE) && + ((strstr(downloadfonts, "ttf") != NULL) || + (strstr(downloadfonts, "ttc") != NULL) || + (strstr(downloadfonts, "otf") != NULL) || + (strstr(downloadfonts, "otc") != NULL)) ) + { + type = PSFTI_FONT_TYPE_FREETYPE; + } + } + } +#endif /* XP_USE_FREETYPE */ + +#ifdef DEBUG_gisburn + fprintf(stderr, "getFontFileType: '%s' is %d\n", filename, (int)type); +#endif /* DEBUG_gisburn */ + return type; +} + +PsFTDownloadFontType PsGetFTDownloadFontType(void) +{ + PsFTDownloadFontType downloadfonttype; + XpContextPtr pCon; + char *psfonttype; + + pCon = XpGetPrintContext(requestingClient); + psfonttype = XpGetOneAttribute(pCon, XPPrinterAttr, "xp-psddx-download-font-type"); + + if( !psfonttype || !strlen(psfonttype) ) + { + return PsFontType1; /* Default download font type is PS Type1 */ + } + + if( !strcmp(psfonttype, "bitmap") ) + { + downloadfonttype = PsFontBitmap; + } + else if( !strcmp(psfonttype, "pstype3") ) + { + downloadfonttype = PsFontType3; + } + else if( !strcmp(psfonttype, "pstype1") ) + { + downloadfonttype = PsFontType1; + } + else + { + FatalError("PS DDX: XPPrinterAttr/xp-psddx-download-freetype-font-type='%s' not implemented\n", psfonttype); + return 0; /* NO-OP, FatalError() will call |exit()| */ + } + + return downloadfonttype; +} + +static +PsFontTypeInfoRec *PsCreateFontTypeInfoRec(DrawablePtr pDrawable, FontPtr pFont) +{ + char *dlfnam; + PsFontTypeInfoRec *rec; + char *psname; + + if (!(dlfnam = PsGetFontName(pFont))) + return NULL; + + if (!(rec = (PsFontTypeInfoRec *)xalloc(sizeof(PsFontTypeInfoRec)))) + return NULL; + memset(rec, 0, sizeof(PsFontTypeInfoRec)); + + rec->next = NULL; + + if (rec->filename = getFontFilename(pFont)) + { + rec->font_type = getFontFileType(rec->filename); + } + else + { + rec->filename = NULL; + rec->font_type = PSFTI_FONT_TYPE_OTHER; + } + + rec->adobe_ps_name = PsGetPSFontName(pFont); + rec->ft_download_encoding = PsGetEncodingName(pFont); + rec->ft_download_font_type = PsGetFTDownloadFontType(); + rec->download_ps_name = NULL; + +#define SET_FONT_DOWNLOAD_STATUS(rec, downloaded) { int i; for (i = 0 ; i < 256 ; i++) { (rec)->alreadyDownloaded[i]=(downloaded); } } + + /* Set some flags based on the font type */ + switch( rec->font_type ) + { + case PSFTI_FONT_TYPE_PS_TYPE1_PFA: + case PSFTI_FONT_TYPE_PS_TYPE1_PFB: + rec->downloadableFont = True; + SET_FONT_DOWNLOAD_STATUS(rec, False); + rec->is_iso_encoding = PsIsISOLatin1Encoding(pFont); + break; + + case PSFTI_FONT_TYPE_PMF: + rec->downloadableFont = True; /* This font is in printer's ROM */ + SET_FONT_DOWNLOAD_STATUS(rec, True); + rec->is_iso_encoding = PsIsISOLatin1Encoding(pFont); + break; + + case PSFTI_FONT_TYPE_TRUETYPE: + /* Note: TrueType font download not implemented */ + rec->downloadableFont = False; + SET_FONT_DOWNLOAD_STATUS(rec, False); + rec->is_iso_encoding = PsIsISOLatin1Encoding(pFont); + break; + +#ifdef XP_USE_FREETYPE + case PSFTI_FONT_TYPE_FREETYPE: + if( rec->ft_download_font_type == PsFontType1 || + rec->ft_download_font_type == PsFontType3 ) + { + rec->downloadableFont = True; + } + else + { + rec->downloadableFont = False; + } + + SET_FONT_DOWNLOAD_STATUS(rec, False); + rec->is_iso_encoding = False; /* Freetype--->PS Type1/Type3 uses always non-iso PS encoding for now */ + break; +#endif /* XP_USE_FREETYPE */ + + case PSFTI_FONT_TYPE_OTHER: + default: + rec->downloadableFont = False; + SET_FONT_DOWNLOAD_STATUS(rec, False); + rec->is_iso_encoding = PsIsISOLatin1Encoding(pFont); + break; + } + +#ifdef XP_USE_FREETYPE + if( (rec->font_type == PSFTI_FONT_TYPE_FREETYPE) ) + { + char *s; + register int c; + + if( rec->adobe_ps_name ) + { + rec->download_ps_name = malloc(strlen(rec->adobe_ps_name) + strlen(rec->ft_download_encoding) + 2); + sprintf(rec->download_ps_name, "%s_%s", rec->adobe_ps_name, rec->ft_download_encoding); + } + else + { + /* Unfortunately not all TTF fonts have a PostScript font name (like + * Solaris TTF fonts in /usr/openwin/lib/locale/ko.UTF-8/X11/fonts/TrueType, + * /usr/openwin/lib/locale/ko/X11/fonts/TrueType) - in this case we + * have to generate a font name + */ + char ftfontname[64]; + static long myfontindex = 0L; + sprintf(ftfontname, "psfont_%lx", myfontindex++); + + rec->download_ps_name = malloc(strlen(ftfontname) + strlen(rec->ft_download_encoding) + 2); + sprintf(rec->download_ps_name, "%s_%s", ftfontname, rec->ft_download_encoding); + + fprintf(stderr, "PsCreateFontTypeInfoRec: Note: '%s' has no PS font name, using '%s' for now.\n", dlfnam, rec->download_ps_name); + } + + /* Make sure the font name we use for download is a valid PS font name */ + for( s = rec->download_ps_name ; *s != '\0'; s++ ) + { + c = *s; + + /* Check for allowed chars, invalid ones are replaced with a '_' + * (and check that the first char is not a digit) */ + if( !(isalnum(c) || c == '.' || c == '_' || c == '-') || (s==rec->download_ps_name && isdigit(c)) ) + { + *s = '_'; + } + } + } + else +#endif /* XP_USE_FREETYPE */ + { + if( rec->adobe_ps_name ) + { + rec->download_ps_name = strdup(rec->adobe_ps_name); + } + else + { + rec->download_ps_name = NULL; + } + } + + /* Safeguard - only treat font as downloadable when we have a PS font name!! */ + if (!rec->download_ps_name && rec->downloadableFont) + { + /* XXX: Log this message to the log when the logging service has been hook'ed up */ + fprintf(stderr, "PsCreateFontTypeInfoRec: Safeguard: No PS font name for '%s'!\n", dlfnam); + rec->downloadableFont = False; + } + +#ifdef DEBUG_gisburn + fprintf(stderr, "PsCreateFontTypeInfoRec: Created PsFontTypeInfoRec '%s' ('%s'/'%s')\n", + ((rec->filename) ?(rec->filename) :("")), + ((rec->adobe_ps_name) ?(rec->adobe_ps_name):("")), + ((rec->download_ps_name)?(rec->download_ps_name):(""))); +#endif /* DEBUG_gisburn */ + + return rec; +} + +static +PsFontTypeInfoRec *PsGetFontTypeInfoRec(DrawablePtr pDrawable, FontPtr pFont) +{ + PsFontTypeInfoRec *rec; + char *dlfnam; + + if(!(dlfnam = PsGetFontName(pFont))) + return NULL; + + rec = PsFindFontTypeInfoRec(pDrawable, pFont); + if (rec) + return rec; + + rec = PsCreateFontTypeInfoRec(pDrawable, pFont); + if (!rec) + return NULL; + + PsAddFontTypeInfoRec(pDrawable, rec); + + return rec; +} + +static +void PsFreeFontTypeInfoRecords( PsContextPrivPtr priv ) +{ + PsFontTypeInfoRec *curr, *next; + curr = priv->fontTypeInfoRecords; + while( curr != NULL ) + { + if (curr->filename) + free(curr->filename); /* Free memory allocated by |strdup()| */ + + if (curr->download_ps_name) + free(curr->download_ps_name); + + next = curr->next; + xfree(curr); + curr = next; + } +} + +static +PsFontInfoRec *PsFindFontInfoRec(DrawablePtr pDrawable, FontPtr pFont) +{ + PsContextPrivRec *cPriv = PsGetPsContextPriv(pDrawable); + PsFontInfoRec *rec; + + if (!pFont) + return NULL; + + for( rec = cPriv->fontInfoRecords ; rec != NULL ; rec = rec->next ) + { + if ((rec->font == pFont) && + (rec->font_fontPrivate == pFont->fontPrivate)) + return rec; + } + + return NULL; +} + +static +void PsAddFontInfoRec(DrawablePtr pDrawable, PsFontInfoRec *add_rec) +{ + PsContextPrivRec *cPriv = PsGetPsContextPriv(pDrawable); + + /* ToDO: Always move the last used entry to the top that the list get's + * sorted in an efficient order... :-) */ + add_rec->next = cPriv->fontInfoRecords; + cPriv->fontInfoRecords = add_rec; +} + +static +PsFontInfoRec *PsCreateFontInfoRec(DrawablePtr pDrawable, FontPtr pFont) +{ + PsFontInfoRec *rec; + PsFontTypeInfoRec *ftir; + + if (!(ftir = PsGetFontTypeInfoRec(pDrawable, pFont))) + return NULL; + + if (!(rec = (PsFontInfoRec *)xalloc(sizeof(PsFontInfoRec)))) + return NULL; + memset(rec, 0, sizeof(PsFontInfoRec)); + + rec->font = pFont; + rec->font_fontPrivate = pFont->fontPrivate; + rec->ftir = ftir; + rec->next = NULL; + rec->dfl_name = PsGetFontName(pFont); + rec->size = PsGetFontSize(pFont, rec->mtx); + +#ifdef DEBUG_gisburn + fprintf(stderr, "PsCreateFontInfoRec: Created PsFontInfoRec '%s'\n", + ((rec->dfl_name)?(rec->dfl_name):(""))); +#endif /* DEBUG_gisburn */ + + return rec; +} + +PsFontInfoRec *PsGetFontInfoRec(DrawablePtr pDrawable, FontPtr pFont) +{ + PsFontInfoRec *rec; + + rec = PsFindFontInfoRec(pDrawable, pFont); + if (rec) + return rec; + + rec = PsCreateFontInfoRec(pDrawable, pFont); + if (!rec) + return NULL; + + PsAddFontInfoRec(pDrawable, rec); + + return rec; +} + +void PsFreeFontInfoRecords( PsContextPrivPtr priv ) +{ + PsFontInfoRec *curr, *next; + curr = priv->fontInfoRecords; + while( curr != NULL ) + { + next = curr->next; + xfree(curr); + curr = next; + } + + PsFreeFontTypeInfoRecords(priv); + + priv->fontTypeInfoRecords = NULL; + priv->fontInfoRecords = NULL; +} diff --git a/Xprint/ps/PsGC.c b/Xprint/ps/PsGC.c index ea441cff5..28c1f718b 100644 --- a/Xprint/ps/PsGC.c +++ b/Xprint/ps/PsGC.c @@ -57,7 +57,6 @@ in this Software without prior written authorization from The Open Group. * or other dealings in this Software without prior written authorization * from said copyright holders. */ -/* $XFree86: xc/programs/Xserver/Xprint/ps/PsGC.c,v 1.6tsi Exp $ */ /******************************************************************* ** @@ -171,6 +170,26 @@ PsGetDrawablePrivateStuff( } } +PsContextPrivPtr +PsGetPsContextPriv( DrawablePtr pDrawable ) +{ + XpContextPtr pCon; + PsContextPrivPtr cPriv; + + switch(pDrawable->type) + { + case DRAWABLE_PIXMAP: + return FALSE; + case DRAWABLE_WINDOW: + pCon = PsGetContextFromWindow((WindowPtr)pDrawable); + if (pCon != NULL) + { + return pCon->devPrivates[PsContextPrivateIndex].ptr; + } + } + return NULL; +} + int PsUpdateDrawableGC( GCPtr pGC, @@ -181,6 +200,7 @@ PsUpdateDrawableGC( GC dGC; unsigned long valid; int i; + PsContextPrivPtr cPriv; BoxPtr boxes; if (!PsGetDrawablePrivateStuff(pDrawable, &dGC, &valid, psOut, cMap)) @@ -232,6 +252,8 @@ PsUpdateDrawableGC( PsOut_Offset(*psOut, pDrawable->x, pDrawable->y); PsOut_Clip(*psOut, pGC->clientClipType, (PsClipPtr)pGC->clientClip); } + cPriv = ( PsGetContextFromWindow( (WindowPtr)pDrawable ) ) + ->devPrivates[PsContextPrivateIndex].ptr; break; } return TRUE; diff --git a/Xprint/ps/PsInit.c b/Xprint/ps/PsInit.c index a7a63343d..224d08335 100644 --- a/Xprint/ps/PsInit.c +++ b/Xprint/ps/PsInit.c @@ -71,9 +71,8 @@ in this Software without prior written authorization from The Open Group. ** * Copyright: Copyright 1996 The Open Group, Inc. ** * ** ********************************************************* -** +** ********************************************************************/ -/* $XFree86: xc/programs/Xserver/Xprint/ps/PsInit.c,v 1.13tsi Exp $ */ #include #include @@ -109,8 +108,12 @@ InitializePsDriver(ndx, pScreen, argc, argv) char **argv; { #if 0 + int maxXres, maxYres, maxWidth, maxHeight; + int maxRes, maxDim, numBytes; PsScreenPrivPtr pPriv; #endif + char **printerNames; + int numPrinters; int nVisuals; int nDepths; VisualPtr visuals; @@ -188,7 +191,7 @@ InitializePsDriver(ndx, pScreen, argc, argv) visuals[1].vid = FakeClientID(0); visuals[1].class = PseudoColor; - visuals[1].bitsPerRGBValue = 0; + visuals[1].bitsPerRGBValue = 8; visuals[1].ColormapEntries = 256; visuals[1].nplanes = 8; visuals[1].redMask = 0x0; @@ -209,7 +212,7 @@ InitializePsDriver(ndx, pScreen, argc, argv) /* THE FOLLOWING CAUSES SERVER DEFAULT VISUAL TO BE 24 BIT */ /* miScreenInit(pScreen, (pointer)0, pScreen->width, pScreen->height, - pScreen->width / (pScreen->mmWidth / 25.40), + pScreen->width / (pScreen->mmWidth / 25.40), pScreen->height / (pScreen->mmHeight / 25.40), 0, 24, nDepths, depths, visuals[1].vid, nVisuals, visuals); */ @@ -217,7 +220,7 @@ InitializePsDriver(ndx, pScreen, argc, argv) /* THE FOLLOWING CAUSES SERVER DEFAULT VISUAL TO BE 8 BIT */ miScreenInit(pScreen, (pointer)0, pScreen->width, pScreen->height, - (int) (pScreen->width / (pScreen->mmWidth / 25.40)), + (int) (pScreen->width / (pScreen->mmWidth / 25.40)), (int) (pScreen->height / (pScreen->mmHeight / 25.40)), 0, 8, nDepths, depths, visuals[1].vid, nVisuals, visuals); @@ -243,7 +246,7 @@ AllocatePsPrivates(ScreenPtr pScreen) sizeof(PsWindowPrivRec)); PsContextPrivateIndex = XpAllocateContextPrivateIndex(); - XpAllocateContextPrivate(PsContextPrivateIndex, + XpAllocateContextPrivate(PsContextPrivateIndex, sizeof(PsContextPrivRec)); PsPixmapPrivateIndex = AllocatePixmapPrivateIndex(); @@ -278,7 +281,7 @@ PsInitContext(pCon) XpDriverFuncsPtr pFuncs; PsContextPrivPtr pConPriv; char *server, *attrStr; - + /* * Initialize the attribute store for this printer. */ @@ -304,18 +307,23 @@ PsInitContext(pCon) pFuncs->GetMediumDimensions = PsGetMediumDimensions; pFuncs->GetReproducibleArea = PsGetReproducibleArea; pFuncs->SetImageResolution = PsSetImageResolution; - + /* * Set up the context privates */ pConPriv = (PsContextPrivPtr)pCon->devPrivates[PsContextPrivateIndex].ptr; - pConPriv->jobFileName = (char *)NULL; - pConPriv->pJobFile = (FILE *)NULL; - - pConPriv->getDocClient = (ClientPtr)NULL; - pConPriv->getDocBufSize = 0; + memset(pConPriv, 0, sizeof(PsContextPrivRec)); + pConPriv->jobFileName = (char *)NULL; + pConPriv->pJobFile = (FILE *)NULL; + pConPriv->dash = (unsigned char *)NULL; + pConPriv->validGC = 0; + pConPriv->getDocClient = (ClientPtr)NULL; + pConPriv->getDocBufSize = 0; + pConPriv->pPsOut = NULL; + pConPriv->fontInfoRecords = NULL; + pConPriv->fontTypeInfoRecords = NULL; /* * document-attributes-supported @@ -323,15 +331,15 @@ PsInitContext(pCon) server = XpGetOneAttribute( pCon, XPServerAttr, DOC_ATT_SUPP ); if ((attrStr = (char *) xalloc(strlen(server) + strlen(DOC_ATT_SUPP) + strlen(DOC_ATT_VAL) - + strlen(PAGE_ATT_VAL) + 6)) == NULL) + + strlen(PAGE_ATT_VAL) + 6)) == NULL) { return BadAlloc; } - sprintf(attrStr, "*%s:\t%s %s %s", + sprintf(attrStr, "*%s:\t%s %s %s", DOC_ATT_SUPP, server, DOC_ATT_VAL, PAGE_ATT_VAL); XpAugmentAttributes( pCon, XPPrinterAttr, attrStr); xfree(attrStr); - + /* * job-attributes-supported */ @@ -344,7 +352,7 @@ PsInitContext(pCon) sprintf(attrStr, "*%s:\t%s %s", JOB_ATT_SUPP, server, JOB_ATT_VAL); XpAugmentAttributes(pCon, XPPrinterAttr, attrStr); xfree(attrStr); - + /* * xp-page-attributes-supported */ @@ -375,7 +383,7 @@ PsDestroyContext(pCon) { PsContextPrivPtr pConPriv = (PsContextPrivPtr)pCon->devPrivates[PsContextPrivateIndex].ptr; - + if( pConPriv->pJobFile!=(FILE *)NULL ) { fclose(pConPriv->pJobFile); @@ -388,6 +396,11 @@ PsDestroyContext(pCon) pConPriv->jobFileName = (char *)NULL; } + PsFreeFontInfoRecords(pConPriv); + + /* Reset context to make sure we do not use any stale/invalid/obsolete data */ + memset(pConPriv, 0, sizeof(PsContextPrivRec)); + /*### free up visuals/depths ###*/ return Success; diff --git a/Xprint/ps/PsLine.c b/Xprint/ps/PsLine.c index dd01fcb65..23e105804 100644 --- a/Xprint/ps/PsLine.c +++ b/Xprint/ps/PsLine.c @@ -73,7 +73,6 @@ in this Software without prior written authorization from The Open Group. ** ********************************************************* ** ********************************************************************/ -/* $XFree86: xc/programs/Xserver/Xprint/ps/PsLine.c,v 1.5 2001/01/17 22:36:32 dawes Exp $ */ #include "Ps.h" #include "gcstruct.h" diff --git a/Xprint/ps/PsMisc.c b/Xprint/ps/PsMisc.c index 3085888c7..86d862ce1 100644 --- a/Xprint/ps/PsMisc.c +++ b/Xprint/ps/PsMisc.c @@ -73,7 +73,6 @@ in this Software without prior written authorization from The Open Group. ** ********************************************************* ** ********************************************************************/ -/* $XFree86: xc/programs/Xserver/Xprint/ps/PsMisc.c,v 1.5 2001/01/17 22:36:32 dawes Exp $ */ #include "Xos.h" /* for SIGCLD on pre-POSIX systems */ #include diff --git a/Xprint/ps/PsPixel.c b/Xprint/ps/PsPixel.c index 303b0d5ec..c2c360d2e 100644 --- a/Xprint/ps/PsPixel.c +++ b/Xprint/ps/PsPixel.c @@ -73,7 +73,6 @@ in this Software without prior written authorization from The Open Group. ** ********************************************************* ** ********************************************************************/ -/* $XFree86: xc/programs/Xserver/Xprint/ps/PsPixel.c,v 1.5 2001/01/17 22:36:32 dawes Exp $ */ #include diff --git a/Xprint/ps/PsPixmap.c b/Xprint/ps/PsPixmap.c index a020aba22..2c3e43245 100644 --- a/Xprint/ps/PsPixmap.c +++ b/Xprint/ps/PsPixmap.c @@ -57,7 +57,7 @@ in this Software without prior written authorization from The Open Group. * or other dealings in this Software without prior written authorization * from said copyright holders. */ -/* $XFree86: xc/programs/Xserver/Xprint/ps/PsPixmap.c,v 1.4 2001/01/17 22:36:32 dawes Exp $ */ + /******************************************************************* ** ** ********************************************************* @@ -79,6 +79,10 @@ in this Software without prior written authorization from The Open Group. #include "Ps.h" +#define BitsPerPixel(d) (\ + (1 << PixmapWidthPaddingInfo[d].padBytesLog2) * 8 / \ + (PixmapWidthPaddingInfo[d].padRoundUp+1)) + PixmapPtr PsCreatePixmap( ScreenPtr pScreen, @@ -199,7 +203,7 @@ PsGetFreeDisplayBlock(PsPixmapPrivPtr priv) return(disp); } -static void +void PsReplay(DisplayElmPtr elm, DrawablePtr pDrawable) { switch(elm->type) @@ -488,8 +492,6 @@ PsCreateFillElementList(PixmapPtr pix, int *nElms) case PolyFillArcCmd: *nElms += elm->c.arcs.nArcs; break; - default: - break; } } } @@ -552,8 +554,6 @@ PsCreateFillElementList(PixmapPtr pix, int *nElms) *nElms += 1; } break; - default: - break; } } } diff --git a/Xprint/ps/PsPolygon.c b/Xprint/ps/PsPolygon.c index d334c7778..a5b373775 100644 --- a/Xprint/ps/PsPolygon.c +++ b/Xprint/ps/PsPolygon.c @@ -73,7 +73,6 @@ in this Software without prior written authorization from The Open Group. ** ********************************************************* ** ********************************************************************/ -/* $XFree86: xc/programs/Xserver/Xprint/ps/PsPolygon.c,v 1.6 2001/01/17 22:36:32 dawes Exp $ */ #include "Ps.h" #include "gcstruct.h" @@ -176,7 +175,8 @@ PsFillPolygon( } else { - pts[0].x = pPoints[0].x; pts[0].y = pPoints[0].y; + i = 0; + pts[0].x = pPoints[i].x; pts[0].y = pPoints[i].y; for( i=1 ; i #include @@ -91,6 +90,7 @@ in this Software without prior written authorization from The Open Group. #include "Ps.h" #include "windowstr.h" +#include "attributes.h" #include "Oid.h" /* static utility function to get document/page attributes */ @@ -206,6 +206,8 @@ PsEndJob( unlink(priv->jobFileName); xfree(priv->jobFileName); priv->jobFileName = (char *)NULL; + + PsFreeFontInfoRecords(priv); return Success; } @@ -214,6 +216,7 @@ PsEndJob( * Append any trailing information here */ PsOut_EndFile(priv->pPsOut, 0); + priv->pPsOut = NULL; /* this is where we find out if we're out of space */ error = (fclose(priv->pJobFile) == EOF); @@ -233,6 +236,8 @@ PsEndJob( xfree(priv->jobFileName); priv->jobFileName = (char *)NULL; + PsFreeFontInfoRecords(priv); + return BadAlloc; } @@ -265,10 +270,12 @@ PsEndJob( xfree(priv->jobFileName); priv->jobFileName = (char *)NULL; + PsFreeFontInfoRecords(priv); + #ifdef BM_CACHE PsBmClearImageCache(); #endif - + return r; } @@ -281,10 +288,13 @@ PsStartPage( { int iorient, iplex, icount, ires; unsigned short iwd, iht; + register WindowPtr pChild; PsContextPrivPtr pConPriv = (PsContextPrivPtr)pCon->devPrivates[PsContextPrivateIndex].ptr; PsWindowPrivPtr pWinPriv = (PsWindowPrivPtr)pWin->devPrivates[PsWindowPrivateIndex].ptr; + char s[80]; + xEvent event; /* * Put a pointer to the context in the window private structure @@ -298,9 +308,16 @@ PsStartPage( * Start the page */ if (pConPriv->pPsOut == NULL) { - pConPriv->pPsOut = PsOut_BeginFile(pConPriv->pJobFile, - iorient, icount, iplex, ires, - (int)iwd, (int)iht, False); + char *title; + + /* get job level attributes */ + title = XpGetOneAttribute(pCon, XPJobAttr, "job-name"); + + pConPriv->pPsOut = PsOut_BeginFile(pConPriv->pJobFile, + title, iorient, icount, iplex, ires, + (int)iwd, (int)iht, False); + pConPriv->fontInfoRecords = NULL; + pConPriv->fontTypeInfoRecords = NULL; } PsOut_BeginPage(pConPriv->pPsOut, iorient, icount, iplex, ires, (int)iwd, (int)iht); @@ -348,15 +365,22 @@ PsStartDoc(XpContextPtr pCon, XPDocumentType type) { int iorient, iplex, icount, ires; unsigned short iwd, iht; + char *title; PsContextPrivPtr pConPriv = (PsContextPrivPtr)pCon->devPrivates[PsContextPrivateIndex].ptr; + /* get job level attributes */ + title = XpGetOneAttribute(pCon, XPJobAttr, "job-name"); + /* get document level attributes */ S_GetPageAttributes(pCon,&iorient,&icount,&iplex,&ires,&iwd,&iht); pConPriv->pPsOut = PsOut_BeginFile(pConPriv->pJobFile, - iorient, icount, iplex, ires, - (int)iwd, (int)iht, (type == XPDocRaw)); + title, iorient, icount, iplex, ires, + (int)iwd, (int)iht, (Bool)(type == XPDocRaw)); + + pConPriv->fontInfoRecords = NULL; + pConPriv->fontTypeInfoRecords = NULL; return Success; } @@ -391,8 +415,11 @@ PsDocumentData( PsContextPrivPtr cPriv; PsOutPtr psOut; - if (len_fmt != 12 || !strcmp(pFmt, "PostScript 2") || len_opt) + if (len_fmt != 12 || + strncasecmp(pFmt, "PostScript 2", len_fmt) != 0 || + len_opt) return BadValue; + cPriv = pCon->devPrivates[PsContextPrivateIndex].ptr; psOut = cPriv->pPsOut; diff --git a/Xprint/ps/PsText.c b/Xprint/ps/PsText.c index ae44b3f1c..8bb0b0fb2 100644 --- a/Xprint/ps/PsText.c +++ b/Xprint/ps/PsText.c @@ -73,49 +73,13 @@ in this Software without prior written authorization from The Open Group. ** ********************************************************* ** ********************************************************************/ -/* $XFree86: xc/programs/Xserver/Xprint/ps/PsText.c,v 1.12tsi Exp $ */ #include "Ps.h" #include "gcstruct.h" #include "windowstr.h" +#include "fntfil.h" #include "fntfilst.h" -#include - -static int readFontName(char *fileName, char *file_name, char *dlfnam) -{ - FILE *file; - struct stat statb; - char buf[256]; - char *front, *fn; - - file = fopen(fileName, "r"); - if(file) - { - if (fstat (fileno(file), &statb) == -1) - return 0; - while(fgets(buf, 255, file)) - { - if((fn = strstr(buf, " -"))) - { - strcpy(file_name, buf); - file_name[fn - buf - 4] = '\0'; - fn++; - if((front = strstr(fn, "normal-"))) - { - fn[front - fn] = '\0'; - if(strstr(dlfnam, fn)) - { - fclose(file); - return 1; - } - } - } - } - } - file_name[0] = '\0'; - fclose(file); - return 0; -} +#include int PsPolyText8( @@ -147,70 +111,97 @@ PsPolyText8( elm->c.text8.string = (char *)xalloc(count); memcpy(elm->c.text8.string, string, count); disp->nelms += 1; + + return x; } else { - char *fnam, ffname[512], *dlfnam; - FontDirectoryPtr dir; - char file_name[MAXFONTNAMELEN]; + PsFontInfoRec *firec; - dir = pGC->font->fpe->private; - sprintf(ffname, "%s%s", dir->directory, "fonts.dir"); + /* We need a context for rendering... */ + if (PsGetPsContextPriv(pDrawable) == NULL) + return x; - fnam = PsGetPSFontName(pGC->font); - if(!fnam){ - if(!(dlfnam = PsGetFontName(pGC->font))) - return x; - /* If Type1 font, try to download to printer first */ - if(strstr(ffname, "Type1") && readFontName(ffname, file_name, dlfnam)) - { - int siz; - float mtx[4]; - PsOutPtr psOut; - ColormapPtr cMap; + firec = PsGetFontInfoRec(pDrawable, pGC->font); + if (!firec) + return x; - if( PsUpdateDrawableGC(pGC, pDrawable, &psOut, &cMap)==FALSE ) - return x; - sprintf(ffname, "%s%s%s", dir->directory, file_name, ".pfa"); - PsOut_DownloadType1(psOut, file_name, ffname); - PsOut_Offset(psOut, pDrawable->x, pDrawable->y); - PsOut_Color(psOut, PsGetPixelColor(cMap, pGC->fgPixel)); - siz = PsGetFontSize(pGC->font, mtx); - if( !siz ) PsOut_TextAttrsMtx(psOut, file_name, mtx, 1); - else PsOut_TextAttrs(psOut, file_name, siz, 1); - PsOut_Text(psOut, x, y, string, count, -1); - return x; - } - { - unsigned long n, i; - int w; - CharInfoPtr charinfo[255]; +#ifdef XP_USE_FREETYPE + if (firec->ftir->downloadableFont && + (firec->ftir->font_type == PSFTI_FONT_TYPE_FREETYPE)) + { + PsOutPtr psOut; + ColormapPtr cMap; + + if( PsUpdateDrawableGC(pGC, pDrawable, &psOut, &cMap)==FALSE ) + return x; - GetGlyphs(pGC->font, (unsigned long)count, - (unsigned char *)string, Linear8Bit,&n, charinfo); - w = 0; - for (i=0; i < n; i++) w += charinfo[i]->metrics.characterWidth; - if (n != 0) - PsPolyGlyphBlt(pDrawable, pGC, x, y, n, - charinfo, FONTGLYPHS(pGC->font)); - x += w; - } - }else{ - int iso; - int siz; - float mtx[4]; - PsOutPtr psOut; - ColormapPtr cMap; + if (firec->ftir->alreadyDownloaded[0] == False) + { + PsOut_DownloadFreeType(psOut, + firec->ftir->ft_download_font_type, + firec->ftir->download_ps_name, pGC->font, 0); + firec->ftir->alreadyDownloaded[0] = True; + } - if( PsUpdateDrawableGC(pGC, pDrawable, &psOut, &cMap)==FALSE ) return x; - PsOut_Offset(psOut, pDrawable->x, pDrawable->y); - PsOut_Color(psOut, PsGetPixelColor(cMap, pGC->fgPixel)); - siz = PsGetFontSize(pGC->font, mtx); - iso = PsIsISOLatin1Encoding(pGC->font); - if( !siz ) PsOut_TextAttrsMtx(psOut, fnam, mtx, iso); - else PsOut_TextAttrs(psOut, fnam, siz, iso); - PsOut_Text(psOut, x, y, string, count, -1); + PsOut_Offset(psOut, pDrawable->x, pDrawable->y); + PsOut_Color(psOut, PsGetPixelColor(cMap, pGC->fgPixel)); + if (!firec->size) + PsOut_TextAttrsMtx(psOut, firec->ftir->download_ps_name, firec->mtx, firec->ftir->is_iso_encoding); + else + PsOut_TextAttrs(psOut, firec->ftir->download_ps_name, firec->size, firec->ftir->is_iso_encoding); + PsOut_FreeType_Text(pGC->font, psOut, x, y, string, count); + + return x; } + else +#endif /* XP_USE_FREETYPE */ + if (firec->ftir->downloadableFont && + (firec->ftir->font_type != PSFTI_FONT_TYPE_FREETYPE)) + { + PsOutPtr psOut; + ColormapPtr cMap; + + if( PsUpdateDrawableGC(pGC, pDrawable, &psOut, &cMap)==FALSE ) + return x; + + if (firec->ftir->alreadyDownloaded[0] == False) + { + PsOut_DownloadType1(psOut, "PsPolyText8", + firec->ftir->download_ps_name, firec->ftir->filename); + firec->ftir->alreadyDownloaded[0] = True; + } + + PsOut_Offset(psOut, pDrawable->x, pDrawable->y); + PsOut_Color(psOut, PsGetPixelColor(cMap, pGC->fgPixel)); + if (!firec->size) + PsOut_TextAttrsMtx(psOut, firec->ftir->download_ps_name, firec->mtx, firec->ftir->is_iso_encoding); + else + PsOut_TextAttrs(psOut, firec->ftir->download_ps_name, firec->size, firec->ftir->is_iso_encoding); + PsOut_Text(psOut, x, y, string, count, -1); + + return x; + } + + /* Render glyphs as bitmaps */ + { + unsigned long n, i; + int w; + CharInfoPtr charinfo[255]; + + GetGlyphs(pGC->font, (unsigned long)count, + (unsigned char *)string, Linear8Bit, &n, charinfo); + w = 0; + for (i=0; i < n; i++) + w += charinfo[i]->metrics.characterWidth; + + if (n != 0) + PsPolyGlyphBlt(pDrawable, pGC, x, y, n, + charinfo, FONTGLYPHS(pGC->font)); + x += w; + + return x; + } } return x; } @@ -246,21 +237,136 @@ PsPolyText16( (unsigned short *)xalloc(count*sizeof(unsigned short)); memcpy(elm->c.text16.string, string, count*sizeof(unsigned short)); disp->nelms += 1; + + return x; } else { - unsigned long n, i; - int w; - CharInfoPtr charinfo[255]; /* encoding only has 1 byte for count */ + PsFontInfoRec *firec; - GetGlyphs(pGC->font, (unsigned long)count, (unsigned char *)string, - (FONTLASTROW(pGC->font) == 0) ? Linear16Bit : TwoD16Bit, - &n, charinfo); - w = 0; - for (i=0; i < n; i++) w += charinfo[i]->metrics.characterWidth; - if (n != 0) - PsPolyGlyphBlt(pDrawable, pGC, x, y, n, charinfo, FONTGLYPHS(pGC->font)); - x += w; + /* We need a context for rendering... */ + if (PsGetPsContextPriv(pDrawable) == NULL) + return x; + + firec = PsGetFontInfoRec(pDrawable, pGC->font); + if (!firec) + return x; + +#ifdef XP_USE_FREETYPE + if (firec->ftir->downloadableFont && + (firec->ftir->font_type == PSFTI_FONT_TYPE_FREETYPE)) + { + PsOutPtr psOut; + ColormapPtr cMap; + unsigned short c, + c_hiByte, + c_lowByte, + fontPage; + int i; + + if( PsUpdateDrawableGC(pGC, pDrawable, &psOut, &cMap)==FALSE ) + return x; + + /* Scan the string we want to render and download all neccesary parts + * of the font (one part(="font page") has 256 glyphs) + */ + for( i = 0 ; i < count ; i++ ) + { + c = string[i]; +#if IMAGE_BYTE_ORDER == LSBFirst + c_hiByte = c & 0x00FF; + c_lowByte = (c >> 8) & 0x00FF; +#elif IMAGE_BYTE_ORDER == MSBFirst + c_hiByte = (c >> 8) & 0x00FF; + c_lowByte = c & 0x00FF; +#else +#error Unsupported byte order +#endif + fontPage = c_hiByte; + + if (firec->ftir->alreadyDownloaded[fontPage] == False) + { + char buffer[256]; + const char *ps_name; + + if (fontPage > 0) + { + sprintf(buffer, "%s_%x", firec->ftir->download_ps_name, (int)fontPage); + ps_name = buffer; + } + else + { + ps_name = firec->ftir->download_ps_name; + } + + PsOut_DownloadFreeType(psOut, + firec->ftir->ft_download_font_type, + ps_name, pGC->font, (fontPage * 0x100)); /* same as (fontPage << 8) */ + + firec->ftir->alreadyDownloaded[fontPage] = True; + } + } + + + PsOut_Offset(psOut, pDrawable->x, pDrawable->y); + PsOut_Color(psOut, PsGetPixelColor(cMap, pGC->fgPixel)); + if (!firec->size) + PsOut_FreeType_TextAttrsMtx16(psOut, firec->ftir->download_ps_name, firec->mtx, firec->ftir->is_iso_encoding); + else + PsOut_FreeType_TextAttrs16(psOut, firec->ftir->download_ps_name, firec->size, firec->ftir->is_iso_encoding); + PsOut_FreeType_Text16(pGC->font, psOut, x, y, string, count); + + return x; + } + else +#endif /* XP_USE_FREETYPE */ + if (firec->ftir->downloadableFont && + (firec->ftir->font_type != PSFTI_FONT_TYPE_FREETYPE)) + { + PsOutPtr psOut; + ColormapPtr cMap; + unsigned short c, + c_hiByte, + c_lowByte, + fontPage; + int i; + + if( PsUpdateDrawableGC(pGC, pDrawable, &psOut, &cMap)==FALSE ) + return x; + + PsOut_DownloadType1(psOut, "PsPolyText16", + firec->ftir->download_ps_name, firec->ftir->filename); + firec->ftir->alreadyDownloaded[fontPage] = True; + + PsOut_Offset(psOut, pDrawable->x, pDrawable->y); + PsOut_Color(psOut, PsGetPixelColor(cMap, pGC->fgPixel)); + if (!firec->size) + PsOut_TextAttrsMtx(psOut, firec->ftir->download_ps_name, firec->mtx, firec->ftir->is_iso_encoding); + else + PsOut_TextAttrs(psOut, firec->ftir->download_ps_name, firec->size, firec->ftir->is_iso_encoding); + PsOut_Text16(psOut, x, y, string, count, -1); + + return x; + } + + /* Render glyphs as bitmaps */ + { + unsigned long n, i; + int w; + CharInfoPtr charinfo[255]; /* encoding only has 1 byte for count */ + + GetGlyphs(pGC->font, (unsigned long)count, (unsigned char *)string, + (FONTLASTROW(pGC->font) == 0) ? Linear16Bit : TwoD16Bit, + &n, charinfo); + w = 0; + for (i=0; i < n; i++) + w += charinfo[i]->metrics.characterWidth; + if (n != 0) + PsPolyGlyphBlt(pDrawable, pGC, x, y, n, charinfo, FONTGLYPHS(pGC->font)); + x += w; + + return x; + } } return x; } @@ -386,7 +492,7 @@ PsPolyGlyphBlt( pointer pGlyphBase) { int width, height; - PixmapPtr pPixmap = NullPixmap; + PixmapPtr pPixmap; int nbyLine; /* bytes per line of padded pixmap */ FontPtr pfont; GCPtr pGCtmp; @@ -399,7 +505,7 @@ PsPolyGlyphBlt( int gWidth, gHeight; /* width and height of glyph */ register int nbyGlyphWidth; /* bytes per scanline of glyph */ int nbyPadGlyph; /* server padded line of glyph */ - int w; + int w, tmpx; XID gcvals[3]; pfont = pGC->font; @@ -435,6 +541,7 @@ PsPolyGlyphBlt( PsDestroyPixmap(pPixmap); return; } + tmpx = 0; while(nGlyphs--) { pci = *pCharInfo++; @@ -466,8 +573,9 @@ PsPolyGlyphBlt( 1, x + pci->metrics.leftSideBearing, y - pci->metrics.ascent, gWidth, gHeight, 0, XYBitmap, (char *)pb); - x += pci->metrics.characterWidth; } + + x += pci->metrics.characterWidth; } DEALLOCATE_LOCAL(pbits); FreeScratchGC(pGCtmp); diff --git a/Xprint/ps/PsWindow.c b/Xprint/ps/PsWindow.c index 987d434ff..3a9a7ed2a 100644 --- a/Xprint/ps/PsWindow.c +++ b/Xprint/ps/PsWindow.c @@ -73,11 +73,9 @@ in this Software without prior written authorization from The Open Group. ** ********************************************************* ** ********************************************************************/ -/* $XFree86: xc/programs/Xserver/Xprint/ps/PsWindow.c,v 1.12tsi Exp $ */ #include #include -#include #include #include "mistruct.h" @@ -87,7 +85,8 @@ in this Software without prior written authorization from The Open Group. #include "Ps.h" -#if 0 +extern WindowPtr *WindowTable; + /* * The following list of strings defines the properties which will be * placed on the screen's root window if the property was defined in @@ -104,7 +103,7 @@ static char *propStrings[] = { DT_PRINT_PAGE_COMMAND, (char *)NULL }; -#endif + /* * PsCreateWindow - watch for the creation of the root window. @@ -219,6 +218,8 @@ PsPaintWindow( RegionPtr pRegion, int what) { + int status; + WindowPtr pRoot; #define FUNCTION 0 #define FOREGROUND 1 @@ -298,6 +299,7 @@ PsPaintWindow( gcmask |= GCFunction | GCClipMask; i = pScreen->myNum; + pRoot = WindowTable[i]; pBgWin = pWin; if (what == PW_BORDER) @@ -375,14 +377,14 @@ PsPaintWindow( } break; case GCClipMask: - if( (pointer)(long)pGC->clientClipType!=(pointer)CT_NONE ) + if( (pointer)pGC->clientClipType!=(pointer)CT_NONE ) { gcmask |= index; gcval[i++] = (pointer)CT_NONE; } break; case GCSubwindowMode: - if( (pointer)(long)pGC->subWindowMode!=newValues[SUBWINDOW] ) + if( (pointer)pGC->subWindowMode!=newValues[SUBWINDOW] ) { gcmask |= index; gcval[i++] = newValues[SUBWINDOW]; @@ -396,7 +398,7 @@ PsPaintWindow( } break; case GCFillStyle: - if( (pointer)(long)pGC->fillStyle!=newValues[FILLSTYLE] ) + if( (pointer)pGC->fillStyle!=newValues[FILLSTYLE] ) { gcmask |= index; gcval[i++] = newValues[FILLSTYLE]; diff --git a/Xprint/ps/psout.c b/Xprint/ps/psout.c index 6b4c71a2b..943320197 100644 --- a/Xprint/ps/psout.c +++ b/Xprint/ps/psout.c @@ -73,79 +73,17 @@ in this Software without prior written authorization from The Open Group. ** ********************************************************* ** ********************************************************************/ -/* $XFree86: xc/programs/Xserver/Xprint/ps/psout.c,v 1.11 2001/12/19 21:55:59 dawes Exp $ */ - -/* - * For XFree86 3.3.3: - * - * As a *quick* way of preventing some buffers overflowing onto the stack, - * they have been made static. There are potential problems with - * PsOutRec.Buf overflowing too which should be investigated as part of a - * review of this code, but that is at least always allocated with malloc - * and shouldn't pose an immediate stack trashing problem. - * - */ #include +#include #include "os.h" -#include "Ps.h" +#define USE_PSOUT_PRIVATE 1 #include "psout.h" +/* For VENDOR_STRING and VENDOR_RELEASE */ +#include "site.h" -typedef void *voidPtr; - -typedef struct PsPatRec_ -{ - PsFillEnum type; - voidPtr tag; -} PsPatRec; - -typedef PsPatRec *PsPatPtr; - -typedef struct PsOutRec_ -{ - FILE *Fp; - char Buf[256]; - int CurColor; - int LineWidth; - PsCapEnum LineCap; - PsJoinEnum LineJoin; - int NDashes; - int *Dashes; - int DashOffset; - int LineBClr; - PsRuleEnum FillRule; - char *FontName; - int FontSize; - float FontMtx[4]; - int ImageFormat; - int RevImage; - int NPatterns; - int MxPatterns; - PsPatPtr Patterns; - int ClipType; - PsClipRec Clip; - int InFrame; - int XOff; - int YOff; - - PsFillEnum InTile; - int ImgSkip; - int ImgBClr; - int ImgFClr; - int ImgX; - int ImgY; - int ImgW; - int ImgH; - int SclW; - int SclH; - - int NDownloads; - int MxDownloads; - char **Downloads; - Bool isRaw; - - int start_image; -} PsOutRec; +extern PsElmPtr PsCloneFillElementList(int nElms, PsElmPtr elms); +extern void PsDestroyFillElementList(int nElms, PsElmPtr elms); /* * Standard definitions @@ -174,6 +112,7 @@ static char *S_StandardDefs = "\ /ie{ifelse}bd\ /len{length}bd\ /m{moveto}bd\ +/rm{rmoveto}bd\ /l{lineto}bd\ /rl{rlineto}bd\ /a{arc}bd\ @@ -236,7 +175,11 @@ static char *S_StandardDefs = "\ /mp{makepattern}bd\ /spt{setpattern}bd\ /spd{setpagedevice}bd\ -"; +" +#ifdef XP_USE_FREETYPE +"/trmoveto{currentfont /FontMatrix get transform rm}d" +#endif /* XP_USE_FREETYPE */ +; /* * Composite definitions @@ -341,7 +284,6 @@ static char *S_CompositeDefs = "\ /mtx{scl t [3 i 0 0 5 i 0 0]}bd \ "; -int pagenum = 0; char *pg_orient[] = {"Portrait","Landscape","Reverse Portrait","Reverse Landscape"}; /* * Setup definitions @@ -360,7 +302,7 @@ static char *S_SetupDefs = "\ * PRIVATE FUNCTIONS * *******************************************************************/ -static void +void S_Flush(PsOutPtr self) { if( self->Buf[0] ) @@ -388,7 +330,7 @@ S_OutDefs(PsOutPtr self, char *defs) { int i, k=0; S_Flush(self); - memset(self->Buf, 0, 256); + memset(self->Buf, 0, sizeof(self->Buf)); for( i=0 ; defs[i]!='\0' ;) { if( k>70 && (i==0 || (i && defs[i-1]!='/')) && @@ -396,7 +338,7 @@ S_OutDefs(PsOutPtr self, char *defs) { S_Flush(self); k = 0; - memset(self->Buf, 0, 256); + memset(self->Buf, 0, sizeof(self->Buf)); } if( k && self->Buf[k-1]==' ' && defs[i]==' ' ) { i++; continue; } self->Buf[k] = defs[i]; @@ -405,11 +347,11 @@ S_OutDefs(PsOutPtr self, char *defs) S_Flush(self); } -static void +void S_OutNum(PsOutPtr self, float num) { int i; - static char buf[64]; + char buf[64]; sprintf(buf, "%.3f", num); for( i=strlen(buf)-1 ; buf[i]=='0' ; i-- ); buf[i+1] = '\0'; if( buf[strlen(buf)-1]=='.' ) buf[strlen(buf)-1] = '\0'; @@ -422,7 +364,7 @@ static void S_OutStr(PsOutPtr self, char *txt, int txtl) { int i, k; - static char buf[512]; + char buf[1024]; for( i=0,k=0 ; i=' ' && txt[i]<='~') && @@ -430,7 +372,9 @@ S_OutStr(PsOutPtr self, char *txt, int txtl) { buf[k] = txt[i]; k++; continue; } buf[k] = '\\'; k++; sprintf(&buf[k], "%03o", txt[i]&0xFF); - k += 3; + /* Skip to the end of the buffer */ + while( buf[k] != '\0' ) + k++; } strcat(self->Buf, "("); i = strlen(self->Buf); @@ -440,7 +384,32 @@ S_OutStr(PsOutPtr self, char *txt, int txtl) if( strlen(self->Buf)>70 ) S_Flush(self); } +/* Same as S_OutStr() but takes |short *| instead of |char *| */ static void +S_OutStr16(PsOutPtr self, unsigned short *txt, int txtl) +{ + int i, k; + char buf[2048]; + for( i=0,k=0 ; i=' ' && txt[i]<='~') && + txt[i]!='(' && txt[i]!=')' && txt[i]!='\\' ) + { buf[k] = txt[i]; k++; continue; } + buf[k] = '\\'; k++; + sprintf(&buf[k], "%03o", txt[i]&0xFFFF); + /* Skip to the end of the buffer */ + while( buf[k] != '\0' ) + k++; + } + strcat(self->Buf, "("); + i = strlen(self->Buf); + memcpy(&self->Buf[i], buf, k); + self->Buf[i+k] = '\0'; + strcat(self->Buf, ")"); + if( strlen(self->Buf)>70 ) S_Flush(self); +} + +void S_OutTok(PsOutPtr self, char *tok, int cr) { if( self->Buf[0] ) strcat(self->Buf, " "); @@ -471,6 +440,27 @@ S_SetPageDevice(PsOutPtr self, int orient, int count, int plex, int res, float fwd = ((float)wd/(float)res)*72.; float fht = ((float)ht/(float)res)*72.; +#define USE_WORKAROUND_COPY_COUNT_BUG 1 + +#ifdef USE_WORKAROUND_COPY_COUNT_BUG + /* Workaround (see http://xprint.mozdev.org/bugs/show_bug.cgi?id=1861 - + * 'Need workaround for bug 1378 ...') to avoid that we print n^2 copies + * instead of n copies. + * The problem is that we use both /NumCopies here but pass the + * %copy-count% to the spooler, too. + * But we only have to use _one_ way... + * + * The final fix for bug 1378 (http://xprint.mozdev.org/bugs/show_bug.cgi?id=1378 - + * "PS DDX creates n^2 copies of a job instead of n copies") will back this + * workaround out and replace it with a better solution. + * (see mozilla.org bug 140030 + * (http://bugzilla.mozilla.org/show_bug.cgi?id=140030 - "Setting number + * of copies causes too many copies to print") for the initial report for + * this issue...) + */ + count = 1; +#endif /* USE_WORKAROUND_COPY_COUNT_BUG */ + S_OutTok(self, "/pWd", 0); S_OutNum(self, fwd); S_OutTok(self, "d /pHt", 0); @@ -577,10 +567,11 @@ PsOut_ChangeFile(PsOutPtr self, FILE *fp) } PsOutPtr -PsOut_BeginFile(FILE *fp, int orient, int count, int plex, int res, +PsOut_BeginFile(FILE *fp, char *title, int orient, int count, int plex, int res, int wd, int ht, Bool raw) { int i; + char buffer[256+32]; /* enougth space for a title with 256 chars... */ /* * Get ready to output PostScript header */ @@ -589,15 +580,25 @@ PsOut_BeginFile(FILE *fp, int orient, int count, int plex, int res, memset(psout, 0, sizeof(PsOutRec)); psout->Fp = fp; psout->isRaw = raw; - pagenum = 0; + psout->pagenum = 0; if (!raw) { /* * Output PostScript header */ - S_Comment(psout, "%!PS-Adobe-3.0 EPSF-3.0"); - S_Comment(psout, "%%Creator: The Open Group PostScript Print Server"); - /*### BoundingBox ###*/ + /* GhostScript will rant about the missing BoundingBox if we use + * "%!PS-Adobe-3.0 EPSF-3.0" here... */ + S_Comment(psout, "%!PS-Adobe-3.0"); + sprintf(buffer, + "%%%%Creator: The X Print Server's PostScript DDX (%s, release %d)", + VENDOR_STRING, VENDOR_RELEASE); + S_Comment(psout, buffer); + + if (title) + { + sprintf(buffer, "%%%%Title: %.256s", title); + S_Comment(psout, buffer); + } S_Comment(psout, "%%EndComments"); S_Comment(psout, "%%BeginProlog"); S_Comment(psout, "%%BeginProcSet: XServer_PS_Functions"); @@ -634,10 +635,13 @@ PsOut_EndFile(PsOutPtr self, int closeFile) { char coms[50]; int i; + + if (!self) + return; if (!self->isRaw) { S_Comment(self,"%%Trailer"); - sprintf(coms,"%%%%Pages: %d",pagenum); + sprintf(coms,"%%%%Pages: %d", self->pagenum); S_Comment(self, coms); S_Comment(self, "%%EOF"); } @@ -646,9 +650,6 @@ PsOut_EndFile(PsOutPtr self, int closeFile) if( self->Patterns ) xfree(self->Patterns); if( self->Clip.rects ) xfree(self->Clip.rects); if( closeFile ) fclose(self->Fp); - for( i=0 ; iNDownloads ; i++ ) xfree(self->Downloads[i]); - if( self->Downloads ) xfree(self->Downloads); - pagenum = 0; /* reset page num back to 0 */ xfree(self); } @@ -661,8 +662,8 @@ PsOut_BeginPage(PsOutPtr self, int orient, int count, int plex, int res, /*** comment for pagenumbers *****/ S_Comment(self,"%%PageHeader"); - pagenum++; - sprintf(coms,"%%%%Page: %d %d",pagenum,pagenum); + self->pagenum++; + sprintf(coms,"%%%%Page: %d %d", self->pagenum, self->pagenum); S_Comment(self, coms); sprintf(coms,"%%%%PageOrientation: %s",pg_orient[orient]); S_Comment(self, coms); @@ -959,7 +960,7 @@ void PsOut_TextAttrs(PsOutPtr self, char *fnam, int siz, int iso) { int i; - static char buf[256]; + char buf[256]; if( self->FontName && strcmp(fnam, self->FontName)==0 && siz==self->FontSize ) return; if( self->FontName ) xfree(self->FontName); @@ -979,7 +980,7 @@ void PsOut_TextAttrsMtx(PsOutPtr self, char *fnam, float *mtx, int iso) { int i; - static char buf[256]; + char buf[256]; if( self->FontName && strcmp(fnam, self->FontName)==0 && mtx[0]==self->FontMtx[0] && mtx[1]==self->FontMtx[1] && mtx[2]==self->FontMtx[2] && mtx[3]==self->FontMtx[3] ) return; @@ -1171,6 +1172,30 @@ PsOut_Text(PsOutPtr self, int x, int y, char *text, int textl, int bclr) } } +void +PsOut_Text16(PsOutPtr self, int x, int y, unsigned short *text, int textl, int bclr) +{ + int xo = self->XOff; + int yo = self->YOff; + + if( self->InFrame || self->InTile ) xo = yo = 0; + x += xo; y += yo; + S_OutStr16(self, text, textl); + S_OutNum(self, (float)x); + S_OutNum(self, (float)y); + if( bclr<0 ) S_OutTok(self, "T", 1); + else + { + int ir = bclr>>16; + int ig = (bclr>>8)&0xFF; + int ib = bclr&0xFF; + S_OutNum(self, (float)ir/255.); + S_OutNum(self, (float)ig/255.); + S_OutNum(self, (float)ib/255.); + S_OutTok(self, "Tb", 1); + } +} + #ifdef BM_CACHE void /* new */ PsOut_ImageCache(PsOutPtr self, int x, int y, long cache_id, int bclr, int fclr) @@ -1181,7 +1206,7 @@ PsOut_ImageCache(PsOutPtr self, int x, int y, long cache_id, int bclr, int fclr) if( self->InFrame || self->InTile ) xo = yo = 0; x += xo; y += yo; - sprintf(cacheID, "c%ldi", cache_id); + sprintf(cacheID, "c%di", cache_id); S_OutNum(self, (float)x); S_OutNum(self, (float)y); @@ -1214,7 +1239,7 @@ PsOut_BeginImageCache(PsOutPtr self, long cache_id) { char cacheID[10]; - sprintf(cacheID, "/c%ldi {", cache_id); + sprintf(cacheID, "/c%di {", cache_id); S_OutTok(self, cacheID, 0); } /* new */ @@ -1225,7 +1250,7 @@ PsOut_EndImageCache(PsOutPtr self) S_OutTok(self, "}bd", 1); } /* new */ #endif - + void PsOut_BeginImage(PsOutPtr self, int bclr, int fclr, int x, int y, int w, int h, int sw, int sh, int format) @@ -1488,13 +1513,11 @@ PsOut_BeginPattern(PsOutPtr self, void *tag, int w, int h, PsFillEnum type, } self->Patterns[self->NPatterns].tag = tag; self->Patterns[self->NPatterns].type = type; - sprintf(key, "/ %ld", (long)tag); + sprintf(key, "/ %d", (int)tag); switch(type) { case PsTile: key[1] = 't'; break; case PsStip: key[1] = 's'; break; - case PsOpStip: key[1] = 'o'; break; - default: break; - } + case PsOpStip: key[1] = 'o'; break; } S_OutTok(self, key, 0); S_OutTok(self, "db/PatternType 1 d/PaintType 1 d", 0); S_OutTok(self, "/TilingType 1 d/BBox[0 0", 0); @@ -1535,13 +1558,11 @@ PsOut_SetPattern(PsOutPtr self, void *tag, PsFillEnum type) for( i=0 ; iNPatterns ; i++ ) { if( tag==self->Patterns[i].tag && type==self->Patterns[i].type ) break; } if( i>=self->NPatterns ) return; - sprintf(key, " %ld", (long)tag); + sprintf(key, " %d", (int)tag); switch(type) { case PsTile: key[0] = 't'; break; case PsStip: key[0] = 's'; break; - case PsOpStip: key[0] = 'o'; break; - default: break; - } + case PsOpStip: key[0] = 'o'; break; } S_OutTok(self, key, 0); S_OutTok(self, "spt", 1); self->CurColor = 0xFFFFFFFF; @@ -1556,83 +1577,141 @@ PsOut_RawData(PsOutPtr self, char *data, int len) } } -void -PsOut_DownloadType1(PsOutPtr self, char *name, char *fname) +typedef enum PsDownfontFontType_ +{ + PsDFT_Type1PFA=0, + PsDFT_Type1PFB, + PsDFT_TrueType /* not implemented yet */ +} PsDownfontFontType; + +/* Download a PS Type1 font */ +int +PsOut_DownloadType1(PsOutPtr self, const char *auditmsg, const char *name, const char *fname) { int i; int stt; - static char buf[256]; + char buf[256]; FILE *fp; + PsDownfontFontType type; - for( i=0 ; iNDownloads ; i++ ) - { if( strcmp(name, self->Downloads[i])==0 ) break; } - if( iNDownloads ) return; + fp = fopen(fname, "r"); + if( !fp ) + return 0; - if( (self->NDownloads+1)>self->MxDownloads ) +#ifdef DEBUG_gisburn + /* This should be log-able! */ + fprintf(stderr, "PsOut_DownloadType1: %s: Downloading '%s' from '%s'\n", auditmsg, name, fname); +#endif /* DEBUG_gisburn */ + + fread(buf, 32, 1, fp); + fseek(fp, (long)0, 0); + + /* Is this a Adobe PostScript Type 1 binary font (PFB) ? */ + if( (buf[0]&0xFF)==0x80 && (buf[1]&0xFF)==0x01 ) { - if( self->NDownloads ) - { - self->MxDownloads *= 2; - self->Downloads = (char **)xrealloc(self->Downloads, - self->MxDownloads*sizeof(char *)); - } - else - { - self->MxDownloads = 32; - self->Downloads = (char **)xalloc(self->MxDownloads*sizeof(char *)); - } + type = PsDFT_Type1PFB; + } + /* Is this a Adobe PostScript ASCII font (PFA) ? */ + else if (!strncmp(buf, "%!PS-AdobeFont", 14)) + { + type = PsDFT_Type1PFA; } - - self->Downloads[self->NDownloads] = (char *)xalloc(strlen(name)+1); - strcpy(self->Downloads[self->NDownloads], name); - self->NDownloads += 1; + else + { + /* This should be log-able! */ + fprintf(stderr, "PsOut_DownloadType1: Unknown font type for '%s'\n", fname); + return 0; + } S_Flush(self); sprintf(buf, "%%%%BeginFont: %s", name); S_Comment(self, buf); - fp = fopen(fname, "r"); - if( !fp ) return; - fread(buf, 1, 1, fp); - fseek(fp, (long)0, 0); - if( (buf[0]&0xFF)==0x80 ) - { - int len; - for(;;) + if( type == PsDFT_Type1PFB ) + { + char *buf, + *pt; + int len, + ch, + stype; + + ch = fgetc(fp); + /* Strip out the binary headers and de-binary it */ + while( (ch&0xFF) == 0x80 ) { - stt = fread(buf, 1, 2, fp); - if( stt!=2 || (buf[0]&0xFF)!=0x80 ) break; - if( (int)buf[1]<1 || (int)buf[1]>2 ) break; - stt = fread(buf, 1, 4, fp); - if( stt!=4 ) break; - len = ((buf[3]&0xFF)<<24)|((buf[2]&0xFF)<<16)| - ((buf[1]&0xFF)<<8)|(buf[0]&0xFF); - for(; len ;) + stype = fgetc(fp); + if( stype==3 ) /* eof mark */ + break; + len = fgetc(fp); + len |= fgetc(fp)<<8; + len |= fgetc(fp)<<16; + len |= fgetc(fp)<<24; + buf = (char *)xalloc(len+1); + if( stype==1 ) { - i = len<256 ? len : 256; - stt = fread(buf, 1, i, fp); - if( stt<=0 ) break; - if (!ferror(self->Fp)) { - (void) fwrite(buf, 1, stt, self->Fp); - } - if( sttFp); + } + else if( stype==2 ) + { + int i; + + /* Process binary section */ + len = fread(buf, 1, len, fp); + for( i=0 ; i>4)&0xf) <= 9 ) + fputc('0'+((ch>>4)&0xf), self->Fp); + else + fputc('A'-10+((ch>>4)&0xf), self->Fp); + + if( (ch&0xf) <= 9 ) + fputc('0'+(ch&0xf), self->Fp); + else + fputc('A'-10+(ch&0xf), self->Fp); + + if( (i&0x1f)==0x1f ) + fputc('\n', self->Fp); + } } + xfree(buf); + + /* Next block... */ + ch = fgetc(fp); } } - else + /* Is this a Adobe PostScript ASCII font (PFA) ? */ + else if (type == PsDFT_Type1PFA) { for(;;) { stt = fread(buf, 1, 256, fp); if( stt<=0 ) break; if (!ferror(self->Fp)) { - (void) fwrite(buf, 1, stt, self->Fp); + (void) fwrite(buf, 1, stt, self->Fp); } - if( stt<256 ) break; + if( stt<256 ) + break; } } fclose(fp); S_Flush(self); S_Comment(self, "%%EndFont"); + + /* Success... */ + return 1; } + + + + + + diff --git a/Xprint/ps/psout.h b/Xprint/ps/psout.h index 37b089ece..c592d7250 100644 --- a/Xprint/ps/psout.h +++ b/Xprint/ps/psout.h @@ -57,7 +57,6 @@ in this Software without prior written authorization from The Open Group. * or other dealings in this Software without prior written authorization * from said copyright holders. */ -/* $XFree86: xc/programs/Xserver/Xprint/ps/psout.h,v 1.4 2001/12/14 19:59:18 dawes Exp $ */ /******************************************************************* ** @@ -147,10 +146,80 @@ typedef struct PsClipRec_ typedef PsClipRec *PsClipPtr; +typedef enum PsFTDownloadFontType_ +{ + PsFontBitmap=0, + PsFontType1, + PsFontType3 +} PsFTDownloadFontType; + +#ifdef USE_PSOUT_PRIVATE +typedef void *voidPtr; + +typedef struct PsPatRec_ +{ + PsFillEnum type; + voidPtr tag; +} PsPatRec; + +typedef PsPatRec *PsPatPtr; + +typedef struct PsOutRec_ +{ + FILE *Fp; + char Buf[16384]; + int CurColor; + int LineWidth; + PsCapEnum LineCap; + PsJoinEnum LineJoin; + int NDashes; + int *Dashes; + int DashOffset; + int LineBClr; + PsRuleEnum FillRule; + char *FontName; + int FontSize; + float FontMtx[4]; + int ImageFormat; + int RevImage; + int NPatterns; + int MxPatterns; + PsPatPtr Patterns; + int ClipType; + PsClipRec Clip; + int InFrame; + int XOff; + int YOff; + + PsFillEnum InTile; + int ImgSkip; + int ImgBClr; + int ImgFClr; + int ImgX; + int ImgY; + int ImgW; + int ImgH; + int SclW; + int SclH; + + Bool isRaw; + + int pagenum; + + int start_image; +} PsOutRec; + typedef struct PsOutRec_ *PsOutPtr; -extern PsOutPtr PsOut_BeginFile(FILE *fp, int orient, int count, int plex, - int res, int wd, int ht, Bool raw); +extern void S_Flush(PsOutPtr self); +extern void S_OutNum(PsOutPtr self, float num); +extern void S_OutTok(PsOutPtr self, char *tok, int cr); +#else +typedef struct PsOutRec_ *PsOutPtr; +#endif /* USE_PSOUT_PRIVATE */ + +extern PsOutPtr PsOut_BeginFile(FILE *fp, char *title, int orient, int count, int plex, + int res, int wd, int ht, Bool raw); extern void PsOut_EndFile(PsOutPtr self, int closeFile); extern void PsOut_BeginPage(PsOutPtr self, int orient, int count, int plex, int res, int wd, int ht); @@ -182,8 +251,9 @@ extern void PsOut_DrawArc(PsOutPtr self, int x, int y, int w, int h, extern void PsOut_Text(PsOutPtr self, int x, int y, char *text, int textl, int bclr); +extern void PsOut_Text16(PsOutPtr self, int x, int y, unsigned short *text, int textl, int bclr); -extern void PsOut_BeginImage(PsOutPtr self, int bclr, int fclr, int x, int y, +extern void PsOut_BeginImage(PsOutPtr self, int bclr, int fclr, int x, int y, int w, int h, int sw, int sh, int format); extern void PsOut_BeginImageIM(PsOutPtr self, int bclr, int fclr, int x, int y, int w, int h, int sw, int sh, int format); @@ -200,16 +270,17 @@ extern void PsOut_EndPattern(PsOutPtr self); extern void PsOut_SetPattern(PsOutPtr self, void *tag, PsFillEnum type); extern void PsOut_RawData(PsOutPtr self, char *data, int len); -extern void PsOut_DownloadType1(PsOutPtr self, char *name, char *fname); - -#ifdef BM_CACHE -extern void PsOut_BeginImageCache(PsOutPtr self, long cache_id); -extern void PsOut_EndImageCache(PsOutPtr self); -extern void PsOut_ImageCache(PsOutPtr self, int x, int y, long cache_id, - int bclr, int fclr); -#endif - -extern FILE *PsOut_ChangeFile(PsOutPtr self, FILE *fp); - +extern int PsOut_DownloadType1(PsOutPtr self, const char *auditmsg, const char *name, const char *fname); + +extern int PsOut_DownloadFreeType1(PsOutPtr self, const char *psfontname, FontPtr pFont, long block_offset); +extern int PsOut_DownloadFreeType3(PsOutPtr self, const char *psfontname, FontPtr pFont, long block_offset); + +extern int PsOut_DownloadFreeType(PsOutPtr self, PsFTDownloadFontType downloadfonttype, const char *psfontname, FontPtr pFont, long block_offset); +extern void PsOut_Get_FreeType_Glyph_Name( char *destbuf, FontPtr pFont, unsigned long x11fontindex); +extern void PsOut_FreeType_Text(FontPtr pFont, PsOutPtr self, int x, int y, char *text, int textl); +extern void PsOut_FreeType_Text16(FontPtr pFont, PsOutPtr self, int x, int y, unsigned short *text, int textl); + +extern void PsOut_FreeType_TextAttrs16(PsOutPtr self, char *fnam, int siz, int iso); +extern void PsOut_FreeType_TextAttrsMtx16(PsOutPtr self, char *fnam, float *mtx, int iso); #endif diff --git a/Xprint/ps/psout_ft.c b/Xprint/ps/psout_ft.c new file mode 100644 index 000000000..914e2e57b --- /dev/null +++ b/Xprint/ps/psout_ft.c @@ -0,0 +1,330 @@ + +/* +Copyright (c) 2003-2004 Roland Mainz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#include +#include +#include "os.h" +#define USE_PSOUT_PRIVATE 1 +#include "psout.h" + +#include +#include FT_FREETYPE_H +#include FT_TYPE1_TABLES_H + +#include "Xproto.h" +#include "font.h" +#include "fontstruct.h" +#include "fntfilst.h" +#include "fontutil.h" +#include "fontenc.h" +#include "ft.h" +#include "ftfuncs.h" +#include "servermd.h" /* needed for endian test (IMAGE_BYTE_ORDER) */ + +#define USE_FT_PS_NAMES 1 + +#ifdef USE_FT_PS_NAMES +void PsOut_Get_FreeType_Glyph_Name( char *destbuf, FontPtr pFont, unsigned long x11fontindex) +{ + FTFontPtr tf = (FTFontPtr)pFont->fontPrivate; + FT_Face ttface = tf->instance->face->face; + FT_Error error; + char buf[256]; + unsigned long ftindex; + + /* Remap X11 font index to FreeType font index */ + ftindex = FTRemap(ttface, &tf->mapping, x11fontindex); + + if( FT_Has_PS_Glyph_Names(ttface) ) + { + error = FT_Get_Glyph_Name(ttface, ftindex, buf, 64); + } + else + { + error = 1; + } + + if( error ) + { + /* Check for unicode mapping + * See Adobe document "Unicode and Glyph Names" + * (http://partners.adobe.com/asn/tech/type/unicodegn.jsp) + */ + if( (tf->mapping.mapping->type == FONT_ENCODING_UNICODE) && + (ftindex < 0xFFFE) ) + { + sprintf(buf, "uni%04lx", ftindex); + } + else + { + sprintf(buf, "ch%02lx", ftindex); + } + } + + strcpy(destbuf, buf); +} +#endif /* USE_FT_PS_NAMES */ + +int PsOut_DownloadFreeType(PsOutPtr self, PsFTDownloadFontType downloadfonttype, const char *psfontname, FontPtr pFont, long block_offset) +{ + switch(downloadfonttype) + { + case PsFontType3: + return PsOut_DownloadFreeType3(self, psfontname, pFont, block_offset); + case PsFontType1: + return PsOut_DownloadFreeType1(self, psfontname, pFont, block_offset); + default: + FatalError("PS DDX: PsOut_DownloadFreeType(downloadfonttype='%d' not implemented\n", + (int)downloadfonttype); + return 0; /* NO-OP, FatalError() will call |exit()| */ + } +} + +/* cloned from |PsOut_TextAttrs16| */ +void +PsOut_FreeType_TextAttrs16(PsOutPtr self, char *fnam, int siz, int iso) +{ + int i; + if( self->FontName && strcmp(fnam, self->FontName)==0 && + siz==self->FontSize ) return; + if( self->FontName ) xfree(self->FontName); + self->FontName = (char *)xalloc(strlen(fnam)+1); + strcpy(self->FontName, fnam); + self->FontSize = siz; + for( i=0 ; i<4 ; i++ ) self->FontMtx[i] = -1.; +} + +/* cloned from |PsOut_TextAttrsMtx16| */ +void +PsOut_FreeType_TextAttrsMtx16(PsOutPtr self, char *fnam, float *mtx, int iso) +{ + int i; + if( self->FontName && strcmp(fnam, self->FontName)==0 && + mtx[0]==self->FontMtx[0] && mtx[1]==self->FontMtx[1] && + mtx[2]==self->FontMtx[2] && mtx[3]==self->FontMtx[3] ) return; + if( self->FontName ) xfree(self->FontName); + self->FontName = (char *)xalloc(strlen(fnam)+1); + strcpy(self->FontName, fnam); + for( i=0 ; i<4 ; i++ ) self->FontMtx[i] = mtx[i]; + self->FontSize = -1; +} + +static +int FT_Get_CharcellMetricsCharacterHeight(FontPtr pFont) +{ + FTFontPtr ftfont = (FTFontPtr)pFont->fontPrivate; + + return ftfont->instance->charcellMetrics->ascent + + ftfont->instance->charcellMetrics->descent; +} + +static +int FT_Get_CharcellMetricsCharacterWidth(FontPtr pFont) +{ + FTFontPtr ftfont = (FTFontPtr)pFont->fontPrivate; + + if( ftfont->instance->spacing != FT_PROPORTIONAL ) + { + int width = ftfont->instance->charcellMetrics->characterWidth; + + /* If the font uses a matrix make sure we transform the |characterWidth| + * back to it's original value since we download the untransformed font + * and use a PostScript transformation matrix to transform the font when + * rendering the text + */ + if( ftfont->instance->transformation.nonIdentity ) + { + FT_Vector v; + + FT_Matrix m = ftfont->instance->transformation.matrix; + (void)FT_Matrix_Invert(&m); /* FixMe: We should check the return code */ + v.x = width; + v.y = FT_Get_CharcellMetricsCharacterHeight(pFont); + FT_Vector_Transform(&v, &m); + width = v.x; + } + + return width; + } + + return 0; +} + +void +PsOut_FreeType_Text(FontPtr pFont, PsOutPtr self, int x, int y, char *text, int textl) +{ + int i; + int xo = self->XOff, + yo = self->YOff; + char buf[256]; + int cwidth = FT_Get_CharcellMetricsCharacterWidth(pFont); + + if( self->InFrame || self->InTile ) xo = yo = 0; + x += xo; y += yo; + + S_OutNum(self, (float)x); + S_OutNum(self, (float)y); + S_OutTok(self, "moveto", 1); + + S_OutTok(self, "[ ", 0); + + for( i = 0 ; i < textl ; i++ ) + { +#ifdef USE_FT_PS_NAMES + char namebuf[256]; + unsigned int ch = text[i]&0xFF; + unsigned long block_offset = 0; + PsOut_Get_FreeType_Glyph_Name(namebuf, pFont, ch+block_offset); + + sprintf(buf, "/%s ", namebuf); +#else + sprintf(buf, "/ch%02x ", text[i]&0xFF); +#endif /* USE_FT_PS_NAMES */ + S_OutTok(self, buf, 0); + } + + /* Check whether we have any special spacing requirements (e.g. non-proportional fonts) ... */ + if( cwidth != 0 ) + { + /* If the we use a matrix to render the font (instead of using |self->FontSize|) + * we must apply the matrix to the "rmoveto" which is used to force the exact + * character width. The "trmoveto" macro will do that for us... + */ + if( self->FontSize == -1 ) + { + sprintf(buf, "]{gs glyphshow gr %d 0 trmoveto}fa", cwidth); + } + else + { + sprintf(buf, "]{gs glyphshow gr %d 0 rm}fa", cwidth); + } + } + else + { + sprintf(buf, "]{glyphshow}fa"); + } + S_OutTok(self, buf, 0); +} + +/* XXX: |PsOut_FreeType_Text16| should be rewritten - currently it uses lame, + * slow hacks and makes some risky assumtions about how |PsOut_Text16| + * allocates memory */ +void +PsOut_FreeType_Text16(FontPtr pFont, PsOutPtr self, int x, int y, unsigned short *text, int textl) +{ + int i; + int xo = self->XOff, + yo = self->YOff; + unsigned short c, + c_hiByte, + c_lowByte, + fontPage; + long lastFontPage = -1; + char baseFontName[256]; + char buf[256]; + + if( self->InFrame || self->InTile ) xo = yo = 0; + x += xo; y += yo; + + strcpy(baseFontName, self->FontName); + + S_OutNum(self, (float)x); + S_OutNum(self, (float)y); + S_OutTok(self, "moveto", 1); + + for( i = 0 ; i < textl ; i++ ) + { + c = text[i]; +#if IMAGE_BYTE_ORDER == LSBFirst + c_hiByte = c & 0x00FF; + c_lowByte = (c >> 8) & 0x00FF; +#elif IMAGE_BYTE_ORDER == MSBFirst + c_hiByte = (c >> 8) & 0x00FF; + c_lowByte = c & 0x00FF; +#else +#error Unsupported byte order +#endif + fontPage = c_hiByte; + + if( fontPage != lastFontPage ) + { + if( fontPage > 0 ) + { + sprintf(buf, "%s_%x", baseFontName, fontPage); + } + else + { + sprintf(buf, "%s", baseFontName); + } + + if( self->FontSize == -1 ) + { + PsOut_TextAttrsMtx(self, buf, self->FontMtx, FALSE); + } + else + { + PsOut_TextAttrs(self, buf, self->FontSize, FALSE); + } + lastFontPage = fontPage; + } + +#ifdef USE_FT_PS_NAMES + { + char namebuf[256]; + unsigned int ch = c_lowByte; + unsigned long block_offset = c_hiByte * 0x100 /* same as c_hiByte << 8 */; + int cwidth = FT_Get_CharcellMetricsCharacterWidth(pFont); + PsOut_Get_FreeType_Glyph_Name(namebuf, pFont, ch+block_offset); + + /* Check whether we have any special spacing requirements (e.g. non-proportional fonts) ... */ + if( cwidth != 0 ) + { + /* If the we use a matrix to render the font (instead of using |self->FontSize|) + * we must apply the matrix to the "rmoveto" which is used to force the exact + * character width. The "trmoveto" macro will do that for us... + */ + if( self->FontSize == -1 ) + { + sprintf(buf, "gs /%s glyphshow gr %d 0 trmoveto", namebuf, cwidth); + } + else + { + sprintf(buf, "gs /%s glyphshow gr %d 0 rm", namebuf, cwidth); + } + } + else + { + sprintf(buf, "/%s glyphshow", namebuf); + } + } +#else + sprintf(buf, "/ch%02x glyphshow", c_lowByte); +#endif /* USE_FT_PS_NAMES */ + S_OutTok(self, buf, 1); + } + + if( self->FontName ) xfree(self->FontName); + self->FontName = (char *)xalloc(strlen(baseFontName)+1); + strcpy(self->FontName, baseFontName); +} + diff --git a/Xprint/ps/psout_ftpstype1.c b/Xprint/ps/psout_ftpstype1.c new file mode 100644 index 000000000..a9b0cfe86 --- /dev/null +++ b/Xprint/ps/psout_ftpstype1.c @@ -0,0 +1,180 @@ + +/* +Copyright (c) 2003-2004 Roland Mainz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#include +#include +#include +#include + +#include "os.h" +#define USE_PSOUT_PRIVATE 1 +#include "psout.h" + +#include +#include FT_FREETYPE_H + +#include "Xproto.h" +#include "font.h" +#include "fontstruct.h" +#include "fntfilst.h" +#include "fontutil.h" +#include "fontenc.h" +#include "ft.h" +#include "ftfuncs.h" + +int do_debug_ft2pt1 = FALSE; +int do_enable_ft2pt1_optimizer = FALSE; + +/* Defined in ttf2pt1.c */ +int ft2pt1_main(int argc, char **argv, + FTFontPtr tf, const char *download_psfontname, unsigned long download_font_block_offset); + +/* Download FreeType outlines as PS Type1 font */ +int PsOut_DownloadFreeType1(PsOutPtr self, const char *psfontname, FontPtr pFont, long block_offset) +{ + FTFontPtr tf; + FT_Face face; + int ft2pt1_numargs = 0; + char *ft2pt1_args[40]; + char *pstype1filename_prefix; + char pstype1filename[PATH_MAX+1]; + int ft2pt1_main_retval; + pid_t childpid; + + tf = (FTFontPtr)pFont->fontPrivate; + face = tf->instance->face->face; + + /* Set debugging flags */ + do_debug_ft2pt1 = (getenv("XPRT_PSDDX_DO_DEBUG_FT2PT1") != NULL); + do_enable_ft2pt1_optimizer = (getenv("XPRT_PSDDX_DO_ENABLE_FT2PT1_OPTIMIZER") != NULL); + + if( do_debug_ft2pt1 ) + { + fprintf(stderr, "# Converting FT2 font to PS Type1 filename='%s', ttface=%lx\n", tf->instance->face->filename, (long)face); + } + + pstype1filename_prefix = tempnam(NULL, "Xprt_"); + + ft2pt1_args[ft2pt1_numargs] = "ft2pt1"; ft2pt1_numargs++; + ft2pt1_args[ft2pt1_numargs] = "-Ob"; ft2pt1_numargs++; + ft2pt1_args[ft2pt1_numargs] = "-e"; ft2pt1_numargs++; + ft2pt1_args[ft2pt1_numargs] = "-a"; ft2pt1_numargs++; + ft2pt1_args[ft2pt1_numargs] = "-Ga"; ft2pt1_numargs++; + if( do_enable_ft2pt1_optimizer ) + { + /* Scale fonts to a 1000x1000 matrix */ + ft2pt1_args[ft2pt1_numargs] = "-Ot"; ft2pt1_numargs++; + } + else + { + /* Disable the ttf2pt1 optimisations */ + ft2pt1_args[ft2pt1_numargs] = "-Ou"; ft2pt1_numargs++; + ft2pt1_args[ft2pt1_numargs] = "-Oo"; ft2pt1_numargs++; + ft2pt1_args[ft2pt1_numargs] = "-Os"; ft2pt1_numargs++; + ft2pt1_args[ft2pt1_numargs] = "-Oh"; ft2pt1_numargs++; + } + + if( !do_debug_ft2pt1 ) + { + ft2pt1_args[ft2pt1_numargs] = "-W 0"; ft2pt1_numargs++; + } + ft2pt1_args[ft2pt1_numargs] = tf->instance->face->filename; ft2pt1_numargs++; + ft2pt1_args[ft2pt1_numargs] = pstype1filename_prefix; ft2pt1_numargs++; + ft2pt1_args[ft2pt1_numargs] = NULL; + +/* XXX: ttf2pt1 has lots of leaks and global vars which are not cleaned-up + * As long this problem exists we will simply fork() and call the converter + * from the child process (all resources are free'ed when the child process + * exists) as a workaround. + */ +#define FT2PT1_NEEDS_SEPERATE_PROCESS 1 + +#ifdef FT2PT1_NEEDS_SEPERATE_PROCESS + /* Flush internal buffer and then the stdio stream before fork()! */ + S_Flush(self); + fflush(self->Fp); + + childpid = fork(); + switch(childpid) + { + case -1: + FatalError("PS DDX internal error: Cannot fork() converter child process, errno=%d\n", (int)errno); + break; + case 0: /* child */ + fclose(self->Fp); + self->Fp = NULL; + + ft2pt1_main_retval = ft2pt1_main(ft2pt1_numargs, ft2pt1_args, tf, psfontname, block_offset); + if( do_debug_ft2pt1 ) + { + fprintf(stderr, "## ft2pt1_main returned %d (child)\n", ft2pt1_main_retval); + } + exit(ft2pt1_main_retval); + break; + default: /* parent */ + waitpid(childpid, &ft2pt1_main_retval, 0); + break; + } + + if( do_debug_ft2pt1 ) + { + fprintf(stderr, "## ft2pt1_main returned %d (parent)\n", ft2pt1_main_retval); + } +#else + S_Flush(self); + + ft2pt1_main_retval = ft2pt1_main(ft2pt1_numargs, ft2pt1_args, tf, psfontname, block_offset); + if( do_debug_ft2pt1 ) + { + fprintf(stderr, "## ft2pt1_main returned %d (child)\n", ft2pt1_main_retval); + } +#endif /* FT2PT1_NEEDS_SEPERATE_PROCESS */ + + if( ft2pt1_main_retval != EXIT_SUCCESS ) + { + FatalError("PS DDX internal error while converting FreeType font '%s' to PS Type1, error=%d\n", + tf->instance->face->filename, ft2pt1_main_retval); + } + + sprintf(pstype1filename, "%s.pfa", pstype1filename_prefix); + if( do_debug_ft2pt1 ) + { + fprintf(stderr, "# Downloading converted FT2/PS Type1 filename='%s'\n", pstype1filename); + } + + PsOut_DownloadType1(self, "PsOut_DownloadFreeType1", psfontname, pstype1filename); + + if( !do_debug_ft2pt1 ) + { + unlink(pstype1filename); + } + + free(pstype1filename_prefix); + + S_Flush(self); + + return 0; +} + + diff --git a/Xprint/ps/psout_ftpstype3.c b/Xprint/ps/psout_ftpstype3.c new file mode 100644 index 000000000..bceb1d479 --- /dev/null +++ b/Xprint/ps/psout_ftpstype3.c @@ -0,0 +1,463 @@ + +/* +Copyright (c) 2003-2004 Roland Mainz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#include +#include +#include "os.h" +#define USE_PSOUT_PRIVATE 1 +#include "psout.h" + +#include +#include FT_FREETYPE_H +#include FT_TRUETYPE_TABLES_H +#include FT_BBOX_H +#include FT_GLYPH_H + +#include FT_CONFIG_CONFIG_H +#include FT_CONFIG_OPTIONS_H +#include FT_ERRORS_H +#include FT_SYSTEM_H +#include FT_IMAGE_H +#include FT_TYPES_H +#include FT_OUTLINE_H +#include FT_MODULE_H +#include FT_RENDER_H +#include FT_TYPE1_TABLES_H +#include FT_TRUETYPE_IDS_H +#include FT_TRUETYPE_TAGS_H +#include FT_CACHE_H +#include FT_CACHE_IMAGE_H +#include FT_CACHE_SMALL_BITMAPS_H +#include FT_MULTIPLE_MASTERS_H +#include FT_SFNT_NAMES_H + +#define USE_FT_INTERNALS 1 +#ifdef USE_FT_INTERNALS +#include FT_INTERNAL_TYPE1_TYPES_H +#include "t42types.h" +#include FT_INTERNAL_OBJECTS_H +#endif /* USE_FT_INTERNALS */ + +#include "Xproto.h" +#include "font.h" +#include "fontstruct.h" +#include "fntfilst.h" +#include "fontutil.h" +#include "fontenc.h" +#include "ft.h" +#include "ftfuncs.h" + +struct ft2info +{ + FontPtr pFont; + FTFontPtr tf; + FT_Face ttface; + struct + { + char *full_name; + char *copyright; + char *family; + char *subfamily; + char *version; + } nameid; + TT_Postscript *ttpostscript; + TT_Header *ttheader; +}; + +/* Local prototypes */ +static FT_Error PSType3_createOutlineGlyphs(FILE *out, struct ft2info *ti, unsigned long unicode, const char *psglyphname); +static int PSType3_generateOutlineFont(FILE *out, const char *psfontname, struct ft2info *ti, long block_offset); + +extern FT_Library ftypeLibrary; /* defined in xc/lib/font/FreeType/ftfuncs.c */ + +#define USE_FT_PS_NAMES 1 + +static +FT_Error PSType3_createOutlineGlyphs( FILE *out, struct ft2info *ti, unsigned long x11fontindex, const char *psglyphname ) +{ + unsigned long ftindex; + FT_BBox bbox; + FT_Error error; + FT_Outline outline; + + /* Remap X11 font index to FreeType font index */ + ftindex = FTRemap(ti->ttface, &ti->tf->mapping, x11fontindex); + + error = FT_Load_Glyph(ti->ttface, ftindex, (FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING)); + if( error ) + { + fprintf(stderr, "PSType3_createOutlineGlyphs: FT_Load_Glyph() failure, error=%d\n", (int)error); + return error; + } + + outline = ti->ttface->glyph->outline; + + FT_Outline_Get_CBox(&outline, &bbox); + + fprintf(out, "/%s {\n", psglyphname); + fprintf(out, "%ld 0 %ld %ld %ld %ld setcachedevice\n", + (signed long)ti->ttface->glyph->metrics.horiAdvance, + (long)bbox.xMin, + (long)bbox.yMin, + (long)bbox.xMax, + (long)bbox.yMax); + + if( outline.n_contours > 0 ) + { + long i, + j, + k, k1, + cs, ce, + nguide, + contour_start, + contour_end, + last_point; + Bool first; + FT_Vector *vec; + + contour_start = ce = 0; + + vec = outline.points; + last_point = outline.n_points; + + i = j = k = 0; + first = TRUE; + + while( i <= outline.contours[outline.n_contours - 1] ) + { + contour_end = outline.contours[j]; + + if( first ) + { + fprintf(out, "%ld %ld moveto\n", vec[i].x, vec[i].y); + contour_start = i; + first = FALSE; + } + else if( outline.tags[i] & FT_CURVE_TAG_ON ) + { + fprintf(out, "%ld %ld lineto\n", vec[i].x, vec[i].y); + } + else + { + Bool finished = FALSE; + + cs = i-1; + nguide = 0; + while( !finished ) + { + if( i == contour_end+1 ) + { + ce = contour_start; + finished = TRUE; + } + else if( outline.tags[i] & FT_CURVE_TAG_ON ) + { + ce = i; + finished = TRUE; + } + else + { + i++; + nguide++; + } + } + + switch( nguide ) + { + case 0: + fprintf(out, "%ld %ld lineto\n", vec[ce].x, vec[ce].y); + break; + + case 1: + fprintf(out, "%ld %ld %ld %ld %ld %ld curveto\n", + (vec[cs].x+2*vec[cs+1].x)/3, + (vec[cs].y+2*vec[cs+1].y)/3, + (2*vec[cs+1].x+vec[ce].x)/3, + (2*vec[cs+1].y+vec[ce].y)/3, + vec[ce].x, vec[ce].y); + break; + + case 2: + fprintf(out, "%ld %ld %ld %ld %ld %ld curveto\n", + (-vec[cs].x+4*vec[cs+1].x)/3, + (-vec[cs].y+4*vec[cs+1].y)/3, + (4*vec[cs+2].x-vec[ce].x)/3, + (4*vec[cs+2].y-vec[ce].y)/3, + vec[ce].x, vec[ce].y); + break; + + case 3: + fprintf(out, "%ld %ld %ld %ld %ld %ld curveto\n", + (vec[cs].x+2*vec[cs+1].x)/3, + (vec[cs].y+2*vec[cs+1].y)/3, + (5*vec[cs+1].x+vec[cs+2].x)/6, + (5*vec[cs+1].y+vec[cs+2].y)/6, + (vec[cs+1].x+vec[cs+2].x)/2, + (vec[cs+1].y+vec[cs+2].y)/2); + + fprintf(out, "%ld %ld %ld %ld %ld %ld curveto\n", + (vec[cs+1].x+5*vec[cs+2].x)/6, + (vec[cs+1].y+5*vec[cs+2].y)/6, + (5*vec[cs+2].x+vec[cs+3].x)/6, + (5*vec[cs+2].y+vec[cs+3].y)/6, + (vec[cs+3].x+vec[cs+2].x)/2, + (vec[cs+3].y+vec[cs+2].y)/2); + + fprintf(out, "%ld %ld %ld %ld %ld %ld curveto\n", + (vec[cs+2].x+5*vec[cs+3].x)/6, + (vec[cs+2].y+5*vec[cs+3].y)/6, + (2*vec[cs+3].x+vec[ce].x)/3, + (2*vec[cs+3].y+vec[ce].y)/3, + vec[ce].x, vec[ce].y); + break; + + default: /* anything |nguide > 3| */ + k1 = cs + nguide; + + fprintf(out, "%ld %ld %ld %ld %ld %ld curveto\n", + (vec[cs].x+2*vec[cs+1].x)/3, + (vec[cs].y+2*vec[cs+1].y)/3, + (5*vec[cs+1].x+vec[cs+2].x)/6, + (5*vec[cs+1].y+vec[cs+2].y)/6, + (vec[cs+1].x+vec[cs+2].x)/2, + (vec[cs+1].y+vec[cs+2].y)/2); + + for( k = cs+2 ; k <= k1-1 ; k++ ) + { + fprintf(out, "%ld %ld %ld %ld %ld %ld curveto\n", + (vec[k-1].x+5*vec[k].x)/6, + (vec[k-1].y+5*vec[k].y)/6, + (5*vec[k].x+vec[k+1].x)/6, + (5*vec[k].y+vec[k+1].y)/6, + (vec[k].x+vec[k+1].x)/2, + (vec[k].y+vec[k+1].y)/2); + } + + fprintf(out, "%ld %ld %ld %ld %ld %ld curveto\n", + (vec[k1-1].x+5*vec[k1].x)/6, + (vec[k1-1].y+5*vec[k1].y)/6, + (2*vec[k1].x+vec[ce].x)/3, + (2*vec[k1].y+vec[ce].y)/3, + vec[ce].x, vec[ce].y); + break; + } + } + + if( i >= contour_end ) + { + fprintf(out, "closepath\n"); + first = TRUE; + i = contour_end + 1; + j++; + } + else + { + i++; + } + } + } + + fprintf(out, "fill } bind def\n"); + + return 0; +} + +#ifdef USE_FT_INTERNALS +static FT_BBox * +FT_Get_PS_Font_BBox( FT_Face face ) +{ + const char *driver_name; + FT_BBox *font_bbox = NULL; + + if ( face && face->driver && face->driver->root.clazz ) + { + driver_name = face->driver->root.clazz->module_name; + if ( ft_strcmp( driver_name, "type1" ) == 0 ) + font_bbox = &(((T1_Face)face)->type1.font_bbox); + else if ( ft_strcmp( driver_name, "t1cid" ) == 0 ) + font_bbox = &(((CID_Face)face)->cid.font_bbox); + else if ( ft_strcmp( driver_name, "type42" ) == 0 ) + font_bbox = &(((T42_Face)face)->type1.font_bbox); + } + + return font_bbox; +} +#endif /* USE_FT_INTERNALS */ + +static +int PSType3_generateOutlineFont(FILE *out, const char *psfontname, struct ft2info *ti, long block_offset) +{ + long i; + double scaler; + const int numchars = 256; +#ifdef USE_FT_PS_NAMES + int linewidth = 0; +#endif /* USE_FT_PS_NAMES */ + + fprintf(out, "%%%%BeginFont: %s\n", psfontname); + fprintf(out, "22 dict begin\n"); + fprintf(out, "/FontType 3 def\n"); + fprintf(out, "/StrokeWidth 0 def\n"); + fprintf(out, "/PaintType 0 def\n"); + fprintf(out, "/FontName (%s) def\n", psfontname); + fprintf(out, "/FontInfo 9 dict dup begin\n"); + fprintf(out, " /FullName (%s) def\n", ti->nameid.full_name?ti->nameid.full_name:psfontname); + fprintf(out, " /Notice (%s) def\n", ti->nameid.copyright?ti->nameid.copyright:"nothing here"); + fprintf(out, " /FamilyName (%s) def\n", ti->nameid.family?ti->nameid.family:psfontname); + fprintf(out, " /Weight (%s) def\n", ti->nameid.subfamily?ti->nameid.subfamily:"Regular"); + fprintf(out, " /version (%s) def\n", ti->nameid.version?ti->nameid.version:"0.1"); + + if( ti->ttpostscript ) + { + fprintf(out, " /italicAngle %.9g def\n", (double)ti->ttpostscript->italicAngle); + fprintf(out, " /underlineThickness %d def\n", (int)ti->ttpostscript->underlineThickness); + fprintf(out, " /underlinePosition %d def\n", (int)ti->ttpostscript->underlinePosition); + fprintf(out, " /isFixedPitch %s def\n", ((ti->ttpostscript->isFixedPitch)?("true"):("false"))); + } + else + { + fprintf(out, " /italicAngle %.9g def\n", 0.0); + fprintf(out, " /underlineThickness %d def\n", 100); + fprintf(out, " /underlinePosition %d def\n", 0); + fprintf(out, " /isFixedPitch false def\n"); + } + + fprintf(out, "end def\n"); + + scaler = (1000.0 / (double)ti->ttface->units_per_EM) / 1000.0; + fprintf(out, "/FontMatrix [%.9g 0 0 %.9g 0 0] def\n", scaler, scaler); + + if( ti->ttheader ) + { + fprintf(out, "/FontBBox [%d %d %d %d] def\n", + (int)ti->ttheader->xMin, + (int)ti->ttheader->yMin, + (int)ti->ttheader->xMax, + (int)ti->ttheader->yMax); + } + else + { + FT_BBox *font_bbox = FT_Get_PS_Font_BBox(ti->ttface); + fprintf(out, "/FontBBox [%d %d %d %d] def\n", + (int)font_bbox->xMin, + (int)font_bbox->yMin, + (int)font_bbox->xMax, + (int)font_bbox->yMax); + } + + fprintf(out, "/Encoding [\n"); + for( i = 0 ; i < 256 ; i++ ) + { +#ifdef USE_FT_PS_NAMES + char namebuf[256]; + PsOut_Get_FreeType_Glyph_Name(namebuf, ti->pFont, i+block_offset); + linewidth += strlen(namebuf) + 2; + fprintf(out, "/%s%s", namebuf, (linewidth > 70)?(linewidth = 0, "\n"):(" ")); +#else + fprintf(out, "/ch%02x%s", i, (((i % 10) == 9)?("\n"):(" "))); +#endif /* USE_FT_PS_NAMES */ + } + fprintf(out, "] def\n"); + + fprintf(out, "/CharProcs %d dict def CharProcs begin\n", (int)(numchars + 1)); + fprintf(out, "/.notdef {\n" + "1000 0 0 0 0 0 setcachedevice\n" + "fill } bind def\n"); + for( i = 0 ; i < numchars ; i++ ) + { + char buf[32]; +#ifdef USE_FT_PS_NAMES + char namebuf[256]; + PsOut_Get_FreeType_Glyph_Name(namebuf, ti->pFont, i+block_offset); + sprintf(buf, "%s ", namebuf); +#else + sprintf(buf, "ch%02lx ", i); +#endif /* USE_FT_PS_NAMES */ + PSType3_createOutlineGlyphs(out, ti, i+block_offset, buf); + } + fprintf(out, "end\n" + "/BuildGlyph {\n" + " exch /CharProcs get exch\n" + " 2 copy known not {pop /.notdef} if get exec } bind def\n" + "/BuildChar { 1 index /Encoding get exch get\n" + " 1 index /Encoding get exec } bind def\n"); + fprintf(out, "currentdict end /%s exch definefont pop\n", psfontname); + fprintf(out, "%%EndFont\n"); + + return 0; +} + +static +char *FT_Get_TT_NAME_ID(FT_Face ttface, int index) +{ + FT_SfntName name; + char *s; + + if( index >= FT_Get_Sfnt_Name_Count(ttface) ) + return NULL; + + FT_Get_Sfnt_Name(ttface, index, &name); + s = (char *)malloc(name.string_len+2); + if( !s ) + return NULL; + memcpy(s, (char *)name.string, name.string_len); + s[name.string_len] = '\0'; + return s; +} + +int PsOut_DownloadFreeType3(PsOutPtr self, const char *psfontname, FontPtr pFont, long block_offset) +{ + struct ft2info cft2info = { 0 }; + struct ft2info *ti = &cft2info; + + S_Flush(self); + + ti->tf = (FTFontPtr)pFont->fontPrivate; + ti->ttface = ti->tf->instance->face->face; + ti->pFont = pFont; +#ifdef DEBUG_gisburn + fprintf(stderr, "# Downloading FT2 font filename='%s', ttface=%lx\n", ti->tf->instance->face->filename, (long)ti->ttface); +#endif /* DEBUG_gisburn */ + + ti->nameid.full_name = FT_Get_TT_NAME_ID(ti->ttface, TT_NAME_ID_FULL_NAME); + ti->nameid.copyright = FT_Get_TT_NAME_ID(ti->ttface, TT_NAME_ID_COPYRIGHT); + ti->nameid.family = FT_Get_TT_NAME_ID(ti->ttface, TT_NAME_ID_FONT_FAMILY); + ti->nameid.subfamily = FT_Get_TT_NAME_ID(ti->ttface, TT_NAME_ID_FONT_SUBFAMILY); + ti->nameid.version = FT_Get_TT_NAME_ID(ti->ttface, TT_NAME_ID_VERSION_STRING); + + ti->ttheader = (TT_Header *)FT_Get_Sfnt_Table(ti->ttface, ft_sfnt_head); + ti->ttpostscript = (TT_Postscript *)FT_Get_Sfnt_Table(ti->ttface, ft_sfnt_post); + + PSType3_generateOutlineFont(self->Fp, psfontname, ti, block_offset); + + free(ti->nameid.full_name); + free(ti->nameid.copyright); + free(ti->nameid.family); + free(ti->nameid.subfamily); + free(ti->nameid.version); + + S_Flush(self); + + return 0; +} + diff --git a/Xprint/raster/Raster.h b/Xprint/raster/Raster.h index 750dc0722..9b335743f 100644 --- a/Xprint/raster/Raster.h +++ b/Xprint/raster/Raster.h @@ -30,8 +30,6 @@ not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from said copyright holders. */ -/* $XFree86: xc/programs/Xserver/Xprint/raster/Raster.h,v 1.3 2001/10/31 22:50:29 tsi Exp $ */ - /******************************************************************* ** ** ********************************************************* @@ -53,6 +51,7 @@ copyright holders. * Some sleazes to force the XrmDB stuff into the server */ #ifndef HAVE_XPointer +#define HAVE_XPointer 1 typedef char *XPointer; #endif #define Status int @@ -110,6 +109,6 @@ typedef struct { extern XpValidatePoolsRec RasterValidatePoolsRec; extern Bool InitializeRasterDriver(int ndx, ScreenPtr pScreen, int argc, - char **argv); + char **argv); #endif /* _RASTER_H_ */ diff --git a/Xprint/spooler.c b/Xprint/spooler.c new file mode 100644 index 000000000..a9983fc17 --- /dev/null +++ b/Xprint/spooler.c @@ -0,0 +1,190 @@ + +/* $Xorg: spooler.c,v 1.1 2003/09/14 1:19:56 gisburn Exp $ */ +/* +Copyright (c) 2003-2004 Roland Mainz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the names of the copyright holders shall +not be used in advertising or otherwise to promote the sale, use or other +dealings in this Software without prior written authorization from said +copyright holders. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef __hpux +#include +#endif + +#include "spooler.h" + +/* + * The string LIST_QUEUES_* is fed to a shell to generate an ordered + * list of available printers on the system. These string definitions + * are taken from the file PrintSubSys.C within the code for the + * dtprintinfo program. + */ +#define LIST_QUEUES_AIX4 \ + "lsallq | grep -v '^bsh$' | sort | uniq" + +#define LIST_QUEUES_HPUX \ + "LANG=C lpstat -v | " \ + "awk '" \ + " $2 == \"for\" " \ + " { " \ + " x = match($3, /:/); " \ + " print substr($3, 1, x-1)" \ + " }' | sort | uniq" + +#define LIST_QUEUES_OSF \ + "LANG=C lpstat -v | " \ + "nawk '" \ + " $2 == \"for\" " \ + " { print $4 }' " \ + " | sort | uniq" + +#define LIST_QUEUES_UXP \ + "LANG=C lpstat -v |" \ + "nawk '" \ + " $4 == \"for\" " \ + " { " \ + " x = match($5, /:/); " \ + " print substr($5, 1, x-1)" \ + " }' | sort | uniq" + +/* Support both normal and LPRng output of "lpc status" */ +#define LIST_QUEUES_BSD \ + "PATH=\"${PATH}:/usr/bin:/usr/sbin:/bin:/sbin\"\n" \ + "export PATH\n" \ + \ + "which_tool()\n" \ + "{\n" \ + " echo \"${PATH}\" | tr \":\" \"\n\" | while read i ; do ls -1ad \"${i}/${1}\" 2>/dev/null ; done\n" \ + "}\n" \ + \ + "(\n" \ + "WHICH_LPC=\"`which_tool lpc`\"\n" \ + \ + "if [ \"`which_tool nawk`\" != \"\" ] ; then\n" \ + " NAWK=\"nawk\"\n" \ + "else\n" \ + " NAWK=\"awk\"\n" \ + "fi\n" \ + \ + "[ \"${WHICH_LPC}\" != \"\" ] && (LANG=C lpc status | ${NAWK} '/^[^ ]*:$/ && !/@/ && !/ / { print $1 }' | sed -e /:/s///)\n" \ + "[ \"${WHICH_LPC}\" != \"\" ] && (LANG=C lpc -a status | ${NAWK} '/^[^ ]*@[^ ]/ && !/:$/ { split( $1, name, \"@\" ); print name[1]; }')\n" \ + ") | egrep -v -i \" |^all$\" | sort | uniq" + +#define LIST_QUEUES_SYSV \ + "PATH=\"${PATH}:/usr/bin:/usr/sbin:/bin:/sbin\"\n" \ + "export PATH\n" \ + \ + "which_tool()\n" \ + "{\n" \ + " echo \"${PATH}\" | tr \":\" \"\n\" | while read i ; do ls -1ad \"${i}/${1}\" 2>/dev/null ; done\n" \ + "}\n" \ + \ + "(\n" \ + "WHICH_LPSTAT=\"`which_tool lpstat`\"\n" \ + \ + "if [ \"`which_tool nawk`\" != \"\" ] ; then\n" \ + " NAWK=\"nawk\"\n" \ + "else\n" \ + " NAWK=\"awk\"\n" \ + "fi\n" \ + \ + "[ \"${WHICH_LPSTAT}\" != \"\" ] && (LANG=C lpstat -v | ${NAWK} ' $2 == \"for\" { x = match($3, /:/); print substr($3, 1, x-1) }')\n" \ + ") | egrep -v -i \" |^all$\" | sort | uniq" + +#define LIST_QUEUES_OTHER \ + "LANG=C lpstat -v | " \ + "nawk '" \ + " $2 == \"for\" " \ + " { " \ + " x = match($3, /:/); " \ + " print substr($3, 1, x-1)" \ + " }' | sort | uniq" + +#define DEFAULT_SPOOL_COMMAND_HPUX "/usr/bin/lp -d %printer-name% -o raw -n %copy-count% -t %job-name% %options%" +#define DEFAULT_SPOOL_COMMAND_BSD "/usr/bin/lpr -P %printer-name% -#%copy-count% -T %job-name% %options%" +#define DEFAULT_SPOOL_COMMAND_SYSV "/usr/bin/lp -d %printer-name% -n %copy-count% -t %job-name% %options%" +#define DEFAULT_SPOOL_COMMAND_OTHER "/usr/bin/lp -d %printer-name% -n %copy-count% -t %job-name% %options%" + + +/* List of spooler types and the commands used to enumerate + * print queues and submit print jobs */ +XpSpoolerType xpstm[] = +{ + /* OS-specific spoolers */ + { "aix", LIST_QUEUES_AIX4, DEFAULT_SPOOL_COMMAND_OTHER }, + { "aix4", LIST_QUEUES_AIX4, DEFAULT_SPOOL_COMMAND_OTHER }, + { "bsd", LIST_QUEUES_BSD, DEFAULT_SPOOL_COMMAND_BSD }, + { "osf", LIST_QUEUES_OSF, DEFAULT_SPOOL_COMMAND_OTHER }, + { "solaris", LIST_QUEUES_SYSV, DEFAULT_SPOOL_COMMAND_SYSV }, + { "sysv", LIST_QUEUES_SYSV, DEFAULT_SPOOL_COMMAND_SYSV }, + { "uxp", LIST_QUEUES_UXP, DEFAULT_SPOOL_COMMAND_OTHER }, + /* crossplatform spoolers */ + { "cups", LIST_QUEUES_SYSV, DEFAULT_SPOOL_COMMAND_SYSV }, + { "lprng", LIST_QUEUES_BSD, DEFAULT_SPOOL_COMMAND_BSD }, + /* misc */ + { "other", LIST_QUEUES_OTHER, DEFAULT_SPOOL_COMMAND_OTHER }, + { "none", NULL, NULL }, + { NULL, NULL, NULL } +}; + +/* Used by Init.c and attributes.c */ +XpSpoolerTypePtr spooler_type = NULL; + +XpSpoolerTypePtr XpSpoolerNameToXpSpoolerType(char *name) +{ + XpSpoolerTypePtr curr = xpstm; + + while( curr->name != NULL ) + { + if( !strcasecmp(name, curr->name) ) + return curr; + + curr++; + } + + return NULL; +} + +static char *spooler_namelist = NULL; + +char *XpGetSpoolerTypeNameList(void) +{ + if( spooler_namelist ) + return spooler_namelist; + + return XPDEFAULTSPOOLERNAMELIST; +} + +void XpSetSpoolerTypeNameList(char *namelist) +{ + spooler_namelist = namelist; +} + + diff --git a/Xprint/spooler.h b/Xprint/spooler.h new file mode 100644 index 000000000..ac1257c55 --- /dev/null +++ b/Xprint/spooler.h @@ -0,0 +1,72 @@ + +#ifndef SPOOLER_H +#define SPOOLER_H 1 + +/* $Xorg: spooler.h,v 1.1 2003/09/14 1:19:56 gisburn Exp $ */ +/* +Copyright (c) 2003-2004 Roland Mainz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the names of the copyright holders shall +not be used in advertising or otherwise to promote the sale, use or other +dealings in this Software without prior written authorization from said +copyright holders. +*/ + +/* + * Define platform-specific default spooler type + */ +#if defined(sun) +#define XPDEFAULTSPOOLERNAMELIST "solaris" +#elif defined(AIXV4) +#define XPDEFAULTSPOOLERNAMELIST "aix4" +#elif defined(hpux) +#define XPDEFAULTSPOOLERNAMELIST "hpux" +#elif defined(__osf__) +#define XPDEFAULTSPOOLERNAMELIST "osf" +#elif defined(__uxp__) +#define XPDEFAULTSPOOLERNAMELIST "uxp" +#elif defined(CSRG_BASED) || defined(linux) +/* ToDo: This should be "cups:bsd" in the future, but for now + * the search order first-bsd-then-cups is better for backwards + * compatibility. + */ +#define XPDEFAULTSPOOLERNAMELIST "bsd:cups" +#else +#define XPDEFAULTSPOOLERNAMELIST "other" +#endif + +typedef struct +{ + const char *name; + const char *list_queues_command; + const char *spool_command; +} XpSpoolerType, *XpSpoolerTypePtr; + +/* prototypes */ +extern XpSpoolerTypePtr XpSpoolerNameToXpSpoolerType(char *name); +extern void XpSetSpoolerTypeNameList(char *namelist); +extern char *XpGetSpoolerTypeNameList(void); + +/* global vars */ +extern XpSpoolerTypePtr spooler_type; +extern XpSpoolerType xpstm[]; + +#endif /* !SPOOLER_H */ + diff --git a/dix/dispatch.c b/dix/dispatch.c index 6ac81d823..d07b631e7 100644 --- a/dix/dispatch.c +++ b/dix/dispatch.c @@ -1,4 +1,4 @@ -/* $XdotOrg$ */ +/* $XdotOrg: xc/programs/Xserver/dix/dispatch.c,v 1.1.4.4.2.3.6.2 2004/04/20 03:27:08 gisburn Exp $ */ /* $Xorg: dispatch.c,v 1.5 2001/02/09 02:04:40 xorgcvs Exp $ */ /************************************************************ @@ -253,7 +253,7 @@ FlushClientCaches(id) #define SMART_SCHEDULE_DEFAULT_INTERVAL 20 /* ms */ #define SMART_SCHEDULE_MAX_SLICE 200 /* ms */ -Bool SmartScheduleDisable; +Bool SmartScheduleDisable = FALSE; long SmartScheduleSlice = SMART_SCHEDULE_DEFAULT_INTERVAL; long SmartScheduleInterval = SMART_SCHEDULE_DEFAULT_INTERVAL; long SmartScheduleMaxSlice = SMART_SCHEDULE_MAX_SLICE; diff --git a/dix/main.c b/dix/main.c index 887517738..a5814849d 100644 --- a/dix/main.c +++ b/dix/main.c @@ -1,4 +1,4 @@ -/* $XdotOrg$ */ +/* $XdotOrg: xc/programs/Xserver/dix/main.c,v 1.1.4.5.2.4.6.1 2004/04/20 03:27:08 gisburn Exp $ */ /* $XFree86: xc/programs/Xserver/dix/main.c,v 3.43 2003/10/30 21:21:02 herrb Exp $ */ /*********************************************************** @@ -251,6 +251,8 @@ main(int argc, char *argv[], char *envp[]) display = "0"; + InitGlobals(); + /* Quartz support on Mac OS X requires that the Cocoa event loop be in * the main thread. This allows the X server main to be called again * from another thread. */ diff --git a/hw/darwin/darwin.c b/hw/darwin/darwin.c index 18ea8d117..caf32c5df 100644 --- a/hw/darwin/darwin.c +++ b/hw/darwin/darwin.c @@ -29,7 +29,7 @@ * holders shall not be used in advertising or otherwise to promote the sale, * use or other dealings in this Software without prior written authorization. */ -/* $XdotOrg$ */ +/* $XdotOrg: xc/programs/Xserver/hw/darwin/darwin.c,v 1.1.4.2.4.1.6.3 2004/04/20 03:27:08 gisburn Exp $ */ /* $XFree86: xc/programs/Xserver/hw/darwin/darwin.c,v 1.55 2003/11/15 00:07:09 torrey Exp $ */ #include "X.h" @@ -448,9 +448,11 @@ static int DarwinKeybdProc( DeviceIntPtr pDev, int onoff ) } /* +=========================================================================== Utility routines +=========================================================================== */ /* @@ -538,9 +540,11 @@ static int DarwinParseModifierList( } /* +=========================================================================== Functions needed to link against device independent X +=========================================================================== */ /* @@ -693,6 +697,10 @@ void OsVendorInit(void) } } +/* ddxInitGlobals - called by |InitGlobals| from os/util.c */ +void ddxInitGlobals(void) +{ +} /* * ddxProcessArgument -- diff --git a/hw/vfb/InitOutput.c b/hw/vfb/InitOutput.c index 59283bdf3..562dd611e 100644 --- a/hw/vfb/InitOutput.c +++ b/hw/vfb/InitOutput.c @@ -273,6 +273,11 @@ ddxUseMsg() #endif } +/* ddxInitGlobals - called by |InitGlobals| from os/util.c */ +void ddxInitGlobals(void) +{ +} + int ddxProcessArgument(int argc, char *argv[], int i) { diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c index 079abefd9..d3e36e02c 100644 --- a/hw/xfree86/common/xf86Init.c +++ b/hw/xfree86/common/xf86Init.c @@ -1641,6 +1641,11 @@ ddxProcessArgument(int argc, char **argv, int i) return xf86ProcessArgument(argc, argv, i); } +/* ddxInitGlobals - called by |InitGlobals| from os/util.c */ +void ddxInitGlobals(void) +{ +} + /* * ddxUseMsg -- * Print out correct use of device dependent commandline options. diff --git a/hw/xnest/Args.c b/hw/xnest/Args.c index 0da0d5006..cc9a2707f 100644 --- a/hw/xnest/Args.c +++ b/hw/xnest/Args.c @@ -47,6 +47,11 @@ int xnestNumScreens = 0; Bool xnestDoDirectColormaps = False; Window xnestParentWindow = 0; +/* ddxInitGlobals - called by |InitGlobals| from os/util.c */ +void ddxInitGlobals(void) +{ +} + int ddxProcessArgument (int argc, char *argv[], int i) { diff --git a/hw/xwin/InitOutput.c b/hw/xwin/InitOutput.c index 8a2241914..68910be1a 100644 --- a/hw/xwin/InitOutput.c +++ b/hw/xwin/InitOutput.c @@ -394,6 +394,11 @@ ddxUseMsg (void) /* Compare the current option with the string. */ #define IS_OPTION(name) (strcmp (argv[i], name) == 0) +/* ddxInitGlobals - called by |InitGlobals| from os/util.c */ +void ddxInitGlobals(void) +{ +} + int ddxProcessArgument (int argc, char *argv[], int i) { diff --git a/include/os.h b/include/os.h index 879f89295..b553e06e1 100644 --- a/include/os.h +++ b/include/os.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/include/os.h,v 3.53 2003/10/29 04:17:22 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/include/os.h,v 3.54 2003/10/30 21:21:06 herrb Exp $ */ /*********************************************************** Copyright 1987, 1998 The Open Group @@ -231,6 +231,8 @@ extern SIGVAL GiveUp(int /*sig*/); extern void UseMsg(void); +extern void InitGlobals(void); + extern void ProcessCommandLine(int /*argc*/, char* /*argv*/[]); extern int set_font_authorizations( @@ -412,6 +414,8 @@ extern XID GenerateAuthorization( extern void ExpandCommandLine(int * /*pargc*/, char *** /*pargv*/); #endif +extern void ddxInitGlobals(void); + extern int ddxProcessArgument(int /*argc*/, char * /*argv*/ [], int /*i*/); extern void ddxUseMsg(void); diff --git a/os/utils.c b/os/utils.c index 36855dee3..51931ae4c 100644 --- a/os/utils.c +++ b/os/utils.c @@ -1,4 +1,4 @@ -/* $XdotOrg$ */ +/* $XdotOrg: xc/programs/Xserver/os/utils.c,v 1.1.4.6.2.4.6.3 2004/04/20 03:27:09 gisburn Exp $ */ /* $Xorg: utils.c,v 1.5 2001/02/09 02:05:24 xorgcvs Exp $ */ /* @@ -575,6 +575,17 @@ VerifyDisplayName(const char *d) return( 1 ); } +/* + * This function is responsible for doing initalisation of any global + * variables at an very early point of server startup (even before + * |ProcessCommandLine()|. + */ +void InitGlobals(void) +{ + ddxInitGlobals(); +} + + /* * This function parses the command line. Handles device-independent fields * and allows ddx to handle additional fields. It is not allowed to modify