add missing va_end() in bmp.c's write_packed()
[imager.git] / TODO
1                          *** TODO ***
2
3 Release Plans (subject to change)
4 -------------
5
6 brown-bag bugs may add intermediate releases.  The dates are goals,
7 not commitments.
8
9 For 0.65:
10
11 PNG re-work (#29268)
12
13 For 0.64: (speculative)
14
15 thick lines (#28854)
16
17 have alpha channel work treated as coverage for primitives (more
18 general combine parameter)
19
20 add some extra combine modes (hard/soft light, screen)
21
22 For 0.63:
23
24 general alpha channel fixes (#29879, etc) (done)
25
26 give 4/2 channel images a background color when saving to pnm (#30074)
27 (done)
28
29 give 4/2 channel images a background color when saving to BMP (#30075)
30 (done)
31
32 give 4/2 channel images a background color when saving to JPEG
33 (#29876)
34
35
36 For 0.62:
37
38 TIFF improvements (to be detailed) (#20329) (done)
39  - read/write 16-bit RGB w/ and w/o alpha
40  - read 16-bit CMYK w/ and w/o alpha
41  - read/write 32-bit RGB w/ and w/o alpha
42  - read 32-bit CMYK w/ and w/o alpha
43  - write mono images as bi-level
44  - read bi-level image as mono/paletted
45  - read/write 16/32 grayscale w/ and w/o alpha
46 both contig and non-contiguous
47  - possible extra code for handling 8-bit CMYK (#29353)
48
49 Makefile.PL --incpath and --libpath should expand ~/ paths (#29484)
50
51 scaling alpha channel image issues (done)
52
53 PBM images inverted (#30859) (might be fixed in TIFF branch) (was,
54 added test, done)
55
56 don't load B at compile-time in t82inline.t (#30508) (done)
57
58 the hardinvert filter inverts the alpha channels, this probably isn't
59 desirable (#30002) (done)
60
61 "dh-make-perl --build --cpan Imager" fails on require Makefile.PL
62 (#30520) (fixed)
63
64 Wrong link in Imager Pod (#30889) (done)
65
66 more diagnostics in 5/t57infix.t (fixed the problem)
67
68 extract out the scale() scale factor calculations (done)
69
70 For 0.61:
71
72 regmach.c fixes/tests (#29296) (done)
73
74 sample: scaling an animated gif (#27591) (done)
75
76 transform2() docs (#29267) (done)
77
78 i_gsamp() chan_count validation (#28985) (done)
79
80 Imager::Font::Wrap doesn't correctly set savepos (#29771) (done)
81
82 testdrive warnings (#29610) (done)
83
84 Imager::Files still refers to rgb file type (#29354) (done)
85
86 t/t01introvert test failure line 495 (#29413) (done)
87
88 Imager::Expr::Infix problem (#29562) (done)
89
90 CMYK alpha TIFF problems with old libtiff (#29353) (done)
91
92 matrix_transform() should use fabs() instead of abs() range checking
93 sz (#29936) (done)
94
95 warning compiling datatypes.c on x64 (#30204) (done)
96
97 dynfilt/t/t60dyntest.t relies on a file that may not exist (#30203)
98 (done)
99
100 Imager::Font::Wrap doesn't correctly set savepos (#29771) (done)
101
102 For 0.60 (hopefully):
103
104 RGB file support (#8666) (done)
105
106 convert() doesn't preserve sample size (#28492) (done)
107
108 be explicit that scale*() doesn't modify the source (#28570) (done)
109
110 repeated text in Imager::Files (#27589) (done)
111
112 error message when loading an unsupported font format is confusing (#27571) (done)
113
114 enable transparency by default for gif (#27615) (done)
115
116 Imager doesn't load on Windows 98 (#27653) (done)
117
118 new color counting code (#28142) (done)
119
120 sample: scaling an animated gif (#27591)
121
122 test getcolorcount() (done)
123
124 do a compiler warning clean up run (done)
125
126 change the ico/cur reader to apply the mask as an alpha channel by
127 default (#29001) (done)
128
129 For 0.58:
130
131 rgb.txt search (and testing) (#26064) (done)
132
133 guassian blur radius (#25645) (done)
134
135 text rendering FT1 (#11972) (done)
136
137 text rendering T1 (#11972) (done)
138
139 For 0.57
140
141 BMP security fix only
142
143 For 0.56:
144
145 checking testing of new ft2 rendering (done)
146
147 possibly: use renderer on other fonts
148
149 check testing of new ppm input (done)
150
151 check testing of new ppm output (done)
152
153 check lbr's font output issue (done)
154
155 tests for monochrome makemap (done)
156
157 correct handling of old Data::Dumper (#24391) (done)
158
159 fix unsharpmask documentation (#25531) (done)
160
161 work around compiler bug on OS X (#25561) (done)
162
163 BEFORE 0.54
164
165 OO interface for i_plin/i_glin (done)
166
167 remove gif query from makefile.pl (done)
168
169 fallback for read/write_multi to read/write
170
171 pnmscale based alternative scale method (done)
172
173 rubthrough 4 on 4 (done)
174
175 replace dummy test script in dynfilt with a real one (done)
176
177 BEFORE 0.50:
178
179 skip t82inline.t tests if directory has spaces in name
180
181 integrate pod coverage tests
182
183 rework iolayers
184
185 add .ico support
186
187 note lack of IRC support
188
189 document parseiptc()
190
191 BEFORE 0.48:
192
193 scale() fixes/docs, Imager::Transformations going over. (done)
194
195 do some more malloc checks (done)
196
197 scan $Config{libspath} for directories if we can. (done)
198
199 0.47:
200
201 - more documentation (and corresponding code cleanup)
202
203 - external C API access
204
205 - hooks for file reading/writing
206
207 - hooks for font types
208
209 - hooks for filters
210
211 - hooks for fills
212
213 - filter pre-processor for handling both image access methods
214
215 - move existing loadable filters into separate sub-directories
216
217 - write Imager::SDL
218
219 - maybe Imager::Tk::Photo
220
221
222 0.46: (September 2005)
223
224 - check remaining memory allocation calls for integer overflows
225   http://rt.cpan.org/NoAuth/Bug.html?id=8213
226    - check *alloc() calls
227    - check llist_push() calls
228
229 - fix Imager::Color warning when $ENV{HOME} isn't set from
230   _get_gimp_color() (done)
231   http://rt.cpan.org/NoAuth/Bug.html?id=13143
232
233 - module version numbers (done)
234   http://rt.cpan.org/NoAuth/Bug.html?id=13047 
235
236 - allow limits to be set on the size of an image read from a file.  This is
237   to prevent an attacker supplying huge images that consume all of 
238   memory causing a denial of service attack. (done)
239
240 - implement gsamp()/gsampf()/plin() etc methods for those low level image
241   interfaces which don't yet have methods. (done)
242    - code (done)
243    - test (done)
244    - document (done)
245
246 - add Imager::Tutorial (see Tk::UserGuide for a structure) (done)
247   don't cover installation - belongs in README or INSTALL
248   it doesn't need to cover everything - read/write/create/simple drawing
249   and simple text - other stuff belongs in the cookbook or in sample code
250
251 - rename lib/Imager/Cookbook.pm to lib/Imager/Cookbook.pod (done)
252
253 - add 5 more recipes to Imager::Cookbook
254
255 - implement i_incomplete for png and gif files.
256
257 - documentation audit, check:
258   - every method has at least one example, but if the method is complex
259     (like transform2, to_paletted, string() for example) it should include 
260     a range of examples
261   - check each method description to ensure it's reasonably clear.
262   - check POD sections (SEE ALSO in particular)
263   - multiple examples for writing GIF images.
264   - name arguments and use those names in the documentation
265     http://nntp.perl.org/group/perl.perl5.porters/102434
266   (#1521, #5608, #8231, #11429, #13058(done))
267
268 - have $img->read() act like ($img) = Imager->read_multi() on GIFs (done)
269
270 - figure out what the nearest_color filter does, and document it
271
272 - remove image.h dependency on t1lib.h (done)
273
274 - make sure dynfilt/Makefile.PL gets the same includes that
275   Makefile.PL does.
276
277 0.47:
278
279 - rework handling of antialiasing and other transparency against
280   transparent images
281
282   Places to check:
283    - text AA rendering
284    - AA line drawing
285    - anything that uses combine (fills in particular)
286    - image scaling? and matrix_transform()'s interpolation
287   http://rt.cpan.org/NoAuth/Bug.html?id=11972
288
289 0.48:
290
291 - fill out handling of large sample (16/double per sample) images
292   - filters
293   - rendering:
294     - lines
295     - text
296     - boxes
297     - polygons
298   - engines
299     - matrix transform
300     - transform()
301     - transform2()
302   - files:
303     - png
304     - tiff
305     - pnm
306
307 Speculation
308 -----------
309
310 Some of what's listed below has been implemented.
311
312 - should i_incomplete be optional?  ie. reading a short image results in
313   an error unless the user requests incomplete images.
314
315 Iolayer:
316 - Add scalar/mmap to iolayer
317 - Add close() code to iolayer for fakeseek sources.
318 - Merge callback interface into iolayer
319 - and raw
320 - Implment the maxread threshold (Indicates how much can
321   be read from a source before it stops reading from its
322   underlying source.  For making sure only the relevant
323   data is read from a socket for example. 
324
325 Enhanched internal structure:
326
327 MultiImage & metadata support:
328 - Figure what interface should be between C and perl?
329 - How to store data in the C interface for tags/metadata?
330   Support tiff's madness, i.e. tags and options.
331 - Error handling, make a general i_errstr object and arrange
332   such that each image has an i_errstr object to hold its
333   local errors?
334 - SEE design/represent.txt for proposed new structure and
335   interface design that takes these factors into account.
336 - define common i_* tags for specifying attribute common among images
337   like spatial resolution (implement for other image types, especially 
338   TIFF)  (Spatial resolution is supported for all types that support 
339   it - are there any other common properties we can add?)
340 - implement the i_incomplete tag for other formats  
341
342 New Features:
343 - Add mng support, pcx and aalib support.
344   - Windows icon files (.ico) (done)
345   - ILBM (Amiga) images
346   - photoshop files (I think I've seen docs)
347   - XBM
348   - FITS
349   - WMF (extract bitmap data on read)
350   - gzip or bzip2 compressed raw
351   - postscript for output
352   - PAM file support (man pam in recent PNM tools)
353
354 - Transforms, interpolated multidimensional lookup tables.
355   Usefull for CMYK <-> RGB table lookup.
356
357 - advanced font layout (spacing, kerning, alignment) (Artur?)
358
359 - ways to check if characters are present in a font, eg. checking if
360   ligatures are present (done for FreeType2)
361
362 - font synthesis - synthesize a bold or slanted font from a normal font
363   (or even from an existing bold or slanted font)
364
365 - utf8 support for text output
366   (available for FT1, freetype2, T1, Win32)
367
368 - easy interfaces for text output:
369   - align text around point, including:
370     - left, center, right horizontal alignment
371     - top, center, baseline, bottom alignment
372     - choose whether to base alignment upon character cells or font 
373       metrics to avoid spacing problems between lines
374   - fill a box from text, with newline handling
375     - an option to just return the information that would be used to 
376       output the text, so it can be used for sizing calculations
377     - how much text fit in the box/how much space is left in the box
378   - fill a box with rich text (size and font changes)
379     - as above
380     - wrapping around boxes/images
381   - pod2Imager :)
382
383 - tools to get more information about fonts/characters:
384   - name of font "Arial Bold Italic" vs "arialbi.ttf"
385   - ABC widths for characters (currently the only way to get the C width 
386     for a character is to get the width with a following space and without
387     and then compare)
388   - character names
389
390 - encodings for text output (maybe using the Encode module to work 
391   between encodings)
392
393 - image rotation, 3 ways of doing rotation:
394   - rotation by shearing, which produces makes lengths in the image larger,
395     but could be useful
396   (2 of the 3 have been done)
397
398 - read_multi() needs to handle other multi-image types,
399    (handles TIFF and GIF)
400
401 - write_multi() to save other multi-image types, (handles TIFF and GIF)
402   - pnm binary formats support multiple images per file
403
404 - compose channels - build a new image based on channels from several
405   images
406
407 - arc outlines
408
409 - filled/outlined ellipses and elliptical arcs
410
411   Complexities include:
412
413   a) when drawing a pie segment, are the angles specified the real
414   angles (since the scaling changes the angles if you just use sin() and
415   cos() directly) or the angle before scaling?  I can see cases where
416   both are useful.
417
418   b) can you control the angles of the axes of symmetry? (the axes would
419   remain at right angles to each other) Does this change the effect of
420   the d1 and d2 parameters?
421
422 - complex lines/curves:
423   - thick lines:
424     - dotted/dashed lines
425     - doubled lines?
426     - end-point controls (butt-end, square-end, round-end, pointy, arrows)
427   - brush-lines (as with the Gimp, or Photoshop)
428     - more complex with multiple strokes and various randomness as with
429       Fractal Design Painter (or later versions of Corel Photo Paint)
430   - complex line shapes:
431     - lines
432     - general curves (cubic or bezier, whichever is more general)
433     - easy access to general curves:
434       - points to make a nice curve from
435       - various circular curves (centre, radii, start/end angles, 
436         direction)
437   - Complex thick lines are probably more useful than brush-lines for 
438     the things I expect Imager to be used for.
439   - http://www.develop-help.com/imager/strokes.png (.jpg for smaller version)
440
441 - have Imager::Color{::Float}? use Graphics::ColorNames if present.
442
443 Clean up:
444 - Make sure everything is doable with the OO interface
445   i_flood_fill() for example.
446   - include low-level functions like gsamp() and so on
447
448 - Compile with memory debugging enabled and fix all leaks
449
450 - Add mycalloc() memory allocation wrappers.
451
452 - should we overload <=> or cmp for Imager::Color objects?
453   too many worms, leave it out
454
455 - should the interlace option for reading raw images have 
456   symbolic names in the OO interface?
457
458 - improve consistency in the interfaces, both in trying to use named
459   parameters where possible but also in using consistent names, eg.
460   (tx, ty) vs (left, top) in rubthrough() vs paste().  Do we want a (simple)
461   standard for this (suggested names)?  Remember to preserve the old 
462   interface where possible.
463
464 - try to clean up the inconsistencies between font types:
465   - utf8 (even if we just treat characters over 0xFF as missing for T1)
466     (done for FT2, FT1, T1)
467   - transformations (done for FT2)
468   - has_char() method (done for FT2, FT1, T1)
469
470 Format specific issues:
471 - provide patches for libgif and libungif that fix their bugs
472   and give a useful extension interface.  Probe for the 
473   installation of the patches in Makefile.PL to let gif.c
474   know what features it can use. (no need anymore)
475
476 - Add options for pnm writer to save in any of the p1..P6
477   formats.  Even if the input has 1 channel, write 3 and such
478   cases.  Also allow ascii mode.  Need to be able to write 
479   pbm images which needs ties to the quantization code.
480
481 - save paletted images as paletted where that's supported.  Done
482   for gif/tga/bmp/tiff.  Not done for png yet.
483
484 - read other format paletted images as paletted images.  This has 
485   been done for gif/tga/bmp/tiff formats but not for png.
486
487 - read/write 16-bit/sample images as such for tiff
488
489 - read more metadata from images, esp tiff tags, EXIF format information 
490   from TIFF and JPEG.
491
492 - handle 16-bit/sample pgm/ppm files (done)
493
494 - "jpeg lossless rotation" - directly manipulates the JPEG
495   representation to rotate, scale or in some limited cases, crop an
496   image.
497
498 Documentation:
499 - Add to the documentation
500 - Write a tutorial?
501 - sample code and Imager/Samples.pod describing them
502 - Imager/Cookbook.pod
503 - Write a guide to installing the helper libraries
504 - Go through the entire project and add comments in pod
505   so doco.perl can be used to read them.
506 - see the IRC log in design/doclayout.txt
507 - method index?
508 - concept index?
509
510 Build/configure:
511 - use prompt() (from ExtUtils::MakeMaker) for questions in Makefile.PL
512 - use the library's mechanism's to find the library if needed, for
513   example, freetype-config for FT2
514 - the freetype2 library is built as "freetype.lib" on Win32 and needs
515   to be renamed to be found by the configuration process and included
516   with -lfreetype.  Try to work around that.
517 - freetype2 and freetype1 tend to be installed in /usr/include/freetype2
518   and /usr/include/freetype directories, or similarly named (somedir/freetype
519   for example), instead of putting these directly into the search path
520   search for the freetype{2}?/someheader and then add the subdirectory if
521   we find the file in that directory.
522 - switch to Test::More
523 - change headers to use more unique re-include protection macros
524
525 Old release checklists
526 ----------------------
527
528 0.44: (december 2004)
529 - set i_format for every file type on read and test for it:
530   - bmp - done
531   - jpeg - done
532   - tiff - done
533   - tga - done
534   - rgb - no read function anyway
535   - png - done
536   - gif - done
537   - pnm - done
538   - raw - done
539 - check each file reader for possible integer overflows
540   - bmp - done
541   - tiff
542   - tga
543   - rgb
544   - png
545   - gif
546   - pnm
547 - check bmp code uses image data offset correctly - done
548 - check quant code for integer overflows - done
549 - check for old URLs (umich and imager.perl.org/~addi/...) - done
550
551 0.45: (march 2005?)
552 - resolve fills test failure under 5.8.6/darwin
553   http://www.nntp.perl.org/group/perl.cpan.testers/202802
554   add tests to check if the same problem occurs with other ?: operators
555 - stop tga_header_verify() from spewing junk to stdout (done)
556 - fix i_setcolors_p bug (done)
557 - audit pnm.c (done)
558 - audit tga.c (done)
559 - audit rgb.c and add tests
560 - add META.yml (bypass EU::MM's limited mechanism) (done)
561 - implement i_incomplete for bmp files
562 - check if freetype 2 is faster/slower than freetype 1 with Imager's glyph
563   caching.  If FT1 is faster, add caching as a TODO for FT2.
564 - add XS for i_tags_get_string() and test it.  It has an apparent problem
565   in C<< sprintf(value, "%d", entry->data); >> since data is a pointer
566   (done)
567 - test and fix problem with fallback value for 
568   Imager::Font::BBox->advance_width. (done)
569 - check handling of string() method align parameter. (done, fixed)
570 - i_tt_bbox_inst in font.c uses variable i without ever setting it. (fixed)
571 - add sample CGI that handles an uploaded image (done)
572 - examples for fountain filter in Imager::Filters (done)
573 - allow Imager::Fountain to take color descriptions (eg. blue, FF000)
574   instead of color objects for c0 and c1 (done)
575 - support newer GIMP gradient files with the Name line (done)
576 - provide access to right-side bearing information from the bounding box
577   function (done for all drivers)
578 - capture TIFF read warnings (i_warnings tag?) (done)
579 - Imager::Matrix2d rotate method only applies offset if both x and y
580   are non-zero, it should do it if either is non-zero (done)
581 - add Imager::Cookbook with at least 5 recipes (done)
582 - store floating point tags in an appropriate precision (done)
583 - allow image creation to fail on malloc() failure for the image data
584   rather than aborting.  The current behaviour could be a denial of
585   service attack.  This has limited utility because of the way memory
586   over commitment works on Linux (done but reverted)
587 - eliminate unused variable warning (especially the RETVAL ones in Imager.xs)
588   (done)
589 - handle probing for libraries better (use pkg-config or I<library>-config
590   where possible (freetype2 and libpng)) (done)
591 - add concept index to Imager.pm pod (done, still working it)
592 - replace testimg/penguin-base.ppm with a smaller image (done)
593 - add a sample CGI HTML and image generation scripts that work together,
594   with appropriate security management (done)
595