annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
70
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
1 module doodle.tk.pixel_model;
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
2
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
3 public {
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
4 import doodle.tk.geometry;
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
5 }
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
6
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
7 // FIXME consider using the term Screen instead of Pixel...
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
8
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
9 class PixelModel {
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
10 this(in double zoom, in Rectangle canvasBounds, in Rectangle viewBounds) {
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
11 _zoom = zoom;
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
12 _viewBounds = viewBounds;
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
13 _canvasBounds = canvasBounds;
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
14
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
15 _viewCentre = _canvasBounds.centre;
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
16 }
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
17
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
18 void consolidateCanvasBounds(in Rectangle requiredCanvasBounds) {
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
19 Rectangle r = pixelToModel(_viewBounds);
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
20 _canvasBounds = r | requiredCanvasBounds;
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
21 }
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
22
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
23 // For normalZoom 1.0 -> 100% means the presentation on the screen is
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
24 // one-to-one with real-life
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
25 double normalZoom(in double pixelsPerMillimetre) { return _zoom / pixelsPerMillimetre; }
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
26
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
27 Point modelToPixel(in Point model) const { return _viewBounds.centre + _zoom * (model - _viewCentre); }
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
28 Point pixelToModel(in Point pixel) const { return _viewCentre + (pixel - _viewBounds.centre) / _zoom; }
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
29 Vector modelToPixel(in Vector model) const { return _zoom * model; }
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
30 Vector pixelToModel(in Vector pixel) const { return pixel / _zoom; }
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
31 Rectangle modelToPixel(in Rectangle model) const { return Rectangle(modelToPixel(model.position), modelToPixel(model.size)); }
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
32 Rectangle pixelToModel(in Rectangle model) const { return Rectangle(pixelToModel(model.position), pixelToModel(model.size)); }
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
33
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
34 private {
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
35 // Screen units are pixels
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
36 // Model units are millimetres
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
37 double _zoom; // pixels-per-millimetre
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
38 Rectangle _viewBounds; // pixel: bounds of the viewport in pixels
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
39 Point _viewCentre; // model: where in the model is the centre of our view
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
40 Rectangle _canvasBounds; // model: the bounds of the canvas in millimetres
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
41 }
0e61702c6ea6 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents:
diff changeset
42 }