Mercurial > hg > orthanc-webviewer
diff Orthanc/Core/Images/ImageAccessor.cpp @ 128:e8cfda4c8a2f
Sync + support of JPEG2000 lossless images with YBR_RCT photometric interpretation
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 15 Apr 2016 21:44:03 +0200 |
parents | 3809121c3290 |
children | 2c73a785c08e |
line wrap: on
line diff
--- a/Orthanc/Core/Images/ImageAccessor.cpp Fri Mar 25 17:38:34 2016 +0100 +++ b/Orthanc/Core/Images/ImageAccessor.cpp Fri Apr 15 21:44:03 2016 +0200 @@ -121,7 +121,7 @@ { if (buffer_ != NULL) { - return reinterpret_cast<const uint8_t*>(buffer_) + y * pitch_; + return buffer_ + y * pitch_; } else { @@ -143,7 +143,7 @@ if (buffer_ != NULL) { - return reinterpret_cast<uint8_t*>(buffer_) + y * pitch_; + return buffer_ + y * pitch_; } else { @@ -174,9 +174,12 @@ width_ = width; height_ = height; pitch_ = pitch; - buffer_ = const_cast<void*>(buffer); + buffer_ = reinterpret_cast<uint8_t*>(const_cast<void*>(buffer)); - assert(GetBytesPerPixel() * width_ <= pitch_); + if (GetBytesPerPixel() * width_ > pitch_) + { + throw OrthancException(ErrorCode_ParameterOutOfRange); + } } @@ -191,9 +194,12 @@ width_ = width; height_ = height; pitch_ = pitch; - buffer_ = buffer; + buffer_ = reinterpret_cast<uint8_t*>(buffer); - assert(GetBytesPerPixel() * width_ <= pitch_); + if (GetBytesPerPixel() * width_ > pitch_) + { + throw OrthancException(ErrorCode_ParameterOutOfRange); + } } @@ -226,4 +232,43 @@ buffer.Flatten(target); } + + + ImageAccessor ImageAccessor::GetRegion(unsigned int x, + unsigned int y, + unsigned int width, + unsigned int height) const + { + if (x + width > width_ || + y + height > height_) + { + throw OrthancException(ErrorCode_ParameterOutOfRange); + } + + ImageAccessor result; + + if (width == 0 || + height == 0) + { + result.AssignWritable(format_, 0, 0, 0, NULL); + } + else + { + uint8_t* p = (buffer_ + + y * pitch_ + + x * GetBytesPerPixel()); + + if (readOnly_) + { + result.AssignReadOnly(format_, width, height, pitch_, p); + } + else + { + result.AssignWritable(format_, width, height, pitch_, p); + } + } + + return result; + } + }