Go to the first, previous, next, last section, table of contents.

## D.5 Canon inkjet printers

Basically, a new Canon printer can be added to ``print-canon.c'` in a similar way as described above for the epson inkjet printers. The main differences are noted here:

In general, Canon printers have more "built-in intelligence" than Epson printers which results in the fact that the driver only has to tell the printing conditions like resolutions, dot sizes, etc. to the printer and afterwards transfer the raster data line by line for each color used.

`canon_cap_t` is a C struct defined as follows:

Data type: canon_cap_t

      typedef struct canon_caps {
        int model;          /* model number as used in printers.xml */
        int max_width;      /* maximum printable paper size */
        int max_height;
        int base_res;       /* base resolution - shall be 150 or 180 */
        int max_xdpi;       /* maximum horizontal resolution */
        int max_ydpi;       /* maximum vertical resolution */
        int max_quality;
        int border_left;    /* left margin, points */
        int border_right;   /* right margin, points */
        int border_top;     /* absolute top margin, points */
        int border_bottom;  /* absolute bottom margin, points */
        int inks;           /* installable cartridges (CANON_INK_*) */
        int slots;          /* available paperslots */
        int features;       /* special bjl settings */
        canon_dot_size_t dot_sizes;	/* Vector of dot sizes for resolutions */
        canon_densities_t densities;	/* List of densities for each printer */
        canon_variable_inklist_t *inxs; /* Choices of inks for this printer */
      } canon_cap_t;

Since there are Canon printers which print in resolutions of @math{2^n*150} dpi (e.g. 300, 600, 1200) and others which support resolutions of @math{2^n*180} dpi (e.g. 360, 720, 1440), there's a base resolution (150 or 180, respectively) given in the `canon_cap_t`. The structs `canon_dot_size_t`, `canon_densities_t` and `canon_variable_inklist_t` refer to resolutions being multiples of the base resolution.

For the Canon driver, the struct `canon_dot_size_t` holds values for a model's capabilities at a given resolution: ``-1'` if the resolution is not supported. ``0'` if it can be used and ``1'` if the resolution can be used for variable dot size printing.

In `canon_densities_t` the base densities for each resolution can be specified like for an epson printer, the same holds true for `canon_variable_inklist_t`. See the descriptions above to learn about how to adjust your model's output to yield nice results.

There's a slight difference though in the way the Canon driver and the escp2 driver define their variable inklists: In the Canon driver, you need to define an inklist like this:

    static const canon_variable_inklist_t canon_ink_myinks[] =
    {
      {
        1,4, /* 1bit/pixel, 4 colors */
        &ci_CMYK_1, &ci_CMYK_1, &ci_CMYK_1,
        &ci_CMYK_1, &ci_CMYK_1, &ci_CMYK_1,
      },
      {
        3,4, /* 3bit/pixel, 4 colors */
        &ci_CMYK_3, &ci_CMYK_3, &ci_CMYK_3,
        &ci_CMYK_3, &ci_CMYK_3, &ci_CMYK_3,
      },
    };

where the ``&ci_CMYK_1'` and ``&ci_CMYK_3'` entries are references to a previously defined const of type `canon_variable_inkset_t`.

Go to the first, previous, next, last section, table of contents.