next up previous contents
Next: 3.8.2 Pitfalls with partials Up: 3.8 Joining operations together Previous: 3.8 Joining operations together   Contents

3.8.1 How it works

When a VIPS function is asked to output to a "p" image descriptor, all the fields in the descriptor are set (the output image size and type are set, for example), but no image data is actually generated. Instead, the function attaches callbacks to the image descriptor which VIPS can use later to generate any piece of the output image that might be needed.

When a VIPS function is asked to output to a "w" or a "t" descriptor (a real disc file or a real memory buffer), it evaluates immediately, and its evaluation in turn forces the evaluation of any earlier "p" images.

In the example in figure 3.5, whether or not any pixels are really processed when im_Lab2disp() is called depends upon the mode in which out was opened. If out is also a partial image, then no pixels will be calculated -- instead, a pipeline of VIPS operations will be constructed behind the scenes and attached to out.

Conversely, if out is a real image (that is, either "w" or "t"), then the final VIPS operation in the function (im_XYZ2disp()) will output the entire image to out, causing the earlier parts of im_Lab2disp() (and indeed possibly some earlier pieces of program, if in was also a "p" image) to run.

When a VIPS pipeline does finally evaluate, all of the functions in the pipeline execute together, sucking image data through the system in small pieces. As a consequence, no intermediate images are generated, large amounts of RAM are not needed, and no slow disc I/O needs to be performed.

Since VIPS partial I/O is demand-driven rather than data-driven, this works even if some of the operations perform coordinate transformations. We could, for example, include a call to im_affine(), which performs arbitrary rotation and scaling, and everything would still work correctly.


next up previous contents
Next: 3.8.2 Pitfalls with partials Up: 3.8 Joining operations together Previous: 3.8 Joining operations together   Contents
John Cupitt 2004-11-02