# HG changeset patch # User Sebastien Jodogne # Date 1540212498 -7200 # Node ID fdec8e6893cb24bdb4296aa428e70f5e8cf96a6c # Parent 712acc87fa2eb1bdb3e4e0a90338cf15b2a04ff3 ordering of bitmap layers diff -r 712acc87fa2e -r fdec8e6893cb Applications/Samples/SingleFrameEditorApplication.h --- a/Applications/Samples/SingleFrameEditorApplication.h Mon Oct 22 14:20:39 2018 +0200 +++ b/Applications/Samples/SingleFrameEditorApplication.h Mon Oct 22 14:48:18 2018 +0200 @@ -686,11 +686,15 @@ { Orthanc::ImageProcessing::Set(buffer, 0); - for (Bitmaps::const_iterator it = bitmaps_.begin(); - it != bitmaps_.end(); ++it) + // Render layers in the background-to-foreground order + for (size_t index = 0; index < countBitmaps_; index++) { - assert(it->second != NULL); - it->second->Render(buffer, view); + Bitmaps::const_iterator it = bitmaps_.find(index); + if (it != bitmaps_.end()) + { + assert(it->second != NULL); + it->second->Render(buffer, view); + } } } @@ -699,14 +703,18 @@ double x, double y) const { - for (Bitmaps::const_iterator it = bitmaps_.begin(); - it != bitmaps_.end(); ++it) + // Render layers in the foreground-to-background order + for (size_t i = countBitmaps_; i > 0; i--) { - assert(it->second != NULL); - if (it->second->Contains(x, y)) + index = i - 1; + Bitmaps::const_iterator it = bitmaps_.find(index); + if (it != bitmaps_.end()) { - index = it->first; - return true; + assert(it->second != NULL); + if (it->second->Contains(x, y)) + { + return true; + } } } @@ -840,7 +848,7 @@ size_t bitmap; if (stack_.LookupBitmap(bitmap, x, y)) { - printf("CLICK on bitmap %d\n", bitmap); + printf("CLICK on bitmap %ld\n", bitmap); return new MoveBitmapTracker(stack_, bitmap, x, y, (modifiers & KeyboardModifiers_Shift)); } @@ -897,7 +905,6 @@ protected: virtual Extent2D GetSceneExtent() { - printf("Get extent\n"); return stack_.GetSceneExtent(); } @@ -938,10 +945,11 @@ virtual bool Render(Orthanc::ImageAccessor& target) { - Orthanc::Image buffer(Orthanc::PixelFormat_Float32, target.GetWidth(), target.GetHeight(), false); + Orthanc::Image buffer(Orthanc::PixelFormat_Float32, target.GetWidth(), + target.GetHeight(), false); stack_.Render(buffer, GetView()); - // As in GrayscaleFrameRenderer => TODO MERGE + // As in GrayscaleFrameRenderer => TODO MERGE? float windowCenter, windowWidth; if (!stack_.GetWindowing(windowCenter, windowWidth)) @@ -953,19 +961,19 @@ float x0 = windowCenter - windowWidth / 2.0f; float x1 = windowCenter + windowWidth / 2.0f; - const unsigned int width = target.GetWidth(); - const unsigned int height = target.GetHeight(); - - for (unsigned int y = 0; y < height; y++) + if (windowWidth >= 0.001f) // Avoid division by zero at (*) { - const float* p = reinterpret_cast(buffer.GetConstRow(y)); - uint8_t* q = reinterpret_cast(target.GetRow(y)); + const unsigned int width = target.GetWidth(); + const unsigned int height = target.GetHeight(); + + for (unsigned int y = 0; y < height; y++) + { + const float* p = reinterpret_cast(buffer.GetConstRow(y)); + uint8_t* q = reinterpret_cast(target.GetRow(y)); - for (unsigned int x = 0; x < width; x++, p++, q += 4) - { - uint8_t v = 0; - if (windowWidth >= 0.001f) // Avoid division by zero + for (unsigned int x = 0; x < width; x++, p++, q += 4) { + uint8_t v = 0; if (*p >= x1) { v = 255; @@ -977,7 +985,7 @@ else { // https://en.wikipedia.org/wiki/Linear_interpolation - v = static_cast(255.0f * (*p - x0) / (x1 - x0)); + v = static_cast(255.0f * (*p - x0) / (x1 - x0)); // (*) } // TODO MONOCHROME1 @@ -985,14 +993,18 @@ { v = 255 - v; }*/ + + q[0] = v; + q[1] = v; + q[2] = v; + q[3] = 255; } - - q[3] = 255; - q[2] = v; - q[1] = v; - q[0] = v; } } + else + { + Orthanc::ImageProcessing::Set(target, 0, 0, 0, 255); + } return true; }