From ce27aa87d42e913fd8029791a3168d10794a3d56 Mon Sep 17 00:00:00 2001 From: greenflute Date: Mon, 10 Aug 2026 04:23:35 +0200 Subject: [PATCH] Fix LaserJet 1018 raster scaling on macOS --- PPD/HP-LaserJet_1018-arm64.ppd | 484 +++++++++++++++++++++++++++++++++ rastertozjs.c | 154 +++++++++-- 2 files changed, 617 insertions(+), 21 deletions(-) create mode 100644 PPD/HP-LaserJet_1018-arm64.ppd diff --git a/PPD/HP-LaserJet_1018-arm64.ppd b/PPD/HP-LaserJet_1018-arm64.ppd new file mode 100644 index 0000000..3c1c94d --- /dev/null +++ b/PPD/HP-LaserJet_1018-arm64.ppd @@ -0,0 +1,484 @@ +*PPD-Adobe: "4.3" +*% +*% For information on using this, and to obtain the required backend +*% script, consult http://www.openprinting.org/ +*% +*% This file is published under the GNU General Public License +*% +*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with +*% all programs and environments which use PPD files for dealing with +*% printer capability information. The printer must be configured with the +*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This +*% file and "foomatic-rip" work together to support PPD-controlled printer +*% driver option access with arbitrary free software printer drivers and +*% printing spoolers. +*% +*% To save this file on your disk, wait until the download has completed +*% (the animation of the browser logo must stop) and then use the +*% "Save as..." command in the "File" menu of your browser or in the +*% pop-up manu when you click on this document with the right mouse button. +*% DO NOT cut and paste this file into an editor with your mouse. This can +*% introduce additional line breaks which lead to unexpected results. +*% +*% You may save this file as 'HP-LaserJet_1018-foo2zjs-z1.ppd' +*% +*% +*FormatVersion: "4.3" +*FileVersion: "1.1" +*LanguageVersion: English +*LanguageEncoding: ISOLatin1 +*PCFileName: "FOO2ZJS-.PPD" +*Manufacturer: "HP" +*Product: "(HP LaserJet 1018)" +*cupsVersion: 1.0 +*cupsManualCopies: True +*cupsModelNumber: 2 +*cupsFilter: "application/vnd.cups-raster 0 rastertozjs" +*%pprRIP: foomatic-rip other +*ModelName: "HP LaserJet 1018" +*ShortNickName: "HP LaserJet 1018 ARM64" +*NickName: "HP LaserJet 1018 ARM64 rastertozjs" +*PSVersion: "(3010.000) 550" +*PSVersion: "(3010.000) 651" +*PSVersion: "(3010.000) 652" +*PSVersion: "(3010.000) 653" +*PSVersion: "(3010.000) 704" +*PSVersion: "(3010.000) 705" +*PSVersion: "(3010.000) 800" +*LanguageLevel: "3" +*ColorDevice: False +*DefaultColorSpace: Gray +*FileSystem: False +*Throughput: "1" +*LandscapeOrientation: Plus90 +*TTRasterizer: Type42 +*1284DeviceID: "MFG:Hewlett-Packard;MDL:HP LaserJet 1018;CMD:ACL;DES:HP LaserJet 1018;DRV:Dfoo2zjs-z1,R1,M0,TF;" + +*driverType F/Filter: "" +*driverObsolete: False + + + + +*HWMargins: 11.34 11.34 11.34 11.34 +*VariablePaperSize: True +*MaxMediaWidth: 100000 +*MaxMediaHeight: 100000 +*NonUIOrderDependency: 135 AnySetup *CustomPageSize +*CustomPageSize True: "pop pop pop pop pop +%% FoomaticRIPOptionSetting: PageSize=Custom" +*End +*FoomaticRIPOptionSetting PageSize=Custom: "-pCustom.%0x%1 " +*ParamCustomPageSize Width: 1 points 36 100000 +*ParamCustomPageSize Height: 2 points 36 100000 +*ParamCustomPageSize Orientation: 3 int 0 0 +*ParamCustomPageSize WidthOffset: 4 points 0 0 +*ParamCustomPageSize HeightOffset: 5 points 0 0 + + +*OpenGroup: General/General + +*OpenUI *Quality/Printing Quality: PickOne +*FoomaticRIPOption Quality: enum CmdLine A +*OrderDependency: 110 AnySetup *Quality +*DefaultQuality: normal +*Quality draft/Draft: "%% FoomaticRIPOptionSetting: Quality=draft" +*FoomaticRIPOptionSetting Quality=draft: " -t " +*Quality normal/Normal: "%% FoomaticRIPOptionSetting: Quality=normal" +*FoomaticRIPOptionSetting Quality=normal: " " +*CloseUI: *Quality + +*OpenUI *Resolution/Resolution: PickOne +*FoomaticRIPOption Resolution: enum CmdLine A +*OrderDependency: 130 AnySetup *Resolution +*DefaultResolution: 1200x600dpi +*Resolution 600x600dpi/600x600 dpi: "<>setpagedevice" +*FoomaticRIPOptionSetting Resolution=600x600dpi: "-r600x600 " +*Resolution 1200x600dpi/1200x600 dpi: "<>setpagedevice" +*FoomaticRIPOptionSetting Resolution=1200x600dpi: "-r1200x600 " +*CloseUI: *Resolution + +*OpenUI *PageSize/Page Size: PickOne +*FoomaticRIPOption PageSize: enum CmdLine A +*OrderDependency: 135 AnySetup *PageSize +*DefaultPageSize: Letter +*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter" +*FoomaticRIPOptionSetting PageSize=Letter: "-p1 " +*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4" +*FoomaticRIPOptionSetting PageSize=A4: "-p9 " +*PageSize A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5" +*FoomaticRIPOptionSetting PageSize=A5: "-p11 " +*PageSize A6/A6: "%% FoomaticRIPOptionSetting: PageSize=A6" +*FoomaticRIPOptionSetting PageSize=A6: "-p262 " +*PageSize B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5" +*FoomaticRIPOptionSetting PageSize=B5: "-p13 " +*PageSize B5ISO/B5 ISO: "%% FoomaticRIPOptionSetting: PageSize=B5ISO" +*FoomaticRIPOptionSetting PageSize=B5ISO: "-p259 " +*PageSize DoublePostcard/Double Postcard: "%% FoomaticRIPOptionSetting: PageSize=DoublePostcard" +*FoomaticRIPOptionSetting PageSize=DoublePostcard: "-p261 " +*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10" +*FoomaticRIPOptionSetting PageSize=Env10: "-p20 " +*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5" +*FoomaticRIPOptionSetting PageSize=EnvC5: "-p28 " +*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL" +*FoomaticRIPOptionSetting PageSize=EnvDL: "-p27 " +*PageSize EnvISOB5/Env ISO B5: "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" +*FoomaticRIPOptionSetting PageSize=EnvISOB5: "-p34 " +*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" +*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p37 " +*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive" +*FoomaticRIPOptionSetting PageSize=Executive: "-p7 " +*PageSize FanfoldGermanLegal/Fanfold German Legal: "%% FoomaticRIPOptionSetting: PageSize=FanfoldGermanLegal" +*FoomaticRIPOptionSetting PageSize=FanfoldGermanLegal: "-p258 " +*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal" +*FoomaticRIPOptionSetting PageSize=Legal: "-p5 " +*PageSize Postcard/Postcard: "%% FoomaticRIPOptionSetting: PageSize=Postcard" +*FoomaticRIPOptionSetting PageSize=Postcard: "-p260 " +*PageSize w558h774/16k 197x273 mm: "%% FoomaticRIPOptionSetting: PageSize=w558h774" +*FoomaticRIPOptionSetting PageSize=w558h774: "-p257 " +*CloseUI: *PageSize + +*OpenUI *PageRegion: PickOne +*OrderDependency: 135 AnySetup *PageRegion +*DefaultPageRegion: Letter +*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter" +*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4" +*PageRegion A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5" +*PageRegion A6/A6: "%% FoomaticRIPOptionSetting: PageSize=A6" +*PageRegion B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5" +*PageRegion B5ISO/B5 ISO: "%% FoomaticRIPOptionSetting: PageSize=B5ISO" +*PageRegion DoublePostcard/Double Postcard: "%% FoomaticRIPOptionSetting: PageSize=DoublePostcard" +*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10" +*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5" +*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL" +*PageRegion EnvISOB5/Env ISO B5: "%% FoomaticRIPOptionSetting: PageSize=EnvISOB5" +*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch" +*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive" +*PageRegion FanfoldGermanLegal/Fanfold German Legal: "%% FoomaticRIPOptionSetting: PageSize=FanfoldGermanLegal" +*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal" +*PageRegion Postcard/Postcard: "%% FoomaticRIPOptionSetting: PageSize=Postcard" +*PageRegion w558h774/16k 197x273 mm: "%% FoomaticRIPOptionSetting: PageSize=w558h774" +*CloseUI: *PageRegion + +*DefaultImageableArea: Letter +*ImageableArea Letter/Letter: "11.34 11.34 600.66 780.66" +*ImageableArea A4/A4: "11.34 11.34 583.66 830.66" +*ImageableArea A5/A5: "11.34 11.34 408.66 583.66" +*ImageableArea A6/A6: "11.34 11.34 285.66 408.66" +*ImageableArea B5/B5: "11.34 11.34 486.66 696.66" +*ImageableArea B5ISO/B5 ISO: "11.34 11.34 486.66 696.66" +*ImageableArea DoublePostcard/Double Postcard: "11.34 11.34 271.66 404.66" +*ImageableArea Env10/Env #10: "11.34 11.34 285.66 672.66" +*ImageableArea EnvC5/Env C5: "11.34 11.34 447.66 637.66" +*ImageableArea EnvDL/Env DL: "11.34 11.34 299.66 611.66" +*ImageableArea EnvISOB5/Env ISO B5: "11.34 11.34 486.66 696.66" +*ImageableArea EnvMonarch/Env Monarch: "11.34 11.34 267.66 528.66" +*ImageableArea Executive/Executive: "11.34 11.34 510.66 744.66" +*ImageableArea FanfoldGermanLegal/Fanfold German Legal: "11.34 11.34 600.66 996.66" +*ImageableArea Legal/Legal: "11.34 11.34 600.66 996.66" +*ImageableArea Postcard/Postcard: "11.34 11.34 271.66 404.66" +*ImageableArea w558h774/16k 197x273 mm: "11.34 11.34 546.66 762.66" + +*DefaultPaperDimension: Letter +*PaperDimension Letter/Letter: "612 792" +*PaperDimension A4/A4: "595 842" +*PaperDimension A5/A5: "420 595" +*PaperDimension A6/A6: "297 420" +*PaperDimension B5/B5: "498 708" +*PaperDimension B5ISO/B5 ISO: "498 708" +*PaperDimension DoublePostcard/Double Postcard: "283 416" +*PaperDimension Env10/Env #10: "297 684" +*PaperDimension EnvC5/Env C5: "459 649" +*PaperDimension EnvDL/Env DL: "311 623" +*PaperDimension EnvISOB5/Env ISO B5: "498 708" +*PaperDimension EnvMonarch/Env Monarch: "279 540" +*PaperDimension Executive/Executive: "522 756" +*PaperDimension FanfoldGermanLegal/Fanfold German Legal: "612 1008" +*PaperDimension Legal/Legal: "612 1008" +*PaperDimension Postcard/Postcard: "283 416" +*PaperDimension w558h774/16k 197x273 mm: "558 774" + +*OpenUI *InputSlot/Media Source: PickOne +*FoomaticRIPOption InputSlot: enum CmdLine A +*OrderDependency: 150 AnySetup *InputSlot +*DefaultInputSlot: Auto +*InputSlot Upper/Upper or Only One InputSlot: "%% FoomaticRIPOptionSetting: InputSlot=Upper" +*FoomaticRIPOptionSetting InputSlot=Upper: "-s1 " +*InputSlot Middle/Middle Tray: "%% FoomaticRIPOptionSetting: InputSlot=Middle" +*FoomaticRIPOptionSetting InputSlot=Middle: "-s3 " +*InputSlot Lower/Lower Tray: "%% FoomaticRIPOptionSetting: InputSlot=Lower" +*FoomaticRIPOptionSetting InputSlot=Lower: "-s2 " +*InputSlot Auto/Auto Source: "%% FoomaticRIPOptionSetting: InputSlot=Auto" +*FoomaticRIPOptionSetting InputSlot=Auto: "-s7 " +*InputSlot Envelope/Envelope: "%% FoomaticRIPOptionSetting: InputSlot=Envelope" +*FoomaticRIPOptionSetting InputSlot=Envelope: "-s5 " +*InputSlot Manual/Manual Feed: "%% FoomaticRIPOptionSetting: InputSlot=Manual" +*FoomaticRIPOptionSetting InputSlot=Manual: "-s4 " +*CloseUI: *InputSlot + +*OpenUI *MediaType/Media Type: PickOne +*FoomaticRIPOption MediaType: enum CmdLine A +*OrderDependency: 150 AnySetup *MediaType +*DefaultMediaType: Standard +*MediaType Bond/Bond: "%% FoomaticRIPOptionSetting: MediaType=Bond" +*FoomaticRIPOptionSetting MediaType=Bond: "-m260 " +*MediaType Color/Color: "%% FoomaticRIPOptionSetting: MediaType=Color" +*FoomaticRIPOptionSetting MediaType=Color: "-m512 " +*MediaType Envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=Envelope" +*FoomaticRIPOptionSetting MediaType=Envelope: "-m267 " +*MediaType Heavy/Heavy: "%% FoomaticRIPOptionSetting: MediaType=Heavy" +*FoomaticRIPOptionSetting MediaType=Heavy: "-m262 " +*MediaType Labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=Labels" +*FoomaticRIPOptionSetting MediaType=Labels: "-m263 " +*MediaType Letterhead/Letterhead: "%% FoomaticRIPOptionSetting: MediaType=Letterhead" +*FoomaticRIPOptionSetting MediaType=Letterhead: "-m513 " +*MediaType Light/Light: "%% FoomaticRIPOptionSetting: MediaType=Light" +*FoomaticRIPOptionSetting MediaType=Light: "-m258 " +*MediaType Preprinted/Preprinted: "%% FoomaticRIPOptionSetting: MediaType=Preprinted" +*FoomaticRIPOptionSetting MediaType=Preprinted: "-m514 " +*MediaType Prepunched/Prepunched: "%% FoomaticRIPOptionSetting: MediaType=Prepunched" +*FoomaticRIPOptionSetting MediaType=Prepunched: "-m515 " +*MediaType Recycled/Recycled: "%% FoomaticRIPOptionSetting: MediaType=Recycled" +*FoomaticRIPOptionSetting MediaType=Recycled: "-m516 " +*MediaType Rough/Rough: "%% FoomaticRIPOptionSetting: MediaType=Rough" +*FoomaticRIPOptionSetting MediaType=Rough: "-m263 " +*MediaType Standard/Standard Paper: "%% FoomaticRIPOptionSetting: MediaType=Standard" +*FoomaticRIPOptionSetting MediaType=Standard: "-m1 " +*MediaType ThickStock/Thick Stock: "%% FoomaticRIPOptionSetting: MediaType=ThickStock" +*FoomaticRIPOptionSetting MediaType=ThickStock: "-m261 " +*MediaType Transparency/Transparency: "%% FoomaticRIPOptionSetting: MediaType=Transparency" +*FoomaticRIPOptionSetting MediaType=Transparency: "-m2 " +*MediaType Vellum/Vellum: "%% FoomaticRIPOptionSetting: MediaType=Vellum" +*FoomaticRIPOptionSetting MediaType=Vellum: "-m273 " +*CloseUI: *MediaType + +*OpenUI *Density/Print Density: PickOne +*FoomaticRIPOption Density: enum CmdLine A +*OrderDependency: 150 AnySetup *Density +*DefaultDensity: Density3 +*Density Density1/Extra Light (1): "%% FoomaticRIPOptionSetting: Density=Density1" +*FoomaticRIPOptionSetting Density=Density1: "-T1 " +*Density Density2/Light (2): "%% FoomaticRIPOptionSetting: Density=Density2" +*FoomaticRIPOptionSetting Density=Density2: "-T2 " +*Density Density3/Medium (3): "%% FoomaticRIPOptionSetting: Density=Density3" +*FoomaticRIPOptionSetting Density=Density3: "-T3 " +*Density Density4/Dark (4): "%% FoomaticRIPOptionSetting: Density=Density4" +*FoomaticRIPOptionSetting Density=Density4: "-T4 " +*Density Density5/Extra Dark (5): "%% FoomaticRIPOptionSetting: Density=Density5" +*FoomaticRIPOptionSetting Density=Density5: "-T5 " +*CloseUI: *Density + +*OpenUI *Copies/Copies: PickOne +*FoomaticRIPOption Copies: int CmdLine A +*FoomaticRIPOptionPrototype Copies: "-n%s " +*FoomaticRIPOptionRange Copies: 1 100 +*OrderDependency: 220 AnySetup *Copies +*DefaultCopies: 1 +*FoomaticRIPDefaultCopies: 1 +*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1" +*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2" +*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3" +*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4" +*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5" +*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6" +*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7" +*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8" +*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9" +*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10" +*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11" +*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12" +*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13" +*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14" +*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15" +*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16" +*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17" +*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18" +*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19" +*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20" +*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21" +*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22" +*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23" +*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24" +*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25" +*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26" +*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27" +*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28" +*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29" +*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30" +*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31" +*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32" +*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33" +*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34" +*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35" +*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36" +*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37" +*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38" +*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39" +*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40" +*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41" +*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42" +*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43" +*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44" +*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45" +*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46" +*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47" +*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48" +*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49" +*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50" +*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51" +*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52" +*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53" +*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54" +*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55" +*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56" +*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57" +*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58" +*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59" +*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60" +*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61" +*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62" +*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63" +*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64" +*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65" +*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66" +*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67" +*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68" +*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69" +*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70" +*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71" +*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72" +*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73" +*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74" +*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75" +*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76" +*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77" +*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78" +*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79" +*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80" +*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81" +*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82" +*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83" +*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84" +*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85" +*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86" +*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87" +*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88" +*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89" +*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90" +*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91" +*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92" +*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93" +*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94" +*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95" +*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96" +*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97" +*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98" +*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99" +*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100" +*CloseUI: *Copies + +*CloseGroup: General + +*OpenGroup: Adjustment/Adjustment + +*OpenUI *halftone/Halftone Algorithm: PickOne +*FoomaticRIPOption halftone: enum CmdLine A +*OrderDependency: 110 AnySetup *halftone +*Defaulthalftone: default +*halftone default/Default: "%% FoomaticRIPOptionSetting: halftone=default" +*FoomaticRIPOptionSetting halftone=default: " " +*halftone as/Accurate Screens (better): "%% FoomaticRIPOptionSetting: halftone=as" +*FoomaticRIPOptionSetting halftone=as: " -qas " +*halftone standard/Standard: "%% FoomaticRIPOptionSetting: halftone=standard" +*FoomaticRIPOptionSetting halftone=standard: " -q1 " +*halftone wts/Well Tempered Screens (best): "%% FoomaticRIPOptionSetting: halftone=wts" +*FoomaticRIPOptionSetting halftone=wts: " -qwts " +*CloseUI: *halftone + +*CloseGroup: Adjustment + +*OpenGroup: Miscellaneous/Miscellaneous + +*OpenUI *NupOrient/N-up Orientation: PickOne +*FoomaticRIPOption NupOrient: enum CmdLine A +*OrderDependency: 200 AnySetup *NupOrient +*DefaultNupOrient: port +*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land" +*FoomaticRIPOptionSetting NupOrient=land: "-ol " +*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port" +*FoomaticRIPOptionSetting NupOrient=port: " " +*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea" +*FoomaticRIPOptionSetting NupOrient=sea: "-os " +*CloseUI: *NupOrient + +*OpenUI *NupPages/N-up Printing: PickOne +*FoomaticRIPOption NupPages: enum CmdLine A +*OrderDependency: 200 AnySetup *NupPages +*DefaultNupPages: 1up +*NupPages 1up/1-up: "%% FoomaticRIPOptionSetting: NupPages=1up" +*FoomaticRIPOptionSetting NupPages=1up: " " +*NupPages 2up/2-up: "%% FoomaticRIPOptionSetting: NupPages=2up" +*FoomaticRIPOptionSetting NupPages=2up: "-2 " +*NupPages 3up/3-up: "%% FoomaticRIPOptionSetting: NupPages=3up" +*FoomaticRIPOptionSetting NupPages=3up: "-3 " +*NupPages 4up/4-up: "%% FoomaticRIPOptionSetting: NupPages=4up" +*FoomaticRIPOptionSetting NupPages=4up: "-4 " +*NupPages 6up/6-up: "%% FoomaticRIPOptionSetting: NupPages=6up" +*FoomaticRIPOptionSetting NupPages=6up: "-6 " +*NupPages 8up/8-up: "%% FoomaticRIPOptionSetting: NupPages=8up" +*FoomaticRIPOptionSetting NupPages=8up: "-8 " +*NupPages 10up/10-up: "%% FoomaticRIPOptionSetting: NupPages=10up" +*FoomaticRIPOptionSetting NupPages=10up: "-10 " +*NupPages 12up/12-up: "%% FoomaticRIPOptionSetting: NupPages=12up" +*FoomaticRIPOptionSetting NupPages=12up: "-12 " +*NupPages 14up/14-up: "%% FoomaticRIPOptionSetting: NupPages=14up" +*FoomaticRIPOptionSetting NupPages=14up: "-14 " +*NupPages 15up/15-up: "%% FoomaticRIPOptionSetting: NupPages=15up" +*FoomaticRIPOptionSetting NupPages=15up: "-15 " +*NupPages 16up/16-up: "%% FoomaticRIPOptionSetting: NupPages=16up" +*FoomaticRIPOptionSetting NupPages=16up: "-16 " +*NupPages 18up/18-up: "%% FoomaticRIPOptionSetting: NupPages=18up" +*FoomaticRIPOptionSetting NupPages=18up: "-18 " +*CloseUI: *NupPages + +*CloseGroup: Miscellaneous + + +*% Generic boilerplate PPD stuff as standard PostScript fonts and so on + +*DefaultFont: Courier +*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM +*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM +*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM +*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM +*Font Bookman-Demi: Standard "(001.004S)" Standard ROM +*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM +*Font Bookman-Light: Standard "(001.004S)" Standard ROM +*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM +*Font Courier: Standard "(002.004S)" Standard ROM +*Font Courier-Bold: Standard "(002.004S)" Standard ROM +*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM +*Font Courier-Oblique: Standard "(002.004S)" Standard ROM +*Font Helvetica: Standard "(001.006S)" Standard ROM +*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM +*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM +*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM +*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM +*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM +*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM +*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM +*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM +*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM +*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM +*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM +*Font Palatino-Bold: Standard "(001.005S)" Standard ROM +*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM +*Font Palatino-Italic: Standard "(001.005S)" Standard ROM +*Font Palatino-Roman: Standard "(001.005S)" Standard ROM +*Font Symbol: Special "(001.007S)" Special ROM +*Font Times-Bold: Standard "(001.007S)" Standard ROM +*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM +*Font Times-Italic: Standard "(001.007S)" Standard ROM +*Font Times-Roman: Standard "(001.007S)" Standard ROM +*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM +*Font ZapfDingbats: Special "(001.004S)" Standard ROM diff --git a/rastertozjs.c b/rastertozjs.c index 53c9bbf..cd7561c 100644 --- a/rastertozjs.c +++ b/rastertozjs.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include "jbig.h" @@ -37,6 +38,64 @@ /* ---------- ZJS output helpers ---------- */ +static FILE *DebugOutput = NULL; + +static size_t +output_write(const void *ptr, size_t size, size_t nmemb, FILE *fp) +{ + size_t written = fwrite(ptr, size, nmemb, fp); + + if (written != nmemb) + return written; + if (DebugOutput && fp == stdout && + fwrite(ptr, size, nmemb, DebugOutput) != nmemb) + { + fprintf(stderr, "ERROR: rastertozjs: debug output write failed\n"); + exit(1); + } + return written; +} + +static int +output_putc(int ch, FILE *fp) +{ + int rc = fputc(ch, fp); + + if (rc == EOF) + return rc; + if (DebugOutput && fp == stdout && fputc(ch, DebugOutput) == EOF) + { + fprintf(stderr, "ERROR: rastertozjs: debug output write failed\n"); + exit(1); + } + return rc; +} + +static int +output_printf(FILE *fp, const char *format, ...) +{ + int rc; + va_list ap, copy; + + va_start(ap, format); + va_copy(copy, ap); + rc = vfprintf(fp, format, ap); + va_end(ap); + if (rc < 0) + { + va_end(copy); + return rc; + } + if (DebugOutput && fp == stdout && vfprintf(DebugOutput, format, copy) < 0) + { + va_end(copy); + fprintf(stderr, "ERROR: rastertozjs: debug output write failed\n"); + exit(1); + } + va_end(copy); + return rc; +} + static void chunk_write_rsvd(unsigned long type, unsigned int rsvd, unsigned long items, unsigned long size, FILE *fp) @@ -47,7 +106,7 @@ chunk_write_rsvd(unsigned long type, unsigned int rsvd, chunk.size = be32(sizeof(ZJ_HEADER) + size); chunk.reserved = be16(rsvd); chunk.signature = 0x5a5a; - if (fwrite(&chunk, 1, sizeof(ZJ_HEADER), fp) == 0) + if (output_write(&chunk, 1, sizeof(ZJ_HEADER), fp) != sizeof(ZJ_HEADER)) { fprintf(stderr, "ERROR: rastertozjs: chunk_write failed\n"); exit(1); @@ -70,7 +129,7 @@ item_uint32_write(unsigned short item, unsigned long value, FILE *fp) rec.header.type = ZJIT_UINT32; rec.header.param = 0; rec.value = be32(value); - if (fwrite(&rec, 1, sizeof(ZJ_ITEM_UINT32), fp) == 0) + if (output_write(&rec, 1, sizeof(ZJ_ITEM_UINT32), fp) != sizeof(ZJ_ITEM_UINT32)) { fprintf(stderr, "ERROR: rastertozjs: item_uint32_write failed\n"); exit(1); @@ -201,7 +260,7 @@ write_plane(int planeNum, BIE_CHAIN **root, FILE *fp, int model) if (current == *root) { chunk_write(ZJT_JBIG_BIH, 0, current->len, fp); - fwrite(current->data, 1, current->len, fp); + output_write(current->data, 1, current->len, fp); } else { @@ -212,9 +271,9 @@ write_plane(int planeNum, BIE_CHAIN **root, FILE *fp, int model) else pad_len = 0; chunk_write(ZJT_JBIG_BID, 0, len + pad_len, fp); - fwrite(current->data, 1, len, fp); + output_write(current->data, 1, len, fp); for (i = 0; i < pad_len; i++) - putc(0, fp); + output_putc(0, fp); } } @@ -270,22 +329,22 @@ start_doc(FILE *fp, int model, int density, int economode) tmp = localtime(&now); strftime(datetime, sizeof(datetime), "%Y%m%d%H%M%S", tmp); - fprintf(fp, "\033%%-12345X@PJL JOB\n"); - fprintf(fp, "@PJL SET JAMRECOVERY=OFF\n"); - fprintf(fp, "@PJL SET DENSITY=%d\n", density); - fprintf(fp, "@PJL SET ECONOMODE=%s\n", economode ? "ON" : "OFF"); - fprintf(fp, "@PJL SET RET=MEDIUM\n"); - fprintf(fp, "@PJL INFO STATUS\n"); - fprintf(fp, "@PJL USTATUS DEVICE = ON\n"); - fprintf(fp, "@PJL USTATUS JOB = ON\n"); - fprintf(fp, "@PJL USTATUS PAGE = ON\n"); - fprintf(fp, "@PJL USTATUS TIMED = 30\n"); - fprintf(fp, "@PJL SET JOBATTR=\"JobAttr4=%s\"", datetime); - fputc(0, fp); - fprintf(fp, "\033%%-12345X"); + output_printf(fp, "\033%%-12345X@PJL JOB\n"); + output_printf(fp, "@PJL SET JAMRECOVERY=OFF\n"); + output_printf(fp, "@PJL SET DENSITY=%d\n", density); + output_printf(fp, "@PJL SET ECONOMODE=%s\n", economode ? "ON" : "OFF"); + output_printf(fp, "@PJL SET RET=MEDIUM\n"); + output_printf(fp, "@PJL INFO STATUS\n"); + output_printf(fp, "@PJL USTATUS DEVICE = ON\n"); + output_printf(fp, "@PJL USTATUS JOB = ON\n"); + output_printf(fp, "@PJL USTATUS PAGE = ON\n"); + output_printf(fp, "@PJL USTATUS TIMED = 30\n"); + output_printf(fp, "@PJL SET JOBATTR=\"JobAttr4=%s\"", datetime); + output_putc(0, fp); + output_printf(fp, "\033%%-12345X"); } - fwrite(header, 1, sizeof(header), fp); + output_write(header, 1, sizeof(header), fp); /* START_DOC */ nitems = 1; /* ZJI_DMCOLLATE always */ @@ -345,8 +404,8 @@ end_doc(FILE *fp, int model) if (model == MODEL_HP1020 || model == MODEL_HP_PRO || model == MODEL_HP_PRO_CP) { - fprintf(fp, "\033%%-12345X@PJL EOJ\n"); - fprintf(fp, "\033%%-12345X"); + output_printf(fp, "\033%%-12345X@PJL EOJ\n"); + output_printf(fp, "\033%%-12345X"); } } @@ -580,6 +639,7 @@ main(int argc, char *argv[]) int density = 3; int economode = 0; int model = MODEL_HP1020; + const char *debugPath; if (argc < 6 || argc > 7) { @@ -593,6 +653,19 @@ main(int argc, char *argv[]) parse_options(argv[5], &density, &economode, &model); + debugPath = getenv("RASTERTOZJS_DEBUG_FILE"); + if (debugPath && debugPath[0]) + { + DebugOutput = fopen(debugPath, "wb"); + if (!DebugOutput) + { + fprintf(stderr, "ERROR: rastertozjs: cannot open debug output %s\n", + debugPath); + return 1; + } + fprintf(stderr, "DEBUG: LJ1018: debug_file=%s\n", debugPath); + } + if (argc == 7) { fd = open(argv[6], O_RDONLY); @@ -665,6 +738,36 @@ main(int argc, char *argv[]) bpl = (jbigW + 7) / 8; bpl16 = (bpl + 15) & ~15; + fprintf(stderr, + "DEBUG: LJ1018: page=%d cups=%ux%u cupsBytesPerLine=%u " + "cupsBitsPerPixel=%u cupsBitsPerColor=%u cupsColorSpace=%u " + "HWResolution=%dx%d PageSizeName=%s " + "PageSize=%ux%u cupsPageSize=%.2fx%.2f\n", + page, cupsW, cupsH, cupsBpl, + header.cupsBitsPerPixel, header.cupsBitsPerColor, + header.cupsColorSpace, resX, resY, + header.cupsPageSizeName[0] ? header.cupsPageSizeName : "(none)", + header.PageSize[0], header.PageSize[1], + header.cupsPageSize[0], header.cupsPageSize[1]); + fprintf(stderr, + "DEBUG: LJ1018: page=%d ImagingBoundingBox=%u,%u,%u,%u " + "cupsImagingBBox=%.2f,%.2f,%.2f,%.2f\n", + page, header.ImagingBoundingBox[0], header.ImagingBoundingBox[1], + header.ImagingBoundingBox[2], header.ImagingBoundingBox[3], + header.cupsImagingBBox[0], header.cupsImagingBBox[1], + header.cupsImagingBBox[2], header.cupsImagingBBox[3]); + fprintf(stderr, + "DEBUG: LJ1018: page=%d computed realWidth=%d jbigW=%d " + "jbigH=%u bpp=%d inputBpl=%u jbigBpl=%d stride=%d model=%d\n", + page, realWidth, jbigW, cupsH, bpp, cupsBpl, bpl, bpl16, model); + fprintf(stderr, + "DEBUG: LJ1018: page=%d ZJS VIDEO_X=%d VIDEO_Y=%u VIDEO_BPP=%d " + "RASTER_X=%d RASTER_Y=%u RESOLUTION_X=600 RESOLUTION_Y=%d " + "OFFSET_X=(absent) OFFSET_Y=(absent) NBIE=1 PLANE=4 " + "PAPER=%d MEDIA=%d SOURCE=%d COPIES=%d\n", + page, realWidth / bpp, cupsH, bpp, + realWidth, cupsH, resY, paperCode, mediaCode, sourceCode, copies); + buf = calloc(bpl16, cupsH); if (!buf) { @@ -715,6 +818,15 @@ main(int argc, char *argv[]) end_doc(stdout, model); + if (fflush(stdout) == EOF) + fprintf(stderr, "ERROR: rastertozjs: stdout flush failed\n"); + if (DebugOutput) + { + if (fclose(DebugOutput) == EOF) + fprintf(stderr, "ERROR: rastertozjs: debug output close failed\n"); + DebugOutput = NULL; + } + cupsRasterClose(ras); if (fd != 0) close(fd);