annotate Applications/Samples/SingleFrameEditorApplication.h @ 351:da25d2423314 am-2

CornerBitmapTracker to crop images
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 26 Oct 2018 17:04:24 +0200
parents c57e049ed079
children d95e65ebe0b9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
325
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1 /**
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
2 * Stone of Orthanc
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
4 * Department, University Hospital of Liege, Belgium
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
5 * Copyright (C) 2017-2018 Osimis S.A., Belgium
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
6 *
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
7 * This program is free software: you can redistribute it and/or
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
8 * modify it under the terms of the GNU Affero General Public License
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
9 * as published by the Free Software Foundation, either version 3 of
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
10 * the License, or (at your option) any later version.
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
11 *
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
12 * This program is distributed in the hope that it will be useful, but
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
15 * Affero General Public License for more details.
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
16 *
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
17 * You should have received a copy of the GNU Affero General Public License
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
19 **/
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
20
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
21
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
22 #pragma once
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
23
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
24 #include "SampleApplicationBase.h"
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
25
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
26 #include "../../Framework/Toolbox/GeometryToolbox.h"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
27 #include "../../Framework/Toolbox/ImageGeometry.h"
325
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
28 #include "../../Framework/Layers/OrthancFrameLayerSource.h"
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
29
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
30 #include <Core/DicomFormat/DicomArray.h>
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
31 #include <Core/Images/FontRegistry.h>
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
32 #include <Core/Images/ImageProcessing.h>
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
33 #include <Core/Images/PamReader.h>
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
34 #include <Core/Images/PngWriter.h> //TODO
325
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
35 #include <Core/Logging.h>
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
36 #include <Plugins/Samples/Common/FullOrthancDataset.h>
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
37 #include <Plugins/Samples/Common/DicomDatasetReader.h>
325
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
38
340
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
39
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
40 #include <boost/math/constants/constants.hpp>
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
41
325
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
42 namespace OrthancStone
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
43 {
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
44 class BitmapStack :
337
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 336
diff changeset
45 public IObserver,
336
c7fdc8bac581 creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
46 public IObservable
c7fdc8bac581 creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
47 {
c7fdc8bac581 creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
48 public:
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
49 typedef OriginMessage<MessageType_Widget_GeometryChanged, BitmapStack> GeometryChangedMessage;
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
50 typedef OriginMessage<MessageType_Widget_ContentChanged, BitmapStack> ContentChangedMessage;
336
c7fdc8bac581 creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
51
350
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
52
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
53 enum Corner
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
54 {
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
55 Corner_TopLeft,
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
56 Corner_TopRight,
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
57 Corner_BottomLeft,
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
58 Corner_BottomRight
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
59 };
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
60
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
61
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
62 class Bitmap : public boost::noncopyable
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
63 {
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
64 private:
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
65 bool visible_;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
66 bool hasSize_;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
67 unsigned int width_;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
68 unsigned int height_;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
69 bool hasCrop_;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
70 unsigned int cropX_;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
71 unsigned int cropY_;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
72 unsigned int cropWidth_;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
73 unsigned int cropHeight_;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
74 Matrix transform_;
350
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
75 Matrix transformInverse_;
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
76 double pixelSpacingX_;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
77 double pixelSpacingY_;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
78 double panX_;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
79 double panY_;
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
80 double angle_;
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
81
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
82
348
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
83 protected:
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
84 static Matrix CreateOffsetMatrix(double dx,
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
85 double dy)
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
86 {
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
87 Matrix m = LinearAlgebra::IdentityMatrix(3);
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
88 m(0, 2) = dx;
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
89 m(1, 2) = dy;
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
90 return m;
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
91 }
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
92
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
93
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
94 static Matrix CreateScalingMatrix(double sx,
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
95 double sy)
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
96 {
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
97 Matrix m = LinearAlgebra::IdentityMatrix(3);
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
98 m(0, 0) = sx;
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
99 m(1, 1) = sy;
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
100 return m;
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
101 }
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
102
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
103
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
104 static Matrix CreateRotationMatrix(double angle)
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
105 {
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
106 Matrix m;
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
107 const double v[] = { cos(angle), -sin(angle), 0,
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
108 sin(angle), cos(angle), 0,
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
109 0, 0, 1 };
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
110 LinearAlgebra::FillMatrix(m, 3, 3, v);
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
111 return m;
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
112 }
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
113
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
114
348
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
115 private:
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
116 static void ApplyTransform(double& x /* inout */,
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
117 double& y /* inout */,
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
118 const Matrix& transform)
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
119 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
120 Vector p;
340
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
121 LinearAlgebra::AssignVector(p, x, y, 1);
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
122
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
123 Vector q = LinearAlgebra::Product(transform, p);
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
124
340
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
125 if (!LinearAlgebra::IsNear(q[2], 1.0))
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
126 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
127 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
128 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
129 else
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
130 {
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
131 x = q[0];
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
132 y = q[1];
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
133 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
134 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
135
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
136
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
137 void UpdateTransform()
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
138 {
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
139 transform_ = CreateScalingMatrix(pixelSpacingX_, pixelSpacingY_);
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
140
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
141 double centerX, centerY;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
142 GetCenter(centerX, centerY);
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
143
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
144 transform_ = LinearAlgebra::Product(
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
145 CreateOffsetMatrix(panX_ + centerX, panY_ + centerY),
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
146 CreateRotationMatrix(angle_),
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
147 CreateOffsetMatrix(-centerX, -centerY),
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
148 transform_);
350
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
149
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
150 LinearAlgebra::InvertMatrix(transformInverse_, transform_);
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
151 }
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
152
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
153
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
154 void AddToExtent(Extent2D& extent,
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
155 double x,
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
156 double y) const
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
157 {
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
158 ApplyTransform(x, y, transform_);
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
159 extent.AddPoint(x, y);
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
160 }
350
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
161
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
162
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
163 void GetCornerInternal(double& x,
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
164 double& y,
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
165 Corner corner,
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
166 unsigned int cropX,
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
167 unsigned int cropY,
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
168 unsigned int cropWidth,
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
169 unsigned int cropHeight) const
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
170 {
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
171 double dx = static_cast<double>(cropX);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
172 double dy = static_cast<double>(cropY);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
173 double dwidth = static_cast<double>(cropWidth);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
174 double dheight = static_cast<double>(cropHeight);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
175
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
176 switch (corner)
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
177 {
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
178 case Corner_TopLeft:
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
179 x = dx;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
180 y = dy;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
181 break;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
182
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
183 case Corner_TopRight:
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
184 x = dx + dwidth;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
185 y = dy;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
186 break;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
187
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
188 case Corner_BottomLeft:
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
189 x = dx;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
190 y = dy + dheight;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
191 break;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
192
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
193 case Corner_BottomRight:
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
194 x = dx + dwidth;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
195 y = dy + dheight;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
196 break;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
197
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
198 default:
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
199 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
200 }
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
201
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
202 ApplyTransform(x, y, transform_);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
203 }
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
204
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
205
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
206 public:
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
207 Bitmap() :
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
208 visible_(true),
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
209 hasSize_(false),
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
210 width_(0),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
211 height_(0),
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
212 hasCrop_(false),
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
213 pixelSpacingX_(1),
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
214 pixelSpacingY_(1),
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
215 panX_(0),
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
216 panY_(0),
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
217 angle_(0)
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
218 {
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
219 UpdateTransform();
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
220 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
221
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
222 virtual ~Bitmap()
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
223 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
224 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
225
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
226 void ResetCrop()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
227 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
228 hasCrop_ = false;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
229 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
230
348
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
231 void SetCrop(unsigned int x,
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
232 unsigned int y,
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
233 unsigned int width,
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
234 unsigned int height)
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
235 {
348
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
236 if (!hasSize_)
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
237 {
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
238 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
239 }
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
240
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
241 if (x + width > width_ ||
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
242 y + height > height_)
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
243 {
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
244 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
245 }
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
246
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
247 hasCrop_ = true;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
248 cropX_ = x;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
249 cropY_ = y;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
250 cropWidth_ = width;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
251 cropHeight_ = height;
348
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
252
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
253 UpdateTransform();
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
254 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
255
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
256 void GetCrop(unsigned int& x,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
257 unsigned int& y,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
258 unsigned int& width,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
259 unsigned int& height) const
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
260 {
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
261 if (hasCrop_)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
262 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
263 x = cropX_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
264 y = cropY_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
265 width = cropWidth_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
266 height = cropHeight_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
267 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
268 else
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
269 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
270 x = 0;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
271 y = 0;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
272 width = width_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
273 height = height_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
274 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
275 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
276
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
277 void SetAngle(double angle)
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
278 {
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
279 angle_ = angle;
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
280 UpdateTransform();
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
281 }
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
282
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
283 double GetAngle() const
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
284 {
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
285 return angle_;
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
286 }
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
287
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
288 bool IsVisible() const
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
289 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
290 return visible_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
291 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
292
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
293 void SetVisible(bool visible)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
294 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
295 visible_ = visible;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
296 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
297
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
298
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
299 void SetSize(unsigned int width,
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
300 unsigned int height)
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
301 {
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
302 if (hasSize_ &&
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
303 (width != width_ ||
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
304 height != height_))
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
305 {
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
306 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize);
340
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
307 }
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
308
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
309 hasSize_ = true;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
310 width_ = width;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
311 height_ = height;
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
312
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
313 UpdateTransform();
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
314 }
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
315
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
316
351
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
317 unsigned int GetWidth() const
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
318 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
319 return width_;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
320 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
321
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
322
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
323 unsigned int GetHeight() const
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
324 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
325 return height_;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
326 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
327
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
328
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
329 void CheckSize(unsigned int width,
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
330 unsigned int height)
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
331 {
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
332 if (hasSize_ &&
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
333 (width != width_ ||
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
334 height != height_))
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
335 {
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
336 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize);
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
337 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
338 }
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
339
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
340
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
341 Extent2D GetExtent() const
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
342 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
343 Extent2D extent;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
344
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
345 unsigned int x, y, width, height;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
346 GetCrop(x, y, width, height);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
347
350
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
348 double dx = static_cast<double>(x);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
349 double dy = static_cast<double>(y);
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
350 double dwidth = static_cast<double>(width);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
351 double dheight = static_cast<double>(height);
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
352
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
353 AddToExtent(extent, dx, dy);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
354 AddToExtent(extent, dx + dwidth, dy);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
355 AddToExtent(extent, dx, dy + dheight);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
356 AddToExtent(extent, dx + dwidth, dy + dheight);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
357
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
358 return extent;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
359 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
360
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
361
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
362 virtual void Render(Orthanc::ImageAccessor& buffer,
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
363 const ViewportGeometry& view,
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
364 ImageInterpolation interpolation) const = 0;
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
365
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
366
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
367 bool Contains(double x,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
368 double y) const
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
369 {
350
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
370 ApplyTransform(x, y, transformInverse_);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
371
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
372 unsigned int cropX, cropY, cropWidth, cropHeight;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
373 GetCrop(cropX, cropY, cropWidth, cropHeight);
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
374
350
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
375 return (x >= cropX && x <= cropX + cropWidth &&
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
376 y >= cropY && y <= cropY + cropHeight);
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
377 }
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
378
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
379
351
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
380 bool GetPixel(unsigned int& pixelX,
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
381 unsigned int& pixelY,
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
382 double sceneX,
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
383 double sceneY) const
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
384 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
385 if (width_ == 0 ||
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
386 height_ == 0)
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
387 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
388 return false;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
389 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
390 else
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
391 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
392 ApplyTransform(sceneX, sceneY, transformInverse_);
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
393
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
394 int x = static_cast<int>(std::floor(sceneX));
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
395 int y = static_cast<int>(std::floor(sceneY));
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
396
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
397 if (x < 0)
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
398 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
399 pixelX = 0;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
400 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
401 else if (x >= static_cast<int>(width_))
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
402 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
403 pixelX = width_;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
404 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
405 else
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
406 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
407 pixelX = static_cast<unsigned int>(x);
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
408 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
409
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
410 if (y < 0)
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
411 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
412 pixelY = 0;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
413 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
414 else if (y >= static_cast<int>(height_))
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
415 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
416 pixelY = height_;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
417 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
418 else
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
419 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
420 pixelY = static_cast<unsigned int>(y);
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
421 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
422
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
423 return true;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
424 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
425 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
426
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
427
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
428 void SetPan(double x,
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
429 double y)
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
430 {
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
431 panX_ = x;
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
432 panY_ = y;
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
433 UpdateTransform();
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
434 }
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
435
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
436
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
437 void SetPixelSpacing(double x,
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
438 double y)
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
439 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
440 pixelSpacingX_ = x;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
441 pixelSpacingY_ = y;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
442 UpdateTransform();
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
443 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
444
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
445 double GetPixelSpacingX() const
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
446 {
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
447 return pixelSpacingX_;
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
448 }
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
449
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
450 double GetPixelSpacingY() const
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
451 {
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
452 return pixelSpacingY_;
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
453 }
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
454
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
455 double GetPanX() const
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
456 {
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
457 return panX_;
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
458 }
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
459
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
460 double GetPanY() const
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
461 {
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
462 return panY_;
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
463 }
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
464
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
465 virtual bool GetDefaultWindowing(float& center,
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
466 float& width) const
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
467 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
468 return false;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
469 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
470
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
471 const Matrix& GetTransform() const
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
472 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
473 return transform_;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
474 }
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
475
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
476
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
477 void GetCenter(double& centerX,
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
478 double& centerY) const
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
479 {
351
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
480 #if 0
348
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
481 unsigned int x, y, width, height;
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
482 GetCrop(x, y, width, height);
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
483
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
484 centerX = static_cast<double>(width) / 2.0;
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
485 centerY = static_cast<double>(height) / 2.0;
351
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
486 #else
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
487 centerX = static_cast<double>(width_) / 2.0;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
488 centerY = static_cast<double>(height_) / 2.0;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
489 #endif
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
490
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
491 ApplyTransform(centerX, centerY, transform_);
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
492 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
493
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
494
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
495 void DrawBorders(CairoContext& context,
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
496 double zoom)
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
497 {
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
498 unsigned int cx, cy, width, height;
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
499 GetCrop(cx, cy, width, height);
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
500
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
501 double dx = static_cast<double>(cx);
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
502 double dy = static_cast<double>(cy);
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
503 double dwidth = static_cast<double>(width);
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
504 double dheight = static_cast<double>(height);
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
505
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
506 cairo_t* cr = context.GetObject();
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
507 cairo_set_line_width(cr, 2.0 / zoom);
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
508
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
509 double x, y;
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
510 x = dx;
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
511 y = dy;
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
512 ApplyTransform(x, y, transform_);
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
513 cairo_move_to(cr, x, y);
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
514
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
515 x = dx + dwidth;
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
516 y = dy;
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
517 ApplyTransform(x, y, transform_);
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
518 cairo_line_to(cr, x, y);
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
519
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
520 x = dx + dwidth;
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
521 y = dy + dheight;
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
522 ApplyTransform(x, y, transform_);
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
523 cairo_line_to(cr, x, y);
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
524
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
525 x = dx;
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
526 y = dy + dheight;
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
527 ApplyTransform(x, y, transform_);
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
528 cairo_line_to(cr, x, y);
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
529
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
530 x = dx;
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
531 y = dy;
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
532 ApplyTransform(x, y, transform_);
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
533 cairo_line_to(cr, x, y);
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
534
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
535 cairo_stroke(cr);
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
536 }
350
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
537
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
538
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
539 static double Square(double x)
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
540 {
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
541 return x * x;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
542 }
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
543
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
544
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
545 void GetCorner(double& x /* out */,
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
546 double& y /* out */,
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
547 Corner corner) const
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
548 {
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
549 unsigned int cropX, cropY, cropWidth, cropHeight;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
550 GetCrop(cropX, cropY, cropWidth, cropHeight);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
551 GetCornerInternal(x, y, corner, cropX, cropY, cropWidth, cropHeight);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
552 }
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
553
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
554
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
555 bool LookupCorner(Corner& corner /* out */,
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
556 double x,
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
557 double y,
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
558 double zoom,
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
559 double viewportDistance) const
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
560 {
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
561 static const Corner CORNERS[] = {
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
562 Corner_TopLeft,
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
563 Corner_TopRight,
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
564 Corner_BottomLeft,
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
565 Corner_BottomRight
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
566 };
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
567
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
568 unsigned int cropX, cropY, cropWidth, cropHeight;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
569 GetCrop(cropX, cropY, cropWidth, cropHeight);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
570
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
571 double threshold = Square(viewportDistance / zoom);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
572
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
573 for (size_t i = 0; i < 4; i++)
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
574 {
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
575 double cx, cy;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
576 GetCornerInternal(cx, cy, CORNERS[i], cropX, cropY, cropWidth, cropHeight);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
577
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
578 double d = Square(cx - x) + Square(cy - y);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
579
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
580 if (d <= threshold)
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
581 {
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
582 corner = CORNERS[i];
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
583 return true;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
584 }
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
585 }
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
586
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
587 return false;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
588 }
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
589 };
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
590
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
591
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
592 class BitmapAccessor : public boost::noncopyable
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
593 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
594 private:
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
595 size_t index_;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
596 Bitmap* bitmap_;
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
597
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
598 public:
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
599 BitmapAccessor(BitmapStack& stack,
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
600 size_t index) :
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
601 index_(index)
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
602 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
603 Bitmaps::iterator bitmap = stack.bitmaps_.find(index);
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
604 if (bitmap == stack.bitmaps_.end())
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
605 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
606 bitmap_ = NULL;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
607 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
608 else
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
609 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
610 assert(bitmap->second != NULL);
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
611 bitmap_ = bitmap->second;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
612 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
613 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
614
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
615 BitmapAccessor(BitmapStack& stack,
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
616 double x,
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
617 double y) :
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
618 index_(0) // Dummy initialization
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
619 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
620 if (stack.LookupBitmap(index_, x, y))
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
621 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
622 Bitmaps::iterator bitmap = stack.bitmaps_.find(index_);
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
623
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
624 if (bitmap == stack.bitmaps_.end())
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
625 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
626 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
627 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
628 else
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
629 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
630 assert(bitmap->second != NULL);
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
631 bitmap_ = bitmap->second;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
632 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
633 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
634 else
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
635 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
636 bitmap_ = NULL;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
637 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
638 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
639
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
640 void Invalidate()
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
641 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
642 bitmap_ = NULL;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
643 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
644
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
645 bool IsValid() const
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
646 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
647 return bitmap_ != NULL;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
648 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
649
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
650 size_t GetIndex() const
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
651 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
652 if (IsValid())
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
653 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
654 return index_;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
655 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
656 else
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
657 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
658 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
659 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
660 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
661
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
662 Bitmap& GetBitmap() const
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
663 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
664 if (IsValid())
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
665 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
666 return *bitmap_;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
667 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
668 else
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
669 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
670 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
671 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
672 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
673 };
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
674
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
675
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
676 private:
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
677 class DicomBitmap : public Bitmap
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
678 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
679 private:
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
680 std::auto_ptr<Orthanc::ImageAccessor> source_; // Content of PixelData
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
681 std::auto_ptr<DicomFrameConverter> converter_;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
682 std::auto_ptr<Orthanc::ImageAccessor> converted_; // Float32 or RGB24
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
683
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
684
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
685 void ApplyConverter()
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
686 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
687 if (source_.get() != NULL &&
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
688 converter_.get() != NULL)
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
689 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
690 converted_.reset(converter_->ConvertFrame(*source_));
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
691 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
692 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
693
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
694 public:
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
695 static OrthancPlugins::DicomTag ConvertTag(const Orthanc::DicomTag& tag)
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
696 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
697 return OrthancPlugins::DicomTag(tag.GetGroup(), tag.GetElement());
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
698 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
699
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
700 void SetDicomTags(const OrthancPlugins::FullOrthancDataset& dataset)
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
701 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
702 converter_.reset(new DicomFrameConverter);
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
703 converter_->ReadParameters(dataset);
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
704 ApplyConverter();
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
705
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
706 std::string tmp;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
707 Vector pixelSpacing;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
708
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
709 if (dataset.GetStringValue(tmp, ConvertTag(Orthanc::DICOM_TAG_PIXEL_SPACING)) &&
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
710 LinearAlgebra::ParseVector(pixelSpacing, tmp) &&
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
711 pixelSpacing.size() == 2)
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
712 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
713 SetPixelSpacing(pixelSpacing[0], pixelSpacing[1]);
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
714 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
715
348
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
716 //SetPan(-0.5 * GetPixelSpacingX(), -0.5 * GetPixelSpacingY());
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
717
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
718 static unsigned int c = 0;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
719 if (c == 0)
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
720 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
721 SetPan(400, 0);
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
722 c ++;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
723 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
724
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
725 OrthancPlugins::DicomDatasetReader reader(dataset);
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
726
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
727 unsigned int width, height;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
728 if (!reader.GetUnsignedIntegerValue(width, ConvertTag(Orthanc::DICOM_TAG_COLUMNS)) ||
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
729 !reader.GetUnsignedIntegerValue(height, ConvertTag(Orthanc::DICOM_TAG_ROWS)))
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
730 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
731 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
732 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
733 else
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
734 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
735 SetSize(width, height);
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
736 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
737 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
738
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
739
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
740 void SetSourceImage(Orthanc::ImageAccessor* image) // Takes ownership
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
741 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
742 std::auto_ptr<Orthanc::ImageAccessor> raii(image);
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
743
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
744 if (image == NULL)
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
745 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
746 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
747 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
748
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
749 SetSize(image->GetWidth(), image->GetHeight());
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
750
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
751 source_ = raii;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
752 ApplyConverter();
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
753 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
754
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
755
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
756 virtual void Render(Orthanc::ImageAccessor& buffer,
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
757 const ViewportGeometry& view,
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
758 ImageInterpolation interpolation) const
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
759 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
760 if (converted_.get() != NULL)
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
761 {
351
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
762 if (converted_->GetFormat() != Orthanc::PixelFormat_Float32)
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
763 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
764 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
765 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
766
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
767 unsigned int cropX, cropY, cropWidth, cropHeight;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
768 GetCrop(cropX, cropY, cropWidth, cropHeight);
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
769
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
770 Matrix m = LinearAlgebra::Product(view.GetMatrix(),
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
771 GetTransform(),
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
772 CreateOffsetMatrix(cropX, cropY));
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
773
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
774 Orthanc::ImageAccessor cropped;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
775 converted_->GetRegion(cropped, cropX, cropY, cropWidth, cropHeight);
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
776
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
777 ApplyProjectiveTransform(buffer, cropped, m, interpolation, false);
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
778 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
779 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
780
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
781
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
782 virtual bool GetDefaultWindowing(float& center,
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
783 float& width) const
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
784 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
785 if (converter_.get() != NULL &&
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
786 converter_->HasDefaultWindow())
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
787 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
788 center = static_cast<float>(converter_->GetDefaultWindowCenter());
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
789 width = static_cast<float>(converter_->GetDefaultWindowWidth());
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
790 return true;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
791 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
792 else
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
793 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
794 return false;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
795 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
796 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
797 };
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
798
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
799
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
800
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
801
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
802 class AlphaBitmap : public Bitmap
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
803 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
804 private:
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
805 const BitmapStack& stack_;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
806 std::auto_ptr<Orthanc::ImageAccessor> alpha_; // Grayscale8
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
807 bool useWindowing_;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
808 float foreground_;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
809
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
810 public:
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
811 AlphaBitmap(const BitmapStack& stack) :
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
812 stack_(stack),
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
813 useWindowing_(true),
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
814 foreground_(0)
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
815 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
816 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
817
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
818
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
819 void SetForegroundValue(float foreground)
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
820 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
821 useWindowing_ = false;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
822 foreground_ = foreground;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
823 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
824
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
825
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
826 void SetAlpha(Orthanc::ImageAccessor* image)
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
827 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
828 std::auto_ptr<Orthanc::ImageAccessor> raii(image);
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
829
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
830 if (image == NULL)
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
831 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
832 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
833 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
834
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
835 if (image->GetFormat() != Orthanc::PixelFormat_Grayscale8)
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
836 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
837 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat);
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
838 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
839
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
840 SetSize(image->GetWidth(), image->GetHeight());
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
841 alpha_ = raii;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
842 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
843
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
844
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
845 void LoadText(const Orthanc::Font& font,
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
846 const std::string& utf8)
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
847 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
848 SetAlpha(font.RenderAlpha(utf8));
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
849 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
850
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
851
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
852 virtual void Render(Orthanc::ImageAccessor& buffer,
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
853 const ViewportGeometry& view,
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
854 ImageInterpolation interpolation) const
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
855 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
856 if (buffer.GetFormat() != Orthanc::PixelFormat_Float32)
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
857 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
858 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat);
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
859 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
860
348
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
861 unsigned int cropX, cropY, cropWidth, cropHeight;
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
862 GetCrop(cropX, cropY, cropWidth, cropHeight);
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
863
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
864 Matrix m = LinearAlgebra::Product(view.GetMatrix(),
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
865 GetTransform(),
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
866 CreateOffsetMatrix(cropX, cropY));
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
867
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
868 Orthanc::ImageAccessor cropped;
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
869 alpha_->GetRegion(cropped, cropX, cropY, cropWidth, cropHeight);
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
870
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
871 Orthanc::Image tmp(Orthanc::PixelFormat_Grayscale8, buffer.GetWidth(), buffer.GetHeight(), false);
348
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
872 ApplyProjectiveTransform(tmp, cropped, m, interpolation, true /* clear */);
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
873
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
874 // Blit
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
875 const unsigned int width = buffer.GetWidth();
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
876 const unsigned int height = buffer.GetHeight();
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
877
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
878 float value = foreground_;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
879
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
880 if (useWindowing_)
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
881 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
882 float center, width;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
883 if (stack_.GetWindowing(center, width))
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
884 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
885 value = center + width / 2.0f;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
886 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
887 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
888
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
889 for (unsigned int y = 0; y < height; y++)
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
890 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
891 float *q = reinterpret_cast<float*>(buffer.GetRow(y));
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
892 const uint8_t *p = reinterpret_cast<uint8_t*>(tmp.GetRow(y));
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
893
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
894 for (unsigned int x = 0; x < width; x++, p++, q++)
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
895 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
896 float a = static_cast<float>(*p) / 255.0f;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
897
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
898 *q = (a * value + (1.0f - a) * (*q));
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
899 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
900 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
901 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
902 };
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
903
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
904
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
905
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
906 typedef std::map<size_t, Bitmap*> Bitmaps;
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
907
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
908 OrthancApiClient& orthanc_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
909 size_t countBitmaps_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
910 bool hasWindowing_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
911 float windowingCenter_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
912 float windowingWidth_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
913 Bitmaps bitmaps_;
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
914 bool hasSelection_;
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
915 size_t selectedBitmap_;
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
916
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
917 public:
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
918 BitmapStack(MessageBroker& broker,
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
919 OrthancApiClient& orthanc) :
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
920 IObserver(broker),
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
921 IObservable(broker),
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
922 orthanc_(orthanc),
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
923 countBitmaps_(0),
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
924 hasWindowing_(false),
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
925 windowingCenter_(0), // Dummy initialization
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
926 windowingWidth_(0), // Dummy initialization
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
927 hasSelection_(false),
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
928 selectedBitmap_(0) // Dummy initialization
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
929 {
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
930 }
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
931
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
932
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
933 void Unselect()
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
934 {
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
935 hasSelection_ = false;
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
936 }
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
937
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
938
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
939 void Select(size_t bitmap)
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
940 {
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
941 hasSelection_ = true;
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
942 selectedBitmap_ = bitmap;
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
943 }
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
944
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
945
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
946 bool GetSelectedBitmap(size_t& bitmap) const
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
947 {
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
948 if (hasSelection_)
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
949 {
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
950 bitmap = selectedBitmap_;
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
951 return true;
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
952 }
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
953 else
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
954 {
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
955 return false;
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
956 }
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
957 }
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
958
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
959
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
960 virtual ~BitmapStack()
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
961 {
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
962 for (Bitmaps::iterator it = bitmaps_.begin(); it != bitmaps_.end(); it++)
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
963 {
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
964 assert(it->second != NULL);
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
965 delete it->second;
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
966 }
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
967 }
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
968
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
969
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
970 bool GetWindowing(float& center,
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
971 float& width) const
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
972 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
973 if (hasWindowing_)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
974 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
975 center = windowingCenter_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
976 width = windowingWidth_;
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
977 return true;
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
978 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
979 else
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
980 {
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
981 return false;
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
982 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
983 }
350
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
984
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
985
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
986 void SetWindowing(float center,
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
987 float width)
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
988
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
989 {
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
990 hasWindowing_ = true;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
991 windowingCenter_ = center;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
992 windowingWidth_ = width;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
993
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
994 EmitMessage(ContentChangedMessage(*this));
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
995 }
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
996
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
997
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
998 size_t LoadText(const Orthanc::Font& font,
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
999 const std::string& utf8,
348
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1000 float foreground)
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1001 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1002 std::auto_ptr<AlphaBitmap> alpha(new AlphaBitmap(*this));
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1003 alpha->LoadText(font, utf8);
350
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1004 //alpha->SetForegroundValue(foreground);
348
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1005
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1006 size_t bitmap = countBitmaps_++;
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1007
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1008 bitmaps_[bitmap] = alpha.release();
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1009
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1010 return bitmap;
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1011 }
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1012
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1013
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1014 size_t LoadTestBlock(unsigned int width,
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1015 unsigned int height,
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1016 float foreground)
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1017 {
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1018 std::auto_ptr<AlphaBitmap> alpha(new AlphaBitmap(*this));
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1019
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1020 std::auto_ptr<Orthanc::Image> block(new Orthanc::Image(Orthanc::PixelFormat_Grayscale8, width, height, false));
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1021
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1022 for (unsigned int padding = 0;
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1023 (width > 2 * padding) && (height > 2 * padding);
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1024 padding++)
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1025 {
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1026 uint8_t color;
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1027 if (255 > 10 * padding)
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1028 {
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1029 color = 255 - 10 * padding;
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1030 }
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1031 else
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1032 {
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1033 color = 0;
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1034 }
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1035
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1036 Orthanc::ImageAccessor region;
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1037 block->GetRegion(region, padding, padding, width - 2 * padding, height - 2 * padding);
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1038 Orthanc::ImageProcessing::Set(region, color);
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1039 }
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1040
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1041 alpha->SetAlpha(block.release());
350
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1042 //alpha->SetForegroundValue(foreground);
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1043
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1044 size_t bitmap = countBitmaps_++;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1045
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1046 bitmaps_[bitmap] = alpha.release();
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1047
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1048 return bitmap;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1049 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1050
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1051
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1052 size_t LoadFrame(const std::string& instance,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1053 unsigned int frame,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1054 bool httpCompression)
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1055 {
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1056 size_t bitmap = countBitmaps_++;
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1057
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1058 bitmaps_[bitmap] = new DicomBitmap;
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1059
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1060
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1061 {
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1062 IWebService::Headers headers;
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1063 std::string uri = "/instances/" + instance + "/tags";
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1064 orthanc_.GetBinaryAsync(uri, headers,
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1065 new Callable<BitmapStack, OrthancApiClient::BinaryResponseReadyMessage>
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1066 (*this, &BitmapStack::OnTagsReceived), NULL,
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1067 new Orthanc::SingleValueObject<size_t>(bitmap));
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1068 }
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1069
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1070 {
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1071 IWebService::Headers headers;
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1072 headers["Accept"] = "image/x-portable-arbitrarymap";
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1073
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1074 if (httpCompression)
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1075 {
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1076 headers["Accept-Encoding"] = "gzip";
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1077 }
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1078
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1079 std::string uri = "/instances/" + instance + "/frames/" + boost::lexical_cast<std::string>(frame) + "/image-uint16";
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1080 orthanc_.GetBinaryAsync(uri, headers,
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1081 new Callable<BitmapStack, OrthancApiClient::BinaryResponseReadyMessage>
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1082 (*this, &BitmapStack::OnFrameReceived), NULL,
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1083 new Orthanc::SingleValueObject<size_t>(bitmap));
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1084 }
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1085
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1086 return bitmap;
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1087 }
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1088
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1089
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1090 void OnTagsReceived(const OrthancApiClient::BinaryResponseReadyMessage& message)
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1091 {
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1092 size_t index = dynamic_cast<Orthanc::SingleValueObject<size_t>*>(message.Payload.get())->GetValue();
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1093
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1094 printf("JSON received: [%s] (%ld bytes) for bitmap %ld\n",
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1095 message.Uri.c_str(), message.AnswerSize, index);
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1096
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1097 Bitmaps::iterator bitmap = bitmaps_.find(index);
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1098 if (bitmap != bitmaps_.end())
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1099 {
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1100 assert(bitmap->second != NULL);
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1101
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1102 OrthancPlugins::FullOrthancDataset dicom(message.Answer, message.AnswerSize);
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1103 dynamic_cast<DicomBitmap*>(bitmap->second)->SetDicomTags(dicom);
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1104
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1105 float c, w;
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1106 if (!hasWindowing_ &&
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1107 bitmap->second->GetDefaultWindowing(c, w))
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1108 {
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1109 hasWindowing_ = true;
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1110 windowingCenter_ = c;
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1111 windowingWidth_ = w;
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1112 }
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1113
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1114 EmitMessage(GeometryChangedMessage(*this));
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1115 }
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1116 }
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1117
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1118
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1119 void OnFrameReceived(const OrthancApiClient::BinaryResponseReadyMessage& message)
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1120 {
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1121 size_t index = dynamic_cast<Orthanc::SingleValueObject<size_t>*>(message.Payload.get())->GetValue();
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1122
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1123 printf("Frame received: [%s] (%ld bytes) for bitmap %ld\n",
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1124 message.Uri.c_str(), message.AnswerSize, index);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1125
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1126 Bitmaps::iterator bitmap = bitmaps_.find(index);
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1127 if (bitmap != bitmaps_.end())
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1128 {
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1129 assert(bitmap->second != NULL);
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1130
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1131 std::string content;
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1132 if (message.AnswerSize > 0)
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1133 {
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1134 content.assign(reinterpret_cast<const char*>(message.Answer), message.AnswerSize);
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1135 }
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1136
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1137 std::auto_ptr<Orthanc::PamReader> reader(new Orthanc::PamReader);
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1138 reader->ReadFromMemory(content);
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1139 dynamic_cast<DicomBitmap*>(bitmap->second)->SetSourceImage(reader.release());
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1140
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1141 EmitMessage(ContentChangedMessage(*this));
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1142 }
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1143 }
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1144
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1145
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1146 Extent2D GetSceneExtent() const
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1147 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1148 Extent2D extent;
340
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1149
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1150 for (Bitmaps::const_iterator it = bitmaps_.begin();
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1151 it != bitmaps_.end(); ++it)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1152 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1153 assert(it->second != NULL);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1154 extent.Union(it->second->GetExtent());
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1155 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1156
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1157 return extent;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1158 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1159
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1160
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1161 void Render(Orthanc::ImageAccessor& buffer,
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1162 const ViewportGeometry& view,
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1163 ImageInterpolation interpolation) const
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1164 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1165 Orthanc::ImageProcessing::Set(buffer, 0);
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1166
344
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1167 // Render layers in the background-to-foreground order
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1168 for (size_t index = 0; index < countBitmaps_; index++)
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1169 {
344
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1170 Bitmaps::const_iterator it = bitmaps_.find(index);
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1171 if (it != bitmaps_.end())
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1172 {
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1173 assert(it->second != NULL);
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1174 it->second->Render(buffer, view, interpolation);
344
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1175 }
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1176 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1177 }
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1178
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1179
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1180 bool LookupBitmap(size_t& index /* out */,
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1181 double x,
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1182 double y) const
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1183 {
344
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1184 // Render layers in the foreground-to-background order
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1185 for (size_t i = countBitmaps_; i > 0; i--)
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1186 {
344
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1187 index = i - 1;
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1188 Bitmaps::const_iterator it = bitmaps_.find(index);
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1189 if (it != bitmaps_.end())
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1190 {
344
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1191 assert(it->second != NULL);
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1192 if (it->second->Contains(x, y))
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1193 {
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1194 return true;
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1195 }
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1196 }
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1197 }
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1198
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1199 return false;
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1200 }
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1201
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1202 void DrawControls(CairoSurface& surface,
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1203 const ViewportGeometry& view)
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1204 {
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1205 if (hasSelection_)
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1206 {
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1207 Bitmaps::const_iterator bitmap = bitmaps_.find(selectedBitmap_);
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1208
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1209 if (bitmap != bitmaps_.end())
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1210 {
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1211 CairoContext context(surface);
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1212
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1213 context.SetSourceColor(255, 0, 0);
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1214 view.ApplyTransform(context);
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1215 bitmap->second->DrawBorders(context, view.GetZoom());
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1216 }
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1217 }
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1218 }
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1219 };
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1220
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1221
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1222 class BitmapStackInteractor : public IWorldSceneInteractor
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1223 {
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1224 private:
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1225 enum Tool
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1226 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1227 Tool_Move,
350
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1228 Tool_Rotate,
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1229 Tool_Crop
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1230 };
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1231
351
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1232 static double GetHandleSize()
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1233 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1234 return 10.0;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1235 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1236
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1237
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1238 BitmapStack& stack_;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1239 Tool tool_;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1240
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1241
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1242 class RotateBitmapTracker : public IWorldSceneMouseTracker
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1243 {
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1244 private:
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1245 BitmapStack::BitmapAccessor accessor_;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1246 double centerX_;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1247 double centerY_;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1248 double originalAngle_;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1249 double clickAngle_;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1250 bool roundAngles_;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1251
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1252 bool ComputeAngle(double& angle /* out */,
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1253 double sceneX,
348
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1254 double sceneY) const
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1255 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1256 Vector u;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1257 LinearAlgebra::AssignVector(u, sceneX - centerX_, sceneY - centerY_);
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1258
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1259 double nu = boost::numeric::ublas::norm_2(u);
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1260
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1261 if (!LinearAlgebra::IsCloseToZero(nu))
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1262 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1263 u /= nu;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1264 angle = atan2(u[1], u[0]);
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1265 return true;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1266 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1267 else
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1268 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1269 return false;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1270 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1271 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1272
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1273
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1274 public:
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1275 RotateBitmapTracker(BitmapStack& stack,
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1276 const ViewportGeometry& view,
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1277 size_t bitmap,
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1278 double x,
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1279 double y,
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1280 bool roundAngles) :
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1281 accessor_(stack, bitmap),
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1282 roundAngles_(roundAngles)
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1283 {
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1284 if (accessor_.IsValid())
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1285 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1286 accessor_.GetBitmap().GetCenter(centerX_, centerY_);
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1287 originalAngle_ = accessor_.GetBitmap().GetAngle();
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1288
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1289 double sceneX, sceneY;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1290 view.MapDisplayToScene(sceneX, sceneY, x, y);
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1291
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1292 if (!ComputeAngle(clickAngle_, x, y))
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1293 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1294 accessor_.Invalidate();
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1295 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1296 }
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1297 }
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1298
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1299 virtual bool HasRender() const
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1300 {
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1301 return false;
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1302 }
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1303
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1304 virtual void Render(CairoContext& context,
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1305 double zoom)
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1306 {
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1307 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1308 }
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1309
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1310 virtual void MouseUp()
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1311 {
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1312 }
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1313
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1314 virtual void MouseMove(int displayX,
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1315 int displayY,
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1316 double sceneX,
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1317 double sceneY)
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1318 {
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1319 static const double ROUND_ANGLE = 15.0 / 180.0 * boost::math::constants::pi<double>();
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1320
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1321 double angle;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1322
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1323 if (accessor_.IsValid() &&
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1324 ComputeAngle(angle, sceneX, sceneY))
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1325 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1326 angle = angle - clickAngle_ + originalAngle_;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1327
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1328 if (roundAngles_)
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1329 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1330 angle = round(angle / ROUND_ANGLE) * ROUND_ANGLE;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1331 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1332
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1333 accessor_.GetBitmap().SetAngle(angle);
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1334 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1335 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1336 };
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1337
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1338
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1339 class MoveBitmapTracker : public IWorldSceneMouseTracker
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1340 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1341 private:
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1342 BitmapStack::BitmapAccessor accessor_;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1343 double clickX_;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1344 double clickY_;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1345 double panX_;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1346 double panY_;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1347 bool oneAxis_;
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1348
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1349 public:
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1350 MoveBitmapTracker(BitmapStack& stack,
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1351 size_t bitmap,
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1352 double x,
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1353 double y,
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1354 bool oneAxis) :
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1355 accessor_(stack, bitmap),
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1356 clickX_(x),
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1357 clickY_(y),
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1358 oneAxis_(oneAxis)
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1359 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1360 if (accessor_.IsValid())
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1361 {
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1362 panX_ = accessor_.GetBitmap().GetPanX();
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1363 panY_ = accessor_.GetBitmap().GetPanY();
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1364 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1365 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1366
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1367 virtual bool HasRender() const
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1368 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1369 return false;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1370 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1371
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1372 virtual void Render(CairoContext& context,
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1373 double zoom)
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1374 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1375 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1376 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1377
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1378 virtual void MouseUp()
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1379 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1380 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1381
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1382 virtual void MouseMove(int displayX,
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1383 int displayY,
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1384 double sceneX,
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1385 double sceneY)
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1386 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1387 if (accessor_.IsValid())
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1388 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1389 double dx = sceneX - clickX_;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1390 double dy = sceneY - clickY_;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1391
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1392 if (oneAxis_)
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1393 {
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1394 if (fabs(dx) > fabs(dy))
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1395 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1396 accessor_.GetBitmap().SetPan(dx + panX_, panY_);
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1397 }
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1398 else
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1399 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1400 accessor_.GetBitmap().SetPan(panX_, dy + panY_);
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1401 }
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1402 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1403 else
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1404 {
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1405 accessor_.GetBitmap().SetPan(dx + panX_, dy + panY_);
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1406 }
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1407 }
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1408 }
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1409 };
351
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1410
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1411
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1412 class CornerBitmapTracker : public IWorldSceneMouseTracker
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1413 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1414 private:
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1415 BitmapStack::BitmapAccessor accessor_;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1416 BitmapStack::Corner corner_;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1417 unsigned int cropX_;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1418 unsigned int cropY_;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1419 unsigned int cropWidth_;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1420 unsigned int cropHeight_;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1421
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1422 public:
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1423 CornerBitmapTracker(BitmapStack& stack,
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1424 const ViewportGeometry& view,
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1425 size_t bitmap,
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1426 double x,
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1427 double y,
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1428 BitmapStack::Corner corner) :
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1429 accessor_(stack, bitmap),
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1430 corner_(corner)
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1431 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1432 if (accessor_.IsValid())
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1433 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1434 accessor_.GetBitmap().GetCrop(cropX_, cropY_, cropWidth_, cropHeight_);
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1435 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1436 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1437
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1438 virtual bool HasRender() const
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1439 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1440 return false;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1441 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1442
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1443 virtual void Render(CairoContext& context,
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1444 double zoom)
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1445 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1446 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1447 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1448
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1449 virtual void MouseUp()
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1450 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1451 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1452
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1453 virtual void MouseMove(int displayX,
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1454 int displayY,
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1455 double sceneX,
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1456 double sceneY)
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1457 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1458 unsigned int x, y;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1459
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1460 if (accessor_.IsValid())
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1461 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1462 BitmapStack::Bitmap& bitmap = accessor_.GetBitmap();
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1463 if (bitmap.GetPixel(x, y, sceneX, sceneY))
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1464 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1465 unsigned int targetX, targetWidth;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1466
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1467 if (corner_ == BitmapStack::Corner_TopLeft ||
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1468 corner_ == BitmapStack::Corner_BottomLeft)
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1469 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1470 targetX = std::min(x, cropX_ + cropWidth_);
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1471 targetWidth = cropX_ + cropWidth_ - targetX;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1472 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1473 else
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1474 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1475 targetX = cropX_;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1476 targetWidth = std::max(x, cropX_) - cropX_;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1477 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1478
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1479 unsigned int targetY, targetHeight;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1480
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1481 if (corner_ == BitmapStack::Corner_TopLeft ||
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1482 corner_ == BitmapStack::Corner_TopRight)
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1483 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1484 targetY = std::min(y, cropY_ + cropHeight_);
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1485 targetHeight = cropY_ + cropHeight_ - targetY;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1486 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1487 else
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1488 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1489 targetY = cropY_;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1490 targetHeight = std::max(y, cropY_) - cropY_;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1491 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1492
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1493 bitmap.SetCrop(targetX, targetY, targetWidth, targetHeight);
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1494 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1495 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1496 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1497 };
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1498
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1499
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1500 public:
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1501 BitmapStackInteractor(BitmapStack& stack) :
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1502 stack_(stack),
351
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1503 //tool_(Tool_Move)
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1504 tool_(Tool_Crop)
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1505 {
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1506 }
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1507
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1508 virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1509 const ViewportGeometry& view,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1510 MouseButton button,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1511 KeyboardModifiers modifiers,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1512 double x,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1513 double y,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1514 IStatusBar* statusBar)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1515 {
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1516 if (button == MouseButton_Left)
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1517 {
351
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1518 size_t selected;
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
1519
351
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1520 if (!stack_.GetSelectedBitmap(selected))
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1521 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1522 size_t bitmap;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1523 if (stack_.LookupBitmap(bitmap, x, y))
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1524 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1525 printf("CLICK on bitmap %ld\n", bitmap);
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1526 stack_.Select(bitmap);
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1527 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1528
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1529 return NULL;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1530 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1531 else if (tool_ == Tool_Crop)
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1532 {
351
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1533 BitmapStack::BitmapAccessor accessor(stack_, selected);
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1534 BitmapStack::Corner corner;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1535 if (accessor.GetBitmap().LookupCorner(corner, x, y, view.GetZoom(), GetHandleSize()))
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1536 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1537 return new CornerBitmapTracker(stack_, view, selected, x, y, corner);
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1538 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1539 else
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1540 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1541 size_t bitmap;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1542
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1543 if (!stack_.LookupBitmap(bitmap, x, y) ||
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1544 bitmap != selected)
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1545 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1546 stack_.Unselect();
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1547 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1548
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1549 return NULL;
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1550 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1551 }
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1552 else
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1553 {
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1554 size_t bitmap;
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
1555
351
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1556 if (stack_.LookupBitmap(bitmap, x, y) &&
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
1557 bitmap == selected)
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
1558 {
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1559 switch (tool_)
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1560 {
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1561 case Tool_Move:
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1562 return new MoveBitmapTracker(stack_, bitmap, x, y,
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1563 (modifiers & KeyboardModifiers_Shift));
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1564
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1565 case Tool_Rotate:
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1566 return new RotateBitmapTracker(stack_, view, bitmap, x, y,
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1567 (modifiers & KeyboardModifiers_Shift));
351
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1568
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1569 default:
351
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1570 break;
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1571 }
351
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1572
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1573 return NULL;
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
1574 }
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
1575 else
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
1576 {
351
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1577 printf("CLICK outside\n");
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1578 stack_.Unselect();
346
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
1579 return NULL;
c2e040ea8fbe rotation transform
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 345
diff changeset
1580 }
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1581 }
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1582 }
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1583 else
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1584 {
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1585 return NULL;
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1586 }
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1587 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1588
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1589 virtual void MouseOver(CairoContext& context,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1590 WorldSceneWidget& widget,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1591 const ViewportGeometry& view,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1592 double x,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1593 double y,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1594 IStatusBar* statusBar)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1595 {
350
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1596 size_t selected;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1597 if (stack_.GetSelectedBitmap(selected) &&
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1598 tool_ == Tool_Crop)
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1599 {
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1600 BitmapStack::BitmapAccessor accessor(stack_, selected);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1601
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1602 BitmapStack::Corner corner;
351
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1603 if (accessor.GetBitmap().LookupCorner(corner, x, y, view.GetZoom(), GetHandleSize()))
350
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1604 {
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1605 accessor.GetBitmap().GetCorner(x, y, corner);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1606
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1607 double z = 1.0 / view.GetZoom();
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1608
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1609 context.SetSourceColor(255, 0, 0);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1610 cairo_t* cr = context.GetObject();
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1611 cairo_set_line_width(cr, 2.0 * z);
351
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1612 cairo_move_to(cr, x - GetHandleSize() * z, y - GetHandleSize() * z);
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1613 cairo_line_to(cr, x + GetHandleSize() * z, y - GetHandleSize() * z);
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1614 cairo_line_to(cr, x + GetHandleSize() * z, y + GetHandleSize() * z);
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1615 cairo_line_to(cr, x - GetHandleSize() * z, y + GetHandleSize() * z);
da25d2423314 CornerBitmapTracker to crop images
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 350
diff changeset
1616 cairo_line_to(cr, x - GetHandleSize() * z, y - GetHandleSize() * z);
350
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1617 cairo_stroke(cr);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1618 }
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1619 }
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1620 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1621
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1622 virtual void MouseWheel(WorldSceneWidget& widget,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1623 MouseWheelDirection direction,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1624 KeyboardModifiers modifiers,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1625 IStatusBar* statusBar)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1626 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1627 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1628
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1629 virtual void KeyPressed(WorldSceneWidget& widget,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1630 KeyboardKeys key,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1631 char keyChar,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1632 KeyboardModifiers modifiers,
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1633 IStatusBar* statusBar)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1634 {
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1635 switch (keyChar)
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1636 {
350
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1637 case 'c':
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1638 tool_ = Tool_Crop;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1639 break;
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1640
347
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1641 case 's':
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1642 widget.FitContent();
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1643 break;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1644
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1645 case 'm':
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1646 tool_ = Tool_Move;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1647 break;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1648
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1649 case 'r':
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1650 tool_ = Tool_Rotate;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1651 break;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1652
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1653 default:
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1654 break;
cd65103c9172 RotateBitmapTracker
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 346
diff changeset
1655 }
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1656 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1657 };
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1658
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1659
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1660
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1661 class BitmapStackWidget :
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1662 public WorldSceneWidget,
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1663 public IObservable,
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1664 public IObserver
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1665 {
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1666 private:
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1667 BitmapStack& stack_;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1668 BitmapStackInteractor myInteractor_;
337
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 336
diff changeset
1669
336
c7fdc8bac581 creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
1670 protected:
c7fdc8bac581 creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
1671 virtual Extent2D GetSceneExtent()
c7fdc8bac581 creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
1672 {
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1673 return stack_.GetSceneExtent();
336
c7fdc8bac581 creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
1674 }
c7fdc8bac581 creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
1675
c7fdc8bac581 creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
1676 virtual bool RenderScene(CairoContext& context,
c7fdc8bac581 creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
1677 const ViewportGeometry& view)
c7fdc8bac581 creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
1678 {
340
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1679 // "Render()" has been replaced
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1680 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1681 }
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1682
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1683 public:
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1684 BitmapStackWidget(MessageBroker& broker,
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1685 BitmapStack& stack,
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1686 const std::string& name) :
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1687 WorldSceneWidget(name),
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1688 IObservable(broker),
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1689 IObserver(broker),
342
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1690 stack_(stack),
4297d6c5eef9 moving bitmap
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 341
diff changeset
1691 myInteractor_(stack_)
340
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1692 {
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1693 stack.RegisterObserverCallback(new Callable<BitmapStackWidget, BitmapStack::GeometryChangedMessage>(*this, &BitmapStackWidget::OnGeometryChanged));
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1694 stack.RegisterObserverCallback(new Callable<BitmapStackWidget, BitmapStack::ContentChangedMessage>(*this, &BitmapStackWidget::OnContentChanged));
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1695
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1696 SetInteractor(myInteractor_);
340
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1697 }
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1698
340
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1699 void OnGeometryChanged(const BitmapStack::GeometryChangedMessage& message)
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1700 {
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1701 printf("Geometry has changed\n");
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1702 FitContent();
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1703 }
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1704
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1705 void OnContentChanged(const BitmapStack::ContentChangedMessage& message)
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1706 {
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1707 printf("Content has changed\n");
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1708 NotifyContentChanged();
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1709 }
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1710
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1711 virtual bool Render(Orthanc::ImageAccessor& target)
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1712 {
344
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1713 Orthanc::Image buffer(Orthanc::PixelFormat_Float32, target.GetWidth(),
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1714 target.GetHeight(), false);
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1715
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1716 // TODO => rendering quality
348
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1717 stack_.Render(buffer, GetView(), ImageInterpolation_Nearest);
dadee0f7f1b3 testing crop
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 347
diff changeset
1718 //stack_.Render(buffer, GetView(), ImageInterpolation_Bilinear);
340
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1719
344
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1720 // As in GrayscaleFrameRenderer => TODO MERGE?
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1721
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1722 float windowCenter, windowWidth;
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1723 if (!stack_.GetWindowing(windowCenter, windowWidth))
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1724 {
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1725 windowCenter = 128;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1726 windowWidth = 256;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1727 }
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1728
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1729 float x0 = windowCenter - windowWidth / 2.0f;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1730 float x1 = windowCenter + windowWidth / 2.0f;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1731
344
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1732 if (windowWidth >= 0.001f) // Avoid division by zero at (*)
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1733 {
344
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1734 const unsigned int width = target.GetWidth();
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1735 const unsigned int height = target.GetHeight();
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1736
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1737 for (unsigned int y = 0; y < height; y++)
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1738 {
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1739 const float* p = reinterpret_cast<const float*>(buffer.GetConstRow(y));
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1740 uint8_t* q = reinterpret_cast<uint8_t*>(target.GetRow(y));
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1741
344
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1742 for (unsigned int x = 0; x < width; x++, p++, q += 4)
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1743 {
344
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1744 uint8_t v = 0;
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1745 if (*p >= x1)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1746 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1747 v = 255;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1748 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1749 else if (*p <= x0)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1750 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1751 v = 0;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1752 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1753 else
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1754 {
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1755 // https://en.wikipedia.org/wiki/Linear_interpolation
344
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1756 v = static_cast<uint8_t>(255.0f * (*p - x0) / (x1 - x0)); // (*)
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1757 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1758
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1759 // TODO MONOCHROME1
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1760 /*if (invert_)
340
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1761 {
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1762 v = 255 - v;
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1763 }*/
344
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1764
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1765 q[0] = v;
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1766 q[1] = v;
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1767 q[2] = v;
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1768 q[3] = 255;
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1769 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1770 }
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1771 }
344
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1772 else
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1773 {
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1774 Orthanc::ImageProcessing::Set(target, 0, 0, 0, 255);
fdec8e6893cb ordering of bitmap layers
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 343
diff changeset
1775 }
339
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 338
diff changeset
1776
345
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1777 {
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1778 // TODO => REFACTOR
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1779 CairoSurface surface(target);
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1780 stack_.DrawControls(surface, GetView());
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1781 }
55438b1ca317 drawing borders
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 344
diff changeset
1782
337
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 336
diff changeset
1783 return true;
336
c7fdc8bac581 creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
1784 }
c7fdc8bac581 creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
1785
c7fdc8bac581 creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
1786 };
c7fdc8bac581 creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
1787
c7fdc8bac581 creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
1788
325
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1789 namespace Samples
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1790 {
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1791 class SingleFrameEditorApplication :
340
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1792 public SampleSingleCanvasApplicationBase,
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1793 public IObserver
325
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1794 {
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1795 enum Tools
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1796 {
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1797 Tools_Crop,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1798 Tools_Windowing,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1799 Tools_Zoom,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1800 Tools_Pan
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1801 };
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1802
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1803 enum Actions
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1804 {
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1805 Actions_Invert,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1806 Actions_RotateLeft,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1807 Actions_RotateRight
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1808 };
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1809
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1810 private:
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1811 class Interactor : public IWorldSceneInteractor
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1812 {
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1813 private:
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1814 SingleFrameEditorApplication& application_;
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1815
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1816 public:
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1817 Interactor(SingleFrameEditorApplication& application) :
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1818 application_(application)
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1819 {
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1820 }
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1821
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1822 virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1823 const ViewportGeometry& view,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1824 MouseButton button,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1825 KeyboardModifiers modifiers,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1826 double x,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1827 double y,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1828 IStatusBar* statusBar)
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1829 {
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1830 switch (application_.currentTool_) {
340
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1831 case Tools_Zoom:
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1832 printf("ZOOM\n");
329
b10dfdb96866 removing WorldSceneWidget::IWorldObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 327
diff changeset
1833
b10dfdb96866 removing WorldSceneWidget::IWorldObserver
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 327
diff changeset
1834 case Tools_Crop:
340
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1835 case Tools_Windowing:
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1836 case Tools_Pan:
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1837 // TODO return the right mouse tracker
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1838 return NULL;
325
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1839 }
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1840
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1841 return NULL;
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1842 }
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1843
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1844 virtual void MouseOver(CairoContext& context,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1845 WorldSceneWidget& widget,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1846 const ViewportGeometry& view,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1847 double x,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1848 double y,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1849 IStatusBar* statusBar)
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1850 {
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1851 if (statusBar != NULL)
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1852 {
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1853 char buf[64];
336
c7fdc8bac581 creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
1854 sprintf(buf, "X = %.02f Y = %.02f (in cm)", x / 10.0, y / 10.0);
c7fdc8bac581 creating GrayscaleBitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 334
diff changeset
1855 statusBar->SetMessage(buf);
325
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1856 }
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1857 }
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1858
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1859 virtual void MouseWheel(WorldSceneWidget& widget,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1860 MouseWheelDirection direction,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1861 KeyboardModifiers modifiers,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1862 IStatusBar* statusBar)
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1863 {
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1864 }
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1865
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1866 virtual void KeyPressed(WorldSceneWidget& widget,
327
8716176ff7f0 added support for arrow keys
am@osimis.io
parents: 326
diff changeset
1867 KeyboardKeys key,
8716176ff7f0 added support for arrow keys
am@osimis.io
parents: 326
diff changeset
1868 char keyChar,
325
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1869 KeyboardModifiers modifiers,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1870 IStatusBar* statusBar)
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1871 {
327
8716176ff7f0 added support for arrow keys
am@osimis.io
parents: 326
diff changeset
1872 switch (keyChar)
325
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1873 {
340
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1874 case 's':
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1875 widget.FitContent();
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1876 break;
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1877 case 'p':
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1878 application_.currentTool_ = Tools_Pan;
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1879 break;
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1880 case 'z':
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1881 application_.currentTool_ = Tools_Zoom;
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1882 break;
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1883 case 'c':
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1884 application_.currentTool_ = Tools_Crop;
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1885 break;
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1886 case 'w':
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1887 application_.currentTool_ = Tools_Windowing;
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1888 break;
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1889 case 'i':
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1890 application_.Invert();
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1891 break;
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1892 case 'r':
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1893 if (modifiers == KeyboardModifiers_None)
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1894 application_.Rotate(90);
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1895 else
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1896 application_.Rotate(-90);
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1897 break;
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1898 case 'e':
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1899 application_.Export();
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1900 break;
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1901 default:
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1902 break;
325
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1903 }
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1904 }
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1905 };
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1906
334
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
1907 std::auto_ptr<Interactor> mainWidgetInteractor_;
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
1908 std::auto_ptr<OrthancApiClient> orthancApiClient_;
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1909 std::auto_ptr<BitmapStack> stack_;
334
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
1910 Tools currentTool_;
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
1911 const OrthancFrameLayerSource* source_;
c34784e5f299 compatibility fixes
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 330
diff changeset
1912 unsigned int slice_;
325
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1913
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1914 public:
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1915 SingleFrameEditorApplication(MessageBroker& broker) :
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1916 IObserver(broker),
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1917 currentTool_(Tools_Zoom),
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1918 source_(NULL),
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1919 slice_(0)
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1920 {
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1921 }
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1922
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1923 virtual void DeclareStartupOptions(boost::program_options::options_description& options)
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1924 {
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1925 boost::program_options::options_description generic("Sample options");
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1926 generic.add_options()
340
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1927 ("instance", boost::program_options::value<std::string>(),
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1928 "Orthanc ID of the instance")
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1929 ("frame", boost::program_options::value<unsigned int>()->default_value(0),
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1930 "Number of the frame, for multi-frame DICOM instances")
f5d5814a41a0 rendering BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 339
diff changeset
1931 ;
325
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1932
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1933 options.add(generic);
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1934 }
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1935
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1936 virtual void Initialize(StoneApplicationContext* context,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1937 IStatusBar& statusBar,
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1938 const boost::program_options::variables_map& parameters)
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1939 {
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1940 using namespace OrthancStone;
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1941
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1942 context_ = context;
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1943
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1944 statusBar.SetMessage("Use the key \"s\" to reinitialize the layout, \"p\" to pan, \"z\" to zoom, \"c\" to crop, \"i\" to invert, \"w\" to change windowing, \"r\" to rotate cw, \"shift+r\" to rotate ccw");
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1945
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1946 if (parameters.count("instance") != 1)
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1947 {
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1948 LOG(ERROR) << "The instance ID is missing";
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1949 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1950 }
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1951
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1952 std::string instance = parameters["instance"].as<std::string>();
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1953 int frame = parameters["frame"].as<unsigned int>();
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1954
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1955 orthancApiClient_.reset(new OrthancApiClient(IObserver::broker_, context_->GetWebService()));
337
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 336
diff changeset
1956
343
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1957 Orthanc::FontRegistry fonts;
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1958 fonts.AddFromResource(Orthanc::EmbeddedResources::FONT_UBUNTU_MONO_BOLD_16);
712acc87fa2e text layer
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 342
diff changeset
1959
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1960 stack_.reset(new BitmapStack(IObserver::broker_, *orthancApiClient_));
350
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1961 stack_->LoadFrame(instance, frame, false);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1962 stack_->LoadFrame("61f3143e-96f34791-ad6bbb8d-62559e75-45943e1b", frame, false);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1963 stack_->LoadText(fonts.GetFont(0), "Hello\nworld\nBonjour, Alain", 256);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1964 stack_->LoadTestBlock(100, 50, 256);
337
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 336
diff changeset
1965
338
b3b3fa0e3689 BitmapStack
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 337
diff changeset
1966 mainWidget_ = new BitmapStackWidget(IObserver::broker_, *stack_, "main-widget");
325
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1967 mainWidget_->SetTransmitMouseOver(true);
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1968
350
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1969 //stack_->SetWindowing(128, 256);
c57e049ed079 drawing corners for cropping
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 348
diff changeset
1970
325
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1971 mainWidgetInteractor_.reset(new Interactor(*this));
341
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 340
diff changeset
1972 //mainWidget_->SetInteractor(*mainWidgetInteractor_);
325
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1973 }
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1974
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1975
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1976 void Invert()
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1977 {
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1978 // TODO
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1979 }
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1980
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1981 void Rotate(int degrees)
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1982 {
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1983 // TODO
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1984 }
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1985
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1986 void Export()
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1987 {
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1988 // TODO: export dicom file to a temporary file
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1989 }
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1990 };
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1991
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1992
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1993 }
37ab9d83dc9b reactivate SingleFrameApplication sample + Added SingleFrameEditorApplication (SDL only)
am@osimis.io
parents:
diff changeset
1994 }