Mercurial > projects > doodle
comparison doodle/tk/pixel_model.d @ 79:535bae7a7305
Checkpoint
author | "David Bryant <bagnose@gmail.com>" |
---|---|
date | Sun, 15 Aug 2010 23:18:05 +0930 |
parents | 024a5608087f |
children |
comparison
equal
deleted
inserted
replaced
78:024a5608087f | 79:535bae7a7305 |
---|---|
22 | 22 |
23 // Choose the centre of the canvas as the centre of the view | 23 // Choose the centre of the canvas as the centre of the view |
24 _viewCentreModel = _canvasBoundsModel.centre; | 24 _viewCentreModel = _canvasBoundsModel.centre; |
25 } | 25 } |
26 | 26 |
27 void consolidateCanvasBounds(in Rectangle requiredCanvasBounds) { | 27 void consolidateCanvasBounds(in Rectangle requiredCanvasBounds) { _canvasBoundsModel = screenToModel(_viewBoundsScreen) | requiredCanvasBounds; } |
28 _canvasBoundsModel = screenToModel(_viewBoundsScreen) | requiredCanvasBounds; | 28 void canvasAccommodate(in Rectangle bounds) { _canvasBoundsModel = _canvasBoundsModel | bounds; } |
29 } | |
30 | |
31 void canvasAccommodate(in Rectangle bounds) { | |
32 _canvasBoundsModel = _canvasBoundsModel | bounds; | |
33 } | |
34 | 29 |
35 void zoomRelative(in double factor, in Point screenDatum) { | 30 void zoomRelative(in double factor, in Point screenDatum) { |
36 // Work out screen distance from current centre to datum, | 31 // Work out screen distance from current centre to datum, |
37 // Do the zoom, then work out the new centre that keeps the | 32 // Do the zoom, then work out the new centre that keeps the |
38 // screen distance the same | 33 // screen distance the same |
44 } | 39 } |
45 | 40 |
46 void panRelativeScreen(in Vector screenDisplacement) { _viewCentreModel = _viewCentreModel + screenToModel(screenDisplacement); } | 41 void panRelativeScreen(in Vector screenDisplacement) { _viewCentreModel = _viewCentreModel + screenToModel(screenDisplacement); } |
47 void panRelativeModel(in Vector modelDisplacement) { _viewCentreModel = _viewCentreModel + modelDisplacement; } | 42 void panRelativeModel(in Vector modelDisplacement) { _viewCentreModel = _viewCentreModel + modelDisplacement; } |
48 | 43 |
49 // For userZoom 1.0 -> 100% means the presentation on the screen is | 44 // For userZoom 1.0 -> 100% means the presentation on the screen is one-to-one with real-life |
50 // one-to-one with real-life | 45 double userZoom(in double pixelsPerMillimetre) const { return _zoom / pixelsPerMillimetre; } |
51 double userZoom(in double screensPerMillimetre) const { return _zoom / screensPerMillimetre; } | |
52 double zoom() const { return _zoom; } | 46 double zoom() const { return _zoom; } |
53 Rectangle viewBoundsScreen() const { return _viewBoundsScreen; } | 47 Rectangle viewBoundsScreen() const { return _viewBoundsScreen; } |
48 Rectangle viewBoundsModel() const { return screenToModel(_viewBoundsScreen); } | |
54 Rectangle canvasBoundsModel() const { return _canvasBoundsModel; } | 49 Rectangle canvasBoundsModel() const { return _canvasBoundsModel; } |
50 Rectangle canvasBoundsScreen() const { return modelToScreen(_canvasBoundsModel); } | |
55 | 51 |
56 Point modelToScreen(in Point model) const { return _viewBoundsScreen.centre + _zoom * (model - _viewCentreModel); } | 52 Point modelToScreen(in Point model) const { return _viewBoundsScreen.centre + _zoom * (model - _viewCentreModel); } |
57 Point screenToModel(in Point screen) const { return _viewCentreModel + (screen - _viewBoundsScreen.centre) / _zoom; } | 53 Point screenToModel(in Point screen) const { return _viewCentreModel + (screen - _viewBoundsScreen.centre) / _zoom; } |
58 Vector modelToScreen(in Vector model) const { return _zoom * model; } | 54 Vector modelToScreen(in Vector model) const { return _zoom * model; } |
59 Vector screenToModel(in Vector screen) const { return screen / _zoom; } | 55 Vector screenToModel(in Vector screen) const { return screen / _zoom; } |
60 Rectangle modelToScreen(in Rectangle model) const { return Rectangle(modelToScreen(model.position), modelToScreen(model.size)); } | 56 Rectangle modelToScreen(in Rectangle model) const { return Rectangle(modelToScreen(model.position), modelToScreen(model.size)); } |
61 Rectangle screenToModel(in Rectangle model) const { return Rectangle(screenToModel(model.position), screenToModel(model.size)); } | 57 Rectangle screenToModel(in Rectangle model) const { return Rectangle(screenToModel(model.position), screenToModel(model.size)); } |
62 | 58 |
63 private { | 59 private { |
64 static double clampZoom(in double zoom) { return clamp(zoom, 0.1, 10.0); } | 60 static double clampZoom(in double zoom) { return clamp(zoom, 1e-1, 1e2); } |
65 | 61 |
66 // Screen units are pixels | 62 // Screen units are pixels |
67 // Model units are millimetres | 63 // Model units are millimetres |
68 double _zoom; // pixels-per-millimetre | 64 double _zoom; // pixels-per-millimetre |
69 Rectangle _viewBoundsScreen; // bounds of the viewport in screen space | 65 Rectangle _viewBoundsScreen; // bounds of the viewport in screen space |