Mercurial > projects > doodle
diff doodle/tk/pixel_model.d @ 70:0e61702c6ea6
Checkpoint
author | "David Bryant <bagnose@gmail.com>" |
---|---|
date | Sat, 14 Aug 2010 20:05:55 +0930 |
parents | |
children | 0f7cf6c6f206 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doodle/tk/pixel_model.d Sat Aug 14 20:05:55 2010 +0930 @@ -0,0 +1,42 @@ +module doodle.tk.pixel_model; + +public { + import doodle.tk.geometry; +} + +// FIXME consider using the term Screen instead of Pixel... + +class PixelModel { + this(in double zoom, in Rectangle canvasBounds, in Rectangle viewBounds) { + _zoom = zoom; + _viewBounds = viewBounds; + _canvasBounds = canvasBounds; + + _viewCentre = _canvasBounds.centre; + } + + void consolidateCanvasBounds(in Rectangle requiredCanvasBounds) { + Rectangle r = pixelToModel(_viewBounds); + _canvasBounds = r | requiredCanvasBounds; + } + + // For normalZoom 1.0 -> 100% means the presentation on the screen is + // one-to-one with real-life + double normalZoom(in double pixelsPerMillimetre) { return _zoom / pixelsPerMillimetre; } + + Point modelToPixel(in Point model) const { return _viewBounds.centre + _zoom * (model - _viewCentre); } + Point pixelToModel(in Point pixel) const { return _viewCentre + (pixel - _viewBounds.centre) / _zoom; } + Vector modelToPixel(in Vector model) const { return _zoom * model; } + Vector pixelToModel(in Vector pixel) const { return pixel / _zoom; } + Rectangle modelToPixel(in Rectangle model) const { return Rectangle(modelToPixel(model.position), modelToPixel(model.size)); } + Rectangle pixelToModel(in Rectangle model) const { return Rectangle(pixelToModel(model.position), pixelToModel(model.size)); } + + private { + // Screen units are pixels + // Model units are millimetres + double _zoom; // pixels-per-millimetre + Rectangle _viewBounds; // pixel: bounds of the viewport in pixels + Point _viewCentre; // model: where in the model is the centre of our view + Rectangle _canvasBounds; // model: the bounds of the canvas in millimetres + } +}