Short: IPP/AirPrint driver and setup tool Author: Darren Banfi (boingball) Uploader: boingball gmail com Type: driver/print Version: 1.2.6 Requires: 68000+; AmigaOS 3.0+; TCP/IP stack providing bsdsocket.library Architecture: m68k-amigaos >= 3.0.0 MintPRINT ========= MintPRINT lets classic AmigaOS applications print to modern network printers - the same IPP/AirPrint printers phones and modern computers already use - with no printer-specific software needed on the printer side. It is a real DEVS:Printers/ printer.device driver plus MintPrint Settings, a GUI setup, discovery and test tool. Print graphics from applications that use AmigaOS' standard printer graphics dump interface (including MultiView, GraphicDump and many paint/DTP programs), or print plain text through the standard PRT: device. MintPRINT converts the printer.device output into JPEG, PostScript, PWG Raster, or PDF and submits the resulting document directly to the printer's IPP endpoint over the network. AmigaOS 3.0/3.1 use the separate classic pre-V44 driver build. Newer V44-capable AmigaOS releases use the normal extended driver build. Both use the same MintPrint Settings GUI and the same IPP/JPEG/PostScript/PWG/PDF backend. MintPrint Settings detects which build this machine needs and installs the matching one automatically - see Installation below. Archive contents ---------------- This archive contains one drawer plus an Installer script: Install classic AmigaDOS Installer script (optional alternative to running MintPrintSettings) MintPRINT/ MintPrintSettings GUI setup, discovery and test tool Drivers/ MintPRINT-V44/ MintPRINT driver for V44-capable AmigaOS (3.2, 3.5, 3.9+) MintPRINT-OS31/ MintPRINT classic AmigaOS 3.0/3.1 driver build Run MintPrintSettings (or the Install script) and it picks the correct Drivers/ subdrawer for this machine automatically - there is no separate archive to choose between AmigaOS versions any more. Features -------- - Real DEVS:Printers/ printer.device driver - AmigaOS 3.0/3.1 support via a dedicated classic driver build - 68000-compatible driver - Graphics printing through the standard printer.device raster interface - Plain-text printing through PRT:/CMD_WRITE - Prints using JPEG, PostScript, PWG Raster, or PDF, selectable per printer - LAN printer discovery using SSDP and mDNS - IPP capability query - reads the printer's supported media, trays, colour modes, quality settings and document formats directly - Up to eight saved printer profiles (Unit0-Unit7), with one active for printing at a time - Printer make/model shown after a successful query - Built-in test page sent through printer.device - Built-in AmigaGuide help from the Help menu - Warns if a printer advertises none of the formats MintPRINT can produce, with information on reporting the printer for support - Detects this machine's AmigaOS/printer.device generation and offers to install or update the matching bundled driver automatically - Optional classic AmigaDOS Installer script as an alternative install path, with the same auto-detected driver choice - No printer-specific Amiga driver or vendor software required Requirements ------------ - Motorola 68000 or later - AmigaOS 3.0 or later - A running TCP/IP stack providing bsdsocket.library. This is required for every printing path because MintPRINT talks directly to the printer over IP. - A network printer supporting IPP and at least one document format MintPRINT can generate: JPEG, PostScript, PWG Raster, or PDF - AirPrint or IPP Everywhere printers are the most likely to work without additional printer-specific support MintPrint Settings performs network discovery and IPP capability parsing and therefore needs a larger stack than small classic Amiga utilities. Use the supplied MintPrintSettings.info file when launching from Workbench. Installation ------------ Extract the archive and copy the MintPRINT/ drawer wherever you like, then run MintPrintSettings. On first run MintPrintSettings detects your AmigaOS/printer.device generation (from workbench.library's version) and tells you which bundled driver it picked - Drivers/MintPRINT-V44/ for AmigaOS 3.2, 3.5, 3.9 and later, or Drivers/MintPRINT-OS31/ for the classic pre-V44 AmigaOS 3.0/3.1 build - before offering to install it to DEVS:Printers/MintPRINT. On later runs, if the matching bundled driver is newer than the installed copy, it offers to update it. Prefer the classic Amiga install experience? Run the Install script at the top of the archive instead - it performs the same detection through the standard AmigaOS Installer, with a chance to confirm or override the driver choice before anything is copied. Reboot after any driver install or update. A printer driver segment that is already resident in memory will not pick up a replaced file until the system reloads it. After rebooting: 1. Open Prefs/Printer and select MintPRINT as the printer. 2. Run MintPrintSettings. 3. Enter the printer's numeric IPv4 address and IPP path, or use Discover. 4. Press Query Printer to read the printer's capabilities. 5. Select the document engine and required media/tray/colour/quality options. 6. Save the settings. 7. Use Test Print to verify the complete printer.device -> MintPRINT -> IPP path. The active printer configuration is Unit0. Additional configurations can be stored in Unit1-Unit7 and copied to Unit0 when required. AmigaOS 3.0/3.1 notes --------------------- The Drivers/MintPRINT-OS31 build uses a classic pre-V44 printer driver structure and a compatibility rendering path for the older printer.device raster format. The same ABI also covers AmigaOS 3.0. The IPP networking and JPEG/PostScript/PWG Raster/PDF output code is shared with the newer driver build. AmigaOS 3.0 compatibility follows from the V39/V37 library requirements and pre-V44 printer.device ABI used by this build. AmigaOS 3.1 has had more direct real-hardware testing, so 3.0 user reports are especially welcome. MintPrintSettings should be launched using the supplied icon so its configured stack size is used. If launching from a Shell on a classic system and using a build which does not provide its own enlarged stack, set a large Shell stack first, for example: Stack 131072 Reporting a problem ------------------- If MintPrint Settings' Query reports that your printer does not support any format MintPRINT can produce, or printing otherwise fails, please open an issue at: https://github.com/boingball/MintPRINT/issues and attach the output of windows_ipp_probe.py (included in the source repository) run against the printer from a Windows PC on the same network. This helps separate printer-side IPP behaviour from Amiga-side driver problems without requiring any Amiga-specific diagnostic tools. The tested-printer list and full report template are maintained at: https://github.com/boingball/MintPRINT/blob/main/docs/PRINTER_COMPATIBILITY.md Please include the AmigaOS version, TCP/IP stack, document engine, DPI, media/tray, scaling, quality and colour mode so a successful configuration can be reproduced by another user. When reporting an AmigaOS 3.0/3.1 problem, please also mention that the MintPRINT-OS31 driver build is being used. Source Code ----------- Source code, build instructions and development history: https://github.com/boingball/MintPRINT License ------- MIT License. See the LICENSE file in the source repository for the full text - in short, free to use, copy, modify and redistribute, including commercially, provided the copyright notice is kept. Credits ------- Driver, GUI, IPP client, and the JPEG/PostScript/PWG Raster/PDF/Apple Raster document encoders by Darren Banfi (boingball), developed with assistance from Anthropic Claude. History ------- 1.2.6 Fixed monochrome jobs printing in colour, driver revision 41.3. - COLOR= (the Printer Engine colour mode) was only ever forwarded to the printer as the IPP print-color-mode job attribute - a request the printer's firmware can honour or ignore. The actual raster/JPEG pixel data sent alongside it stayed full colour regardless, across all five engines (JPEG, PostScript, PWG Raster, PDF, URF), since none of them had any grayscale handling at all. On hardware that doesn't strictly honour the hint, a "monochrome" job printed in colour - confirmed on real hardware. - driver/driver_core.c's mp_job_write_row() now desaturates the row itself (integer ITU-R BT.601 luma, no floating point) whenever COLOR= is monochrome, auto-monochrome, bi-level, process-bi-level or process-monochrome - the PWG5100.3/RFC 8011 keywords that mean "black ink only" - before it reaches any encoder, so the output is black and white regardless of whether the printer itself respects the IPP hint. 1.2.5 Maintenance release: safer defaults, no more indefinite driver hangs, correct AmigaOS 3.9 detection, driver revision 41.2. - driver/ipp_client.c's connect()/recv()/send() were plain blocking calls with no timeout - a printer that accepted a connection or a job and then went silent (e.g. a Samsung C480W hanging on a valid image/urf job, GitHub issue #66) could hold the driver, and the application printing through it, forever. All three are now timeout-bounded (8s connect, 20s read/write), with a distinct result code and debug log line for a timeout specifically - Fresh installs no longer default to a hardcoded LAN address (192.168.0.51:80) in either MintPrint Settings or the driver's own config - both now default to empty and do nothing until a real address is set, instead of a startup Query or even a print job silently probing some other device on the network - Driver/GUI generation detection now reads workbench.library's version instead of exec.library's - AmigaOS 3.9 and similar software-only OS updates can leave exec.library at whatever the Kickstart ROM shipped with, which was misdetecting real 3.9 systems as needing the classic pre-V44 driver build - Installing/updating DEVS:Printers/MintPRINT is now atomic: copies to a temp file, verifies the full size landed, then swaps it in - an allocation failure, short write, or full disk partway through used to be able to destroy a previously-working driver with no way back - Fixed the Help menu ("MintPrint Settings Help...") silently doing nothing - it built its Multiview command line with the literal PROGDIR:MintPrintSettings.guide, but PROGDIR: is scoped to the process that has it, not inherited by the new process spawned to run Multiview - Query now shows a live printer status (Ready, Busy, Stopped, or a specific problem - Jam, Door Open, Toner Empty, Out of Paper, Supply Low) next to the ink/toner levels, from printer-state and printer-state-reasons - Fixed sluggish loading of the duplex-hint art on real hardware: its IFF decoder's debug output was hitting real stdio instead of MintPrint Settings' Workbench-safe status box, likely forcing a hidden console open. Its per-pixel colour-to-screen-pen matching is now cached instead of recomputed on every redraw - Reduced the GUI's stack requirement from 384 KiB to 128 KiB (the 256 KiB IPP response buffers behind that figure are heap allocations now, not stack) - Relabeled "Printer IP/Host" to "Printer IPv4" - only numeric addresses were ever actually supported - Fixed entering an invalid address and pressing Query closing the entire Settings window instead of just reporting the error - Fixed garbled AmigaGuide help text (words run together with stray gaps) - the help file's @wordwrap/@smartwrap directives were reflowing hand-formatted, already-wrapped paragraphs and splicing their hanging-indent whitespace into the middle of lines 1.2.4 Single combined archive with automatic driver selection, driver revision 41.1 (no driver change). - Merged the separate MintPRINT / MintPRINT-OS31 release bundles into one MintPRINT/ drawer, with both compiled drivers staged under Drivers/MintPRINT-V44/ and Drivers/MintPRINT-OS31/. There is no longer a "which archive for my AmigaOS version" choice to make before downloading - MintPrint Settings now detects this machine's AmigaOS/ printer.device generation from exec.library's version and automatically installs/updates the matching bundled driver, showing the detected AmigaOS version and chosen driver in the install/update prompts and the About box - Added an Install script (classic AmigaDOS Installer format) as an alternative to running MintPrintSettings first, offering the same auto-detected driver choice with a chance to override it - Fixed the ink/toner level bars sometimes showing the wrong colour, and sometimes losing it again. Two bugs found back to back on real hardware: ObtainBestPenA() only ever reuses whatever existing pen was closest to the requested colour, so on a screen with few free colour registers (e.g. a default 32-colour Workbench) with no true cyan/magenta already on screen, several markers snapped onto the same wrong pen (both cyan and magenta bars turned yellow) - fixed by trying ObtainPen() first, which only succeeds by setting a genuinely free pen to the exact requested colour. That then exposed a second bug: each marker released its pen immediately after drawing, so the next marker's ObtainPen() could reclaim the same shared colour register and repaint it, instantly recolouring every bar already drawn with that pen index (all four bars flashed the right colour, then collapsed to whichever was requested last). Pens are now held until just before the next redraw, or released at shutdown - Shortened the OS-detection text in the driver install/update and About requesters: EasyRequest sizes its window to the single widest line with no wrapping, and the full detected-AmigaOS/ driver-path text on one line could push the requester wider than a default low-resolution AmigaOS screen 1.2.3 Printer ink/toner status is back on Query, driver revision 41.1 (no driver change). - Query now also requests the IPP marker-names/marker-colors/ marker-types/marker-levels/marker-low-levels/marker-high-levels attributes (RFC 3805 / PWG5100.13 Printer MIB). Up to six reported markers are shown in a compact 2x3 ink/toner panel in the spare area beside IPP Path / Printer Engine / Debug, filled in the colour the printer itself reports. - The main window stays at 520px wide. The GadTools controls were rearranged to make better use of the existing space, with Unit across the top row and DPI/Sides sharing the lower option rows. 1.2.2 Real AmigaOS $VER: driver versioning, driver revision 41.1. - DEVS:Printers/MintPRINT now embeds a standard "$VER: MintPRINT 41.1 (dd.mm.yyyy)" string, readable by AmigaOS's own Version command and Workbench's Information requester - the same convention MintPrint Settings' own $VER: line already used. Replaces the earlier ad-hoc "MPDRVREV:" marker, which existed only for MintPrint Settings' own bundled-vs-installed update check and wasn't understood by anything else - The driver's own version now has two parts, matching real Amiga version.revision pairs (e.g. Workbench 3.9's 47.102), so "driver revision" is never just a bare integer that could be misread as printer.device's own fixed V44 PrinterSegment ABI marker in the same file. Going forward the revision half is what moves for an ordinary driver rebuild - 41.1, 41.2, 41.3, and so on, the same way a real Amiga library keeps one version number across many small revisions - and the version half only bumps for something that warrants a new version number outright - MintPrint Settings' update-detection and About/Test Print version display now parse and compare the real $VER: string instead of the old single-integer marker - No driver behaviour change, so no version-number bump for the driver's own build count - only the versioning scheme itself changed 1.2.1 Added Apple Raster (URF) engine and duplex, driver revision 41. - Added a fifth output engine, Apple Raster (ENGINE=urf, image/urf), for printers that advertise none of MintPRINT's other formats (JPEG, PostScript, PWG Raster, PDF) - reported for the OKI B412 in issue #60. Reuses the PWG Raster encoder's proven row compression - One-sided URF printing confirmed physically on a Brother MFC-J6930DW; the OKI B412 report that motivated this engine is still pending its own confirmation - Added duplex support to the URF engine: one multi-page stream submitted once from DriverClose(), same as PWG Raster, using Apple Raster's own duplex/tumble page-header byte and a patched-in-after-the-fact page count (its file header declares the total up front, unlike PWG's per-page header). Unlike PWG Raster, no backside row/column reversal is performed - Apple Raster's page header has no equivalent transform fields, so the printer's own duplex mechanism is trusted to orient the backside - Fixed a real bug found on the first URF duplex test (Brother MFC-J6930DW, driver revision 31): strip-printed documents had no accumulator for URF (PWG-only until now), so every small SPECIAL_NOFORMFEED band became its own "duplex page" - 62 queued for what should have been a handful - and the printer rejected the job. Fixed in revision 32 by extending PWG Raster's existing strip-printing accumulator (growable declared height, tiny-band discarding, post-hoc height-field patch) to also cover URF - Fixed a second real bug found immediately after (same Brother test, driver revision 32): the accumulator now built two real pages, but they came out different heights - front content naturally overshot the media-derived target while the back only got padded to it - and the printer rejected the job again, since a physical duplex sheet needs matching front/back geometry. Fixed in revision 33 by flooring every later page's target at the tallest page the duplex job has finalized so far, converging same-sized pages onto one height without ever truncating real content - Fixed a third real bug found immediately after (same Brother test, driver revision 33): with both pages now byte-perfect and an exactly matching height, the printer still rejected the job, immediately and synchronously. The duplex/tumble byte itself (page header offset 2) was wrong - the original implementation used 1/2/3 for no-duplex/short-side/long-side, paraphrased from CUPS source, but cross-checking against a second, independent, real-world URF reverse-engineering (tested against an HP DesignJet T230) found the correct values are 0/1/2, meaning this printer was being sent an undefined byte value (3) for every two-sided-long-edge job. Fixed in revision 34; backside orientation still remains unconfirmed - Fixed a fourth real bug, found testing PWG Raster one-sided on the same printer rather than URF or duplex specifically (driver revision 34): a two-page Wordworth document printed with no IPP error, but visibly corrupted - decoding the retained job file showed a graphic cut off at the top of the second physical sheet. The strip-printing accumulator only checked whether a page had reached its target height after accepting a whole SPECIAL_NOFORMFEED band, never whether accepting it would overshoot the target, so up to ~100 rows belonging to the next page (including its own top margin) got silently welded onto the page that just filled up. Affects PWG Raster and URF alike, one-sided or duplex, and predates this URF duplex work entirely. Revision 35 split an overshooting band at the physical media height, but a real retest proved Wordworth's printable page ends earlier: 3062 rows (thirty 100-row bands plus a final 62-row remainder), not the 3505-row A4 raster. It therefore still took 443 rows from page 2. Revision 36 recognises the short terminal band as the logical page boundary, including narrow auxiliary dumps, and pads/finalises the physical sheet there; the media height split remains as a fallback for other applications - Fixed the top margin going missing on Wordsworth pages once revision 36 started trusting the application's own logical page boundary instead of always padding to the physical media height (driver revisions 37-38): a real trace showed Wordsworth clears its margins and sends only a 70-line form length, not its separate Print Borders values, through the margin commands. Revision 37 restores the top border in strip pages from that signal; revision 38 adds a form-length/physical-media fallback that restores the documented 0.50-inch top border (150 rows at 300 DPI) whenever no real vertical movement or explicit aSTBM placement is present. The media-height finalizer still supplies the matching bottom border - Restored real pre-dump vertical movement as the strongest margin placement signal (driver revision 39): the driver now processes and accumulates the aIND/aNEL and literal line-feed movement Wordsworth issues before a graphics dump, converts it from printer.device's 1/216-inch VMI, and emits the corresponding leading white raster rows ahead of the revision 38 form-length fallback - Added complete legacy page layout diagnostics (driver revision 40): debug logs now record every printer layout command from aVERP0 through aCAM, both parameter slots, live line/VMI/CRLF state, and each raster band's complete IODRPReq source/ destination geometry, to expose any placement signal outside the commands already handled - without changing revision 39's output - Physically confirmed on a Brother MFC-J6930DW: Wordsworth's PWG Raster page boundaries/margins print correctly, and Apple Raster (URF) two-sided long-edge duplex completes and prints - Fixed PRT:/CMD_WRITE text printing silently submitting image/jpeg instead of image/urf when ENGINE=urf is selected: the text path's own engine dispatch had no URF case and fell through to JPEG, which fails outright on a URF-only printer such as the OKI B412. command_table.c now recognises engine=urf and encodes/submits text pages as Apple Raster like the graphics path already does - Fixed the revision 37-39 top-margin restoration corrupting non-PWG/URF strip-printed pages: it computes and writes leading whitespace rows for any NOFORMFEED job regardless of engine, but the helper it called only understood PWG and URF, silently writing into the (unopened) PWG encoder for a JPEG, PDF or PostScript job instead of the one actually in use. mp_job_reserve_page()/mp_job_pad_page() now dispatch to whichever encoder the job is actually using for all five engines. Neither fix has been physically re-tested yet - Driver build revision is now 41 so MintPrint Settings can detect and offer the updated driver automatically 1.2.0 Faster JPEG, PRT: text printing, and PostScript compatibility fixes. - Added plain-text printer.device output through PRT:/CMD_WRITE. Text printing supports normal characters, CR/LF, tabs, automatic wrapping and form-feed page breaks, and has been tested with AmigaDOS Type and MultiView - Further accelerated the JPEG encoder with constant-block shortcuts, static zig-zag lookup, combined chroma sampling and a direct-pointer fast path for complete interior MCUs, reducing JPEG CPU time on classic 68k systems; PostScript benefits from the same JPEG work - PostScript Fit/Fill now performs explicit page placement, with Fit respecting hardware imageable margins reported by the printer so borders and edge content are not placed in non-printable areas; Fill retains its full-sheet cover/crop behaviour - Fixed the 300* DPI compatibility option so it appears immediately after the first Query on PWG Raster printers that omit 300 DPI from their advertised resolution list - Fixed IPP enum parsing for print-quality and printer-state, and now rejects failed Get-Printer-Attributes HTTP/IPP responses instead of treating them as valid capability data - Added built-in AmigaGuide help, available from MintPrint Settings' Help menu and included in both release drawers - Driver build revision is now 29 so MintPrint Settings can detect and offer the updated driver automatically 1.1.0 PostScript engine, faster JPEG, and more reliable wireless setup. - Added a fourth output engine, PostScript, for printers (e.g. Samsung C480W) that advertise IPP JPEG support but silently discard the job; it reuses the existing JPEG encoder internally, so it benefits from the speed-up below too - Query/Discover now wait long enough for Wi-Fi printers that power down their radio between jobs (HP OfficeJet/Envy series confirmed) to wake up, instead of giving up after one attempt - Fixed printer.device occasionally reporting an oversized page width for a single-shot page (observed producing a page ~30% wider than the configured media); the fix now correctly tells a genuinely oversized page apart from a legitimate landscape one, and covers the JPEG and PDF engines as well as PWG Raster - Fixed the test page's Wi-Fi-driven-oversized-page fix leaving a blank left margin and clipping the right edge on some hardware - PWG Raster (the cheapest engine to encode) is now the default whenever a printer advertises it, instead of always defaulting to JPEG - Replaced the JPEG encoder's page-width DCT with a much faster algorithm (fewer than a tenth of the multiplications for the same result), significantly speeding up JPEG and PostScript jobs on real 68k hardware - Test Print now runs asynchronously so the window stays responsive while printing, and uses the current Workbench screen's own palette instead of a fixed one, fixing a toner-wasting grey background on at least one laser printer 1.0.3b Page-boundary fixes and clearer setup options. - Fixed multi-page PWG jobs being combined into one oversized raster when applications left SPECIAL_NOFORMFEED set; complete media-sized pages and narrow end-of-page auxiliary dumps now provide safe physical-page boundaries - Preserved media-height padding for genuine WordWorth strip printing, preventing short portrait documents being rotated or expanded while allowing multi-page documents to print every page - Added a printer-capability-backed DPI selector and renamed it DPI - Replaced the debug JPEG option with a simple Debug on/off setting - Added an early TCP-stack check so the driver fails safely when no bsdsocket.library-compatible stack is available 1.0.3 WordWorth support and more reliable printer connections. - Fixed strip-printed pages (WordWorth, and likely explains ArtEffect's long-standing "many near-blank pages" behaviour too) submitting as several separate, massively oversized pages instead of one correct one - the driver now honours SPECIAL_NOFORMFEED and assembles the bands into a single document before sending it - Fixed MintPrint Settings' status box going blank and staying that way after certain other applications have run - Fixed Query being able to freeze the whole program with no way out but a reboot, if the printer didn't respond - connection attempts are now properly bounded and time out cleanly instead - Fixed a bug where MintPrint Settings' own Get-Printer- Attributes request could be rejected by some printers (reported against a Canon TS8300), leaving Query showing no capabilities at all even though the printer itself was fine - Query now prefers the standard IPP port (631) over port 80 when discovering or querying a printer - Query no longer accepts an all-empty capability response as a successful result 1.0.2 Bug fixes from real-hardware testing reports. - Fixed an IPP response parsing bug (a printer's interim "100 Continue" response was mistaken for the final one) that could report a print job as failed even though it printed, and could leave MintPrint Settings' Query showing Media/Scaling/Quality/ Print Mode as undetected on printers that do support them - MintPrint Settings' Query no longer accepts an incomplete response from the printer as a successful result - Scaling now defaults to "auto" after a Query when the printer offers it, for better cross-printer compatibility - Added a safety guard against a rare runaway "many near-blank pages" print storm triggered by some third-party applications - Driver auto-update detection now also offers to update a driver installed before version tracking was added - About box shows the installed and bundled driver revision - Various MintPrint Settings layout and text-truncation fixes 1.0.0 Initial Aminet release. - DEVS:Printers/MintPRINT driver - Separate AmigaOS 3.1 classic driver build - JPEG, PostScript, PWG Raster and PDF document backends - MintPrint Settings GUI - LAN printer discovery - IPP capability query - Up to eight saved printer profiles - Built-in printer.device test page - Automatic driver install/update