Mercurial > hg > orthanc
annotate Core/Images/ImageBuffer.cpp @ 2934:2dfa40b9ca42
merge
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 27 Nov 2018 17:09:11 +0100 |
parents | 9b4251721f22 |
children | 4e43e67f8ecf |
rev | line source |
---|---|
801 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
1900 | 3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
1288
6e7e5ed91c2d
upgrade to year 2015
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
863
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
2447
878b59270859
upgrade to year 2018
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2244
diff
changeset
|
5 * Copyright (C) 2017-2018 Osimis S.A., Belgium |
801 | 6 * |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU General Public License as | |
9 * published by the Free Software Foundation, either version 3 of the | |
10 * License, or (at your option) any later version. | |
11 * | |
12 * In addition, as a special exception, the copyright holders of this | |
13 * program give permission to link the code of its release with the | |
14 * OpenSSL project's "OpenSSL" library (or with modified versions of it | |
15 * that use the same license as the "OpenSSL" library), and distribute | |
16 * the linked executables. You must obey the GNU General Public License | |
17 * in all respects for all of the code used other than "OpenSSL". If you | |
18 * modify file(s) with this exception, you may extend this exception to | |
19 * your version of the file(s), but you are not obligated to do so. If | |
20 * you do not wish to do so, delete this exception statement from your | |
21 * version. If you delete this exception statement from all source files | |
22 * in the program, then also delete it here. | |
23 * | |
24 * This program is distributed in the hope that it will be useful, but | |
25 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
27 * General Public License for more details. | |
28 * | |
29 * You should have received a copy of the GNU General Public License | |
30 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
31 **/ | |
32 | |
33 | |
824
a811bdf8b8eb
precompiled headers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
801
diff
changeset
|
34 #include "../PrecompiledHeaders.h" |
801 | 35 #include "ImageBuffer.h" |
36 | |
863 | 37 #include "../OrthancException.h" |
38 | |
860 | 39 #include <stdio.h> |
863 | 40 #include <stdlib.h> |
860 | 41 |
801 | 42 namespace Orthanc |
43 { | |
44 void ImageBuffer::Allocate() | |
45 { | |
46 if (changed_) | |
47 { | |
863 | 48 Deallocate(); |
49 | |
844 | 50 /* |
51 if (forceMinimalPitch_) | |
52 { | |
53 TODO: Align pitch and memory buffer to optimal size for SIMD. | |
54 } | |
55 */ | |
56 | |
801 | 57 pitch_ = GetBytesPerPixel() * width_; |
863 | 58 size_t size = pitch_ * height_; |
801 | 59 |
863 | 60 if (size == 0) |
801 | 61 { |
863 | 62 buffer_ = NULL; |
801 | 63 } |
64 else | |
65 { | |
863 | 66 buffer_ = malloc(size); |
67 if (buffer_ == NULL) | |
68 { | |
69 throw OrthancException(ErrorCode_NotEnoughMemory); | |
70 } | |
801 | 71 } |
72 | |
73 changed_ = false; | |
74 } | |
75 } | |
76 | |
77 | |
863 | 78 void ImageBuffer::Deallocate() |
79 { | |
80 if (buffer_ != NULL) | |
81 { | |
82 free(buffer_); | |
83 buffer_ = NULL; | |
84 changed_ = true; | |
85 } | |
86 } | |
87 | |
88 | |
1608
adc6a5704cdb
OrthancPluginConvertPixelFormat
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
89 ImageBuffer::ImageBuffer(PixelFormat format, |
adc6a5704cdb
OrthancPluginConvertPixelFormat
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1288
diff
changeset
|
90 unsigned int width, |
2107 | 91 unsigned int height, |
92 bool forceMinimalPitch) : | |
93 forceMinimalPitch_(forceMinimalPitch) | |
853
839be3022203
DicomImageInformation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
844
diff
changeset
|
94 { |
839be3022203
DicomImageInformation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
844
diff
changeset
|
95 Initialize(); |
839be3022203
DicomImageInformation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
844
diff
changeset
|
96 SetWidth(width); |
839be3022203
DicomImageInformation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
844
diff
changeset
|
97 SetHeight(height); |
839be3022203
DicomImageInformation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
844
diff
changeset
|
98 SetFormat(format); |
839be3022203
DicomImageInformation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
844
diff
changeset
|
99 } |
839be3022203
DicomImageInformation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
844
diff
changeset
|
100 |
839be3022203
DicomImageInformation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
844
diff
changeset
|
101 |
839be3022203
DicomImageInformation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
844
diff
changeset
|
102 void ImageBuffer::Initialize() |
801 | 103 { |
104 changed_ = false; | |
844 | 105 forceMinimalPitch_ = true; |
801 | 106 format_ = PixelFormat_Grayscale8; |
107 width_ = 0; | |
108 height_ = 0; | |
109 pitch_ = 0; | |
110 buffer_ = NULL; | |
111 } | |
112 | |
113 | |
114 void ImageBuffer::SetFormat(PixelFormat format) | |
115 { | |
863 | 116 if (format != format_) |
117 { | |
118 changed_ = true; | |
119 format_ = format; | |
120 } | |
801 | 121 } |
122 | |
123 | |
124 void ImageBuffer::SetWidth(unsigned int width) | |
125 { | |
863 | 126 if (width != width_) |
127 { | |
128 changed_ = true; | |
129 width_ = width; | |
130 } | |
801 | 131 } |
132 | |
133 | |
134 void ImageBuffer::SetHeight(unsigned int height) | |
135 { | |
863 | 136 if (height != height_) |
137 { | |
138 changed_ = true; | |
139 height_ = height; | |
140 } | |
801 | 141 } |
142 | |
2861
9b4251721f22
ImageAccessor now non-copyable
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
143 |
9b4251721f22
ImageAccessor now non-copyable
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
144 void ImageBuffer::GetReadOnlyAccessor(ImageAccessor& accessor) |
801 | 145 { |
146 Allocate(); | |
2861
9b4251721f22
ImageAccessor now non-copyable
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
147 accessor.AssignReadOnly(format_, width_, height_, pitch_, buffer_); |
9b4251721f22
ImageAccessor now non-copyable
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
148 } |
9b4251721f22
ImageAccessor now non-copyable
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
149 |
801 | 150 |
2861
9b4251721f22
ImageAccessor now non-copyable
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
151 void ImageBuffer::GetWriteableAccessor(ImageAccessor& accessor) |
801 | 152 { |
153 Allocate(); | |
2861
9b4251721f22
ImageAccessor now non-copyable
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2447
diff
changeset
|
154 accessor.AssignWritable(format_, width_, height_, pitch_, buffer_); |
801 | 155 } |
844 | 156 |
157 | |
863 | 158 void ImageBuffer::AcquireOwnership(ImageBuffer& other) |
159 { | |
160 // Remove the content of the current image | |
161 Deallocate(); | |
162 | |
163 // Force the allocation of the other image (if not already | |
164 // allocated) | |
165 other.Allocate(); | |
166 | |
167 // Transfer the content of the other image | |
168 changed_ = false; | |
169 forceMinimalPitch_ = other.forceMinimalPitch_; | |
170 format_ = other.format_; | |
171 width_ = other.width_; | |
172 height_ = other.height_; | |
173 pitch_ = other.pitch_; | |
174 buffer_ = other.buffer_; | |
175 | |
176 // Force the reinitialization of the other image | |
177 other.Initialize(); | |
844 | 178 } |
801 | 179 } |