text: /*
    ==============================================================================
  
     This file is part of the JUCE library.
     Copyright (c) 2020 - Raw Material Software Limited
  
     JUCE is an open source library subject to commercial or open-source
     licensing.
  
     By using JUCE, you agree to the terms of both the JUCE 6 End-User License
     Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).
  
     End User License Agreement: www.juce.com/juce-6-licence
     Privacy Policy: www.juce.com/juce-privacy-policy
  
     Or: You may also use this code under the terms of the GPL v3 (see
     www.gnu.org/licenses).
  
     JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
     EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
     DISCLAIMED.
  
    ==============================================================================
  */
  
  namespace juce
  {
  
  void OpenGLHelpers::resetErrorState()
  {
      while (glGetError() != GL_NO_ERROR) {}
  }
  
  void* OpenGLHelpers::getExtensionFunction (const char* functionName)
  {
     #if JUCE_WINDOWS
      return (void*) wglGetProcAddress (functionName);
     #elif JUCE_LINUX
      return (void*) glXGetProcAddress ((const GLubyte*) functionName);
     #else
      static void* handle = dlopen (nullptr, RTLD_LAZY);
      return dlsym (handle, functionName);
     #endif
  }
  
  bool OpenGLHelpers::isExtensionSupported (const char* const extensionName)
  {
      jassert (extensionName != nullptr); // you must supply a genuine string for this.
      jassert (isContextActive()); // An OpenGL context will need to be active before calling this.
  
      const char* extensions = (const char*) glGetString (GL_EXTENSIONS);
      jassert (extensions != nullptr); // Perhaps you didn't activate an OpenGL context before calling this?
  
      for (;;)
      {
          const char* found = strstr (extensions, extensionName);
  
          if (found == nullptr)
              break;
  
          extensions = found + strlen (extensionName);
  
          if (extensions[0] == ' ' || extensions[0] == 0)
              return true;
      }
  
      return false;
  }
  
  void OpenGLHelpers::clear (Colour colour)
  {
      glClearColor (colour.getFloatRed(), colour.getFloatGreen(),
                    colour.getFloatBlue(), colour.getFloatAlpha());
  
      glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
  }
  
  void OpenGLHelpers::enableScissorTest (Rectangle<int> clip)
  {
      glEnable (GL_SCISSOR_TEST);
      glScissor (clip.getX(), clip.getY(), clip.getWidth(), clip.getHeight());
  }
  
  String OpenGLHelpers::translateVertexShaderToV3 (const String& code)
  {
     #if JUCE_OPENGL3
      if (OpenGLShaderProgram::getLanguageVersion() > 1.2)
      {
          String output;
  
         #if JUCE_ANDROID
          {
              int numAttributes = 0;
  
              for (int p = code.indexOf (0, "attribute "); p >= 0; p = code.indexOf (p + 1, "attribute "))
                  numAttributes++;
  
              int last = 0;
  
              for (int p = code.indexOf (0, "attribute "); p >= 0; p = code.indexOf (p + 1, "attribute "))
              {
                  output += code.substring (last, p) + "layout(location=" + String (--numAttributes) + ") in ";
  
                  last = p + 10;
              }
  
              output += code.substring (last);
          }
         #else
          output = code.replace ("attribute", "in");
         #endif
  
          return JUCE_GLSL_VERSION "\n" + output.replace ("varying", "out");
      }
     #endif
  	DBG(code);
      return code;
  }
  
  String OpenGLHelpers::translateFragmentShaderToV3 (const String& code)
  {
     #if JUCE_OPENGL3
      if (OpenGLShaderProgram::getLanguageVersion() > 1.2)
          return JUCE_GLSL_VERSION "\n"
                 "out " JUCE_MEDIUMP " vec4 fragColor;\n"
                  + code.replace ("varying", "in")
                        .replace ("texture2D", "texture")
                        .replace ("gl_FragColor", "fragColor");
     #endif
  
  	DBG(code);
      return code;
  }
  
  } // namespace juce
  