Constraints on Profile Selection Algorithms

Printers are not characterized independently of a driver; the driver is needed to tell the printer to put ink on the page. If you are characterizing a printer to be used with Windows, you have to be using a Windows printer driver. (PostScript devices can be excluded from this discussion because you can characterize them independently of Windows.) If you are using a Windows printer driver, you have access to the relevant values and can construct the ICC profile correctly.

Profile Substitutions

As noted earlier, substitution tables exist both in GDI (hard-coded) and in the registry (configurable) to address issues where it is desirable to have multiple devices referencing the same profile. The substitution tables hard-coded in GDI are for the HP® DeskJet® 3xx and 5xx series color printer drivers, which ship in Windows 95. The same functionality for other devices may be obtained by modifying the value for the SubstList key under the ICM key (for an overview of the registry hierarchy, see Registry Keys Reference to define mapping pairs.

The SubstList key is a string registry value and should consist of 16 character/byte sequences. The first 8 bytes should be the 4-byte manufacturer and 4-byte model values that are being searched for, and the second 8 bytes should be the 4-byte manufacturer and 4-byte model values that should be used in its place. Any number of 16-byte pairings may be used here.

An example would be using the Windows 95 drivers for the "HP DeskJet 1200C" (Manufacturer Tag = "HP ", Model Tag = "381C") and the "HP Color LaserJet (MS)" (Manufacturer Tag = "HP ", Model Tag = "5839"), and substituting the HP Color LaserJet profile for the 1200C profile. The SubstList value would need to be "HP 381CHP 5839". In hexadecimal notation, this is: 0x48 0x50 0x32 0x32 0x33 0x38 0x31 0x43 0x48 0x50 0x32 0x32 0x35 0x38 0x33 0x39.

Note that appending entries to a preexisting SubstList value cannot currently be done using an INF file, and it would require some code that reads the existing value and gracefully appends to it.