text: #include "android_gl_utils.hpp"
  
  #include "../../../../../base/logging.hpp"
  #include "../../../../../base/string_utils.hpp"
  
  namespace android
  {
  
  ConfigComparator::ConfigComparator(EGLDisplay display)
    : m_display(display)
  {
  }
  
  bool ConfigComparator::operator()(EGLConfig const & l, EGLConfig const & r) const
  {
    int const weight = configWeight(l) - configWeight(r);
    if (weight == 0)
      return configAlphaSize(l) < configAlphaSize(r);
  
    return weight < 0;
  }
  
  int ConfigComparator::configWeight(EGLConfig const & config) const
  {
    int val = -1;
    eglGetConfigAttrib(m_display, config, EGL_CONFIG_CAVEAT, &val);
  
    switch (val)
    {
      case EGL_NONE:
        return 0;
      case EGL_SLOW_CONFIG:
        return 1;
      case EGL_NON_CONFORMANT_CONFIG:
        return 2;
      default:
        return 0;
    }
  }
  
  int ConfigComparator::configAlphaSize(EGLConfig const & config) const
  {
    int val = 0;
    eglGetConfigAttrib(m_display, config, EGL_ALPHA_SIZE, &val);
    return val;
  }
  
  namespace
  {
  
  string GetEglError(EGLint error)
  {
    switch (error)
    {
    case EGL_NOT_INITIALIZED :      return "EGL_NOT_INITIALIZED";
    case EGL_BAD_ACCESS :           return "EGL_BAD_ACCESS";
    case EGL_BAD_ALLOC :            return "EGL_BAD_ALLOC";
    case EGL_BAD_ATTRIBUTE :        return "EGL_BAD_ATTRIBUTE";
    case EGL_BAD_CONFIG :           return "EGL_BAD_CONFIG";
    case EGL_BAD_CONTEXT :          return "EGL_BAD_CONTEXT";
    case EGL_BAD_CURRENT_SURFACE :  return "EGL_BAD_CURRENT_SURFACE";
    case EGL_BAD_DISPLAY :          return "EGL_BAD_DISPLAY";
    case EGL_BAD_MATCH :            return "EGL_BAD_MATCH";
    case EGL_BAD_NATIVE_PIXMAP :    return "EGL_BAD_NATIVE_PIXMAP";
    case EGL_BAD_NATIVE_WINDOW :    return "EGL_BAD_NATIVE_WINDOW";
    case EGL_BAD_PARAMETER :        return "EGL_BAD_PARAMETER";
    case EGL_BAD_SURFACE :          return "EGL_BAD_SURFACE";
    case EGL_CONTEXT_LOST :         return "EGL_CONTEXT_LOST";
    default:                        return strings::to_string(error);
    }
  }
  
  }  // namespace
  
  void CheckEGL(my::SrcPoint const & src)
  {
    EGLint error = eglGetError();
    while (error != EGL_SUCCESS)
    {
      LOG(LERROR, ("SrcPoint : ", src, ". EGL error : ", GetEglError(error)));
      error = eglGetError();
    }
  }
  
  }  // namespace android
  