# -*- coding: utf-8 -*-

#-------------------------------------------------------------------------
# drawElements Quality Program utilities
# --------------------------------------
#
# Copyright 2015 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#-------------------------------------------------------------------------

import os
import string

from egl.common import *
from khr_util.format import indentLines
from khr_util.gen_str_util import addValuePrefix, genStrUtilProtos, genStrUtilImpls

# Bitfield mapping
BITFIELD_GROUPS = [
    ("APIBits", [
        "OPENGL_BIT",
        "OPENGL_ES_BIT",
        "OPENGL_ES2_BIT",
        "OPENGL_ES3_BIT_KHR",
        "OPENVG_BIT"
        ]),
    ("SurfaceBits", [
        "PBUFFER_BIT",
        "PIXMAP_BIT",
        "WINDOW_BIT",
        "MULTISAMPLE_RESOLVE_BOX_BIT",
        "SWAP_BEHAVIOR_PRESERVED_BIT",
        "VG_ALPHA_FORMAT_PRE_BIT",
        "VG_COLORSPACE_LINEAR_BIT",
        "LOCK_SURFACE_BIT_KHR",
        "OPTIMAL_FORMAT_BIT_KHR"
        ])
]

# Enum mapping
ENUM_GROUPS = [
    ("Boolean", ["TRUE", "FALSE"]),
    ("BoolDontCare", ["TRUE", "FALSE", "DONT_CARE"]),
    ("API", ["OPENGL_API", "OPENGL_ES_API", "OPENVG_API"]),
    ("Error", [
        "SUCCESS",
        "NOT_INITIALIZED",
        "BAD_ACCESS",
        "BAD_ALLOC",
        "BAD_ATTRIBUTE",
        "BAD_CONFIG",
        "BAD_CONTEXT",
        "BAD_CURRENT_SURFACE",
        "BAD_DISPLAY",
        "BAD_MATCH",
        "BAD_NATIVE_PIXMAP",
        "BAD_NATIVE_WINDOW",
        "BAD_PARAMETER",
        "BAD_SURFACE",
        "CONTEXT_LOST"
        ]),
    ("ContextAttrib", [
        "CONFIG_ID",
        "CONTEXT_CLIENT_TYPE",
        "CONTEXT_CLIENT_VERSION",
        "RENDER_BUFFER"
        ]),
    ("ConfigAttrib", [
        "BUFFER_SIZE",
        "RED_SIZE",
        "GREEN_SIZE",
        "BLUE_SIZE",
        "LUMINANCE_SIZE",
        "ALPHA_SIZE",
        "ALPHA_MASK_SIZE",
        "BIND_TO_TEXTURE_RGB",
        "BIND_TO_TEXTURE_RGBA",
        "COLOR_BUFFER_TYPE",
        "CONFIG_CAVEAT",
        "CONFIG_ID",
        "CONFORMANT",
        "DEPTH_SIZE",
        "LEVEL",
        "MATCH_NATIVE_PIXMAP",
        "MAX_SWAP_INTERVAL",
        "MIN_SWAP_INTERVAL",
        "NATIVE_RENDERABLE",
        "NATIVE_VISUAL_TYPE",
        "RENDERABLE_TYPE",
        "SAMPLE_BUFFERS",
        "SAMPLES",
        "STENCIL_SIZE",
        "SURFACE_TYPE",
        "TRANSPARENT_TYPE",
        "TRANSPARENT_RED_VALUE",
        "TRANSPARENT_GREEN_VALUE",
        "TRANSPARENT_BLUE_VALUE",
        "COLOR_COMPONENT_TYPE_EXT"
        ]),
    ("SurfaceAttrib", [
        "CONFIG_ID",
        "WIDTH",
        "HEIGHT",
        "HORIZONTAL_RESOLUTION",
        "VERTICAL_RESOLUTION",
        "LARGEST_PBUFFER",
        "MIPMAP_TEXTURE",
        "MIPMAP_LEVEL",
        "MULTISAMPLE_RESOLVE",
        "PIXEL_ASPECT_RATIO",
        "RENDER_BUFFER",
        "SWAP_BEHAVIOR",
        "TEXTURE_FORMAT",
        "TEXTURE_TARGET",
        "ALPHA_FORMAT",
        "COLORSPACE"
        ]),
    ("YuvOrder", [
        "NONE",
        "YUV_ORDER_YUV_EXT",
        "YUV_ORDER_YVU_EXT",
        "YUV_ORDER_YUYV_EXT",
        "YUV_ORDER_UYVY_EXT",
        "YUV_ORDER_YVYU_EXT",
        "YUV_ORDER_VYUY_EXT",
        "YUV_ORDER_AYUV_EXT",
        ]),
    ("YuvPlaneBpp", [
        "YUV_PLANE_BPP_0_EXT",
        "YUV_PLANE_BPP_8_EXT",
        "YUV_PLANE_BPP_10_EXT",
        ]),
    ("ColorComponentType", ["COLOR_COMPONENT_TYPE_FIXED_EXT", "COLOR_COMPONENT_TYPE_FLOAT_EXT"]),
    ("SurfaceTarget", ["READ", "DRAW"]),

    # ConfigAttrib values
    ("ColorBufferType", ["RGB_BUFFER", "LUMINANCE_BUFFER"]),
    ("ConfigCaveat", ["NONE", "SLOW_CONFIG", "NON_CONFORMANT_CONFIG"]),
    ("TransparentType", ["NONE", "TRANSPARENT_RGB"]),

    # SurfaceAttrib values
    ("MultisampleResolve", ["MULTISAMPLE_RESOLVE_DEFAULT", "MULTISAMPLE_RESOLVE_BOX"]),
    ("RenderBuffer", ["SINGLE_BUFFER", "BACK_BUFFER"]),
    ("SwapBehavior", ["BUFFER_DESTROYED", "BUFFER_PRESERVED"]),
    ("TextureFormat", ["NO_TEXTURE", "TEXTURE_RGB", "TEXTURE_RGBA"]),
    ("TextureTarget", ["NO_TEXTURE", "TEXTURE_2D"]),
    ("AlphaFormat", ["ALPHA_FORMAT_NONPRE", "ALPHA_FORMAT_PRE"]),
    ("Colorspace", ["COLORSPACE_sRGB", "COLORSPACE_LINEAR"])
]

def gen (iface):
    enumGroups = addValuePrefix(ENUM_GROUPS, "EGL_")
    bitfieldGroups = addValuePrefix(BITFIELD_GROUPS, "EGL_")
    prototypeFile = os.path.join(EGL_DIR, "egluStrUtilPrototypes.inl")
    implFile = os.path.join(EGL_DIR, "egluStrUtil.inl")

    writeInlFile(prototypeFile, indentLines(genStrUtilProtos(iface, enumGroups, bitfieldGroups)))
    writeInlFile(implFile, genStrUtilImpls(iface, enumGroups, bitfieldGroups))
