# HG changeset patch # User Alain Mazy # Date 1563435670 -7200 # Node ID 7a7e4e1f558f06a1fd265781b65db3c86781530e # Parent 2f16ad9d30ad0b87955d43b248726a40c8fbb266 SdlCairo resizable diff -r 2f16ad9d30ad -r 7a7e4e1f558f Framework/Scene2D/CairoCompositor.cpp --- a/Framework/Scene2D/CairoCompositor.cpp Thu Jul 18 09:22:08 2019 +0200 +++ b/Framework/Scene2D/CairoCompositor.cpp Thu Jul 18 09:41:10 2019 +0200 @@ -91,9 +91,14 @@ unsigned int canvasHeight) : helper_(scene, *this) { + UpdateSize(canvasWidth, canvasHeight); + } + + void CairoCompositor::UpdateSize(unsigned int canvasWidth, + unsigned int canvasHeight) + { canvas_.SetSize(canvasWidth, canvasHeight, false); } - CairoCompositor::~CairoCompositor() { diff -r 2f16ad9d30ad -r 7a7e4e1f558f Framework/Scene2D/CairoCompositor.h --- a/Framework/Scene2D/CairoCompositor.h Thu Jul 18 09:22:08 2019 +0200 +++ b/Framework/Scene2D/CairoCompositor.h Thu Jul 18 09:41:10 2019 +0200 @@ -82,6 +82,9 @@ virtual void Refresh(); + void UpdateSize(unsigned int canvasWidth, + unsigned int canvasHeight); + Orthanc::ImageAccessor* RenderText(size_t fontIndex, const std::string& utf8) const; }; diff -r 2f16ad9d30ad -r 7a7e4e1f558f Framework/Viewport/SdlViewport.cpp --- a/Framework/Viewport/SdlViewport.cpp Thu Jul 18 09:22:08 2019 +0200 +++ b/Framework/Viewport/SdlViewport.cpp Thu Jul 18 09:41:10 2019 +0200 @@ -56,17 +56,7 @@ window_(title, width, height, false /* enable OpenGL */, allowDpiScaling), compositor_(GetScene(), width, height) { - static const uint32_t rmask = 0x00ff0000; - static const uint32_t gmask = 0x0000ff00; - static const uint32_t bmask = 0x000000ff; - - sdlSurface_ = SDL_CreateRGBSurfaceFrom((void*)(compositor_.GetCanvas().GetBuffer()), width, height, 32, - compositor_.GetCanvas().GetPitch(), rmask, gmask, bmask, 0); - if (!sdlSurface_) - { - LOG(ERROR) << "Cannot create a SDL surface from a Cairo surface"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } + UpdateSdlSurfaceSize(width, height); } @@ -85,4 +75,29 @@ window_.Render(sdlSurface_); } + void SdlCairoViewport::UpdateSize(unsigned int width, + unsigned int height) + { + compositor_.UpdateSize(width, height); + UpdateSdlSurfaceSize(width, height); + Refresh(); + } + + + void SdlCairoViewport::UpdateSdlSurfaceSize(unsigned int width, + unsigned int height) + { + static const uint32_t rmask = 0x00ff0000; + static const uint32_t gmask = 0x0000ff00; + static const uint32_t bmask = 0x000000ff; + + sdlSurface_ = SDL_CreateRGBSurfaceFrom((void*)(compositor_.GetCanvas().GetBuffer()), width, height, 32, + compositor_.GetCanvas().GetPitch(), rmask, gmask, bmask, 0); + if (!sdlSurface_) + { + LOG(ERROR) << "Cannot create a SDL surface from a Cairo surface"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + } diff -r 2f16ad9d30ad -r 7a7e4e1f558f Framework/Viewport/SdlViewport.h --- a/Framework/Viewport/SdlViewport.h Thu Jul 18 09:22:08 2019 +0200 +++ b/Framework/Viewport/SdlViewport.h Thu Jul 18 09:41:10 2019 +0200 @@ -58,6 +58,9 @@ } virtual SdlWindow& GetWindow() = 0; + + virtual void UpdateSize(unsigned int width, + unsigned int height) = 0; }; class SdlOpenGLViewport : public SdlViewport @@ -88,6 +91,12 @@ { return context_.GetWindow(); } + + virtual void UpdateSize(unsigned int width, + unsigned int height) + { + // nothing to do in OpenGL, the OpenGLCompositor::UpdateSize will be called automatically + } }; @@ -124,5 +133,11 @@ virtual void Refresh(); + virtual void UpdateSize(unsigned int width, + unsigned int height); + + private: + void UpdateSdlSurfaceSize(unsigned int width, + unsigned int height); }; } diff -r 2f16ad9d30ad -r 7a7e4e1f558f Samples/Sdl/BasicScene.cpp --- a/Samples/Sdl/BasicScene.cpp Thu Jul 18 09:22:08 2019 +0200 +++ b/Samples/Sdl/BasicScene.cpp Thu Jul 18 09:41:10 2019 +0200 @@ -337,6 +337,7 @@ { case SDL_WINDOWEVENT_SIZE_CHANGED: tracker.reset(); + viewport.UpdateSize(event.window.data1, event.window.data2); break; case SDL_WINDOWEVENT_SHOWN: