#ifndef MBGL_UTIL_GL_HELPER #define MBGL_UTIL_GL_HELPER #include #include namespace { template class Preserve { public: Preserve() : data(Create()) {} ~Preserve() { Destroy(data); } private: const T data; }; inline bool getBlend() { return glIsEnabled(GL_BLEND); } inline void setBlend(const bool& enabled) { enabled ? MBGL_CHECK_ERROR(glEnable(GL_BLEND)) : MBGL_CHECK_ERROR(glDisable(GL_BLEND)); } inline std::array getClearColor() { std::array color; MBGL_CHECK_ERROR(glGetFloatv(GL_COLOR_CLEAR_VALUE, color.data())); return color; } inline void setClearColor(const std::array& color) { MBGL_CHECK_ERROR(glClearColor(color[0], color[1], color[2], color[3])); } inline std::array getBlendFunc() { GLint func[2]; glGetIntegerv(GL_BLEND_SRC_ALPHA, &func[0]); glGetIntegerv(GL_BLEND_DST_ALPHA, &func[1]); return {{ static_cast(func[0]), static_cast(func[1]) }}; } inline void setBlendFunc(const std::array& func) { MBGL_CHECK_ERROR(glBlendFunc(func[0], func[1])); } #ifndef GL_ES_VERSION_2_0 inline std::array getPixelZoom() { std::array zoom; glGetDoublev(GL_ZOOM_X, &zoom[0]); glGetDoublev(GL_ZOOM_Y, &zoom[1]); return zoom; } inline void setPixelZoom(const std::array& func) { MBGL_CHECK_ERROR(glPixelZoom(func[0], func[1])); } inline std::array getRasterPos() { std::array pos; MBGL_CHECK_ERROR(glGetDoublev(GL_CURRENT_RASTER_POSITION, pos.data())); return pos; } inline void setRasterPos(const std::array& pos) { MBGL_CHECK_ERROR(glRasterPos4d(pos[0], pos[1], pos[2], pos[3])); } #endif } // end anonymous namespace namespace mbgl { namespace gl { using PreserveBlend = Preserve; using PreserveClearColor = Preserve, getClearColor, setClearColor>; using PreserveBlendFunc = Preserve, getBlendFunc, setBlendFunc>; #ifndef GL_ES_VERSION_2_0 using PreservePixelZoom = Preserve, getPixelZoom, setPixelZoom>; using PreserveRasterPos = Preserve, getRasterPos, setRasterPos>; #endif } } #endif