Mercurial > hg > orthanc-webviewer
changeset 162:f17ecfffdc75
sync
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 10 Jul 2017 11:51:20 +0200 |
parents | 4ac039ed55bd |
children | c32c9399433e 273c3e109948 |
files | Orthanc/Core/Enumerations.cpp Orthanc/Core/Enumerations.h Orthanc/Core/Images/ImageProcessing.cpp Orthanc/Core/Images/ImageProcessing.h Orthanc/Core/SQLite/Connection.h Orthanc/Core/SQLite/FunctionContext.cpp Orthanc/Core/SQLite/FunctionContext.h Orthanc/Core/SQLite/SQLiteTypes.h Orthanc/Core/SQLite/Statement.h Orthanc/Core/SQLite/StatementReference.h Orthanc/Resources/CMake/SQLiteConfiguration.cmake Resources/SyncOrthancFolder.py |
diffstat | 12 files changed, 219 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/Orthanc/Core/Enumerations.cpp Thu Jun 15 17:43:34 2017 +0200 +++ b/Orthanc/Core/Enumerations.cpp Mon Jul 10 11:51:20 2017 +0200 @@ -636,10 +636,10 @@ return "RGB"; case PhotometricInterpretation_Monochrome1: - return "Monochrome1"; + return "MONOCHROME1"; case PhotometricInterpretation_Monochrome2: - return "Monochrome2"; + return "MONOCHROME2"; case PhotometricInterpretation_ARGB: return "ARGB"; @@ -651,25 +651,25 @@ return "HSV"; case PhotometricInterpretation_Palette: - return "Palette color"; + return "PALETTE COLOR"; case PhotometricInterpretation_YBRFull: - return "YBR full"; + return "YBR_FULL"; case PhotometricInterpretation_YBRFull422: - return "YBR full 422"; + return "YBR_FULL_422"; case PhotometricInterpretation_YBRPartial420: - return "YBR partial 420"; + return "YBR_PARTIAL_420"; case PhotometricInterpretation_YBRPartial422: - return "YBR partial 422"; + return "YBR_PARTIAL_422"; case PhotometricInterpretation_YBR_ICT: - return "YBR ICT"; + return "YBR_ICT"; case PhotometricInterpretation_YBR_RCT: - return "YBR RCT"; + return "YBR_RCT"; case PhotometricInterpretation_Unknown: return "Unknown"; @@ -1053,6 +1053,80 @@ } + PhotometricInterpretation StringToPhotometricInterpretation(const char* value) + { + // http://dicom.nema.org/medical/dicom/2017a/output/chtml/part03/sect_C.7.6.3.html#sect_C.7.6.3.1.2 + std::string s(value); + + if (s == "MONOCHROME1") + { + return PhotometricInterpretation_Monochrome1; + } + + if (s == "MONOCHROME2") + { + return PhotometricInterpretation_Monochrome2; + } + + if (s == "PALETTE COLOR") + { + return PhotometricInterpretation_Palette; + } + + if (s == "RGB") + { + return PhotometricInterpretation_RGB; + } + + if (s == "HSV") + { + return PhotometricInterpretation_HSV; + } + + if (s == "ARGB") + { + return PhotometricInterpretation_ARGB; + } + + if (s == "CMYK") + { + return PhotometricInterpretation_CMYK; + } + + if (s == "YBR_FULL") + { + return PhotometricInterpretation_YBRFull; + } + + if (s == "YBR_FULL_422") + { + return PhotometricInterpretation_YBRFull422; + } + + if (s == "YBR_PARTIAL_422") + { + return PhotometricInterpretation_YBRPartial422; + } + + if (s == "YBR_PARTIAL_420") + { + return PhotometricInterpretation_YBRPartial420; + } + + if (s == "YBR_ICT") + { + return PhotometricInterpretation_YBR_ICT; + } + + if (s == "YBR_RCT") + { + return PhotometricInterpretation_YBR_RCT; + } + + throw OrthancException(ErrorCode_ParameterOutOfRange); + } + + unsigned int GetBytesPerPixel(PixelFormat format) { switch (format)
--- a/Orthanc/Core/Enumerations.h Thu Jun 15 17:43:34 2017 +0200 +++ b/Orthanc/Core/Enumerations.h Mon Jul 10 11:51:20 2017 +0200 @@ -524,6 +524,8 @@ ValueRepresentation StringToValueRepresentation(const std::string& vr, bool throwIfUnsupported); + PhotometricInterpretation StringToPhotometricInterpretation(const char* value); + unsigned int GetBytesPerPixel(PixelFormat format); bool GetDicomEncoding(Encoding& encoding,
--- a/Orthanc/Core/Images/ImageProcessing.cpp Thu Jun 15 17:43:34 2017 +0200 +++ b/Orthanc/Core/Images/ImageProcessing.cpp Mon Jul 10 11:51:20 2017 +0200 @@ -458,6 +458,26 @@ return; } + if (target.GetFormat() == PixelFormat_RGB24 && + source.GetFormat() == PixelFormat_BGRA32) + { + for (unsigned int y = 0; y < source.GetHeight(); y++) + { + const uint8_t* p = reinterpret_cast<const uint8_t*>(source.GetConstRow(y)); + uint8_t* q = reinterpret_cast<uint8_t*>(target.GetRow(y)); + for (unsigned int x = 0; x < source.GetWidth(); x++) + { + q[0] = p[2]; + q[1] = p[1]; + q[2] = p[0]; + p += 4; + q += 3; + } + } + + return; + } + if (target.GetFormat() == PixelFormat_RGBA32 && source.GetFormat() == PixelFormat_RGB24) { @@ -752,4 +772,29 @@ throw OrthancException(ErrorCode_NotImplemented); } } + + + void ImageProcessing::Invert(ImageAccessor& image) + { + switch (image.GetFormat()) + { + case PixelFormat_Grayscale8: + { + for (unsigned int y = 0; y < image.GetHeight(); y++) + { + uint8_t* p = reinterpret_cast<uint8_t*>(image.GetRow(y)); + + for (unsigned int x = 0; x < image.GetWidth(); x++, p++) + { + *p = 255 - (*p); + } + } + + return; + } + + default: + throw OrthancException(ErrorCode_NotImplemented); + } + } }
--- a/Orthanc/Core/Images/ImageProcessing.h Thu Jun 15 17:43:34 2017 +0200 +++ b/Orthanc/Core/Images/ImageProcessing.h Mon Jul 10 11:51:20 2017 +0200 @@ -73,5 +73,7 @@ static void ShiftScale(ImageAccessor& image, float offset, float scaling); + + static void Invert(ImageAccessor& image); }; }
--- a/Orthanc/Core/SQLite/Connection.h Thu Jun 15 17:43:34 2017 +0200 +++ b/Orthanc/Core/SQLite/Connection.h Mon Jul 10 11:51:20 2017 +0200 @@ -39,13 +39,11 @@ #include "Statement.h" #include "IScalarFunction.h" +#include "SQLiteTypes.h" #include <string> #include <map> -struct sqlite3; -struct sqlite3_stmt; - #define SQLITE_FROM_HERE ::Orthanc::SQLite::StatementId(__FILE__, __LINE__) namespace Orthanc
--- a/Orthanc/Core/SQLite/FunctionContext.cpp Thu Jun 15 17:43:34 2017 +0200 +++ b/Orthanc/Core/SQLite/FunctionContext.cpp Mon Jul 10 11:51:20 2017 +0200 @@ -49,7 +49,7 @@ { FunctionContext::FunctionContext(struct sqlite3_context* context, int argc, - struct ::Mem** argv) + Internals::SQLiteValue** argv) { assert(context != NULL); assert(argc >= 0);
--- a/Orthanc/Core/SQLite/FunctionContext.h Thu Jun 15 17:43:34 2017 +0200 +++ b/Orthanc/Core/SQLite/FunctionContext.h Mon Jul 10 11:51:20 2017 +0200 @@ -36,9 +36,6 @@ #include "Statement.h" -struct sqlite3_context; -struct Mem; // This corresponds to the opaque type "sqlite3_value" - namespace Orthanc { namespace SQLite @@ -50,14 +47,14 @@ private: struct sqlite3_context* context_; unsigned int argc_; - struct ::Mem** argv_; + Internals::SQLiteValue** argv_; void CheckIndex(unsigned int index) const; public: FunctionContext(struct sqlite3_context* context, int argc, - struct ::Mem** argv); + Internals::SQLiteValue** argv); ColumnType GetColumnType(unsigned int index) const;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Orthanc/Core/SQLite/SQLiteTypes.h Mon Jul 10 11:51:20 2017 +0200 @@ -0,0 +1,73 @@ +/** + * Orthanc - A Lightweight, RESTful DICOM Store + * + * Copyright (C) 2012-2016 Sebastien Jodogne <s.jodogne@gmail.com>, + * Medical Physics Department, CHU of Liege, Belgium + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of the CHU of Liege, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + **/ + + +#pragma once + +struct sqlite3; +struct sqlite3_context; +struct sqlite3_stmt; + +#if !defined(ORTHANC_SQLITE_VERSION) +#error Please define macro ORTHANC_SQLITE_VERSION +#endif + + +/** + * "sqlite3_value" is defined as: + * - "typedef struct Mem sqlite3_value;" up to SQLite <= 3.18.2 + * - "typedef struct sqlite3_value sqlite3_value;" since SQLite >= 3.19.0. + * We create our own copy of this typedef to get around this API incompatibility. + * https://github.com/mackyle/sqlite/commit/db1d90df06a78264775a14d22c3361eb5b42be17 + **/ + +#if ORTHANC_SQLITE_VERSION < 3019000 +struct Mem; +#else +struct sqlite3_value; +#endif + +namespace Orthanc +{ + namespace SQLite + { + namespace Internals + { +#if ORTHANC_SQLITE_VERSION < 3019000 + typedef struct ::Mem SQLiteValue; +#else + typedef struct ::sqlite3_value SQLiteValue; +#endif + } + } +}
--- a/Orthanc/Core/SQLite/Statement.h Thu Jun 15 17:43:34 2017 +0200 +++ b/Orthanc/Core/SQLite/Statement.h Mon Jul 10 11:51:20 2017 +0200 @@ -49,8 +49,6 @@ #include <gtest/gtest_prod.h> #endif -struct sqlite3_stmt; - namespace Orthanc {
--- a/Orthanc/Core/SQLite/StatementReference.h Thu Jun 15 17:43:34 2017 +0200 +++ b/Orthanc/Core/SQLite/StatementReference.h Mon Jul 10 11:51:20 2017 +0200 @@ -38,13 +38,12 @@ #pragma once #include "NonCopyable.h" +#include "SQLiteTypes.h" #include <stdint.h> #include <cassert> #include <stdlib.h> -struct sqlite3; -struct sqlite3_stmt; namespace Orthanc {
--- a/Orthanc/Resources/CMake/SQLiteConfiguration.cmake Thu Jun 15 17:43:34 2017 +0200 +++ b/Orthanc/Resources/CMake/SQLiteConfiguration.cmake Mon Jul 10 11:51:20 2017 +0200 @@ -19,6 +19,8 @@ SET(SQLITE_MD5 "5fbeff9645ab035a1f580e90b279a16d") SET(SQLITE_URL "http://www.orthanc-server.com/downloads/third-party/sqlite-amalgamation-3071300.zip") + add_definitions(-DORTHANC_SQLITE_VERSION=3007013) + DownloadPackage(${SQLITE_MD5} ${SQLITE_URL} "${SQLITE_SOURCES_DIR}") set(SQLITE_SOURCES @@ -52,7 +54,10 @@ # Autodetection of the version of SQLite file(STRINGS "${SQLITE_INCLUDE_DIR}/sqlite3.h" SQLITE_VERSION_NUMBER1 REGEX "#define SQLITE_VERSION_NUMBER.*$") - string(REGEX REPLACE "#define SQLITE_VERSION_NUMBER(.*)$" "\\1" SQLITE_VERSION_NUMBER ${SQLITE_VERSION_NUMBER1}) + string(REGEX REPLACE "#define SQLITE_VERSION_NUMBER(.*)$" "\\1" SQLITE_VERSION_NUMBER2 ${SQLITE_VERSION_NUMBER1}) + + # Remove the trailing spaces to convert the string to a proper integer + string(STRIP ${SQLITE_VERSION_NUMBER2} SQLITE_VERSION_NUMBER) message("Detected version of SQLite: ${SQLITE_VERSION_NUMBER}") @@ -61,5 +66,7 @@ message(FATAL_ERROR "SQLite version must be above 3.7.0. Please set the CMake variable USE_SYSTEM_SQLITE to OFF.") ENDIF() + add_definitions(-DORTHANC_SQLITE_VERSION=${SQLITE_VERSION_NUMBER}) + link_libraries(sqlite3) endif()
--- a/Resources/SyncOrthancFolder.py Thu Jun 15 17:43:34 2017 +0200 +++ b/Resources/SyncOrthancFolder.py Mon Jul 10 11:51:20 2017 +0200 @@ -50,6 +50,7 @@ 'Core/SQLite/ITransaction.h', 'Core/SQLite/NonCopyable.h', 'Core/SQLite/OrthancSQLiteException.h', + 'Core/SQLite/SQLiteTypes.h', 'Core/SQLite/Statement.cpp', 'Core/SQLite/Statement.h', 'Core/SQLite/StatementId.cpp',