1- add tests for new stuff
2
3- seeing occasional "rewind image with active regions" message
4
5- should parse_float / _int etc. allow leading and trailing spaces?
6
7    (split is_space x)?0
8
9- how about adding
10
11	zip2 10 [1..5] == [[10, 1], [10, 2], [10, 3], ..
12
13  should be harmless, and quite useful
14
15  same for zip3 etc. as well
16
17  check zip use, we probably have this code there already, in various places
18
19- sharpen should use new interface?
20
21- can we call affine from nip2 vips_call? do we need a double array?
22
23- hough_circle etc. don't get cached ... they use the vips8 API and the vips
24  cache only works for vips8
25
26  we can't turn on the vips8 cache since it does not know about invalidate
27
28- columns can move about on load in large workspaces
29
30- hide tabs if only one tab in window, though we'd need to allow tab drop
31  anywhere in window for that
32
33- Matrix / New / Laplacian
34
35  edit a cell, turns into a plain matrix
36
37  need to override edit method
38
39  same for gaussian
40
41  rather tricky, compared to square / circle etc.
42
43
44
45- breadcrumb trail for prog window, so you can get back to where you were?
46
47- lambdas don't pattern match?
48
49	(\[a, b] a + b)
50
51
52
53- load jpg, ^Q, no leaks
54  load jpg, paint bar, paint one dot, ^Q, no leaks
55
56  load jpg, extract area, paint bar, paint one dot, ^Q, leaks
57  load jpg, extract area, paint bar, paint one dot, ^Z, ^Q, leaks
58  load jpg, extract area, paint bar, paint one dot, close window, ^Q, leaks
59
60  seems to leak:
61
62  	original image,
63  	one large regions on that image (full width)
64	extract area operation
65	extracted image
66	region a bit bigger than paint action on that image
67
680) VipsRegion (0x8b052a0)
69VipsRegion (object), base class VipsRegion: 0x8b052a0, im = 0x887aad0, left =
70192, top = 128, width = 45, height = 2 VipsRegion (0x8b052a0)
711) VipsImage (0x887aad0)
72VipsImage (image), image class 237x202 uchar, 3 bands, srgb, partial VipsImage
73(0x887aad0)
742) VipsImage (0x8016b30)
75VipsImage (image), image class 972x1296 uchar, 3 bands, srgb, openin VipsImage
76(0x8016b30)
773) VipsRegion (0x8b05340)
78VipsRegion (object), base class VipsRegion: 0x8b05340, im = 0x8016b30, left =
790, top = 30, width = 972, height = 283 VipsRegion (0x8b05340)
804) VipsExtractArea (0x882a910)
81VipsExtractArea (extract_area), extract an area from an image - extract_area
82((VipsImage*) 0x8016b30) 142 158 237 202 VipsExtractArea (0x882a910)
83
84  something to do with vips_image_wio_input() and the way it rewinds a PARTIAL
85  image? called from im_rwcheck()
86
87
88- os x build reports missing jasper dylib?
89
90- draw_circle could extract, draw and insert for huge memuse reduction
91
92- section on compat mode for the docs
93
94  see mail to MvGulick for some notes
95
96- expose more of the tone funcs in nip2
97
98- quite a few hist operations have no GUI ... histspec, for example?
99
100- nip2 should use zooming support, if possible
101
102- the windows setup .exe install a bazillion .png icons we will never use,
103  then installs them all again as .svg, which we will certainly never use
104
105- add extract_volume, cf. "grid"
106
107  record tile_size in meta somewhere? grid could set it, save a parameter off
108  extract_volume
109
110  also extract_sequence to get volume over time
111
112- image + complex constant would be nice
113
114
115
116
117- ban parameters which are built-ins, eg. "im", "re" etc., you get nasty
118  crashes
119
120  see also notes below: a new parser could fix this
121
122  can only ban for new code? do we have duff code in compat?
123
124  argh yes there are at least 15 like this, fix them or fix the parser? also
125  need to disable this check for compat defs
126
127  better to fix the parser, it can't be that hard
128
129  need to fix up the list comp compiler too, sigh
130
131
132
133
134
135
136- we can't define local superclasses at the moment
137
138  eg. consider:
139
140  	Fred = class {
141	  Jim a = class {
142	    value = a + 12;
143	  }
144
145	  Jennie x = class Jim x {
146	    value = 99;
147	  }
148	}
149
150  you can't do (Fred.Jennie 12) since Jim will have a secret 'this' param
151  (because it is a class member) and superclass constructors can't have
152  secrets
153
154  don't automatically give all members 'this' as a secret, check that they
155  make references to other class members that do need secrets first
156
157- turn on GM in prefs, have to restart before _stdenv.def:magick sees the
158  change
159
160- try this:
161
162	Workspaces.untitled
163	has_member "A1" A1
164
165  doesn't seem to work?
166
167
168
169- matrix_gaussian_blur could have an 'accuracy' or 'max error' param? expose
170  in custom blur etc.
171
172
173
174- oo_binary etc. needs revising, we don't search down branches as we should
175
176  for example, Matrix does:
177
178		// compound ... don't do iteration
179		[this.Matrix_base (op.fn this.value x.value),
180			(is_Matrix x || is_Real x || is_Vector x) &&
181			op.type == Operator_type.COMPOUND_REWRAP],
182
183  which is stupid, we should not wire Real and Vector in there, it ought to be
184  something like:
185
186		[this.Matrix_base (op.fn this.value x),
187			op.type == Operator_type.COMPOUND_REWRAP],
188
189  ie. don't strip the .value off x and rely on op.fn to do that, but this
190  breaks in various ways
191
192  remove all of _Object and redo it, thinking about what we want operators to
193  look like and what we want types to look like.
194
195  Have a base class for operators that does most of the standard stuff
196
197  get rid of the operator types rewrap / arithmetic / relational etc. etc.
198
199
200
201
202
203
204
205
206- try
207
208	point re
209		= x
210	{
211		(x, y) = re;
212	}
213
214  it's the 're' param, it stops x being bound to the
215  get-real-part-of-complex builtin
216
217  expands to
218
219	point re
220		= x
221	{
222		$$x = re;
223		x
224			= re $$x, is_complex $$x
225			= error "bad match";
226	}
227
228  add secrets
229
230	point point.re
231		= x point.re
232	{
233		$$1 $$1.re = point.re;
234		x x.re
235			= x.re ($$x point.re), is_complex ($$x point.re)
236			= error "bad match";
237	}
238
239
240x compiles to
241
242if_then_else (<symbol "point.x.is_complex"> (<symbol "point.$$pattern_lhs78"> <symbol "point.re">))
243 <symbol "point.x.re"> (<symbol "point.$$pattern_lhs78"> <symbol "point.re">)
244 <symbol "point.x.error"> <Managed* 0x37c5a80>
245
246abstracting point.re
247
248after var abstract
249
250((S ((Sr (if_then_else <compileref "point.x">)) ((Sl ((Sr (&& <compileref "point.x">)) ((Sr <symbol "point.x.is_complex">) <symbol "point.$$pattern_lhs78">))) true))) ((Sl ((Sr SHARE0[(: <compileref "point.x">)]) ((Sr <symbol "point.x.re">) <symbol "point.$$pattern_lhs78">))) ((REF0 (<symbol "point.x.error"> <Managed* 0x3a55980>)) [ ])))
251
252reduce and get
253
254reduce_spine: (<symbol "point.x.re"> (<symbol "point.$$pattern_lhs0"> (I (1,2))))
255reduce_spine: (<symbol "point.re"> (<symbol "point.$$pattern_lhs0"> (I (1,2))))
256sym-param found, argh: point.re
257
258  maybe fix this when we revise the parser
259
260  would be a good time to add multiple definitions as well
261
262- redo name resolution in parser ... scrap the patch thing, instead have a
263  separate 'resolve' step that runs after parsing a top-level
264
265  don't create ZOMBIE symbols, instead make REF nodes in the tree
266
267  this binds local references, but leaves external refs dangling
268
269  we do a final link at load time when we copy into the heap
270
271  do we need zombies at all now?
272
273  make a fork for this
274
275
276
277- we have ws->window_width, can we use the one on Model now instead?
278
279
280
281- new inplace stuff needs a test suite
282
283- 'don't show this dialog again' on delete row dialog, also in prefs
284
285  box_yesno() could take a string which is the name of a pref to check for
286  ask-or-not
287
288
289
290- how about something that does:
291
292	  im' = operation_list [a, b, c, d] im
293
294  it does a fold:
295
296	  im' = d (c (b (a im)))
297
298  but the intermediate images are reused, so you can do in-place stuff with it
299
300  we could get rid of lineset!
301
302
303
304
305
306
307- mac binary has a broken im_text() argh
308
309- do we allow
310
311	[r, g, b] = Image_file "babe.jpg"
312
313  since ? is band index and list index, it seems to make sense
314
315  we have
316
317  	image ++ image
318  	image ++ [] == image
319
320  for bandjoin, so that lines up too, I guess
321
322  hmm
323
324  	reverse image
325
326  to swap the bands over? heh need to be able to override hd and tl
327
328- Ackermann
329
330        http://shootout.alioth.debian.org/great/benchmark.php?test=ackermann&lang=all&sort=cpu
331
332        A x y
333                = y + 1, x == 0
334                = A (x - 1) 1, y == 0
335                = A (x - 1) (A x (y - 1));
336
337        correct test result: A 3 4 == 125
338
339  A 3 10 is benchmark test ... we fail with a "C stack overflow" error
340
341  A 3 9 == 4093 works OK
342
343  we could make this a lot quicker with some arithmetic streamlining
344
345  could we do tail-recursion elimination?
346
347  strictness analysis would help too
348
349- Fib
350
351        http://shootout.alioth.debian.org/great/benchmark.php?test=fibo&lang=all&sort=cpu
352
353        F x
354                = 1, x == 0
355                = 1, x == 1
356                = F (x - 2) + F (x - 1);
357
358  correct output F 32 == 3524578
359
360  cima is ~370s for this (!!)
361
362  work machine is about 50s
363
364  dell vostro laptop is 45s without optimiser
365
366- turn on DEBUG in heap.c, run the fibonacci benchmark
367
368  we heap_copy F every time it recurses! because when we heap_copy we don't
369  link recursive references
370
371  try fixing this ... but remember the problems we had with shared classes
372  when we did link-to-value rather than link-to-copy
373
374  we also have a huge amount of stuff in the heap, could we trim this down?
375  how does it all get pulled in? is it preferences?
376
377  in nip1, F is about 4x faster
378
379WONTFIX for 7.20
380================
381
382- look at:
383
384http://www.eggheadcafe.com/software/aspnet/35467981/programmatic-console-appl.aspx
385
386  possibly better than nip2-cli.exe
387
388- turning a column from Many Stats into a vector for doing arithmetic is very
389  tricky argh
390
391  add a matrix->vector converter? or maybe a one column or 1 row matrix should
392  also be a vector
393
394- try:
395
396	 nip2 Workspaces.uniformshapes2.A1.start_line=21 uniformshapes2.ws
397
398  --set does not work for non-toplevels
399
400- try:
401
402	A1 = [1]
403	A2 = [x :: x <- A1]
404
405	change A1, A2 does not update, argh
406
407  we get:
408
409	link_expr_new: expr A2.$$lcomp0 references link->child = A1
410
411  so perhaps we are updating the local of A2, but not A2?
412
413  A2 is certainly being marked dirty ... on change of A1 we get:
414
415	row_dirty_set_single: A1  clear_error = true
416	symbol_dirty_set: A1 (0x1a59480)
417	symbol_dirty_set: A2 (0x1a595a0)
418	symbol_recalculate_check: untitled.A1
419	row_dirty_clear: A1
420	row_recomp_all: done row A1  - 0.000143873s
421	row_dirty_set_single: A1  clear_error = false
422	row_dirty_clear: A1
423	symbol_dirty_clear: A1 (0x1a59480)
424		success: [2]
425	symbol_recalculate_check: untitled.A2
426	symbol_dirty_clear: A2 (0x1a595a0)
427		success: [1]
428
429  so maybe A2.something is being updated, but the row is not
430
431  we now mark a row dirty if a sub-expr is dirty. but in row_renerate(), we
432  don't build subexprs
433
434  should we mark the subexpr dirty? (or maybe we do?)
435
436  or should we always copy all subexprs when we copy an expr
437
438  or only subexprs with no row?
439
440  do we calc rows outside-in or inside-out? does this affect copying subrows?
441
442  when do we copy now, the first time a row is made?
443
444- we destroy and rebuild all links during recomp (eg. turn on DEBUG in
445  link.c), why is this? can't we only rebuild on a change of source text?
446
447- fix the FIXME in itext_clear_edited() or wherever it is
448
449- try:
450
451	start nip2
452	dir untitled
453	create A2, A3, etc.
454	A1 does not update
455
456  when we add/remove a def to workspace, should we mark the ws dirty?
457
458- lambdas should allow patterns? eg.:
459
460	map (\[x, y] x + y) [[1, 2], [3, 4]] == [3, 7]
461
462- OS X bundler:
463
464   http://sourceforge.net/apps/trac/gtk-osx/wiki/Bundle
465
466  test?
467
468- imageinfo_make_paintable() no longer copies to a file, since this used to
469  cause problems with dangling pointers because of the im_close()s we had to
470  do
471
472  however, this means we now do all painting in memory :-( do we need to add
473  API to change a memory image (eg. a "p") into a file?
474
475- test Joe's layout thing, compare to the thing we do in study2 to make the
476  diagnostic image
477
478- im_blend(), im_ifthenelse(), im_add() etc. now do bandalike/formatalike
479
480  where do we use our bandalike/formatalike stuff? remove our stuff, though
481  make sure we have equivalents in vips now
482
483- outline text example
484
485- needs a custom convol menu item which can loop over a group of matricies
486  with a single image
487
488  actually, we need to nail this down, otherwise when we pass in a list of
489  sample texts the loops don't nest
490
491- right-click menu on row button should have items for "Jump to referrer / WC1
492  / JC1 ..." and "Jump to referred / ..."
493
494- why didn't im_copy_file() work? mysterious
495
496- line colours are wrong, argh, very mysterious, see
497
498  	plot_new_gplot()
499
500- gtk3.0 tests:
501
502	build with
503
504	#define G_DISABLE_DEPRECATED
505	#define G_DISABLE_SINGLE_INCLUDES
506	#define GDK_DISABLE_DEPRECATED
507	#define GTK_DISABLE_DEPRECATED
508	#define GDK_DISABLE_SINGLE_INCLUDES
509	#define GTK_DISABLE_SINGLE_INCLUDES
510
511	paste into config.h, somehow
512
513  need to remove:
514
515	GtkType
516	gtk_type_new
517	gtk_signal_connect
518	GTK_SIGNAL_FUNC
519	gtk_signal_handler_block_by_data
520`	gtk_signal_connect_object
521	GTK_CHECK_CAST
522	GTK_CHECK_TYPE
523	GtkSignalFunc
524
525- add Set menu to Math with mkset/union/intersection/difference ?
526
527  could do bit operations on images?
528
529- lcomps like:
530
531	argh = [x :: x <- poop]
532
533  the 'x' gets copied inside the lcomp, leaving a zombie 'x' attached to argh,
534  which Program / View / Errors then reports
535
536  fix: don't resolve names as we parse and junk the ugly patch list thing
537
538  instead, have a separate resolve stage that runs after we've moved scraps
539  of graph to their final home
540
541- if we want full VipsObject introspection we will need a lot more
542
543	vips_object_arguments (name2gtype "VipsInterpolateYafrsmooth")
544		-> ["sharpness"]
545
546  need some equivalent for GParamSpec / VipsArgument
547
548  	VipsArgument name type .... = class {}
549
550  return a list of these from vips_object_arguments()?
551
552- heap_map_dict() should be reduce_map_dict(), since it does reduction, argh
553
554  redo heap_map_dict() in terms of reduce_map_dict()
555
556  actually, remove all the reduce_ stuff, it's daft to have a distinction
557
558  something to do when we break Snip out into libsnip
559
560- Plot window should have image header menu item?
561
562  not trivial, image header needs a conversion to watch
563
564  we'd need to make a conversion in plotmodel
565
566- filesel guess-file-type-from-suffix needs fixing
567
568  copy the vips model of having a user_name which is just "Workspace" or
569  somesuch, and making "Workspace file (*.ws)" string at runtime
570
571  use this to identity file types in util.c as well: get_image_info() needs it
572
573- for rows made by typing stuff, always show the formula as well as the value
574
575  by default anyway?
576
577  we'd need to always show the up/down arrows, not just for classes
578
579- drag from an image thumbnail to the ws background and you get a new column
580  with "A2" or whgatever in
581
582  does not work for plot thumbnails! how annoying
583
584- right-click on image background to get a context menu with
585  save/replace/header? same as row thumbnail context?
586
587- look at using goffice instead of gtkplot for graphs
588
589	http://ftp.gnome.org/pub/gnome/sources/goffice/
590
591  also in synaptic
592
593  there's also a new cairo-based gtkplot in SVN, apparently
594
595- try
596
597	last [1..]
598
599  then CTRL-W ... we can quit the app, but it's still evaling and the prompt
600  never comes back
601
602- Math / Cluster is a bit useless, will it work for complex numbers? vectors?
603  colours? groups?
604
605  what would we have to do to get it to work for these other types?
606
607- toolkit load is where compiled code would go in
608
609  need to make load / parse / compile self-contained ... the only output is a
610  list of symbols, each with code and sub-symbols; there are no toolkits or
611  whatever made
612
613  after load / parse / compile, we need to walk the symbol list building tools
614  and all that stuff
615
616  we do:
617
618  	load toolkit:
619		get filesize, date last modified, md5sum
620		look in ~/.nip2-7.x.x/cache for a file named with that md5sum
621		if present, open and check first two fields: filesize and date
622		if match, load compiled code
623		if no match, load / parse / compile toolkit, then save compiled
624			code to ~/.nip2-7.x.x./cache
625		walk symbol list building tools and all that stuff
626
627  how much time will this really save? can we easily get an estimate?
628
629  steps to follow:
630
631  1.	make load / parse / compile self-contained, with separate pass to
632  	build tools etc.
633
634	this is a useful cleanup whatever else we do
635
636  2. 	now we know exactly what the output of load / parse / compile is, we
637  	should be able to write to a file
638
639	make our own binary format, don't use XML ... we want speed
640
641  3. 	try loading and benchmarking
642
643  4.	if the benchmarks look promising, harden and polish
644
645
646- numbering of group of group save seems to skip one at end of line?
647
648- Math / Cluster is a bit useless, will it work for complex numbers? vectors?
649  colours? groups?
650
651  what would we have to do to get it to work for these other types?
652
653- segv in test_toolkits on laptop (inside fftw3) ???!? valgrinds cleanly on
654  work machine
655
656- try
657
658	last [1..]
659
660  then CTRL-W ... we can quit the app, but it's still evaling and the prompt
661  never comes back
662
663- configure no longers sets GMSGFMT, is this OK? test on OS X
664
665- for rows made by typing stuff, always show the formula as well as the value
666
667  by default anyway?
668
669  we'd need to always show the up/down arrows, not just for classes
670
671- drag from an image thumbnail to the ws background and you get a new column
672  with "A2" or whgatever in
673
674  does not work for plot thumbnails! how annoying
675
676- right-click on image background to get a context menu with
677  save/replace/header? same as row thumbnail context?
678
679- look at using goffice instead of gtkplot for graphs
680
681	http://ftp.gnome.org/pub/gnome/sources/goffice/
682
683  also in synaptic
684
685WONTFIX for 7.14
686================
687
688- quit while a thumbnail is painting: IMAGEs are leaked? seems esp. bad with
689  greyc, perhaps just because it's so slow
690
691- do we enforce no-args-to-LHS-pattern anywhere? try
692
693	[a,b] a b = 12;
694
695- use destroy_if_destroyed() in more places?
696
697	grep destroy_ *.h
698
699- after pressing "Process" in the edit window, we always select last_sym,
700  which is often not what we want
701
702  make it jump less after a process ... eg. try editing something in the
703  middle of Image/Transform, very annoying
704
705- use compile->last_sym to spot chains of defs
706
707  multiple definitions of the same function are allowed, provided they all
708  multiple definitions of the same function are allowed, provided they all
709  have the same number of arguments, and provided only one of them has no
710  argument pattern matching
711
712  example:
713
714  	fred [a, b, 1] = a * b;
715	fred (Image x) = rot90 x;
716	fred z = error "what";
717
718  any of these can have locals, those locals just apply to that one
719  definition
720
721  this compiles to:
722
723	fred $$a4
724		= $$fred1, is_list $$a4 && len $$a4 == 2 && $$a4?2 == 1
725		= $$fred2, is_instance_of "Image" $$a4
726		= $$fred3
727	{
728		$$fred1
729			= a * b
730		{
731			a = $$a4?0;
732			b = $$a4?1;
733		}
734		$$fred2
735			= rot90 x
736		{
737			x = $$a4;
738		}
739		$$fred3
740			= error "what";
741		{
742			z = $$a4;
743		}
744	}
745
746  so each pattern-matching definition generates a condition and an action
747
748  constants in patterns become part of the condition test
749
750  the action goes into a private function, the conditions are joined together
751  in the function wrapper
752
753  the no-pattern case (if present) becomes the action for the "otherwise"
754  clause in the wrapper
755
756  if not present, we generate (error "pattern match failed") or somesuch for
757  the default case
758
759  we will need to regenerate the wrapper function every time a definition of
760  fred is added or removed ... can we do this easily?
761
762  when are two definitions considered equal? should we warn about this? "fred
763  x" could occur in two files, for example
764
765  process:
766
767	* we see a "fred arg-list" incoming
768	* does the arg list contain any patterns?
769	  yes:
770		* do we already have a fred in this scope?
771		  yes:
772			* the existing fred must be the wrapper, this must be
773			  a new possible RHS
774			* check that the number of args matches
775		  no:
776		  	* generate a fred to act as the wrapper
777			* add args called $$arg1 etc. to the main fred
778		* add this new fred as a $$fredn local to the current
779		  fred
780		* expand the patterns as local references to the main
781		  fred's arguments
782		* parse the rest of the def in that context
783		* keep the pattern list around, we'll need it to generate the
784		  ifs for the wrapper later
785	  no:
786	  	* do we have a fred in this scope?
787		  yes:
788		  	* check the previous fred was a pattern matcher
789		  	* check the number of args matches
790		  	* check there isn't already a default case
791			* add as above
792		  no:
793		  	* add as a regular non-pattern definition
794
795  issues:
796
797  	* where do we store the pattern lists? we can't expand them at
798	  parse-time, since we need them to make the wrapper (which we can't
799	  make until we've seen all the candidate RHS)
800	* when one of the RHS is changed, we need to regenerate the wrapper,
801	  how do we do this? (could nuke the generated code in the compile
802	  when we see a new RHS, then rebuild the wrapper in compile on the
803	  next heap_copy?)
804	* our current condition generator won't work ... we need to test
805	  consts as well, and it'll be rather inefficient as we'll repeatedly
806	  test the trunk as we loop over the leaves --- instead, walk the
807	  pattern recursively top-down testing each node
808
809  process:
810
811  * see "fred" (as opposed to simple_pattern)
812  	* is there already a fred in scope?
813	  yes:
814	  	* was current_compile->last_sym also a "fred"?
815		  yes:
816			* another definition
817	  yes:
818	  	* this must be an alternative definition
819
820
821- we put the 2nd fred in as a local of the first, but then the 2nd can see all
822  the stuff the first has as locals
823
824	  z = 42;
825	  fred 1 = 12 { z = 99; }
826	  fred 2 = z;
827
828  "fred 2" will return 99 :(
829
830
831  we need to make "fred 2 = z" into another fred at the same level, eg
832
833  	$$alternate42$fred 2 = z;
834
835
836  Nope, then how do we link the freds together for remove etc.?
837
838  Better:
839
840  	see a new sym (fred), create it
841
842	parse args with simple names becoming params, patterns becoming
843	$$arg42 plus a local $$patt42 holding the pattern source
844
845	expand the pattern to an access def as well, so our children can bind
846	to it
847
848	at the = sign, test for any pattern args present .. if there are none,
849	carry on as before
850
851	otherwise, make a new local called $$alternate42 or whatever and parse
852	the RHS into that
853
854	at the end of parse, need to resolve outwards twice, since we nest in
855	twice
856
857	now if we see another fred, check that the number of args matches and
858	then parse in as $$alternate99
859
860  what abut
861
862  	fred 2 a = 12;
863	fred 1 b = 32;
864
865  the first fred will make a top-level with
866
867  	fred $$arg12 a
868		=
869	{
870		$$alernate42 = 12;
871		$$patt12 = 2;
872	}
873
874  then when we parse the 2nd fred the name of the 2nd param is wrong :(
875
876
877  Even betterer:
878
879  	use GLR to split off the four cases for us
880
881		ident =
882		pattern =
883		ident ident_list =
884		ident pattern_list =
885
886	change pattern syntax so that ident is not part of simple_pattern
887
888	need to change lcomp as well
889
890	so we need to check why PARSE_PARAMS gets used: can we do without the
891	params part? yes, it's used so we can edit functions, but we no longer
892	do this
893
894	these days all we need is expr I think, but we'd need a small action
895	wrapper around it to wipe out any existing tree and locals
896
897
898
899        Find_item = class
900            Menuaction "_Find"
901                ("find a transform which will map sample image onto " ++
902                "reference") {
903            action reference sample = class
904                Transform b reference.width reference.height {
905                _vislevel = 3;
906
907                // controls
908                order = rubber_order;
909                interp = rubber_interp;
910                wrap = rubber_wrap;
911                max_err = Expression "Maximum error" 0.3;
912                max_iter = Expression "Maximum iterations" 10;
913
914                // transform
915                [a,b,c] = transform_search max_err max_iter order interp wrap
916                        sample reference;
917
918                transformed_image = Image a;
919                final_error = c;
920            }
921        }
922
923  fails with
924
925	Bad superclass.
926
927	Superclass constructor
928	"Image_transform_item.Image_rubber_item.Transform"
929	should have no secret arguments.
930
931  but this:
932
933        Find_item = class
934            Menuaction "_Find"
935                ("find a transform which will map sample image onto " ++
936                "reference") {
937            action reference sample = class
938                _t {
939                _vislevel = 3;
940
941                // controls
942                order = rubber_order;
943                interp = rubber_interp;
944                wrap = rubber_wrap;
945                max_err = Expression "Maximum error" 0.3;
946                max_iter = Expression "Maximum iterations" 10;
947
948                // transform
949                [a,b,c] = transform_search max_err max_iter order interp wrap
950                        sample reference;
951
952                transformed_image = Image a;
953		_t = Transform b reference.width reference.height;
954                final_error = c;
955            }
956        }
957
958  (ie. make the superclass constructor into a member) works fine
959
960
961
962- try using bison's location system
963
964	http://www.gnu.org/software/bison/manual/html_mono/bison.html#Locations
965
966- add something to Symbol:
967
968	Symbol *access_for;
969
970  links generated access def to the $$thing4 which holds the RHS
971
972  handy for the program window, also maybe for lcomp code gen?
973
974  also for row edits
975
976- don't offer to clear temps if there's been a crash
977
978  need to be able to test for process-still-running by PID
979
980  try
981
982  	http://msdn2.microsoft.com/en-us/library/ms886766.aspx
983
984	gboolean
985	process_running( int pid )
986	{
987		HANDLE handle;
988
989		if( (handle = OpenProcess( 0, FALSE, pid )) ) {
990			CloseHandle( handle );
991			return( TRUE );
992		}
993
994		return( FALSE );
995	}
996
997- autoarrange after every column resize or move
998
999  animate movement, so columns slither out of the way and in to place when
1000  you drop
1001
1002  duplicate column placement would be odd: maybe place duplicate below? also
1003  new column? what about dropping an image on to the ws background?
1004
1005- there's some left-recursion in the parser, eg. comma_list, is this easily
1006  fixable?
1007
1008- add (*) (operator sections) ... need a binup / uop production? can't
1009  do this without losing precedence stuff, it'll need a separate production
1010  for sections
1011
1012- magic definition maker could make a workspace-local def, rather cool
1013
1014- test classmodel_dict_new() ... part of classmodel member automation
1015
1016  need to implement member edit for OPTION groups
1017
1018	classmodel_done_member() ... read widget set -> model
1019	classmodel_buildedit_member( ... model -> build widget set
1020
1021  part of the [["key",value]] arg type
1022
1023- can we get VIPS errors reported in Error too?
1024
1025  we'd need to add logging to vips I think
1026
1027- toolkits / find doesn't find builtins on their name ... eg. search for
1028  "im_add"
1029
1030  too hard to fix with the way searching is done now
1031
1032- turn on update regions during drag, fix the x pos, try dragging, horrible
1033  flickering as we update twice, once after the drag motion and once after the
1034  recomp
1035
1036  if you comment out the explicit vobject_refresh() in
1037  regionview_model_update() the flickering goes, but region dragging is then
1038  very unresponsive
1039
1040  fix this when we get fast recomp back again
1041
1042- have a test_types.ws ... test arithmetic on all combinations of _types?
1043
1044- panner would be cool
1045
1046- tooltips on Expression rows always show unedited formula
1047
1048  could special-case formula for things with expression RHS?
1049
1050- what about iimage, iregion, iarrow ... can we member automate these? why are
1051  they different?
1052
1053- can't see error indications in noedit mode
1054
1055  should set a red background for display area as well as for rowview button?
1056
1057- need to be able to override cons to be able to make a List class :-(
1058
1059  see reduce.c:1710
1060
1061  this will change the strictness of cons ... how much breakage will this
1062  cause? very unclear
1063
1064  try this as a quick hack
1065
1066  need to do this before we can finish List
1067
1068  need List to make gamma easy
1069
1070- unselected column headers are too like the bg colour on windows?
1071
1072- python uses z.real and z.imag to extract real/image, should we add this too?
1073
1074  we don't really have complex as a true class, so it would be rather odd
1075
1076  need to add "[a].head" etc as well
1077
1078- python blocks complex->real with casts ... insists you use .imag/.real or
1079  abs()
1080
1081- if nip sees a IM_RW_IMAGE argument, it could automatically do this:
1082
1083	int
1084	im_flood_blob_copy( IMAGE *in, IMAGE *out, int x, int y, PEL *ink )
1085	{
1086		IMAGE *t;
1087
1088		if( !(t = im_open_local( out, "im_flood_blob_copy", "t" )) ||
1089			im_copy( in, t ) ||
1090			im_flood_blob( t, x, y, ink, NULL ) ||
1091			im_copy( t, out ) )
1092			return( -1 );
1093
1094		return( 0 );
1095	}
1096
1097  so it would turn a single IM_RW_IMAGE arg into a paired input and output
1098  arg
1099
1100  could make im_lineset() into a regular inplace func and rely on nip to wrap
1101  and unwrap
1102
1103  junk flood_blob_copy
1104
1105  nip could do this lazilly ... if we see the user doing
1106
1107     im_line (im_line ...) ...
1108
1109  then we could make one memory image and call im_line twice on it
1110  destructively ... cool! we'd need to check refcounts to make sure the
1111  intermediate wasn't being used anywhere else
1112
1113  hmm! might actually be very hard, we don't have true refcounts for things in
1114  the heap
1115
1116  need to do it on read instead:
1117
1118    - for image i
1119
1120    - use as an IM_RW_IMAGE arg ... copy to a memory area and pass in memory
1121      handle
1122
1123    - return memory area IMAGE j, and set a flag saying "can operate on
1124      destructively"
1125
1126    - if we use j as an IM_RW_IMAGE arg, skip the copy and just pass memory
1127      area in destructively ... we now have two ImageInfo sharing a single
1128      IMAGE
1129
1130    - !!!!
1131
1132    - does ImageInfo allow IMAGE sharing? not sure it does
1133
1134    - maybe this needs to be a vips8 feature when we'll have refcounts on
1135      IMAGE
1136
1137- tooltip on column says which other columns items in this column refer to,
1138  and which columns refer to items in this column
1139
1140- how about a nip start folder common to all versions
1141
1142  so nip2-7.11.14 tries
1143
1144    .nip2-7.11.14/start
1145    .nip2-7.11/start
1146    .nip2-7/start
1147    .nip2/start
1148
1149  or maybe
1150
1151    .nip2/7.11.14/start
1152    .nip2/7.11/start
1153    .nip2/7/start
1154    .nip2/start
1155
1156  bit less cluttered
1157
1158  also, we could have
1159
1160    .nip2/tmp
1161
1162  and not have multiple nip2 tmp areas
1163
1164  workspace recover after crash could break though ... maybe keep ws saves in
1165  .nip2/7.11.4/tmp?
1166
1167- think again about class arg checks
1168
1169  is there some way we can avoid the _check overhead? or at least check less
1170  often
1171
1172- plotpresent/imagepresent could have a common base class with the focus stuff
1173  in? also kb nav, zoom, drag-scroll
1174
1175  a bit difficult, because we want two different policies on window resize:
1176  plot should change the object to match the window
1177
1178- photographic negative should also be in image/levels ?
1179
1180  no, it does ->sRGB, (255-) etc., so it's better as a filter
1181
1182- gtk+ 2.12 has a treeview widget with rectangular select and grid lines
1183
1184  use instead of gtksheet?
1185
1186- stop image flickering on clock recomp?
1187
1188  want background pattern to be a property of the image display widget, not
1189  the image?
1190
1191  so we fade in tiles when that section of the image has never been displayed
1192  before (eg. on scroll or zoom)
1193
1194  we don't fade when that section has been painted and we are just changing
1195  the image (eg. on recalc)
1196
1197  if fadesteps == 1, only paint the sections of the tile for which mask == 255
1198
1199  this way we will never paint the bg pattern
1200
1201  need some hack for scroll/zoom ; test for mask == 255 would be slow :(
1202
1203