// Copyright 2018 The Emscripten Authors.  All rights reserved.
// Emscripten is available under two separate licenses, the MIT license and the
// University of Illinois/NCSA Open Source License.  Both these licenses can be
// found in the LICENSE file.

#include <stdio.h>
#include <stdbool.h>
#include <GL/gl.h>
#include <GL/glut.h>

#ifndef REPORT_RESULT
#define REPORT_RESULT(x) printf("%d\n", result)
#endif

int main(int argc, char* argv[]) {
  bool stencilActivated = false;
  bool depthActivated = false;
  bool alphaActivated = false;
  bool antiAliasingActivated = false;

  unsigned int mode = GLUT_RGBA | GLUT_DOUBLE;

#ifdef STENCIL_ACTIVATED
    stencilActivated = true;
    mode |= GLUT_STENCIL;
#endif
#ifdef DEPTH_ACTIVATED
    depthActivated = true;
    mode |= GLUT_DEPTH;
#endif
#ifdef ALPHA_ACTIVATED
    alphaActivated = true;
    mode |= GLUT_ALPHA;
#endif
#ifdef AA_ACTIVATED
    antiAliasingActivated = true;
    mode |= GLUT_MULTISAMPLE;
#endif

  glutInit(&argc, argv);
  glutInitWindowSize(640, 480);
  glutInitDisplayMode(mode);
  glutCreateWindow(__FILE__);

  printf("stencil:   %d\n", glutGet(GLUT_WINDOW_STENCIL_SIZE));
  printf("depth:     %d\n", glutGet(GLUT_WINDOW_DEPTH_SIZE));
  printf("alpha:     %d\n", glutGet(GLUT_WINDOW_ALPHA_SIZE));
  printf("antialias: %d\n", glutGet(GLUT_WINDOW_NUM_SAMPLES));
  int result = (
    (!stencilActivated      || glutGet(GLUT_WINDOW_STENCIL_SIZE) > 0) &&
    (!depthActivated        || glutGet(GLUT_WINDOW_DEPTH_SIZE)   > 0) &&
    (!alphaActivated        || glutGet(GLUT_WINDOW_ALPHA_SIZE)   > 0) &&
    (!antiAliasingActivated || glutGet(GLUT_WINDOW_NUM_SAMPLES)  > 0)
    );

  // fix-up "ReferenceError: GL is not defined,createContext" due to
  // overzealous JS stripping
  glClear(0);

  REPORT_RESULT(result);
}
