diff options
-rw-r--r-- | common/headless_view.cpp | 30 | ||||
-rw-r--r-- | common/headless_view.hpp | 5 | ||||
-rw-r--r-- | test/headless.cpp | 8 |
3 files changed, 29 insertions, 14 deletions
diff --git a/common/headless_view.cpp b/common/headless_view.cpp index d19db57483..9775da1d57 100644 --- a/common/headless_view.cpp +++ b/common/headless_view.cpp @@ -7,7 +7,8 @@ namespace mbgl { -HeadlessView::HeadlessView() : display_(std::make_shared<HeadlessDisplay>()) { +HeadlessView::HeadlessView() + : display_(std::make_shared<HeadlessDisplay>()) { createContext(); } @@ -43,8 +44,12 @@ void HeadlessView::createContext() { void HeadlessView::resize(uint16_t width, uint16_t height, float pixelRatio) { clear_buffers(); - width *= pixelRatio; - height *= pixelRatio; + width_ = width; + height_ = height; + pixelRatio_ = pixelRatio; + + const unsigned int w = width_ * pixelRatio_; + const unsigned int h = height_ * pixelRatio_; #if MBGL_USE_CGL make_active(); @@ -52,12 +57,12 @@ void HeadlessView::resize(uint16_t width, uint16_t height, float pixelRatio) { // Create depth/stencil buffer glGenRenderbuffersEXT(1, &fbo_depth_stencil); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, fbo_depth_stencil); - glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH24_STENCIL8_EXT, width, height); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH24_STENCIL8_EXT, w, h); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); glGenRenderbuffersEXT(1, &fbo_color); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, fbo_color); - glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, width, height); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, w, h); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); glGenFramebuffersEXT(1, &fbo); @@ -87,11 +92,24 @@ void HeadlessView::resize(uint16_t width, uint16_t height, float pixelRatio) { #endif #if MBGL_USE_GLX - x_pixmap = XCreatePixmap(x_display, DefaultRootWindow(x_display), width, height, 32); + x_pixmap = XCreatePixmap(x_display, DefaultRootWindow(x_display), w, h, 32); glx_pixmap = glXCreateGLXPixmap(x_display, x_info, x_pixmap); #endif } +const std::unique_ptr<uint32_t[]>* HeadlessView::readPixels() { + const unsigned int w = width_ * pixelRatio_; + const unsigned int h = height_ * pixelRatio_; + + const std::unique_ptr<uint32_t[]> pixels(new uint32_t[w * h]); + + make_active(); + glReadPixels(0, 0, width_, height_, GL_RGBA, GL_UNSIGNED_BYTE, pixels.get()); + make_inactive(); + + return &pixels; +} + void HeadlessView::clear_buffers() { #if MBGL_USE_CGL make_active(); diff --git a/common/headless_view.hpp b/common/headless_view.hpp index 13a5b01099..b59366349e 100644 --- a/common/headless_view.hpp +++ b/common/headless_view.hpp @@ -26,6 +26,7 @@ public: void createContext(); void resize(uint16_t width, uint16_t height, float pixelRatio); + const std::unique_ptr<uint32_t[]>* readPixels(); void notify_map_change(MapChange change, timestamp delay = 0); void make_active(); @@ -36,9 +37,11 @@ public: private: void clear_buffers(); - private: std::shared_ptr<HeadlessDisplay> display_; + uint16_t width_; + uint16_t height_; + float pixelRatio_; #if MBGL_USE_CGL CGLContextObj gl_context; diff --git a/test/headless.cpp b/test/headless.cpp index 981a9dcd59..439a6dcab7 100644 --- a/test/headless.cpp +++ b/test/headless.cpp @@ -98,13 +98,7 @@ TEST_P(HeadlessTest, render) { const unsigned int w = width * pixelRatio; const unsigned int h = height * pixelRatio; - const std::unique_ptr<uint32_t[]> pixels(new uint32_t[w * h]); - - map.view.make_active(); - glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels.get()); - map.view.make_inactive(); - - const std::string image = util::compress_png(w, h, pixels.get(), true); + const std::string image = util::compress_png(w, h, view.readPixels()->get(), true); util::write_file(actual_image, image); } } |