//
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//

// Config.h: Defines the egl::Config class, describing the format, type
// and size for an egl::Surface. Implements EGLConfig and related functionality.
// [EGL 1.5] section 3.4 page 19.

#ifndef INCLUDE_CONFIG_H_
#define INCLUDE_CONFIG_H_

#include "libANGLE/AttributeMap.h"

#include "common/angleutils.h"

#include <EGL/egl.h>
#include <GLES2/gl2.h>

#include <map>
#include <vector>

namespace egl
{

struct Config
{
    Config();

    GLenum renderTargetFormat;      // TODO(geofflang): remove this
    GLenum depthStencilFormat;      // TODO(geofflang): remove this

    EGLint bufferSize;              // Depth of the color buffer
    EGLint redSize;                 // Bits of Red in the color buffer
    EGLint greenSize;               // Bits of Green in the color buffer
    EGLint blueSize;                // Bits of Blue in the color buffer
    EGLint luminanceSize;           // Bits of Luminance in the color buffer
    EGLint alphaSize;               // Bits of Alpha in the color buffer
    EGLint alphaMaskSize;           // Bits of Alpha Mask in the mask buffer
    EGLBoolean bindToTextureRGB;    // True if bindable to RGB textures.
    EGLBoolean bindToTextureRGBA;   // True if bindable to RGBA textures.
    EGLenum colorBufferType;        // Color buffer type
    EGLenum configCaveat;           // Any caveats for the configuration
    EGLint configID;                // Unique EGLConfig identifier
    EGLint conformant;              // Whether contexts created with this config are conformant
    EGLint depthSize;               // Bits of Z in the depth buffer
    EGLint level;                   // Frame buffer level
    EGLBoolean matchNativePixmap;   // Match the native pixmap format
    EGLint maxPBufferWidth;         // Maximum width of pbuffer
    EGLint maxPBufferHeight;        // Maximum height of pbuffer
    EGLint maxPBufferPixels;        // Maximum size of pbuffer
    EGLint maxSwapInterval;         // Maximum swap interval
    EGLint minSwapInterval;         // Minimum swap interval
    EGLBoolean nativeRenderable;    // EGL_TRUE if native rendering APIs can render to surface
    EGLint nativeVisualID;          // Handle of corresponding native visual
    EGLint nativeVisualType;        // Native visual type of the associated visual
    EGLint renderableType;          // Which client rendering APIs are supported.
    EGLint sampleBuffers;           // Number of multisample buffers
    EGLint samples;                 // Number of samples per pixel
    EGLint stencilSize;             // Bits of Stencil in the stencil buffer
    EGLint surfaceType;             // Which types of EGL surfaces are supported.
    EGLenum transparentType;        // Type of transparency supported
    EGLint transparentRedValue;     // Transparent red value
    EGLint transparentGreenValue;   // Transparent green value
    EGLint transparentBlueValue;    // Transparent blue value
    EGLint optimalOrientation;      // Optimal window surface orientation
    EGLenum colorComponentType;     // Color component type
};

class ConfigSet
{
  public:
    EGLint add(const Config &config);
    const Config &get(EGLint id) const;

    void clear();

    size_t size() const;

    bool contains(const Config *config) const;

    // Filter configurations based on the table in [EGL 1.5] section 3.4.1.2 page 29
    std::vector<const Config*> filter(const AttributeMap &attributeMap) const;

  private:
    typedef std::map<EGLint, const Config> ConfigMap;
    ConfigMap mConfigs;
};

}

#endif   // INCLUDE_CONFIG_H_
