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