1/*
2 *   Print plug-in CANON BJL driver for the GIMP.
3 *
4 *   Copyright 1997-2000 Michael Sweet (mike@easysw.com),
5 *	Robert Krawitz (rlk@alum.mit.edu) and
6 *      Andy Thaller (thaller@ph.tum.de)
7 *   Copyright (c) 2006 - 2007 Sascha Sommer (saschasommer@freenet.de)
8 *
9 *   This program is free software; you can redistribute it and/or modify it
10 *   under the terms of the GNU General Public License as published by the Free
11 *   Software Foundation; either version 2 of the License, or (at your option)
12 *   any later version.
13 *
14 *   This program is distributed in the hope that it will be useful, but
15 *   WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 *   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 *   for more details.
18 *
19 *   You should have received a copy of the GNU General Public License
20 *   along with this program; if not, write to the Free Software
21 *   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 */
23
24/* This file contains definitions for the various inks
25*/
26
27#ifndef GUTENPRINT_INTERNAL_CANON_INKS_H
28#define GUTENPRINT_INTERNAL_CANON_INKS_H
29
30/* ink definition:
31 *  ink dots can be printed in various sizes
32 *  one size is called level
33 *  every level is represented by a bitcombination and a density
34 *  the density ranges from 0 (no dot is printed) to 1.0 (maximum dot size)
35 *
36 *  an ink is therefore defined by the number of bits used for the bitpattern (bitdepth) and the number of possible levels:
37 *    a 1 bit ink can have 2 possible levels 0 and 1
38 *    a 2 bit ink can have 2*2=4 possible levels with the bitpatterns 0,1,2 and 3
39 *    a 3 bit ink can have 2*2*2=8 possible levels with the bitpatterns 0 to 7
40 *    ...
41 *  some inks use less levels than possible with the given bitdepth
42 *  some inks use special compressions to store for example 5 3 level pixels in 1 byte
43 * naming:
44 *  dotsizes are named dotsizes_xl where x is the number of levels (number of dotsizes + 1)
45 *  inks are named canon_xb_yl_ink where x is the number of bits representing the y possible ink levels
46 *  inks that contain special (compression) flags are named canon_xb_yl_c_ink
47 * order:
48 *  dotsizes are ordered ascending by the number of dots
49 *
50*/
51
52
53typedef struct {
54  const int bits;                     /* bitdepth */
55  const int flags;                    /* flags:   */
56#define INK_FLAG_5pixel_in_1byte 0x1  /*  use special compression where 5 3level pixels get stored in 1 byte */
57  int numsizes;                       /* number of possible {bit,density} tuples */
58  const stp_dotsize_t *dot_sizes;     /* pointer to an array of {bit,density} tuples */
59} canon_ink_t;
60
61/* declare a standard ink */
62#define DECLARE_INK(bits,levels)      \
63static const canon_ink_t canon_##bits##b_##levels##l_ink = {              \
64  bits,0,                                  \
65  sizeof(dotsizes_##levels##l)/sizeof(stp_dotsize_t), dotsizes_##levels##l   \
66}
67
68/* declare an ink with flags */
69#define DECLARE_INK_EXTENDED(bits,levels,flags)      \
70static const canon_ink_t canon_##bits##b_##levels##l_c_ink = {              \
71  bits,flags,                                  \
72  sizeof(dotsizes_##levels##l)/sizeof(stp_dotsize_t), dotsizes_##levels##l   \
73}
74
75
76
77/* NOTE  NOTE  NOTE  NOTE  NOTE  NOTE  NOTE  NOTE  NOTE  NOTE  NOTE  NOTE
78 *
79 * Some of the bitpattern/density combinations were taken from print-escp2.c
80 * and do NOT represent the requirements of canon inks. Feel free to play
81 * with them and send a patch to gimp-print-devel@lists.sourceforge.net
82 */
83
84
85static const stp_dotsize_t dotsizes_2l[] = {
86  { 0x1, 1.0 }
87};
88
89DECLARE_INK(1,2);
90
91/* test */
92DECLARE_INK(2,2);
93
94static const stp_dotsize_t dotsizes_3l[] = {
95  { 0x1, 0.5  },
96  { 0x2, 1.0  }
97};
98
99DECLARE_INK(2,3);
100
101DECLARE_INK_EXTENDED(2,3,INK_FLAG_5pixel_in_1byte);
102
103static const stp_dotsize_t dotsizes_4l[] = {
104  { 0x1, 0.45 },
105  { 0x2, 0.68 },
106  { 0x3, 1.0 }
107};
108
109DECLARE_INK(2,4);
110
111/*under development*/
112DECLARE_INK(4,4);
113
114static const stp_dotsize_t dotsizes_5l[] = {
115  { 0x1, 0.45 },
116  { 0x2, 0.55 },
117  { 0x3, 0.68 },
118  { 0x4, 1.0 }
119};
120
121/*under development*/
122DECLARE_INK(4,5);
123DECLARE_INK_EXTENDED(4,5,INK_FLAG_5pixel_in_1byte);
124
125static const stp_dotsize_t dotsizes_6l[] = {
126  { 0x1, 0.2 },
127  { 0x2, 0.4 },
128  { 0x3, 0.6 },
129  { 0x4, 0.8 },
130  { 0x5, 1.0 }
131};
132
133/*under development*/
134DECLARE_INK(4,6);
135DECLARE_INK_EXTENDED(4,6,INK_FLAG_5pixel_in_1byte);
136
137static const stp_dotsize_t dotsizes_7l[] = {
138  { 0x1, 0.45 },
139  { 0x2, 0.55 },
140  { 0x3, 0.66 },
141  { 0x4, 0.77 },
142  { 0x5, 0.88 },
143  { 0x6, 1.0 }
144};
145
146DECLARE_INK(3,7);
147
148/*under development*/
149DECLARE_INK(4,7);
150
151static const stp_dotsize_t dotsizes_8l[] = {
152  { 0x1, 0.14 },
153  { 0x2, 0.29 },
154  { 0x3, 0.43 },
155  { 0x4, 0.58 },
156  { 0x5, 0.71 },
157  { 0x6, 0.86 },
158  { 0x7, 1.00 }
159};
160
161DECLARE_INK(4,8);
162
163static const stp_dotsize_t dotsizes_9l[] = {
164  { 0x1, 0.14 },
165  { 0x2, 0.29 },
166  { 0x3, 0.43 },
167  { 0x4, 0.55 },
168  { 0x5, 0.66 },
169  { 0x6, 0.71 },
170  { 0x7, 0.88 },
171  { 0x8, 1.00 }
172};
173
174/*under development*/
175DECLARE_INK(4,9);
176DECLARE_INK(8,9);
177
178static const stp_dotsize_t dotsizes_16l[] = {
179  { 0x1, 0.07 },
180  { 0x2, 0.13 },
181  { 0x3, 0.20 },
182  { 0x4, 0.27 },
183  { 0x5, 0.33 },
184  { 0x6, 0.40 },
185  { 0x7, 0.47 },
186  { 0x8, 0.53 },
187  { 0x9, 0.60 },
188  { 0xA, 0.67 },
189  { 0xB, 0.73 },
190  { 0xC, 0.80 },
191  { 0xD, 0.87 },
192  { 0xE, 0.93 },
193  { 0xF, 1.00 }
194};
195
196DECLARE_INK(4,16);
197DECLARE_INK(8,16);
198
199
200/* A inkset is a list of inks and their (relative) densities
201 * For printers that use the extended SetImage command t)
202 * the inkset will be used to build the parameter list
203 * therefore invalid inksets will let the printer fallback
204 * to a default mode which will then lead to wrong output
205 * use {0,0.0,NULL} for undefined placeholder inks
206 * set density to 0.0 to disable certain inks
207 * the paramters will then still occure in the t) command
208 *
209 * names:
210 * inksets are named canon_X_ where X is the number of possible inks in the set
211 * followed by YZ combinations for every defined ink where Y is the letter
212 * representing the color and Z the maximum level of the color
213 * if an inkset contains one or more compressed inks a _c is appended
214 * the inkset name ends with _inkset
215 * see the examples below
216 * order:
217 *  inksets are ordered by ascending number of possible inks, used inks, compression
218 *
219 */
220
221
222typedef struct {
223   const int channel;
224   const double density;
225   const canon_ink_t* ink;
226} canon_inkset_t;
227
228
229/* Inkset for printing in K and 1bit/pixel */
230static const canon_inkset_t canon_1_K2_inkset[] = {
231        {'K',1.0,&canon_1b_2l_ink}
232};
233
234/* Inkset for printing in CMY and 1bit/pixel */
235static const canon_inkset_t canon_3_C2M2Y2_inkset[] = {
236        {'C',1.0,&canon_1b_2l_ink},
237        {'M',1.0,&canon_1b_2l_ink},
238        {'Y',1.0,&canon_1b_2l_ink}
239};
240
241
242/* Inkset for printing in CMY and 2bit/pixel */
243static const canon_inkset_t canon_3_C4M4Y4_inkset[] = {
244        {'C',1.0,&canon_2b_4l_ink},
245        {'M',1.0,&canon_2b_4l_ink},
246        {'Y',1.0,&canon_2b_4l_ink}
247};
248
249/* Inkset for printing in CMYK and 1bit/pixel */
250static const canon_inkset_t canon_4_C2M2Y2K2_inkset[] = {
251        {'C',1.0,&canon_1b_2l_ink},
252        {'M',1.0,&canon_1b_2l_ink},
253        {'Y',1.0,&canon_1b_2l_ink},
254        {'K',1.0,&canon_1b_2l_ink}
255};
256
257/* Inkset for printing in CMYK and 2bit/pixel */
258static const canon_inkset_t canon_4_C4M4Y4K4_inkset[] = {
259        {'C',1.0,&canon_2b_4l_ink},
260        {'M',1.0,&canon_2b_4l_ink},
261        {'Y',1.0,&canon_2b_4l_ink},
262        {'K',1.0,&canon_2b_4l_ink}
263};
264
265/*
266 * Dither ranges specifically for any Color and 3bit/pixel
267 * (see NOTE above)
268 *
269 * BIG NOTE: The bjc8200 has this kind of ink. One Byte seems to hold
270 *           drop sizes for 3 pixels in a 3/2/2 bit fashion.
271 *           Size values for 3bit-sized pixels range from 1 to 7,
272 *           size values for 2bit-sized picels from 1 to 3 (kill msb).
273 *
274 *
275 */
276
277/* Inkset for printing in CMYK and 3bit/pixel */
278static const canon_inkset_t canon_4_C7M7Y7K7_inkset[] = {
279        {'C',1.0,&canon_3b_7l_ink},
280        {'M',1.0,&canon_3b_7l_ink},
281        {'Y',1.0,&canon_3b_7l_ink},
282        {'K',1.0,&canon_3b_7l_ink}
283};
284
285/* Inkset for printing in CMYKcm and 1bit/pixel */
286/* FIXME is it really correct that the density of the CM inks is lowered? */
287static const canon_inkset_t canon_6_C2M2Y2K2c2m2_inkset[] = {
288        {'C',0.25,&canon_1b_2l_ink},
289        {'M',0.26,&canon_1b_2l_ink},
290        {'Y',1.0,&canon_1b_2l_ink},
291        {'K',1.0,&canon_1b_2l_ink},
292        {'c',1.0,&canon_1b_2l_ink},
293        {'m',1.0,&canon_1b_2l_ink}
294};
295
296/* Inkset for printing in CMYKcm and 2bit/pixel */
297/* FIXME is it really correct that the density of the CM inks is lowered? */
298static const canon_inkset_t canon_6_C4M4Y4K4c4m4_inkset[] = {
299        {'C',0.33,&canon_2b_4l_ink},
300        {'M',0.33,&canon_2b_4l_ink},
301        {'Y',1.0,&canon_2b_4l_ink},
302        {'K',1.0,&canon_2b_4l_ink},
303        {'c',1.0,&canon_2b_4l_ink},
304        {'m',1.0,&canon_2b_4l_ink}
305};
306
307/* Inkset for printing in CMYKcm and 3bit/pixel */
308/* FIXME is it really correct that the density of the CM inks is lowered? */
309static const canon_inkset_t canon_6_C7M7Y7K7c7m7_inkset[] = {
310        {'C',0.33,&canon_3b_7l_ink},
311        {'M',0.33,&canon_3b_7l_ink},
312        {'Y',1.0,&canon_3b_7l_ink},
313        {'K',1.0,&canon_3b_7l_ink},
314        {'c',1.0,&canon_3b_7l_ink},
315        {'m',1.0,&canon_3b_7l_ink}
316};
317
318static const canon_inkset_t canon_7_C4M4Y4c4m4k4K4_inkset[] = {
319        {'C',1.0,&canon_2b_4l_ink},
320        {'M',1.0,&canon_2b_4l_ink},
321        {'Y',1.0,&canon_2b_4l_ink},
322        {'c',1.0,&canon_2b_4l_ink},
323        {'m',1.0,&canon_2b_4l_ink},
324        {'k',1.0,&canon_2b_4l_ink},
325        {'K',1.0,&canon_2b_4l_ink},
326};
327
328static const canon_inkset_t canon_9_C2M2Y2K2_inkset[] = {
329        {'C',1.0,&canon_1b_2l_ink},
330        {'M',1.0,&canon_1b_2l_ink},
331        {'Y',1.0,&canon_1b_2l_ink},
332        {'K',1.0,&canon_1b_2l_ink},
333        {0,0.0,NULL},
334        {0,0.0,NULL},
335        {0,0.0,NULL},
336        {0,0.0,NULL},
337        {0,0.0,NULL},
338};
339
340static const canon_inkset_t canon_9_C3M3Y2K2h_inkset[] = {
341        {'C',1.0,&canon_2b_3l_ink},
342        {'M',1.0,&canon_2b_3l_ink},
343        {'Y',1.0,&canon_2b_2l_ink},
344        {'K',1.0,&canon_1b_2l_ink},
345        {0,0.0,NULL},
346        {0,0.0,NULL},
347        {0,0.0,NULL},
348        {0,0.0,NULL},
349        {0,0.0,NULL},
350};
351
352static const canon_inkset_t canon_9_C3M3Y2K2_inkset[] = {
353        {'C',1.0,&canon_2b_3l_ink},
354        {'M',1.0,&canon_2b_3l_ink},
355        {'Y',1.0,&canon_1b_2l_ink},
356        {'K',1.0,&canon_1b_2l_ink},
357        {0,0.0,NULL},
358        {0,0.0,NULL},
359        {0,0.0,NULL},
360        {0,0.0,NULL},
361        {0,0.0,NULL},
362};
363
364static const canon_inkset_t canon_9_C3M3Y2K2_c_inkset[] = {
365        {'C',1.0,&canon_2b_3l_c_ink},
366        {'M',1.0,&canon_2b_3l_c_ink},
367        {'Y',1.0,&canon_1b_2l_ink},
368        {'K',1.0,&canon_1b_2l_ink},
369        {0,0.0,NULL},
370        {0,0.0,NULL},
371        {0,0.0,NULL},
372        {0,0.0,NULL},
373        {0,0.0,NULL}
374};
375
376/* iP6000D */
377static const canon_inkset_t canon_9_C3M3Y3K3_inkset[] = {
378        {'C',1.0,&canon_2b_3l_ink},
379        {'M',1.0,&canon_2b_3l_ink},
380        {'Y',1.0,&canon_2b_3l_ink},
381        {'K',1.0,&canon_2b_3l_ink},
382        {0,0.0,NULL},
383        {0,0.0,NULL},
384        {0,0.0,NULL},
385        {0,0.0,NULL},
386        {0,0.0,NULL}
387};
388
389/* iP4000 default print mode (quality 2) */
390static const canon_inkset_t canon_9_C3M3Y2K2k3_c_inkset[] = {
391        {'C',1.0,&canon_2b_3l_c_ink},
392        {'M',1.0,&canon_2b_3l_c_ink},
393        {'Y',1.0,&canon_1b_2l_ink},
394        {'K',1.0,&canon_1b_2l_ink},
395        {0,0.0,NULL},
396        {0,0.0,NULL},
397        {0,0.0,NULL},
398        {'k',0.0,&canon_2b_3l_c_ink},  /* even though we won't use the photo black in this mode its parameters have to be set */
399        {0,0.0,NULL}
400};
401
402static const canon_inkset_t canon_9_C3M3Y3K2c3m3_c_inkset[] = {
403        {'C',1.0,&canon_2b_3l_c_ink},
404        {'M',1.0,&canon_2b_3l_c_ink},
405        {'Y',1.0,&canon_2b_3l_c_ink},
406        {'K',0.0,&canon_1b_2l_ink},
407        {'c',0.5,&canon_2b_3l_c_ink},
408        {'m',0.5,&canon_2b_3l_c_ink},
409        {0,0.0,NULL},
410        {0,0.0,NULL},
411        {0,0.0,NULL}
412};
413
414/* iP4000 mode used for Super Photo Paper (quality 1) */
415static const canon_inkset_t canon_9_C3M3Y3K2c3m3k3_c_inkset[] = {
416        {'C',1.0,&canon_2b_3l_c_ink},
417        {'M',1.0,&canon_2b_3l_c_ink},
418        {'Y',1.0,&canon_2b_3l_c_ink},
419        {'K',0.0,&canon_1b_2l_ink},
420        {'c',0.5,&canon_2b_3l_c_ink},
421        {'m',0.5,&canon_2b_3l_c_ink},
422        {0,0.0,NULL},
423        {'k',1.0,&canon_2b_3l_c_ink},
424        {0,0.0,NULL}
425};
426
427static const canon_inkset_t canon_9_C4M4Y4K2_inkset[] = {
428        {'C',1.0,&canon_2b_4l_ink},
429        {'M',1.0,&canon_2b_4l_ink},
430        {'Y',1.0,&canon_2b_4l_ink},
431        {'K',1.0,&canon_1b_2l_ink},
432        {0,0.0,NULL},
433        {0,0.0,NULL},
434        {0,0.0,NULL},
435        {0,0.0,NULL},
436        {0,0.0,NULL},
437};
438
439/* iP4000 mode used for T-Shirt (quality 2) */
440static const canon_inkset_t canon_9_C4M4Y4K2k4_inkset[] = {
441        {'C',1.0,&canon_2b_4l_ink},
442        {'M',1.0,&canon_2b_4l_ink},
443        {'Y',1.0,&canon_2b_4l_ink},
444        {'K',1.0,&canon_1b_2l_ink},
445        {0,0.0,NULL},
446        {0,0.0,NULL},
447        {0,0.0,NULL},
448        {'k',1.0,&canon_2b_4l_ink},
449        {0,0.0,NULL},
450};
451
452static const canon_inkset_t canon_9_C4M4Y4K3_inkset[] = {
453        {'C',1.0,&canon_2b_4l_ink},
454        {'M',1.0,&canon_2b_4l_ink},
455        {'Y',1.0,&canon_2b_4l_ink},
456        {'K',1.0,&canon_2b_3l_ink},
457        {0,0.0,NULL},
458        {0,0.0,NULL},
459        {0,0.0,NULL},
460        {0,0.0,NULL},
461        {0,0.0,NULL},
462};
463
464/* check this one!!!! */
465static const canon_inkset_t canon_9_C4M4Y4K2c4m4_inkset[] = {
466        {'C',1.0,&canon_2b_4l_ink},
467        {'M',1.0,&canon_2b_4l_ink},
468        {'Y',1.0,&canon_2b_4l_ink},
469        {'K',0.0,&canon_1b_2l_ink},
470        {'c',0.5,&canon_2b_4l_ink},
471        {'m',0.5,&canon_2b_4l_ink},
472        {0,0.0,NULL},
473        {0,0.0,NULL},
474        {0,0.0,NULL}
475};
476
477static const canon_inkset_t canon_9_C4M4Y4K4_inkset[] = {
478        {'C',1.0,&canon_2b_4l_ink},
479        {'M',1.0,&canon_2b_4l_ink},
480        {'Y',1.0,&canon_2b_4l_ink},
481        {'K',1.0,&canon_2b_4l_ink}, /* put K back in for OHP */
482        {0,0.0,NULL},
483        {0,0.0,NULL},
484        {0,0.0,NULL},
485        {0,0.0,NULL},
486        {0,0.0,NULL}
487};
488
489/* check this one !!! */
490static const canon_inkset_t canon_9_C4M4Y4K4c4m4_inkset[] = {
491        {'C',1.0,&canon_4b_4l_ink},
492        {'M',1.0,&canon_4b_4l_ink},
493        {'Y',1.0,&canon_4b_4l_ink},
494        {'K',0.0,&canon_2b_4l_ink},
495        {'c',1.0,&canon_4b_4l_ink},
496        {'m',1.0,&canon_4b_4l_ink},
497        {'y',1.0,&canon_4b_4l_ink},
498        {0,0.0,NULL},
499        {0,0.0,NULL}
500};
501
502/* check this one!!! */
503static const canon_inkset_t canon_9_C4M4Y4K2c4m4y4_inkset[] = {
504        {'C',1.0,&canon_4b_4l_ink},
505        {'M',1.0,&canon_4b_4l_ink},
506        {'Y',1.0,&canon_4b_4l_ink},
507        {'K',0.0,&canon_1b_2l_ink},
508        {'c',0.5,&canon_4b_4l_ink},
509        {'m',0.5,&canon_4b_4l_ink},
510        {'y',1.0,&canon_4b_4l_ink},
511        {0,0.0,NULL},
512        {0,0.0,NULL}
513};
514
515/* iP4000 mode used for CD printing (quality 3) */
516/* Gernot: This is also the normal hi-quality mode for iP4000 at quality level 3 */
517/*         The same inket is used at quality levels 4, 3 and 2 for CD printing */
518static const canon_inkset_t canon_9_C4M4Y4K2c4m4k4_inkset[] = {
519        {'C',1.0,&canon_2b_4l_ink},
520        {'M',1.0,&canon_2b_4l_ink},
521        {'Y',1.0,&canon_2b_4l_ink},
522        {'K',0.0,&canon_1b_2l_ink},
523        {'c',0.5,&canon_2b_4l_ink},
524        {'m',0.5,&canon_2b_4l_ink},
525        {0,0.0,NULL},
526        {'k',1.0,&canon_2b_4l_ink},
527        {0,0.0,NULL}
528};
529
530static const canon_inkset_t canon_9_C5M5Y5_inkset[] = {
531        {'C',1.0,&canon_4b_5l_ink},
532        {'M',1.0,&canon_4b_5l_ink},
533        {'Y',1.0,&canon_4b_5l_ink},
534        {0,0.0,NULL},
535        {0,0.0,NULL},
536        {0,0.0,NULL},
537        {0,0.0,NULL},
538        {0,0.0,NULL},
539        {0,0.0,NULL},
540};
541
542static const canon_inkset_t canon_9_C5M5Y5K2_inkset[] = {
543        {'C',1.0,&canon_4b_5l_ink},
544        {'M',1.0,&canon_4b_5l_ink},
545        {'Y',1.0,&canon_4b_5l_ink},
546        {'K',0.0,&canon_1b_2l_ink}, /* for PPpro, so no use */
547        {0,0.0,NULL},
548        {0,0.0,NULL},
549        {0,0.0,NULL},
550        {0,0.0,NULL},
551        {0,0.0,NULL},
552};
553
554static const canon_inkset_t canon_9_C8M8Y4K4c8m8_inkset[] = {
555        {'C',1.0,&canon_4b_8l_ink},
556        {'M',1.0,&canon_4b_8l_ink},
557        {'Y',1.0,&canon_2b_4l_ink},
558        {'K',1.0,&canon_2b_4l_ink},
559        {'c',1.0,&canon_4b_8l_ink},
560        {'m',1.0,&canon_4b_8l_ink},
561        {0,0.0,NULL},
562        {0,0.0,NULL},
563        {0,0.0,NULL}
564};
565
566static const canon_inkset_t canon_9_C8M8Y8c16m16_inkset[] = {
567        {'C',1.0,&canon_4b_8l_ink},
568        {'M',1.0,&canon_4b_8l_ink},
569        {'Y',1.0,&canon_4b_8l_ink},
570        {0,0.0,NULL},
571        {'c',0.5,&canon_8b_16l_ink},
572        {'m',0.5,&canon_8b_16l_ink},
573        {0,0.0,NULL},
574        {0,0.0,NULL},
575        {0,0.0,NULL}
576};
577
578/* iP4000 mode used for Professional Photo Paper in Quality 4 */
579static const canon_inkset_t canon_9_C8M8Y8c16m16k8_inkset[] = {
580        {'C',1.0,&canon_4b_8l_ink},
581        {'M',1.0,&canon_4b_8l_ink},
582        {'Y',1.0,&canon_4b_8l_ink},
583        {0,0.0,NULL},
584        {'c',0.5,&canon_4b_16l_ink},
585        {'m',0.5,&canon_4b_16l_ink},
586        {0,0.0,NULL},
587        {'k',1.0,&canon_4b_8l_ink},
588        {0,0.0,NULL}
589};
590
591static const canon_inkset_t canon_9_C9M9Y9K2_inkset[] = {
592        {'C',1.0,&canon_4b_9l_ink},
593        {'M',1.0,&canon_4b_9l_ink},
594        {'Y',1.0,&canon_4b_9l_ink},
595        {'K',1.0,&canon_1b_2l_ink},
596        {0,0.0,NULL},
597        {0,0.0,NULL},
598        {0,0.0,NULL},
599        {0,0.0,NULL},
600        {0,0.0,NULL}
601};
602
603static const canon_inkset_t canon_9_C9M9Y9K2c9m9y9_inkset[] = {
604        {'C',1.0,&canon_4b_9l_ink},
605        {'M',1.0,&canon_4b_9l_ink},
606        {'Y',1.0,&canon_4b_9l_ink},
607        {'K',0.0,&canon_1b_2l_ink}, /* for PPpro, so no use */
608        {'c',1.0,&canon_4b_9l_ink},
609        {'m',1.0,&canon_4b_9l_ink},
610        {'y',1.0,&canon_4b_9l_ink},
611        {0,0.0,NULL},
612        {0,0.0,NULL}
613};
614
615static const canon_inkset_t canon_9_c9m9y9_inkset[] = {
616	{0,0.0,NULL},
617	{0,0.0,NULL},
618	{0,0.0,NULL},
619	{0,0.0,NULL},
620	{'c',1.0,&canon_8b_9l_ink},
621	{'m',1.0,&canon_8b_9l_ink},
622	{'y',1.0,&canon_8b_9l_ink},
623	{0,0.0,NULL},
624	{0,0.0,NULL},
625	{0,0.0,NULL},
626	{0,0.0,NULL},
627	{0,0.0,NULL},
628	{0,0.0,NULL},
629};
630
631/* PIXMA Pro9000, Pro9000 Mk.II, Pro9500, Pro9500 Mk.II, PIXMA iP8500 */
632static const canon_inkset_t canon_11_C2M2Y2K2_inkset[] = {
633        {'C',1.0,&canon_1b_2l_ink},
634        {'M',1.0,&canon_1b_2l_ink},
635        {'Y',1.0,&canon_1b_2l_ink},
636        {'K',1.0,&canon_1b_2l_ink},
637        {0,0.0,NULL},
638        {0,0.0,NULL},
639        {0,0.0,NULL},
640        {0,0.0,NULL},
641        {0,0.0,NULL},
642        {0,0.0,NULL},
643        {0,0.0,NULL}
644};
645
646/* Pro9000 */
647static const canon_inkset_t canon_11_C5M5Y5K5c5m5_c_inkset[] = {
648        {'C',1.0,&canon_4b_5l_c_ink},
649        {'M',1.0,&canon_4b_5l_c_ink},
650        {'Y',1.0,&canon_4b_5l_c_ink},
651        {'K',1.0,&canon_4b_5l_c_ink},
652        {'c',1.0,&canon_4b_5l_c_ink},
653        {'m',1.0,&canon_4b_5l_c_ink},
654        {0,0.0,NULL},
655        {0,0.0,NULL},
656        {0,0.0,NULL},
657        {0,0.0,NULL},
658        {0,0.0,NULL}
659};
660
661/* PIXMA Pro9000, Pro9000 Mk.II, Pro9500, Pro9500 Mk.II, PIXMA iP8500 */
662static const canon_inkset_t canon_11_C6M6Y6K6_c_inkset[] = {
663        {'C',1.0,&canon_4b_6l_c_ink},
664        {'M',1.0,&canon_4b_6l_c_ink},
665        {'Y',1.0,&canon_4b_6l_c_ink},
666        {'K',1.0,&canon_4b_6l_c_ink},
667        {0,0.0,NULL},
668        {0,0.0,NULL},
669        {0,0.0,NULL},
670        {0,0.0,NULL},
671        {0,0.0,NULL},
672        {0,0.0,NULL},
673        {0,0.0,NULL}
674};
675
676/* Pro9000, Pro9000 Mk.II */
677static const canon_inkset_t canon_11_C6M6Y6K6c6m6_c_inkset[] = {
678        {'C',1.0,&canon_4b_6l_c_ink},
679        {'M',1.0,&canon_4b_6l_c_ink},
680        {'Y',1.0,&canon_4b_6l_c_ink},
681        {'K',1.0,&canon_4b_6l_c_ink},
682        {'c',1.0,&canon_4b_6l_c_ink},
683        {'m',1.0,&canon_4b_6l_c_ink},
684        {0,0.0,NULL},
685        {0,0.0,NULL},
686        {0,0.0,NULL},
687        {0,0.0,NULL},
688        {0,0.0,NULL}
689};
690
691/* Pro9000, Pro9000 Mk.II */
692static const canon_inkset_t canon_11_C6M6Y6K6c16m16_c_inkset[] = {
693        {'C',1.0,&canon_4b_6l_c_ink},
694        {'M',1.0,&canon_4b_6l_c_ink},
695        {'Y',1.0,&canon_4b_6l_c_ink},
696        {'K',1.0,&canon_4b_6l_c_ink},
697        {'c',1.0,&canon_4b_16l_ink},
698        {'m',1.0,&canon_4b_16l_ink},
699        {0,0.0,NULL},
700        {0,0.0,NULL},
701        {0,0.0,NULL},
702        {0,0.0,NULL},
703        {0,0.0,NULL}
704};
705
706/* Pro9000, Pro9000 Mk.II, PIXMA iP8500 */
707static const canon_inkset_t canon_11_C6M6Y6K9c6m6_c_inkset[] = {
708        {'C',1.0,&canon_4b_6l_c_ink},
709        {'M',1.0,&canon_4b_6l_c_ink},
710        {'Y',1.0,&canon_4b_6l_c_ink},
711        {'K',1.0,&canon_4b_9l_ink},
712        {'c',1.0,&canon_4b_6l_c_ink},
713        {'m',1.0,&canon_4b_6l_c_ink},
714        {0,0.0,NULL},
715        {0,0.0,NULL},
716        {0,0.0,NULL},
717        {0,0.0,NULL},
718        {0,0.0,NULL}
719};
720
721/* PIXMA Pro9500, Pro9500 Mk.II */
722static const canon_inkset_t canon_11_C16M16Y16k16_inkset[] = {
723        {'C',1.0,&canon_4b_16l_ink},
724        {'M',1.0,&canon_4b_16l_ink},
725        {'Y',1.0,&canon_4b_16l_ink},
726        {0,0.0,NULL},
727        {0,0.0,NULL},
728        {0,0.0,NULL},
729        {0,0.0,NULL},
730        {'k',1.0,&canon_4b_16l_ink},
731        {0,0.0,NULL},
732        {0,0.0,NULL},
733        {0,0.0,NULL}
734};
735
736/* Pro9000 Mk.II */
737static const canon_inkset_t canon_11_C16M16Y16K16c16m16_inkset[] = {
738        {'C',1.0,&canon_4b_16l_ink},
739        {'M',1.0,&canon_4b_16l_ink},
740        {'Y',1.0,&canon_4b_16l_ink},
741        {'K',1.0,&canon_4b_16l_ink},
742        {'c',1.0,&canon_4b_16l_ink},
743        {'m',1.0,&canon_4b_16l_ink},
744        {0,0.0,NULL},
745        {0,0.0,NULL},
746        {0,0.0,NULL},
747        {0,0.0,NULL},
748        {0,0.0,NULL}
749};
750
751/* Gernot: MP150 (MP170 for tests) greyscale */
752static const canon_inkset_t canon_13_K2_inkset[] = {
753	{0,0.0,NULL},
754	{0,0.0,NULL},
755	{0,0.0,NULL},
756	{'K',1.0,&canon_1b_2l_ink},
757	{0,0.0,NULL},
758	{0,0.0,NULL},
759	{0,0.0,NULL},
760	{0,0.0,NULL},
761	{0,0.0,NULL},
762	{0,0.0,NULL},
763	{0,0.0,NULL},
764	{0,0.0,NULL},
765	{0,0.0,NULL},
766};
767
768/* MP150 (MP250 for tests) greyscale */
769static const canon_inkset_t canon_13_K3_inkset[] = {
770	{0,0.0,NULL},
771	{0,0.0,NULL},
772	{0,0.0,NULL},
773	{'K',1.0,&canon_2b_3l_ink},
774	{0,0.0,NULL},
775	{0,0.0,NULL},
776	{0,0.0,NULL},
777	{0,0.0,NULL},
778	{0,0.0,NULL},
779	{0,0.0,NULL},
780	{0,0.0,NULL},
781	{0,0.0,NULL},
782	{0,0.0,NULL},
783};
784
785/* iP2700, MP270 color cartridge only, plain fast mode */
786static const canon_inkset_t canon_13_C2M2Y2_inkset[] = {
787        {'C',1.0,&canon_1b_2l_ink},
788        {'M',1.0,&canon_1b_2l_ink},
789        {'Y',1.0,&canon_1b_2l_ink},
790        {0,0.0,NULL},
791        {0,0.0,NULL},
792        {0,0.0,NULL},
793        {0,0.0,NULL},
794        {0,0.0,NULL},
795        {0,0.0,NULL},
796        {0,0.0,NULL},
797        {0,0.0,NULL},
798        {0,0.0,NULL},
799        {0,0.0,NULL},
800};
801
802static const canon_inkset_t canon_13_C2M2Y2K2_inkset[] = {
803	{'C',1.0,&canon_1b_2l_ink},
804	{'M',1.0,&canon_1b_2l_ink},
805	{'Y',1.0,&canon_1b_2l_ink},
806	{'K',1.0,&canon_1b_2l_ink},
807	{0,0.0,NULL},
808	{0,0.0,NULL},
809	{0,0.0,NULL},
810	{0,0.0,NULL},
811	{0,0.0,NULL},
812	{0,0.0,NULL},
813	{0,0.0,NULL},
814	{0,0.0,NULL},
815	{0,0.0,NULL},
816};
817
818/* MX7600, iX7000 */
819static const canon_inkset_t canon_13_C2M2Y2K2k2_inkset[] = {
820        {'C',1.0,&canon_1b_2l_ink},
821        {'M',1.0,&canon_1b_2l_ink},
822        {'Y',1.0,&canon_1b_2l_ink},
823        {'K',1.0,&canon_1b_2l_ink},
824        {0,0.0,NULL},
825        {0,0.0,NULL},
826        {'k',1.0,&canon_1b_2l_ink}, /* swap y and k */
827        {0,0.0,NULL},
828        {0,0.0,NULL},
829        {0,0.0,NULL},
830        {0,0.0,NULL},
831        {0,0.0,NULL},
832        {0,0.0,NULL},
833};
834
835/* iP2700, MP270 color cartridge only, plain mode */
836static const canon_inkset_t canon_13_C3M3Y2_inkset[] = {
837        {'C',1.0,&canon_2b_3l_ink},
838        {'M',1.0,&canon_2b_3l_ink},
839        {'Y',1.0,&canon_1b_2l_ink},
840        {0,0.0,NULL},
841        {0,0.0,NULL},
842        {0,0.0,NULL},
843        {0,0.0,NULL},
844        {0,0.0,NULL},
845        {0,0.0,NULL},
846        {0,0.0,NULL},
847        {0,0.0,NULL},
848        {0,0.0,NULL},
849        {0,0.0,NULL},
850};
851
852/* iP1900 color cartridge only, plain mode */
853static const canon_inkset_t canon_13_C3M3Y2b_inkset[] = {
854        {'C',1.0,&canon_2b_3l_ink},
855        {'M',1.0,&canon_2b_3l_ink},
856        {'Y',1.0,&canon_2b_2l_ink},
857        {0,0.0,NULL},
858        {0,0.0,NULL},
859        {0,0.0,NULL},
860        {0,0.0,NULL},
861        {0,0.0,NULL},
862        {0,0.0,NULL},
863        {0,0.0,NULL},
864        {0,0.0,NULL},
865        {0,0.0,NULL},
866        {0,0.0,NULL},
867};
868
869static const canon_inkset_t canon_13_C3M3Y2K2_inkset[] = {
870        {'C',1.0,&canon_2b_3l_ink},
871        {'M',1.0,&canon_2b_3l_ink},
872        {'Y',1.0,&canon_1b_2l_ink},
873        {'K',1.0,&canon_1b_2l_ink},
874        {0,0.0,NULL},
875        {0,0.0,NULL},
876        {0,0.0,NULL},
877        {0,0.0,NULL},
878        {0,0.0,NULL},
879        {0,0.0,NULL},
880        {0,0.0,NULL},
881        {0,0.0,NULL},
882        {0,0.0,NULL},
883};
884
885/* iP1900, std mode, plain media */
886static const canon_inkset_t canon_13_C3M3Y2K2b_inkset[] = {
887        {'C',1.0,&canon_2b_3l_ink},
888        {'M',1.0,&canon_2b_3l_ink},
889        {'Y',1.0,&canon_2b_2l_ink},
890        {'K',1.0,&canon_1b_2l_ink},
891        {0,0.0,NULL},
892        {0,0.0,NULL},
893        {0,0.0,NULL},
894        {0,0.0,NULL},
895        {0,0.0,NULL},
896        {0,0.0,NULL},
897        {0,0.0,NULL},
898        {0,0.0,NULL},
899        {0,0.0,NULL},
900};
901
902/* Gernot: iP4500 standard mode changed from the compressed one below */
903/*         iP4700 also uses this */
904/*         iP4800 also uses this */
905/*         MG5100, MG5200 */
906/* TODO: how to get both K and k working, for Hagaki and Env modes */
907static const canon_inkset_t canon_13_C3M3Y2K2y3_c_inkset[] = {
908        {'C',1.0,&canon_2b_3l_c_ink},
909        {'M',1.0,&canon_2b_3l_c_ink},
910        {'Y',1.0,&canon_1b_2l_ink},
911        {'K',1.0,&canon_1b_2l_ink},
912        {0,0.0,NULL},
913        {0,0.0,NULL},
914        {'k',0.0,&canon_2b_3l_c_ink}, /* swap y for k, but in any case it is not in output for plain modes */
915        {0,0.0,NULL},
916        {0,0.0,NULL},
917        {0,0.0,NULL},
918        {0,0.0,NULL},
919        {0,0.0,NULL},
920        {0,0.0,NULL},
921};
922
923/* iX7000 */
924static const canon_inkset_t canon_13_C3M3Y2K2k3_c_inkset[] = {
925        {'C',1.0,&canon_2b_3l_c_ink},
926        {'M',1.0,&canon_2b_3l_c_ink},
927        {'Y',1.0,&canon_1b_2l_ink},
928        {'K',1.0,&canon_1b_2l_ink},
929        {0,0.0,NULL},
930        {0,0.0,NULL},
931        {'k',0.0,&canon_2b_3l_c_ink}, /* swap y and k */
932        {0,0.0,NULL},
933        {0,0.0,NULL},
934        {0,0.0,NULL},
935        {0,0.0,NULL},
936        {0,0.0,NULL},
937        {0,0.0,NULL},
938};
939
940/* Gernot: MP250, MP280 photo modes */
941static const canon_inkset_t canon_13_C4M4Y4_inkset[] = {
942        {'C',1.0,&canon_2b_4l_ink},
943        {'M',1.0,&canon_2b_4l_ink},
944        {'Y',1.0,&canon_2b_4l_ink},
945        {0,0.0,NULL},
946        {0,0.0,NULL},
947        {0,0.0,NULL},
948        {0,0.0,NULL},
949        {0,0.0,NULL},
950        {0,0.0,NULL},
951        {0,0.0,NULL},
952        {0,0.0,NULL},
953        {0,0.0,NULL},
954        {0,0.0,NULL},
955};
956
957static const canon_inkset_t canon_13_C4M4Y4K2_inkset[] = {
958        {'C',1.0,&canon_2b_4l_ink},
959        {'M',1.0,&canon_2b_4l_ink},
960        {'Y',1.0,&canon_2b_4l_ink},
961        {'K',1.0,&canon_1b_2l_ink},
962        {0,0.0,NULL},
963        {0,0.0,NULL},
964        {0,0.0,NULL},
965        {0,0.0,NULL},
966        {0,0.0,NULL},
967        {0,0.0,NULL},
968        {0,0.0,NULL},
969        {0,0.0,NULL},
970        {0,0.0,NULL},
971};
972
973/* Gernot: MP250, MP270, MP280 high mode */
974static const canon_inkset_t canon_13_C4M4Y3K3_inkset[] = {
975        {'C',1.0,&canon_2b_4l_ink},
976        {'M',1.0,&canon_2b_4l_ink},
977        {'Y',1.0,&canon_2b_3l_ink},
978        {'K',1.0,&canon_2b_3l_ink},
979        {0,0.0,NULL},
980        {0,0.0,NULL},
981        {0,0.0,NULL},
982        {0,0.0,NULL},
983        {0,0.0,NULL},
984        {0,0.0,NULL},
985        {0,0.0,NULL},
986        {0,0.0,NULL},
987        {0,0.0,NULL},
988};
989
990
991/* Gernot: MP150 (MP170 for tests) high-quality mode */
992static const canon_inkset_t canon_13_C4M4Y4K2c4m4y4_inkset[] = {
993        {'C',1.0,&canon_4b_4l_ink},
994        {'M',1.0,&canon_4b_4l_ink},
995        {'Y',1.0,&canon_4b_4l_ink},
996        {'K',1.0,&canon_1b_2l_ink},
997        {'c',1.0,&canon_4b_4l_ink},
998        {'m',1.0,&canon_4b_4l_ink},
999        {'y',1.0,&canon_4b_4l_ink}, /* output uses y */
1000        {0,0.0,NULL},
1001        {0,0.0,NULL},
1002        {0,0.0,NULL},
1003        {0,0.0,NULL},
1004        {0,0.0,NULL},
1005        {0,0.0,NULL},
1006};
1007
1008/* test on iP5300 --- swap y and k */
1009static const canon_inkset_t canon_13_C4M4Y4K2c4m4k4_inkset[] = {
1010        {'C',1.0,&canon_4b_4l_ink},
1011        {'M',1.0,&canon_4b_4l_ink},
1012        {'Y',1.0,&canon_4b_4l_ink},
1013        {'K',0.0,&canon_1b_2l_ink}, /* do not use for photo modes */
1014        {'c',1.0,&canon_4b_4l_ink},
1015        {'m',1.0,&canon_4b_4l_ink},
1016        {'k',1.0,&canon_4b_4l_ink},
1017        {0,0.0,NULL},
1018        {0,0.0,NULL},
1019        {0,0.0,NULL},
1020        {0,0.0,NULL},
1021        {0,0.0,NULL},
1022        {0,0.0,NULL},
1023};
1024
1025/* iP2700 in user-defined highest quality mode for PPGlossPro paper */
1026/* MP270 same for PPGpro */
1027/* MP280 same for PPGproPlat */
1028/* less 0x60 in bytes */
1029static const canon_inkset_t canon_13_c3m3y3_inkset[] = {
1030	{0,0.0,NULL},
1031	{0,0.0,NULL},
1032	{0,0.0,NULL},
1033	{0,0.0,NULL},
1034	{'c',1.0,&canon_2b_3l_ink},
1035	{'m',1.0,&canon_2b_3l_ink},
1036	{'y',1.0,&canon_2b_3l_ink},
1037	{0,0.0,NULL},
1038	{0,0.0,NULL},
1039	{0,0.0,NULL},
1040	{0,0.0,NULL},
1041	{0,0.0,NULL},
1042	{0,0.0,NULL},
1043};
1044
1045/* Gernot: MP150 (MP170 for tests) high-quality mode for
1046           High Resolution Paper
1047           Inkjet Hagaki
1048	   pro Photo Paper
1049	   super Photo Paper
1050	   super Photo Paper Double Sided
1051	   matte Photo Paper
1052	   other Photo Paper
1053
1054Also used for all modes of gloss Photo Paper
1055*/
1056static const canon_inkset_t canon_13_C4M4Y4c4m4y4_inkset[] = {
1057        {'C',1.0,&canon_4b_4l_ink},
1058        {'M',1.0,&canon_4b_4l_ink},
1059        {'Y',1.0,&canon_4b_4l_ink},
1060        {0,0.0,NULL},
1061        {'c',1.0,&canon_4b_4l_ink},
1062        {'m',1.0,&canon_4b_4l_ink},
1063        {'k',1.0,&canon_4b_4l_ink}, /* swap y and k */
1064        {0,0.0,NULL},
1065        {0,0.0,NULL},
1066        {0,0.0,NULL},
1067        {0,0.0,NULL},
1068        {0,0.0,NULL},
1069        {0,0.0,NULL},
1070};
1071
1072/* Gernot: MP150 (MP170 for tests) T-shirt transfers */
1073static const canon_inkset_t canon_13_C5M5Y5_inkset[] = {
1074        {'C',1.0,&canon_4b_5l_ink},
1075        {'M',1.0,&canon_4b_5l_ink},
1076        {'Y',1.0,&canon_4b_5l_ink},
1077        {0,0.0,NULL},
1078        {0,0.0,NULL},
1079        {0,0.0,NULL},
1080        {0,0.0,NULL},
1081        {0,0.0,NULL},
1082        {0,0.0,NULL},
1083        {0,0.0,NULL},
1084        {0,0.0,NULL},
1085        {0,0.0,NULL},
1086        {0,0.0,NULL},
1087};
1088
1089/* Gernot: added for iP4700 CD printing */
1090/* iP4800 also uses this */
1091/* also MG5200 */
1092static const canon_inkset_t canon_13_C5M5Y4y4_inkset[] = {
1093        {'C',1.0,&canon_4b_5l_ink},
1094        {'M',1.0,&canon_4b_5l_ink},
1095        {'Y',1.0,&canon_2b_4l_ink},
1096        {0,0.0,NULL},
1097        {0,0.0,NULL},
1098        {0,0.0,NULL},
1099        {'k',1.0,&canon_2b_4l_ink}, /* swap y and k */
1100        {0,0.0,NULL},
1101        {0,0.0,NULL},
1102        {0,0.0,NULL},
1103        {0,0.0,NULL},
1104        {0,0.0,NULL},
1105        {0,0.0,NULL},
1106};
1107
1108/* iX7000 photo mode */
1109static const canon_inkset_t canon_13_C6M6Y2K2k4_inkset[] = {
1110	{'C',1.0,&canon_4b_6l_ink},
1111	{'M',1.0,&canon_4b_6l_ink},
1112	{'Y',1.0,&canon_2b_2l_ink},
1113	{'K',1.0,&canon_1b_2l_ink},
1114	{0,0.0,NULL},
1115	{0,0.0,NULL},
1116	{'k',1.0,&canon_2b_4l_ink}, /* swap y and k */
1117	{0,0.0,NULL},
1118	{0,0.0,NULL},
1119	{0,0.0,NULL},
1120	{0,0.0,NULL},
1121	{0,0.0,NULL},
1122	{0,0.0,NULL},
1123};
1124
1125/* Gernot: added for iP4700 photo standard quality */
1126/*         MG5100, MG5200 */
1127static const canon_inkset_t canon_13_C6M6Y4y4_inkset[] = {
1128	{'C',1.0,&canon_4b_6l_ink},
1129	{'M',1.0,&canon_4b_6l_ink},
1130	{'Y',1.0,&canon_2b_4l_ink},
1131	{0,0.0,NULL},
1132	{0,0.0,NULL},
1133	{0,0.0,NULL},
1134	{'k',1.0,&canon_2b_4l_ink}, /* set y to k for photo modes */
1135	{0,0.0,NULL},
1136	{0,0.0,NULL},
1137	{0,0.0,NULL},
1138	{0,0.0,NULL},
1139	{0,0.0,NULL},
1140	{0,0.0,NULL},
1141};
1142
1143/* Gernot: added for iP4500 high quality --- check the pos of k/y */
1144/*         iP4700 also uses this */
1145/*         iP4800 also uses this */
1146/*         MG5100, MG5200 */
1147static const canon_inkset_t canon_13_C6M6Y4K2y4_inkset[] = {
1148	{'C',1.0,&canon_4b_6l_ink},
1149	{'M',1.0,&canon_4b_6l_ink},
1150	{'Y',1.0,&canon_2b_4l_ink},
1151	{'K',1.0,&canon_1b_2l_ink},
1152	{0,0.0,NULL},
1153	{0,0.0,NULL},
1154	{'k',1.0,&canon_2b_4l_ink}, /* set y to k for photo modes */
1155	{0,0.0,NULL},
1156	{0,0.0,NULL},
1157	{0,0.0,NULL},
1158	{0,0.0,NULL},
1159	{0,0.0,NULL},
1160	{0,0.0,NULL},
1161};
1162
1163static const canon_inkset_t canon_13_C6M6Y4K2k4_inkset[] = {
1164	{'C',1.0,&canon_4b_6l_ink},
1165	{'M',1.0,&canon_4b_6l_ink},
1166	{'Y',1.0,&canon_2b_4l_ink},
1167	{'K',1.0,&canon_1b_2l_ink},
1168	{0,0.0,NULL},
1169	{0,0.0,NULL},
1170	{'k',0.0,&canon_2b_4l_ink},
1171	{0,0.0,NULL},
1172	{0,0.0,NULL},
1173	{0,0.0,NULL},
1174	{0,0.0,NULL},
1175	{0,0.0,NULL},
1176	{0,0.0,NULL},
1177};
1178
1179/* MX7600, iX7000 */
1180static const canon_inkset_t canon_13_C6M6Y4K3k4_c_inkset[] = {
1181	{'C',1.0,&canon_4b_6l_ink},
1182	{'M',1.0,&canon_4b_6l_ink},
1183	{'Y',1.0,&canon_2b_4l_ink},
1184	{'K',1.0,&canon_2b_3l_c_ink},
1185	{0,0.0,NULL},
1186	{0,0.0,NULL},
1187	{'k',0.0,&canon_2b_4l_ink},/* swapped y and k */
1188	{0,0.0,NULL},
1189	{0,0.0,NULL},
1190	{0,0.0,NULL},
1191	{0,0.0,NULL},
1192	{0,0.0,NULL},
1193	{0,0.0,NULL},
1194};
1195
1196static const canon_inkset_t canon_13_C6M6Y4k4yask_inkset[] = {
1197	{'C',1.0,&canon_4b_6l_ink},
1198	{'M',1.0,&canon_4b_6l_ink},
1199	{'Y',1.0,&canon_2b_4l_ink},
1200	{0,0.0,NULL},
1201	{0,0.0,NULL},
1202	{0,0.0,NULL},
1203	{'k',1.0,&canon_2b_4l_ink},
1204	{0,0.0,NULL},
1205	{0,0.0,NULL},
1206	{0,0.0,NULL},
1207	{0,0.0,NULL},
1208	{0,0.0,NULL},
1209	{0,0.0,NULL},
1210};
1211
1212/* Gernot: iP4500 photo mode */
1213/*         iP4700 also uses this */
1214/*         iP4800 also uses this */
1215/*         MG5100, MG5200 */
1216static const canon_inkset_t canon_13_C8M8Y4y4_inkset[] = {
1217	{'C',1.0,&canon_4b_8l_ink},
1218	{'M',1.0,&canon_4b_8l_ink},
1219	{'Y',1.0,&canon_2b_4l_ink},
1220	{0,0.0,NULL},
1221	{0,0.0,NULL},
1222	{0,0.0,NULL},
1223	{'k',1.0,&canon_2b_4l_ink}, /* set y to k for photo modes */
1224	{0,0.0,NULL},
1225	{0,0.0,NULL},
1226	{0,0.0,NULL},
1227	{0,0.0,NULL},
1228	{0,0.0,NULL},
1229	{0,0.0,NULL},
1230};
1231
1232static const canon_inkset_t canon_13_C8M8Y4K4k4_inkset[] = {
1233	{'C',1.0,&canon_4b_8l_ink},
1234	{'M',1.0,&canon_4b_8l_ink},
1235	{'Y',1.0,&canon_2b_4l_ink},
1236	{'K',1.0,&canon_2b_4l_ink},
1237	{0,0.0,NULL},
1238	{0,0.0,NULL},
1239	{0,0.0,NULL},
1240	{'k',1.0,&canon_2b_4l_ink},
1241	{0,0.0,NULL},
1242	{0,0.0,NULL},
1243	{0,0.0,NULL},
1244	{0,0.0,NULL},
1245	{0,0.0,NULL},
1246};
1247
1248static const canon_inkset_t canon_13_C8M8Y4k4yask_inkset[] = {
1249	{'C',1.0,&canon_4b_8l_ink},
1250	{'M',1.0,&canon_4b_8l_ink},
1251	{'Y',1.0,&canon_2b_4l_ink},
1252	{0,0.0,NULL},
1253	{0,0.0,NULL},
1254	{0,0.0,NULL},
1255	{'k',1.0,&canon_2b_4l_ink},
1256	{0,0.0,NULL},
1257	{0,0.0,NULL},
1258	{0,0.0,NULL},
1259	{0,0.0,NULL},
1260	{0,0.0,NULL},
1261	{0,0.0,NULL},
1262};
1263
1264/* Gernot: MP150 (MP170 for tests) high-quality mode for
1265           High Resolution Paper
1266           Inkjet Hagaki
1267	   pro Photo Paper
1268	   super Photo Paper
1269	   super Photo Paper Double Sided
1270	   matte Photo Paper
1271	   other Photo Paper
1272
1273 for some reason there is a hack for iP6700 appearing here which might make the y into a k (swapping)
1274*/
1275static const canon_inkset_t canon_13_c9m9y9_inkset[] = {
1276	{0,0.0,NULL},
1277	{0,0.0,NULL},
1278	{0,0.0,NULL},
1279	{0,0.0,NULL},
1280	{'c',1.0,&canon_8b_9l_ink},
1281	{'m',1.0,&canon_8b_9l_ink},
1282	{'y',1.0,&canon_8b_9l_ink},
1283	{0,0.0,NULL},
1284	{0,0.0,NULL},
1285	{0,0.0,NULL},
1286	{0,0.0,NULL},
1287	{0,0.0,NULL},
1288	{0,0.0,NULL},
1289};
1290
1291/* MP980 uss 16 inks */
1292static const canon_inkset_t canon_16_C8M8Y4k4_inkset[] = {
1293	{'C',1.0,&canon_4b_8l_ink},
1294	{'M',1.0,&canon_4b_8l_ink},
1295	{'Y',1.0,&canon_2b_4l_ink},
1296	{0,0.0,NULL},
1297	{0,0.0,NULL},
1298	{0,0.0,NULL},
1299	{'k',1.0,&canon_2b_4l_ink}, /* y and k swapped */
1300	{0,0.0,NULL},
1301	{0,0.0,NULL},
1302	{0,0.0,NULL},
1303	{0,0.0,NULL},
1304	{0,0.0,NULL},
1305	{0,0.0,NULL},
1306	{0,0.0,NULL},
1307	{0,0.0,NULL},
1308	{0,0.0,NULL},
1309};
1310
1311static const canon_inkset_t canon_16_C6M6Y4K2k4_inkset[] = {
1312	{'C',1.0,&canon_4b_6l_ink},
1313	{'M',1.0,&canon_4b_6l_ink},
1314	{'Y',1.0,&canon_2b_4l_ink},
1315	{'K',1.0,&canon_1b_2l_ink},
1316	{0,0.0,NULL},
1317	{0,0.0,NULL},
1318	{'k',1.0,&canon_2b_4l_ink}, /* y and k swapped */
1319	{0,0.0,NULL},
1320	{0,0.0,NULL},
1321	{0,0.0,NULL},
1322	{0,0.0,NULL},
1323	{0,0.0,NULL},
1324	{0,0.0,NULL},
1325	{0,0.0,NULL},
1326	{0,0.0,NULL},
1327	{0,0.0,NULL},
1328};
1329
1330static const canon_inkset_t canon_16_C6M6Y4k4_inkset[] = {
1331	{'C',1.0,&canon_4b_6l_ink},
1332	{'M',1.0,&canon_4b_6l_ink},
1333	{'Y',1.0,&canon_2b_4l_ink},
1334	{0,0.0,NULL},
1335	{0,0.0,NULL},
1336	{0,0.0,NULL},
1337	{'k',1.0,&canon_2b_4l_ink}, /* y and k swapped */
1338	{0,0.0,NULL},
1339	{0,0.0,NULL},
1340	{0,0.0,NULL},
1341	{0,0.0,NULL},
1342	{0,0.0,NULL},
1343	{0,0.0,NULL},
1344	{0,0.0,NULL},
1345	{0,0.0,NULL},
1346	{0,0.0,NULL},
1347};
1348
1349static const canon_inkset_t canon_16_C5M5Y4k4_inkset[] = {
1350	{'C',1.0,&canon_4b_5l_ink},
1351	{'M',1.0,&canon_4b_5l_ink},
1352	{'Y',1.0,&canon_2b_4l_ink},
1353	{0,0.0,NULL},
1354	{0,0.0,NULL},
1355	{0,0.0,NULL},
1356	{'k',1.0,&canon_2b_4l_ink}, /* y and k swapped */
1357	{0,0.0,NULL},
1358	{0,0.0,NULL},
1359	{0,0.0,NULL},
1360	{0,0.0,NULL},
1361	{0,0.0,NULL},
1362	{0,0.0,NULL},
1363	{0,0.0,NULL},
1364	{0,0.0,NULL},
1365	{0,0.0,NULL},
1366};
1367
1368static const canon_inkset_t canon_16_C3M3Y2K2k3_c_inkset[] = {
1369	{'C',1.0,&canon_2b_3l_c_ink},
1370	{'M',1.0,&canon_2b_3l_c_ink},
1371	{'Y',1.0,&canon_1b_2l_ink},
1372	{'K',1.0,&canon_1b_2l_ink},
1373	{0,0.0,NULL},
1374	{0,0.0,NULL},
1375	{'k',1.0,&canon_2b_3l_c_ink}, /* y and k swapped */
1376	{0,0.0,NULL},
1377	{0,0.0,NULL},
1378	{0,0.0,NULL},
1379	{0,0.0,NULL},
1380	{0,0.0,NULL},
1381	{0,0.0,NULL},
1382	{0,0.0,NULL},
1383	{0,0.0,NULL},
1384	{0,0.0,NULL},
1385};
1386
1387static const canon_inkset_t canon_16_C2M2Y2K2_inkset[] = {
1388	{'C',1.0,&canon_1b_2l_ink},
1389	{'M',1.0,&canon_1b_2l_ink},
1390	{'Y',1.0,&canon_1b_2l_ink},
1391	{'K',1.0,&canon_1b_2l_ink},
1392	{0,0.0,NULL},
1393	{0,0.0,NULL},
1394	{0,0.0,NULL},
1395	{0,0.0,NULL},
1396	{0,0.0,NULL},
1397	{0,0.0,NULL},
1398	{0,0.0,NULL},
1399	{0,0.0,NULL},
1400	{0,0.0,NULL},
1401	{0,0.0,NULL},
1402	{0,0.0,NULL},
1403	{0,0.0,NULL},
1404};
1405
1406
1407static const canon_inkset_t canon_19_C2M2Y2K2_inkset[] = {
1408        {'C',1.0,&canon_1b_2l_ink},
1409        {'M',1.0,&canon_1b_2l_ink},
1410        {'Y',1.0,&canon_1b_2l_ink},
1411        {'K',1.0,&canon_1b_2l_ink},
1412        {0,0.0,NULL},
1413        {0,0.0,NULL},
1414        {0,0.0,NULL},
1415        {0,0.0,NULL},
1416        {0,0.0,NULL},
1417        {0,0.0,NULL},
1418        {0,0.0,NULL},
1419        {0,0.0,NULL},
1420        {0,0.0,NULL},
1421        {0,0.0,NULL},
1422        {0,0.0,NULL},
1423        {0,0.0,NULL},
1424        {0,0.0,NULL},
1425        {0,0.0,NULL},
1426        {0,0.0,NULL},
1427};
1428
1429/* iP6700D Fast plain mode */
1430static const canon_inkset_t canon_19_C2M2Y2k2_inkset[] = {
1431        {'C',1.0,&canon_1b_2l_ink},
1432        {'M',1.0,&canon_1b_2l_ink},
1433        {'Y',1.0,&canon_1b_2l_ink},
1434        {0,0.0,NULL},
1435        {0,0.0,NULL},
1436        {0,0.0,NULL},
1437        {'k',1.0,&canon_1b_2l_ink},/* swap y and k */
1438        {0,0.0,NULL},
1439        {0,0.0,NULL},
1440        {0,0.0,NULL},
1441        {0,0.0,NULL},
1442        {0,0.0,NULL},
1443        {0,0.0,NULL},
1444        {0,0.0,NULL},
1445        {0,0.0,NULL},
1446        {0,0.0,NULL},
1447        {0,0.0,NULL},
1448        {0,0.0,NULL},
1449        {0,0.0,NULL},
1450};
1451
1452static const canon_inkset_t canon_19_C3M3Y3k3_inkset[] = {
1453        {'C',1.0,&canon_2b_3l_ink},
1454        {'M',1.0,&canon_2b_3l_ink},
1455        {'Y',1.0,&canon_2b_3l_ink},
1456        {0,0.0,NULL},
1457        {0,0.0,NULL},
1458        {0,0.0,NULL},
1459        {'k',1.0,&canon_2b_3l_ink}, /* swap y and k */
1460        {0,0.0,NULL},
1461        {0,0.0,NULL},
1462        {0,0.0,NULL},
1463        {0,0.0,NULL},
1464        {0,0.0,NULL},
1465        {0,0.0,NULL},
1466        {0,0.0,NULL},
1467        {0,0.0,NULL},
1468        {0,0.0,NULL},
1469        {0,0.0,NULL},
1470        {0,0.0,NULL},
1471        {0,0.0,NULL},
1472};
1473
1474/* works OK on MP960 */
1475static const canon_inkset_t canon_19_C3M3Y3K2k3_inkset[] = {
1476        {'C',1.0,&canon_2b_3l_ink},
1477        {'M',1.0,&canon_2b_3l_ink},
1478        {'Y',1.0,&canon_2b_3l_ink},
1479        {'K',1.0,&canon_1b_2l_ink},
1480        {0,0.0,NULL},
1481        {0,0.0,NULL},
1482        {'k',1.0,&canon_2b_3l_ink},/* need to swap y -> k */
1483        {0,0.0,NULL},
1484        {0,0.0,NULL},
1485        {0,0.0,NULL},
1486        {0,0.0,NULL},
1487        {0,0.0,NULL},
1488        {0,0.0,NULL},
1489        {0,0.0,NULL},
1490        {0,0.0,NULL},
1491        {0,0.0,NULL},
1492        {0,0.0,NULL},
1493        {0,0.0,NULL},
1494        {0,0.0,NULL},
1495};
1496
1497/* photo mode iP6700D T-shirt transfers */
1498static const canon_inkset_t canon_19_C4M4Y4k4_inkset[] = {
1499        {'C',1.0,&canon_2b_4l_ink},
1500        {'M',1.0,&canon_2b_4l_ink},
1501        {'Y',1.0,&canon_2b_4l_ink},
1502        {0,0.0,NULL},
1503        {0,0.0,NULL},
1504        {0,0.0,NULL},
1505        {'k',1.0,&canon_2b_4l_ink}, /* swap y and k */
1506        {0,0.0,NULL},
1507        {0,0.0,NULL},
1508        {0,0.0,NULL},
1509        {0,0.0,NULL},
1510        {0,0.0,NULL},
1511        {0,0.0,NULL},
1512        {0,0.0,NULL},
1513        {0,0.0,NULL},
1514        {0,0.0,NULL},
1515        {0,0.0,NULL},
1516        {0,0.0,NULL},
1517        {0,0.0,NULL},
1518};
1519
1520/* photo mode MP960 T-shirt transfers --- works OK! */
1521static const canon_inkset_t canon_19_C4M4Y4K2k4_inkset[] = {
1522        {'C',1.0,&canon_2b_4l_ink},
1523        {'M',1.0,&canon_2b_4l_ink},
1524        {'Y',1.0,&canon_2b_4l_ink},
1525        {'K',1.0,&canon_1b_2l_ink},
1526        {0,0.0,NULL},
1527        {0,0.0,NULL},
1528        {'k',1.0,&canon_2b_4l_ink}, /* change y to k */
1529        {0,0.0,NULL},
1530        {0,0.0,NULL},
1531        {0,0.0,NULL},
1532        {0,0.0,NULL},
1533        {0,0.0,NULL},
1534        {0,0.0,NULL},
1535        {0,0.0,NULL},
1536        {0,0.0,NULL},
1537        {0,0.0,NULL},
1538        {0,0.0,NULL},
1539        {0,0.0,NULL},
1540        {0,0.0,NULL},
1541};
1542
1543/* photo mode MP960 CDs and iP6700D Photo High 2 [PPmatte, Coated] */
1544static const canon_inkset_t canon_19_C4M4Y4c4m4k4_inkset[] = {
1545        {'C',1.0,&canon_2b_4l_ink},
1546        {'M',1.0,&canon_2b_4l_ink},
1547        {'Y',1.0,&canon_2b_4l_ink},
1548        {0,0.0,NULL},
1549        {'c',1.0,&canon_2b_4l_ink},
1550        {'m',1.0,&canon_2b_4l_ink},
1551        {'k',1.0,&canon_2b_4l_ink}, /* change y to k  */
1552        {0,0.0,NULL},
1553        {0,0.0,NULL},
1554        {0,0.0,NULL},
1555        {0,0.0,NULL},
1556        {0,0.0,NULL},
1557        {0,0.0,NULL},
1558        {0,0.0,NULL},
1559        {0,0.0,NULL},
1560        {0,0.0,NULL},
1561        {0,0.0,NULL},
1562        {0,0.0,NULL},
1563        {0,0.0,NULL},
1564};
1565
1566/* photo mode iP6700D CDs, position of cmk guessed */
1567static const canon_inkset_t canon_19_C4M4Y4c4m4k4CD_inkset[] = {
1568        {'C',1.0,&canon_2b_4l_ink},
1569        {'M',1.0,&canon_2b_4l_ink},
1570        {'Y',1.0,&canon_2b_4l_ink},
1571        {0,0.0,NULL},
1572        {0,0.0,NULL},
1573        {0,0.0,NULL},
1574        {0,0.0,NULL},
1575        {0,0.0,NULL},
1576        {0,0.0,NULL},
1577        {0,0.0,NULL},
1578        {'c',1.0,&canon_2b_4l_ink},
1579        {'m',1.0,&canon_2b_4l_ink},
1580        {'k',1.0,&canon_2b_4l_ink}, /* swap y and k  */
1581        {0,0.0,NULL},
1582        {0,0.0,NULL},
1583        {0,0.0,NULL},
1584        {0,0.0,NULL},
1585        {0,0.0,NULL},
1586        {0,0.0,NULL},
1587};
1588
1589/* photo mode MP960 PPmatte works! */
1590static const canon_inkset_t canon_19_C4M4Y4K2c4m4k4_inkset[] = {
1591        {'C',1.0,&canon_2b_4l_ink},
1592        {'M',1.0,&canon_2b_4l_ink},
1593        {'Y',1.0,&canon_2b_4l_ink},
1594        {'K',0.0,&canon_1b_2l_ink}, /* works when K is set to 0 */
1595        {'c',1.0,&canon_2b_4l_ink},
1596        {'m',1.0,&canon_2b_4l_ink},
1597        {'k',1.0,&canon_2b_4l_ink}, /* change y to k */
1598        {0,0.0,NULL},
1599        {0,0.0,NULL},
1600        {0,0.0,NULL},
1601        {0,0.0,NULL},
1602        {0,0.0,NULL},
1603        {0,0.0,NULL},
1604        {0,0.0,NULL},
1605        {0,0.0,NULL},
1606        {0,0.0,NULL},
1607        {0,0.0,NULL},
1608        {0,0.0,NULL},
1609        {0,0.0,NULL},
1610};
1611
1612/* MP960 HIGH works OK */
1613static const canon_inkset_t canon_19_C6M6Y4K2_inkset[] = {
1614        {'C',1.0,&canon_4b_6l_ink},
1615        {'M',1.0,&canon_4b_6l_ink},
1616        {'Y',1.0,&canon_2b_4l_ink},
1617        {'K',1.0,&canon_1b_2l_ink},
1618        {0,0.0,NULL},
1619        {0,0.0,NULL},
1620        {0,0.0,NULL},
1621        {0,0.0,NULL},
1622        {0,0.0,NULL},
1623        {0,0.0,NULL},
1624        {0,0.0,NULL},
1625        {0,0.0,NULL},
1626        {0,0.0,NULL},
1627        {0,0.0,NULL},
1628        {0,0.0,NULL},
1629        {0,0.0,NULL},
1630        {0,0.0,NULL},
1631        {0,0.0,NULL},
1632        {0,0.0,NULL},
1633};
1634
1635/* iP6700D Plain High: CMYk */
1636static const canon_inkset_t canon_19_C6M6Y4c6m6k4_inkset[] = {
1637        {'C',1.0,&canon_4b_6l_ink},
1638        {'M',1.0,&canon_4b_6l_ink},
1639        {'Y',1.0,&canon_2b_4l_ink},
1640        {0,0.0,NULL},
1641        {'c',0.0,&canon_4b_6l_ink}, /* not used */
1642        {'m',0.0,&canon_4b_6l_ink}, /* not used */
1643        {'k',1.0,&canon_2b_4l_ink}, /* swap y and k */
1644        {0,0.0,NULL},
1645        {0,0.0,NULL},
1646        {0,0.0,NULL},
1647        {0,0.0,NULL},
1648        {0,0.0,NULL},
1649        {0,0.0,NULL},
1650        {0,0.0,NULL},
1651        {0,0.0,NULL},
1652        {0,0.0,NULL},
1653        {0,0.0,NULL},
1654        {0,0.0,NULL},
1655        {0,0.0,NULL},
1656};
1657
1658/* iP6700D Photo Std: CMYKcmk */
1659static const canon_inkset_t canon_19_C6M6Y4c6m6k4photo_inkset[] = {
1660        {'C',1.0,&canon_4b_6l_ink},
1661        {'M',1.0,&canon_4b_6l_ink},
1662        {'Y',1.0,&canon_2b_4l_ink},
1663        {0,0.0,NULL},
1664        {'c',1.0,&canon_4b_6l_ink},
1665        {'m',1.0,&canon_4b_6l_ink},
1666        {'k',1.0,&canon_2b_4l_ink}, /* swap y and k */
1667        {0,0.0,NULL},
1668        {0,0.0,NULL},
1669        {0,0.0,NULL},
1670        {0,0.0,NULL},
1671        {0,0.0,NULL},
1672        {0,0.0,NULL},
1673        {0,0.0,NULL},
1674        {0,0.0,NULL},
1675        {0,0.0,NULL},
1676        {0,0.0,NULL},
1677        {0,0.0,NULL},
1678        {0,0.0,NULL},
1679};
1680
1681/* hagaki std & high MP960 : CMYKk*/
1682static const canon_inkset_t canon_19_C6M6Y4K2c6m6k4hagaki_inkset[] = {
1683        {'C',1.0,&canon_4b_6l_ink},
1684        {'M',1.0,&canon_4b_6l_ink},
1685        {'Y',1.0,&canon_2b_4l_ink},
1686        {'K',1.0,&canon_1b_2l_ink},
1687        {'c',0.0,&canon_4b_6l_ink}, /* will not use, so have to set to 0 */
1688        {'m',0.0,&canon_4b_6l_ink}, /* will not use, so have to set to 0 */
1689        {'k',1.0,&canon_2b_4l_ink}, /* change y to k */
1690        {0,0.0,NULL},
1691        {0,0.0,NULL},
1692        {0,0.0,NULL},
1693        {0,0.0,NULL},
1694        {0,0.0,NULL},
1695        {0,0.0,NULL},
1696        {0,0.0,NULL},
1697        {0,0.0,NULL},
1698        {0,0.0,NULL},
1699        {0,0.0,NULL},
1700        {0,0.0,NULL},
1701        {0,0.0,NULL},
1702};
1703
1704/* photo std mode MP960 and inkjet Hagaki Std: CMYcmk*/
1705static const canon_inkset_t canon_19_C6M6Y4K2c6m6k4_inkset[] = {
1706        {'C',1.0,&canon_4b_6l_ink},
1707        {'M',1.0,&canon_4b_6l_ink},
1708        {'Y',1.0,&canon_2b_4l_ink},
1709        {'K',0.0,&canon_1b_2l_ink}, /* will not use K */
1710        {'c',1.0,&canon_4b_6l_ink},
1711        {'m',1.0,&canon_4b_6l_ink},
1712        {'k',1.0,&canon_2b_4l_ink}, /* change y to k */
1713        {0,0.0,NULL},
1714        {0,0.0,NULL},
1715        {0,0.0,NULL},
1716        {0,0.0,NULL},
1717        {0,0.0,NULL},
1718        {0,0.0,NULL},
1719        {0,0.0,NULL},
1720        {0,0.0,NULL},
1721        {0,0.0,NULL},
1722        {0,0.0,NULL},
1723        {0,0.0,NULL},
1724        {0,0.0,NULL},
1725};
1726
1727/* iP6700D Photo High: CMYkcm */
1728static const canon_inkset_t canon_19_C7M7Y4c7m7k4_inkset[] = {
1729        {'C',1.0,&canon_4b_7l_ink},
1730        {'M',1.0,&canon_4b_7l_ink},
1731        {'Y',1.0,&canon_2b_4l_ink},
1732        {0,0.0,NULL},
1733        {'c',1.0,&canon_4b_7l_ink},
1734        {'m',1.0,&canon_4b_7l_ink},
1735        {'k',1.0,&canon_2b_4l_ink}, /* swap y and k */
1736        {0,0.0,NULL},
1737        {0,0.0,NULL},
1738        {0,0.0,NULL},
1739        {0,0.0,NULL},
1740        {0,0.0,NULL},
1741        {0,0.0,NULL},
1742        {0,0.0,NULL},
1743        {0,0.0,NULL},
1744        {0,0.0,NULL},
1745        {0,0.0,NULL},
1746        {0,0.0,NULL},
1747        {0,0.0,NULL},
1748};
1749
1750/* photo high mode MP960 and inkjetHagaki High: CMYcmk */
1751static const canon_inkset_t canon_19_C7M7Y4K2c7m7k4_inkset[] = {
1752        {'C',1.0,&canon_4b_7l_ink},
1753        {'M',1.0,&canon_4b_7l_ink},
1754        {'Y',1.0,&canon_2b_4l_ink},
1755        {'K',0.0,&canon_1b_2l_ink}, /* will not use K */
1756        {'c',1.0,&canon_4b_7l_ink},
1757        {'m',1.0,&canon_4b_7l_ink},
1758        {'k',1.0,&canon_2b_4l_ink}, /* change y to k */
1759        {0,0.0,NULL},
1760        {0,0.0,NULL},
1761        {0,0.0,NULL},
1762        {0,0.0,NULL},
1763        {0,0.0,NULL},
1764        {0,0.0,NULL},
1765        {0,0.0,NULL},
1766        {0,0.0,NULL},
1767        {0,0.0,NULL},
1768        {0,0.0,NULL},
1769        {0,0.0,NULL},
1770        {0,0.0,NULL},
1771};
1772
1773static const canon_inkset_t canon_22_C2M2Y2K2_inkset[] = {
1774        {'C',1.0,&canon_1b_2l_ink},
1775        {'M',1.0,&canon_1b_2l_ink},
1776        {'Y',1.0,&canon_1b_2l_ink},
1777        {'K',1.0,&canon_1b_2l_ink},
1778        {0,0.0,NULL},
1779        {0,0.0,NULL},
1780        {0,0.0,NULL},
1781        {0,0.0,NULL},
1782        {0,0.0,NULL},
1783        {0,0.0,NULL},
1784        {0,0.0,NULL},
1785        {0,0.0,NULL},
1786        {0,0.0,NULL},
1787        {0,0.0,NULL},
1788        {0,0.0,NULL},
1789        {0,0.0,NULL},
1790        {0,0.0,NULL},
1791        {0,0.0,NULL},
1792        {0,0.0,NULL},
1793        {0,0.0,NULL},
1794        {0,0.0,NULL},
1795        {0,0.0,NULL},
1796};
1797
1798static const canon_inkset_t canon_22_C3M3Y2K2_c_inkset[] = {
1799        {'C',1.0,&canon_2b_3l_c_ink},
1800        {'M',1.0,&canon_2b_3l_c_ink},
1801        {'Y',1.0,&canon_1b_2l_ink},
1802        {'K',1.0,&canon_1b_2l_ink},
1803        {0,0.0,NULL},
1804        {0,0.0,NULL},
1805        {0,0.0,NULL},
1806        {0,0.0,NULL},
1807        {0,0.0,NULL},
1808        {0,0.0,NULL},
1809        {0,0.0,NULL},
1810        {0,0.0,NULL},
1811        {0,0.0,NULL},
1812        {0,0.0,NULL},
1813        {0,0.0,NULL},
1814        {0,0.0,NULL},
1815        {0,0.0,NULL},
1816        {0,0.0,NULL},
1817        {0,0.0,NULL},
1818        {0,0.0,NULL},
1819        {0,0.0,NULL},
1820        {0,0.0,NULL},
1821};
1822
1823static const canon_inkset_t canon_22_C3M3Y2K2k3_c_inkset[] = {
1824        {'C',1.0,&canon_2b_3l_c_ink},
1825        {'M',1.0,&canon_2b_3l_c_ink},
1826        {'Y',1.0,&canon_1b_2l_ink},
1827        {'K',1.0,&canon_1b_2l_ink},
1828        {0,0.0,NULL},
1829        {0,0.0,NULL},
1830        {0,0.0,NULL},
1831        {'k',0.0,&canon_2b_3l_c_ink},  /* even though we won't use the photo black in this mode its parameters have to be set */
1832        {0,0.0,NULL},
1833        {0,0.0,NULL},
1834        {0,0.0,NULL},
1835        {0,0.0,NULL},
1836        {0,0.0,NULL},
1837        {0,0.0,NULL},
1838        {0,0.0,NULL},
1839        {0,0.0,NULL},
1840        {0,0.0,NULL},
1841        {0,0.0,NULL},
1842        {0,0.0,NULL},
1843        {0,0.0,NULL},
1844        {0,0.0,NULL},
1845        {0,0.0,NULL},
1846};
1847
1848/* MP520 photo standard */
1849static const canon_inkset_t canon_22_C3M3Y3K2c3m3_c_inkset[] = {
1850        {'C',1.0,&canon_2b_3l_c_ink},
1851        {'M',1.0,&canon_2b_3l_c_ink},
1852        {'Y',1.0,&canon_2b_3l_c_ink},
1853        {'K',0.0,&canon_1b_2l_ink}, /* set to 0 */
1854        {'c',1.0,&canon_2b_3l_c_ink},
1855        {'m',1.0,&canon_2b_3l_c_ink},
1856        {0,0.0,NULL},
1857	{'k',0.0,&canon_2b_3l_ink},  /* even though we won't use the photo black in this mode its parameters have to be set */
1858        {0,0.0,NULL},
1859        {0,0.0,NULL},
1860        {0,0.0,NULL},
1861        {0,0.0,NULL},
1862        {0,0.0,NULL},
1863        {0,0.0,NULL},
1864        {0,0.0,NULL},
1865        {0,0.0,NULL},
1866        {0,0.0,NULL},
1867        {0,0.0,NULL},
1868        {0,0.0,NULL},
1869        {0,0.0,NULL},
1870        {0,0.0,NULL},
1871        {0,0.0,NULL},
1872};
1873
1874static const canon_inkset_t canon_22_C3M3Y3K2c3m3k3_c_inkset[] = {
1875        {'C',1.0,&canon_2b_3l_c_ink},
1876        {'M',1.0,&canon_2b_3l_c_ink},
1877        {'Y',1.0,&canon_2b_3l_c_ink},
1878        {'K',0.0,&canon_1b_2l_ink}, /* set to 0 */
1879        {'c',1.0,&canon_2b_3l_c_ink},
1880        {'m',1.0,&canon_2b_3l_c_ink},
1881        {0,0.0,NULL},
1882	{'k',1.0,&canon_2b_3l_c_ink},
1883        {0,0.0,NULL},
1884        {0,0.0,NULL},
1885        {0,0.0,NULL},
1886        {0,0.0,NULL},
1887        {0,0.0,NULL},
1888        {0,0.0,NULL},
1889        {0,0.0,NULL},
1890        {0,0.0,NULL},
1891        {0,0.0,NULL},
1892        {0,0.0,NULL},
1893        {0,0.0,NULL},
1894        {0,0.0,NULL},
1895        {0,0.0,NULL},
1896        {0,0.0,NULL},
1897};
1898
1899static const canon_inkset_t canon_22_C4M4Y4K2_inkset[] = {
1900        {'C',1.0,&canon_2b_4l_ink},
1901        {'M',1.0,&canon_2b_4l_ink},
1902        {'Y',1.0,&canon_2b_4l_ink},
1903        {'K',1.0,&canon_1b_2l_ink},
1904        {0,0.0,NULL},
1905        {0,0.0,NULL},
1906        {0,0.0,NULL},
1907        {0,0.0,NULL},
1908        {0,0.0,NULL},
1909        {0,0.0,NULL},
1910        {0,0.0,NULL},
1911        {0,0.0,NULL},
1912        {0,0.0,NULL},
1913        {0,0.0,NULL},
1914        {0,0.0,NULL},
1915        {0,0.0,NULL},
1916        {0,0.0,NULL},
1917        {0,0.0,NULL},
1918        {0,0.0,NULL},
1919        {0,0.0,NULL},
1920        {0,0.0,NULL},
1921        {0,0.0,NULL},
1922};
1923
1924/* MP830 T-Shirt */
1925static const canon_inkset_t canon_22_C4M4Y4K2k4_inkset[] = {
1926        {'C',1.0,&canon_2b_4l_ink},
1927        {'M',1.0,&canon_2b_4l_ink},
1928        {'Y',1.0,&canon_2b_4l_ink},
1929        {'K',1.0,&canon_1b_2l_ink},
1930        {0,0.0,NULL},
1931        {0,0.0,NULL},
1932        {0,0.0,NULL},
1933        {'k',1.0,&canon_2b_4l_ink},
1934        {0,0.0,NULL},
1935        {0,0.0,NULL},
1936        {0,0.0,NULL},
1937        {0,0.0,NULL},
1938        {0,0.0,NULL},
1939        {0,0.0,NULL},
1940        {0,0.0,NULL},
1941        {0,0.0,NULL},
1942        {0,0.0,NULL},
1943        {0,0.0,NULL},
1944        {0,0.0,NULL},
1945        {0,0.0,NULL},
1946        {0,0.0,NULL},
1947        {0,0.0,NULL},
1948};
1949
1950/* MP520 high */
1951static const canon_inkset_t canon_22_C4M4Y4K2c4m4_inkset[] = {
1952        {'C',1.0,&canon_2b_4l_ink},
1953        {'M',1.0,&canon_2b_4l_ink},
1954        {'Y',1.0,&canon_2b_4l_ink},
1955        {'K',0.0,&canon_1b_2l_ink}, /* set to 0 */
1956        {'c',1.0,&canon_2b_4l_ink},
1957        {'m',1.0,&canon_2b_4l_ink},
1958        {0,0.0,NULL},
1959	{'k',0.0,&canon_2b_4l_ink},  /* even though we won't use the photo black in this mode its parameters have to be set */
1960        {0,0.0,NULL},
1961        {0,0.0,NULL},
1962        {0,0.0,NULL},
1963        {0,0.0,NULL},
1964        {0,0.0,NULL},
1965        {0,0.0,NULL},
1966        {0,0.0,NULL},
1967        {0,0.0,NULL},
1968        {0,0.0,NULL},
1969        {0,0.0,NULL},
1970        {0,0.0,NULL},
1971        {0,0.0,NULL},
1972        {0,0.0,NULL},
1973        {0,0.0,NULL},
1974};
1975
1976static const canon_inkset_t canon_22_C4M4Y4K2c4m4k4_inkset[] = {
1977        {'C',1.0,&canon_2b_4l_ink},
1978        {'M',1.0,&canon_2b_4l_ink},
1979        {'Y',1.0,&canon_2b_4l_ink},
1980        {'K',1.0,&canon_1b_2l_ink},
1981        {'c',0.5,&canon_2b_4l_ink},
1982        {'m',0.5,&canon_2b_4l_ink},
1983        {0,0.0,NULL},
1984        {'k',0.0,&canon_2b_4l_ink},  /* even though we won't use the photo black in this mode its parameters have to be set */
1985        {0,0.0,NULL},
1986        {0,0.0,NULL},
1987        {0,0.0,NULL},
1988        {0,0.0,NULL},
1989        {0,0.0,NULL},
1990        {0,0.0,NULL},
1991        {0,0.0,NULL},
1992        {0,0.0,NULL},
1993        {0,0.0,NULL},
1994        {0,0.0,NULL},
1995        {0,0.0,NULL},
1996        {0,0.0,NULL},
1997        {0,0.0,NULL},
1998        {0,0.0,NULL},
1999};
2000
2001/* high */
2002/* MP990, MG6100, MG800 */
2003/* reorder: KCcMmYyk*H* not sure what the 2 missing ones are but they are only needed for ud1 anyway */
2004/*static const canon_inkset_t canon_30_C2M6K6m4k4_inkset[] = {*/
2005static const canon_inkset_t canon_30_K2C6M6Y4k4_inkset[] = {
2006        {'K',1.0,&canon_1b_2l_ink},
2007        {'C',1.0,&canon_4b_6l_ink},
2008        {0,0.0,NULL},
2009        {'M',1.0,&canon_4b_6l_ink},
2010        {0,0.0,NULL},
2011        {'Y',1.0,&canon_2b_4l_ink},
2012        {0,0.0,NULL},
2013        {'k',0.0,&canon_2b_4l_ink}, /* will not use it, but need to specify it */
2014        {0,0.0,NULL},
2015        {0,0.0,NULL},
2016        {0,0.0,NULL},
2017        {0,0.0,NULL},
2018        {0,0.0,NULL},
2019        {0,0.0,NULL},
2020        {0,0.0,NULL},
2021        {0,0.0,NULL},
2022        {0,0.0,NULL},
2023        {0,0.0,NULL},
2024        {0,0.0,NULL},
2025        {0,0.0,NULL},
2026        {0,0.0,NULL},
2027        {0,0.0,NULL},
2028        {0,0.0,NULL},
2029        {0,0.0,NULL},
2030        {0,0.0,NULL},
2031        {0,0.0,NULL},
2032        {0,0.0,NULL},
2033        {0,0.0,NULL},
2034        {0,0.0,NULL},
2035        {0,0.0,NULL},
2036};
2037
2038/* standard */
2039/* MP990, MG6100, MG800 */
2040/* reorder: KCcMmYyk*H* not sure what the 2 missing ones are but they are only needed for ud1 anyway */
2041static const canon_inkset_t canon_30_K2C3M3Y2k3_c_inkset[] = {
2042        {'K',1.0,&canon_1b_2l_ink},
2043        {'C',1.0,&canon_2b_3l_c_ink},
2044        {0,0.0,NULL},
2045        {'M',1.0,&canon_2b_3l_c_ink},
2046        {0,0.0,NULL},
2047        {'Y',1.0,&canon_1b_2l_ink},
2048        {0,0.0,NULL},
2049        {'k',0.0,&canon_2b_3l_c_ink}, /* will not use it, but need to specify it */
2050        {0,0.0,NULL},
2051        {0,0.0,NULL},
2052        {0,0.0,NULL},
2053        {0,0.0,NULL},
2054        {0,0.0,NULL},
2055        {0,0.0,NULL},
2056        {0,0.0,NULL},
2057        {0,0.0,NULL},
2058        {0,0.0,NULL},
2059        {0,0.0,NULL},
2060        {0,0.0,NULL},
2061        {0,0.0,NULL},
2062        {0,0.0,NULL},
2063        {0,0.0,NULL},
2064        {0,0.0,NULL},
2065        {0,0.0,NULL},
2066        {0,0.0,NULL},
2067        {0,0.0,NULL},
2068        {0,0.0,NULL},
2069        {0,0.0,NULL},
2070        {0,0.0,NULL},
2071        {0,0.0,NULL},
2072};
2073
2074/* fast */
2075/* MP990, MG6100, MG800 */
2076/* reorder: KCcMmYyk*H* not sure what the 2 missing ones are but they are only needed for ud1 anyway */
2077/*static const canon_inkset_t canon_30_C2M2K2m2_inkset[] = {*/
2078static const canon_inkset_t canon_30_K2C2M2Y2_inkset[] = {
2079        {'K',1.0,&canon_1b_2l_ink},
2080        {'C',1.0,&canon_1b_2l_ink},
2081        {0,0.0,NULL},
2082        {'M',1.0,&canon_1b_2l_ink},
2083        {0,0.0,NULL},
2084        {'Y',1.0,&canon_1b_2l_ink},
2085        {0,0.0,NULL},
2086        {0,0.0,NULL},
2087        {0,0.0,NULL},
2088        {0,0.0,NULL},
2089        {0,0.0,NULL},
2090        {0,0.0,NULL},
2091        {0,0.0,NULL},
2092        {0,0.0,NULL},
2093        {0,0.0,NULL},
2094        {0,0.0,NULL},
2095        {0,0.0,NULL},
2096        {0,0.0,NULL},
2097        {0,0.0,NULL},
2098        {0,0.0,NULL},
2099        {0,0.0,NULL},
2100        {0,0.0,NULL},
2101        {0,0.0,NULL},
2102        {0,0.0,NULL},
2103        {0,0.0,NULL},
2104        {0,0.0,NULL},
2105        {0,0.0,NULL},
2106        {0,0.0,NULL},
2107        {0,0.0,NULL},
2108        {0,0.0,NULL},
2109};
2110
2111/* CD photo */
2112/* reorder: KCcMmYyk*H* not sure what the 2 missing ones are but they are only needed for ud1 anyway */
2113/*static const canon_inkset_t canon_30_M5K5m4k4_inkset[] = {*/
2114static const canon_inkset_t canon_30_C5M5Y4k4_inkset[] = {
2115        {0,0.0,NULL},
2116        {'C',1.0,&canon_4b_5l_ink},
2117        {0,0.0,NULL},
2118        {'M',1.0,&canon_4b_5l_ink},
2119        {0,0.0,NULL},
2120        {'Y',1.0,&canon_2b_4l_ink},
2121        {0,0.0,NULL},
2122        {'k',1.0,&canon_2b_4l_ink},
2123        {0,0.0,NULL},
2124        {0,0.0,NULL},
2125        {0,0.0,NULL},
2126        {0,0.0,NULL},
2127        {0,0.0,NULL},
2128        {0,0.0,NULL},
2129        {0,0.0,NULL},
2130        {0,0.0,NULL},
2131        {0,0.0,NULL},
2132        {0,0.0,NULL},
2133        {0,0.0,NULL},
2134        {0,0.0,NULL},
2135        {0,0.0,NULL},
2136        {0,0.0,NULL},
2137        {0,0.0,NULL},
2138        {0,0.0,NULL},
2139        {0,0.0,NULL},
2140        {0,0.0,NULL},
2141        {0,0.0,NULL},
2142        {0,0.0,NULL},
2143        {0,0.0,NULL},
2144        {0,0.0,NULL},
2145};
2146
2147#endif
2148
2149