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:<n>" 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
|