Mercurial > hg > orthanc-stone
annotate Applications/Sdl/SdlSurface.cpp~ @ 142:f19194a11c1d wasm
ComputeWindowing in Enumerations.h
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 19 Jan 2018 18:12:42 +0100 |
parents | e2fe9352f240 |
children |
rev | line source |
---|---|
74 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
135
e2fe9352f240
upgrade to year 2018
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
113
diff
changeset
|
5 * Copyright (C) 2017-2018 Osimis S.A., Belgium |
74 | 6 * |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU Affero General Public License | |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Affero General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Affero General Public License | |
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 **/ | |
20 | |
21 | |
102 | 22 #include "SdlSurface.h" |
74 | 23 |
24 #if ORTHANC_ENABLE_SDL == 1 | |
25 | |
113
2eca030792aa
using the Orthanc Framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
102
diff
changeset
|
26 #include "../../Resources/Orthanc/Core/Logging.h" |
2eca030792aa
using the Orthanc Framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
102
diff
changeset
|
27 #include "../../Resources/Orthanc/Core/OrthancException.h" |
74 | 28 |
29 namespace OrthancStone | |
30 { | |
102 | 31 SdlSurface::SdlSurface(SdlWindow& window) : |
32 window_(window), | |
33 sdlSurface_(NULL) | |
74 | 34 { |
35 } | |
36 | |
37 | |
102 | 38 SdlSurface::~SdlSurface() |
74 | 39 { |
40 if (sdlSurface_) | |
41 { | |
42 SDL_FreeSurface(sdlSurface_); | |
43 } | |
44 } | |
45 | |
46 | |
102 | 47 void SdlSurface::SetSize(unsigned int width, |
48 unsigned int height) | |
74 | 49 { |
102 | 50 if (cairoSurface_.get() == NULL || |
51 cairoSurface_->GetWidth() != width || | |
52 cairoSurface_->GetHeight() != height) | |
74 | 53 { |
102 | 54 cairoSurface_.reset(new CairoSurface(width, height)); |
74 | 55 |
56 // TODO Big endian? | |
57 static const uint32_t rmask = 0x00ff0000; | |
58 static const uint32_t gmask = 0x0000ff00; | |
59 static const uint32_t bmask = 0x000000ff; | |
60 | |
61 if (sdlSurface_) | |
62 { | |
63 SDL_FreeSurface(sdlSurface_); | |
64 } | |
65 | |
102 | 66 sdlSurface_ = SDL_CreateRGBSurfaceFrom(cairoSurface_->GetBuffer(), width, height, 32, |
67 cairoSurface_->GetPitch(), rmask, gmask, bmask, 0); | |
74 | 68 if (!sdlSurface_) |
69 { | |
70 LOG(ERROR) << "Cannot create a SDL surface from a Cairo surface"; | |
71 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
102 | 72 } |
74 | 73 } |
74 } | |
75 | |
76 | |
102 | 77 void SdlSurface::Render(IViewport& viewport) |
74 | 78 { |
102 | 79 if (cairoSurface_.get() == NULL) |
74 | 80 { |
102 | 81 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
74 | 82 } |
83 | |
102 | 84 Orthanc::ImageAccessor target = cairoSurface_->GetAccessor(); |
85 | |
86 if (viewport.Render(target)) | |
74 | 87 { |
102 | 88 window_.Render(sdlSurface_); |
74 | 89 } |
90 } | |
91 } | |
92 | |
93 #endif |