comparison Samples/Sdl/TrackerSampleApp.cpp @ 728:8190213e2279 am-dev

Merged default into am-dev
author Alain Mazy <am@osimis.io>
date Tue, 21 May 2019 13:25:58 +0200
parents 28b9e3a54200
children 4d69256d2a46 284f37dc1c66
comparison
equal deleted inserted replaced
690:f185cfcb72a0 728:8190213e2279
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. 18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 **/ 19 **/
20 20
21 #include "TrackerSampleApp.h" 21 #include "TrackerSampleApp.h"
22 22
23 #include "../Common/CreateLineMeasureTracker.h" 23 #include <Framework/Scene2DViewport/CreateLineMeasureTracker.h>
24 #include "../Common/CreateAngleMeasureTracker.h" 24 #include <Framework/Scene2DViewport/CreateAngleMeasureTracker.h>
25 25
26 #include "../../Applications/Sdl/SdlOpenGLWindow.h" 26 #include <Framework/Scene2D/PanSceneTracker.h>
27 27 #include <Framework/Scene2D/RotateSceneTracker.h>
28 #include "../../Framework/Scene2D/PanSceneTracker.h" 28 #include <Framework/Scene2D/Scene2D.h>
29 #include "../../Framework/Scene2D/RotateSceneTracker.h" 29 #include <Framework/Scene2D/ZoomSceneTracker.h>
30 #include "../../Framework/Scene2D/Scene2D.h" 30 #include <Framework/Scene2D/CairoCompositor.h>
31 #include "../../Framework/Scene2D/ZoomSceneTracker.h" 31 #include <Framework/Scene2D/ColorTextureSceneLayer.h>
32 #include "../../Framework/Scene2D/CairoCompositor.h" 32 #include <Framework/Scene2D/OpenGLCompositor.h>
33 #include "../../Framework/Scene2D/ColorTextureSceneLayer.h" 33
34 #include "../../Framework/Scene2D/OpenGLCompositor.h" 34 #include <Framework/StoneInitialization.h>
35 #include "../../Framework/StoneInitialization.h" 35
36 36 #include <Applications/Sdl/SdlOpenGLWindow.h>
37 // From Orthanc framework 37
38 // From Orthanc framework
38 #include <Core/Logging.h> 39 #include <Core/Logging.h>
39 #include <Core/OrthancException.h> 40 #include <Core/OrthancException.h>
40 #include <Core/Images/Image.h> 41 #include <Core/Images/Image.h>
41 #include <Core/Images/ImageProcessing.h> 42 #include <Core/Images/ImageProcessing.h>
42 #include <Core/Images/PngWriter.h> 43 #include <Core/Images/PngWriter.h>
65 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, "Wrong tool index"); 66 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, "Wrong tool index");
66 } 67 }
67 return descs[i]; 68 return descs[i];
68 } 69 }
69 70
70 Scene2D& TrackerSampleApp::GetScene() 71 Scene2DPtr TrackerSampleApp::GetScene()
71 { 72 {
72 return scene_; 73 return controller_->GetScene();
73 } 74 }
74 75
75 void TrackerSampleApp::SelectNextTool() 76 void TrackerSampleApp::SelectNextTool()
76 { 77 {
77 currentTool_ = static_cast<GuiTool>(currentTool_ + 1); 78 currentTool_ = static_cast<GuiTool>(currentTool_ + 1);
85 // do not try to use stuff too early! 86 // do not try to use stuff too early!
86 if (compositor_.get() == NULL) 87 if (compositor_.get() == NULL)
87 return; 88 return;
88 89
89 std::stringstream msg; 90 std::stringstream msg;
90 for (auto kv : infoTextMap_) 91
91 { 92 for (std::map<std::string, std::string>::const_iterator kv = infoTextMap_.begin();
92 msg << kv.first << " : " << kv.second << std::endl; 93 kv != infoTextMap_.end(); ++kv)
93 } 94 {
94 auto msgS = msg.str(); 95 msg << kv->first << " : " << kv->second << std::endl;
96 }
97 std::string msgS = msg.str();
95 98
96 TextSceneLayer* layerP = NULL; 99 TextSceneLayer* layerP = NULL;
97 if (scene_.HasLayer(FIXED_INFOTEXT_LAYER_ZINDEX)) 100 if (GetScene()->HasLayer(FIXED_INFOTEXT_LAYER_ZINDEX))
98 { 101 {
99 TextSceneLayer& layer = dynamic_cast<TextSceneLayer&>( 102 TextSceneLayer& layer = dynamic_cast<TextSceneLayer&>(
100 scene_.GetLayer(FIXED_INFOTEXT_LAYER_ZINDEX)); 103 GetScene()->GetLayer(FIXED_INFOTEXT_LAYER_ZINDEX));
101 layerP = &layer; 104 layerP = &layer;
102 } 105 }
103 else 106 else
104 { 107 {
105 std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer); 108 std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer);
107 layer->SetColor(0, 255, 0); 110 layer->SetColor(0, 255, 0);
108 layer->SetFontIndex(1); 111 layer->SetFontIndex(1);
109 layer->SetBorder(20); 112 layer->SetBorder(20);
110 layer->SetAnchor(BitmapAnchor_TopLeft); 113 layer->SetAnchor(BitmapAnchor_TopLeft);
111 //layer->SetPosition(0,0); 114 //layer->SetPosition(0,0);
112 scene_.SetLayer(FIXED_INFOTEXT_LAYER_ZINDEX, layer.release()); 115 GetScene()->SetLayer(FIXED_INFOTEXT_LAYER_ZINDEX, layer.release());
113 } 116 }
114 // position the fixed info text in the upper right corner 117 // position the fixed info text in the upper right corner
115 layerP->SetText(msgS.c_str()); 118 layerP->SetText(msgS.c_str());
116 double cX = compositor_->GetCanvasWidth() * (-0.5); 119 double cX = compositor_->GetCanvasWidth() * (-0.5);
117 double cY = compositor_->GetCanvasHeight() * (-0.5); 120 double cY = compositor_->GetCanvasHeight() * (-0.5);
118 scene_.GetCanvasToSceneTransform().Apply(cX,cY); 121 GetScene()->GetCanvasToSceneTransform().Apply(cX,cY);
119 layerP->SetPosition(cX, cY); 122 layerP->SetPosition(cX, cY);
120 } 123 }
121 124
122 void TrackerSampleApp::DisplayFloatingCtrlInfoText(const PointerEvent& e) 125 void TrackerSampleApp::DisplayFloatingCtrlInfoText(const PointerEvent& e)
123 { 126 {
124 ScenePoint2D p = e.GetMainPosition().Apply(scene_.GetCanvasToSceneTransform()); 127 ScenePoint2D p = e.GetMainPosition().Apply(GetScene()->GetCanvasToSceneTransform());
125 128
126 char buf[128]; 129 char buf[128];
127 sprintf(buf, "S:(%0.02f,%0.02f) C:(%0.02f,%0.02f)", 130 sprintf(buf, "S:(%0.02f,%0.02f) C:(%0.02f,%0.02f)",
128 p.GetX(), p.GetY(), 131 p.GetX(), p.GetY(),
129 e.GetMainPosition().GetX(), e.GetMainPosition().GetY()); 132 e.GetMainPosition().GetX(), e.GetMainPosition().GetY());
130 133
131 if (scene_.HasLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)) 134 if (GetScene()->HasLayer(FLOATING_INFOTEXT_LAYER_ZINDEX))
132 { 135 {
133 TextSceneLayer& layer = 136 TextSceneLayer& layer =
134 dynamic_cast<TextSceneLayer&>(scene_.GetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)); 137 dynamic_cast<TextSceneLayer&>(GetScene()->GetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX));
135 layer.SetText(buf); 138 layer.SetText(buf);
136 layer.SetPosition(p.GetX(), p.GetY()); 139 layer.SetPosition(p.GetX(), p.GetY());
137 } 140 }
138 else 141 else
139 { 142 {
141 layer->SetColor(0, 255, 0); 144 layer->SetColor(0, 255, 0);
142 layer->SetText(buf); 145 layer->SetText(buf);
143 layer->SetBorder(20); 146 layer->SetBorder(20);
144 layer->SetAnchor(BitmapAnchor_BottomCenter); 147 layer->SetAnchor(BitmapAnchor_BottomCenter);
145 layer->SetPosition(p.GetX(), p.GetY()); 148 layer->SetPosition(p.GetX(), p.GetY());
146 scene_.SetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX, layer.release()); 149 GetScene()->SetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX, layer.release());
147 } 150 }
148 } 151 }
149 152
150 void TrackerSampleApp::HideInfoText() 153 void TrackerSampleApp::HideInfoText()
151 { 154 {
152 scene_.DeleteLayer(FLOATING_INFOTEXT_LAYER_ZINDEX); 155 GetScene()->DeleteLayer(FLOATING_INFOTEXT_LAYER_ZINDEX);
153 } 156 }
154 157
155 void TrackerSampleApp::HandleApplicationEvent( 158 void TrackerSampleApp::HandleApplicationEvent(
156 const SDL_Event & event) 159 const SDL_Event & event)
157 { 160 {
189 // "event.button.y = " << event.button.y; 192 // "event.button.y = " << event.button.y;
190 //LOG(TRACE) << "activeTracker_->PointerMove(e); " << 193 //LOG(TRACE) << "activeTracker_->PointerMove(e); " <<
191 // e.GetMainPosition().GetX() << " " << e.GetMainPosition().GetY(); 194 // e.GetMainPosition().GetX() << " " << e.GetMainPosition().GetY();
192 195
193 activeTracker_->PointerMove(e); 196 activeTracker_->PointerMove(e);
194 if (!activeTracker_->IsActive()) 197 if (!activeTracker_->IsAlive())
195 activeTracker_ = NULL; 198 activeTracker_.reset();
196 } 199 }
197 } 200 }
198 } 201 }
199 else if (event.type == SDL_MOUSEBUTTONUP) 202 else if (event.type == SDL_MOUSEBUTTONUP)
200 { 203 {
201 if (activeTracker_) 204 if (activeTracker_)
202 { 205 {
203 PointerEvent e; 206 PointerEvent e;
204 e.AddPosition(compositor_->GetPixelCenterCoordinates(event.button.x, event.button.y)); 207 e.AddPosition(compositor_->GetPixelCenterCoordinates(event.button.x, event.button.y));
205 activeTracker_->PointerUp(e); 208 activeTracker_->PointerUp(e);
206 if (!activeTracker_->IsActive()) 209 if (!activeTracker_->IsAlive())
207 activeTracker_ = NULL; 210 activeTracker_.reset();
208 } 211 }
209 } 212 }
210 else if (event.type == SDL_MOUSEBUTTONDOWN) 213 else if (event.type == SDL_MOUSEBUTTONDOWN)
211 { 214 {
212 PointerEvent e; 215 PointerEvent e;
213 e.AddPosition(compositor_->GetPixelCenterCoordinates( 216 e.AddPosition(compositor_->GetPixelCenterCoordinates(
214 event.button.x, event.button.y)); 217 event.button.x, event.button.y));
215 if (activeTracker_) 218 if (activeTracker_)
216 { 219 {
217 activeTracker_->PointerDown(e); 220 activeTracker_->PointerDown(e);
218 if (!activeTracker_->IsActive()) 221 if (!activeTracker_->IsAlive())
219 activeTracker_ = NULL; 222 activeTracker_.reset();
220 } 223 }
221 else 224 else
222 { 225 {
223 // we ATTEMPT to create a tracker if need be 226 // we ATTEMPT to create a tracker if need be
224 activeTracker_ = CreateSuitableTracker(event, e); 227 activeTracker_ = CreateSuitableTracker(event, e);
231 { 234 {
232 case SDLK_ESCAPE: 235 case SDLK_ESCAPE:
233 if (activeTracker_) 236 if (activeTracker_)
234 { 237 {
235 activeTracker_->Cancel(); 238 activeTracker_->Cancel();
236 if (!activeTracker_->IsActive()) 239 if (!activeTracker_->IsAlive())
237 activeTracker_ = NULL; 240 activeTracker_.reset();
238 } 241 }
239 break; 242 break;
240 243
241 case SDLK_t: 244 case SDLK_t:
242 if (!activeTracker_) 245 if (!activeTracker_)
247 " is taking place"; 250 " is taking place";
248 } 251 }
249 break; 252 break;
250 253
251 case SDLK_s: 254 case SDLK_s:
252 scene_.FitContent(compositor_->GetCanvasWidth(), 255 controller_->FitContent(compositor_->GetCanvasWidth(),
253 compositor_->GetCanvasHeight()); 256 compositor_->GetCanvasHeight());
254 break; 257 break;
255 258
256 case SDLK_c: 259 case SDLK_c:
257 TakeScreenshot( 260 TakeScreenshot(
265 } 268 }
266 } 269 }
267 } 270 }
268 271
269 272
270 void TrackerSampleApp::OnSceneTransformChanged(const Scene2D::SceneTransformChanged& message) 273 void TrackerSampleApp::OnSceneTransformChanged(
274 const ViewportController::SceneTransformChanged& message)
271 { 275 {
272 DisplayInfoText(); 276 DisplayInfoText();
273 } 277 }
274 278
275 FlexiblePointerTrackerPtr TrackerSampleApp::CreateSuitableTracker( 279 FlexiblePointerTrackerPtr TrackerSampleApp::CreateSuitableTracker(
277 const PointerEvent & e) 281 const PointerEvent & e)
278 { 282 {
279 switch (event.button.button) 283 switch (event.button.button)
280 { 284 {
281 case SDL_BUTTON_MIDDLE: 285 case SDL_BUTTON_MIDDLE:
282 return CreateSimpleTrackerAdapter(PointerTrackerPtr( 286 return FlexiblePointerTrackerPtr(new PanSceneTracker
283 new PanSceneTracker(scene_, e))); 287 (controller_, e));
284 288
285 case SDL_BUTTON_RIGHT: 289 case SDL_BUTTON_RIGHT:
286 return CreateSimpleTrackerAdapter(PointerTrackerPtr( 290 return FlexiblePointerTrackerPtr(new ZoomSceneTracker
287 new ZoomSceneTracker(scene_, e, compositor_->GetCanvasHeight()))); 291 (controller_, e, compositor_->GetCanvasHeight()));
288 292
289 case SDL_BUTTON_LEFT: 293 case SDL_BUTTON_LEFT:
290 { 294 {
291 //LOG(TRACE) << "CreateSuitableTracker: case SDL_BUTTON_LEFT:"; 295 //LOG(TRACE) << "CreateSuitableTracker: case SDL_BUTTON_LEFT:";
292 // TODO: we need to iterate on the set of measuring tool and perform 296 // TODO: we need to iterate on the set of measuring tool and perform
307 { 311 {
308 switch (currentTool_) 312 switch (currentTool_)
309 { 313 {
310 case GuiTool_Rotate: 314 case GuiTool_Rotate:
311 //LOG(TRACE) << "Creating RotateSceneTracker"; 315 //LOG(TRACE) << "Creating RotateSceneTracker";
312 return CreateSimpleTrackerAdapter(PointerTrackerPtr( 316 return FlexiblePointerTrackerPtr(new RotateSceneTracker(
313 new RotateSceneTracker(scene_, e))); 317 controller_, e));
314 case GuiTool_Pan: 318 case GuiTool_Pan:
315 return CreateSimpleTrackerAdapter(PointerTrackerPtr( 319 return FlexiblePointerTrackerPtr(new PanSceneTracker(
316 new PanSceneTracker(scene_, e))); 320 controller_, e));
317 case GuiTool_Zoom: 321 case GuiTool_Zoom:
318 return CreateSimpleTrackerAdapter(PointerTrackerPtr( 322 return FlexiblePointerTrackerPtr(new ZoomSceneTracker(
319 new ZoomSceneTracker(scene_, e, compositor_->GetCanvasHeight()))); 323 controller_, e, compositor_->GetCanvasHeight()));
320 //case GuiTool_AngleMeasure: 324 //case GuiTool_AngleMeasure:
321 // return new AngleMeasureTracker(scene_, measureTools_, undoStack_, e); 325 // return new AngleMeasureTracker(GetScene(), e);
322 //case GuiTool_CircleMeasure: 326 //case GuiTool_CircleMeasure:
323 // return new CircleMeasureTracker(scene_, measureTools_, undoStack_, e); 327 // return new CircleMeasureTracker(GetScene(), e);
324 //case GuiTool_EllipseMeasure: 328 //case GuiTool_EllipseMeasure:
325 // return new EllipseMeasureTracker(scene_, measureTools_, undoStack_, e); 329 // return new EllipseMeasureTracker(GetScene(), e);
326 case GuiTool_LineMeasure: 330 case GuiTool_LineMeasure:
327 return FlexiblePointerTrackerPtr(new CreateLineMeasureTracker( 331 return FlexiblePointerTrackerPtr(new CreateLineMeasureTracker(
328 IObserver::GetBroker(), scene_, undoStack_, measureTools_, e)); 332 IObserver::GetBroker(), controller_, e));
329 case GuiTool_AngleMeasure: 333 case GuiTool_AngleMeasure:
330 return FlexiblePointerTrackerPtr(new CreateAngleMeasureTracker( 334 return FlexiblePointerTrackerPtr(new CreateAngleMeasureTracker(
331 IObserver::GetBroker(), scene_, undoStack_, measureTools_, e)); 335 IObserver::GetBroker(), controller_, e));
332 return NULL;
333 case GuiTool_CircleMeasure: 336 case GuiTool_CircleMeasure:
334 LOG(ERROR) << "Not implemented yet!"; 337 LOG(ERROR) << "Not implemented yet!";
335 return NULL; 338 return FlexiblePointerTrackerPtr();
336 case GuiTool_EllipseMeasure: 339 case GuiTool_EllipseMeasure:
337 LOG(ERROR) << "Not implemented yet!"; 340 LOG(ERROR) << "Not implemented yet!";
338 return NULL; 341 return FlexiblePointerTrackerPtr();
339 default: 342 default:
340 throw OrthancException(ErrorCode_InternalError, "Wrong tool!"); 343 throw OrthancException(ErrorCode_InternalError, "Wrong tool!");
341 } 344 }
342 } 345 }
343 } 346 }
344 default: 347 default:
345 return NULL; 348 return FlexiblePointerTrackerPtr();
346 } 349 }
347 } 350 }
348 351
349 352
350 TrackerSampleApp::TrackerSampleApp(MessageBroker& broker) : IObserver(broker) 353 TrackerSampleApp::TrackerSampleApp(MessageBroker& broker) : IObserver(broker)
351 , scene_(broker)
352 , currentTool_(GuiTool_Rotate) 354 , currentTool_(GuiTool_Rotate)
353 { 355 {
354 scene_.RegisterObserverCallback( 356 controller_ = ViewportControllerPtr(new ViewportController(broker));
355 new Callable<TrackerSampleApp, Scene2D::SceneTransformChanged> 357
358 controller_->RegisterObserverCallback(
359 new Callable<TrackerSampleApp, ViewportController::SceneTransformChanged>
356 (*this, &TrackerSampleApp::OnSceneTransformChanged)); 360 (*this, &TrackerSampleApp::OnSceneTransformChanged));
357 361
358 TEXTURE_2x2_1_ZINDEX = 1; 362 TEXTURE_2x2_1_ZINDEX = 1;
359 TEXTURE_1x1_ZINDEX = 2; 363 TEXTURE_1x1_ZINDEX = 2;
360 TEXTURE_2x2_2_ZINDEX = 3; 364 TEXTURE_2x2_2_ZINDEX = 3;
361 LINESET_1_ZINDEX = 4; 365 LINESET_1_ZINDEX = 4;
362 LINESET_2_ZINDEX = 5; 366 LINESET_2_ZINDEX = 5;
363 FLOATING_INFOTEXT_LAYER_ZINDEX = 6; 367 FLOATING_INFOTEXT_LAYER_ZINDEX = 6;
364 FIXED_INFOTEXT_LAYER_ZINDEX = 7; 368 FIXED_INFOTEXT_LAYER_ZINDEX = 7;
365
366
367 } 369 }
368 370
369 void TrackerSampleApp::PrepareScene() 371 void TrackerSampleApp::PrepareScene()
370 { 372 {
371 // Texture of 2x2 size 373 // Texture of 2x2 size
388 390
389 p[3] = 255; 391 p[3] = 255;
390 p[4] = 0; 392 p[4] = 0;
391 p[5] = 0; 393 p[5] = 0;
392 394
393 scene_.SetLayer(TEXTURE_2x2_1_ZINDEX, new ColorTextureSceneLayer(i)); 395 GetScene()->SetLayer(TEXTURE_2x2_1_ZINDEX, new ColorTextureSceneLayer(i));
394 396
395 std::auto_ptr<ColorTextureSceneLayer> l(new ColorTextureSceneLayer(i)); 397 std::auto_ptr<ColorTextureSceneLayer> l(new ColorTextureSceneLayer(i));
396 l->SetOrigin(-3, 2); 398 l->SetOrigin(-3, 2);
397 l->SetPixelSpacing(1.5, 1); 399 l->SetPixelSpacing(1.5, 1);
398 l->SetAngle(20.0 / 180.0 * M_PI); 400 l->SetAngle(20.0 / 180.0 * M_PI);
399 scene_.SetLayer(TEXTURE_2x2_2_ZINDEX, l.release()); 401 GetScene()->SetLayer(TEXTURE_2x2_2_ZINDEX, l.release());
400 } 402 }
401 403
402 // Texture of 1x1 size 404 // Texture of 1x1 size
403 { 405 {
404 Orthanc::Image i(Orthanc::PixelFormat_RGB24, 1, 1, false); 406 Orthanc::Image i(Orthanc::PixelFormat_RGB24, 1, 1, false);
409 p[2] = 0; 411 p[2] = 0;
410 412
411 std::auto_ptr<ColorTextureSceneLayer> l(new ColorTextureSceneLayer(i)); 413 std::auto_ptr<ColorTextureSceneLayer> l(new ColorTextureSceneLayer(i));
412 l->SetOrigin(-2, 1); 414 l->SetOrigin(-2, 1);
413 l->SetAngle(20.0 / 180.0 * M_PI); 415 l->SetAngle(20.0 / 180.0 * M_PI);
414 scene_.SetLayer(TEXTURE_1x1_ZINDEX, l.release()); 416 GetScene()->SetLayer(TEXTURE_1x1_ZINDEX, l.release());
415 } 417 }
416 418
417 // Some lines 419 // Some lines
418 { 420 {
419 std::auto_ptr<PolylineSceneLayer> layer(new PolylineSceneLayer); 421 std::auto_ptr<PolylineSceneLayer> layer(new PolylineSceneLayer);
441 chain.push_back(ScenePoint2D(-4, -4 + 2.0 * dy)); 443 chain.push_back(ScenePoint2D(-4, -4 + 2.0 * dy));
442 chain.push_back(ScenePoint2D(4, 2)); 444 chain.push_back(ScenePoint2D(4, 2));
443 layer->AddChain(chain, false); 445 layer->AddChain(chain, false);
444 446
445 layer->SetColor(0, 255, 255); 447 layer->SetColor(0, 255, 255);
446 scene_.SetLayer(LINESET_1_ZINDEX, layer.release()); 448 GetScene()->SetLayer(LINESET_1_ZINDEX, layer.release());
447 } 449 }
448 450
449 // Some text 451 // Some text
450 { 452 {
451 std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer); 453 std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer);
452 layer->SetText("Hello"); 454 layer->SetText("Hello");
453 scene_.SetLayer(LINESET_2_ZINDEX, layer.release()); 455 GetScene()->SetLayer(LINESET_2_ZINDEX, layer.release());
454 } 456 }
455 } 457 }
456 458
457 459
458 void TrackerSampleApp::DisableTracker() 460 void TrackerSampleApp::DisableTracker()
459 { 461 {
460 if (activeTracker_) 462 if (activeTracker_)
461 { 463 {
462 activeTracker_->Cancel(); 464 activeTracker_->Cancel();
463 activeTracker_ = NULL; 465 activeTracker_.reset();
464 } 466 }
465 } 467 }
466 468
467 void TrackerSampleApp::TakeScreenshot(const std::string& target, 469 void TrackerSampleApp::TakeScreenshot(const std::string& target,
468 unsigned int canvasWidth, 470 unsigned int canvasWidth,
469 unsigned int canvasHeight) 471 unsigned int canvasHeight)
470 { 472 {
471 CairoCompositor compositor(scene_, canvasWidth, canvasHeight); 473 CairoCompositor compositor(*GetScene(), canvasWidth, canvasHeight);
472 compositor.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, FONT_SIZE_0, Orthanc::Encoding_Latin1); 474 compositor.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, FONT_SIZE_0, Orthanc::Encoding_Latin1);
473 compositor.Refresh(); 475 compositor.Refresh();
474 476
475 Orthanc::ImageAccessor canvas; 477 Orthanc::ImageAccessor canvas;
476 compositor.GetCanvas().GetReadOnlyAccessor(canvas); 478 compositor.GetCanvas().GetReadOnlyAccessor(canvas);
484 486
485 487
486 FlexiblePointerTrackerPtr TrackerSampleApp::TrackerHitTest(const PointerEvent & e) 488 FlexiblePointerTrackerPtr TrackerSampleApp::TrackerHitTest(const PointerEvent & e)
487 { 489 {
488 // std::vector<MeasureToolPtr> measureTools_; 490 // std::vector<MeasureToolPtr> measureTools_;
489 return nullptr; 491 return FlexiblePointerTrackerPtr();
490 } 492 }
491 493
492 static void GLAPIENTRY 494 static void GLAPIENTRY
493 OpenGLMessageCallback(GLenum source, 495 OpenGLMessageCallback(GLenum source,
494 GLenum type, 496 GLenum type,
512 { 514 {
513 // False means we do NOT let Windows treat this as a legacy application 515 // False means we do NOT let Windows treat this as a legacy application
514 // that needs to be scaled 516 // that needs to be scaled
515 SdlOpenGLWindow window("Hello", 1024, 1024, false); 517 SdlOpenGLWindow window("Hello", 1024, 1024, false);
516 518
517 GetScene().FitContent(window.GetCanvasWidth(), window.GetCanvasHeight()); 519 controller_->FitContent(window.GetCanvasWidth(), window.GetCanvasHeight());
518 520
519 glEnable(GL_DEBUG_OUTPUT); 521 glEnable(GL_DEBUG_OUTPUT);
520 glDebugMessageCallback(OpenGLMessageCallback, 0); 522 glDebugMessageCallback(OpenGLMessageCallback, 0);
521 523
522 compositor_.reset(new OpenGLCompositor(window, GetScene())); 524 compositor_.reset(new OpenGLCompositor(window, *GetScene()));
523 525
524 compositor_->SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, 526 compositor_->SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT,
525 FONT_SIZE_0, Orthanc::Encoding_Latin1); 527 FONT_SIZE_0, Orthanc::Encoding_Latin1);
526 compositor_->SetFont(1, Orthanc::EmbeddedResources::UBUNTU_FONT, 528 compositor_->SetFont(1, Orthanc::EmbeddedResources::UBUNTU_FONT,
527 FONT_SIZE_1, Orthanc::Encoding_Latin1); 529 FONT_SIZE_1, Orthanc::Encoding_Latin1);
562 } 564 }
563 HandleApplicationEvent(event); 565 HandleApplicationEvent(event);
564 } 566 }
565 SDL_Delay(1); 567 SDL_Delay(1);
566 } 568 }
569
570 // the following is paramount because the compositor holds a reference
571 // to the scene and we do not want this reference to become dangling
567 compositor_.reset(NULL); 572 compositor_.reset(NULL);
568 } 573 }
569 574
570 void TrackerSampleApp::SetInfoDisplayMessage( 575 void TrackerSampleApp::SetInfoDisplayMessage(
571 std::string key, std::string value) 576 std::string key, std::string value)