| // | |
| // Copyright 2014 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. | |
| // | |
| #include "libANGLE/AttributeMap.h" | |
| #include "common/debug.h" | |
| namespace egl | |
| { | |
| AttributeMap::AttributeMap() = default; | |
| AttributeMap::AttributeMap(const AttributeMap &other) = default; | |
| AttributeMap &AttributeMap::operator=(const AttributeMap &other) = default; | |
| AttributeMap::~AttributeMap() = default; | |
| void AttributeMap::insert(EGLAttrib key, EGLAttrib value) | |
| { | |
| mValidatedAttributes[key] = value; | |
| } | |
| bool AttributeMap::contains(EGLAttrib key) const | |
| { | |
| return (attribs().find(key) != attribs().end()); | |
| } | |
| EGLAttrib AttributeMap::get(EGLAttrib key) const | |
| { | |
| auto iter = attribs().find(key); | |
| ASSERT(iter != attribs().end()); | |
| return iter->second; | |
| } | |
| EGLAttrib AttributeMap::get(EGLAttrib key, EGLAttrib defaultValue) const | |
| { | |
| auto iter = attribs().find(key); | |
| return (iter != attribs().end()) ? iter->second : defaultValue; | |
| } | |
| EGLint AttributeMap::getAsInt(EGLAttrib key) const | |
| { | |
| return static_cast<EGLint>(get(key)); | |
| } | |
| EGLint AttributeMap::getAsInt(EGLAttrib key, EGLint defaultValue) const | |
| { | |
| return static_cast<EGLint>(get(key, static_cast<EGLAttrib>(defaultValue))); | |
| } | |
| bool AttributeMap::isEmpty() const | |
| { | |
| return attribs().empty(); | |
| } | |
| std::vector<EGLint> AttributeMap::toIntVector() const | |
| { | |
| std::vector<EGLint> ret; | |
| for (const auto &pair : attribs()) | |
| { | |
| ret.push_back(static_cast<EGLint>(pair.first)); | |
| ret.push_back(static_cast<EGLint>(pair.second)); | |
| } | |
| ret.push_back(EGL_NONE); | |
| return ret; | |
| } | |
| AttributeMap::const_iterator AttributeMap::begin() const | |
| { | |
| return attribs().begin(); | |
| } | |
| AttributeMap::const_iterator AttributeMap::end() const | |
| { | |
| return attribs().end(); | |
| } | |
| bool AttributeMap::validate(const ValidationContext *val, | |
| const egl::Display *display, | |
| AttributeValidationFunc validationFunc) const | |
| { | |
| if (mIntPointer) | |
| { | |
| for (const EGLint *curAttrib = mIntPointer; curAttrib[0] != EGL_NONE; curAttrib += 2) | |
| { | |
| if (!validationFunc(val, display, curAttrib[0])) | |
| { | |
| return false; | |
| } | |
| mValidatedAttributes[static_cast<EGLAttrib>(curAttrib[0])] = | |
| static_cast<EGLAttrib>(curAttrib[1]); | |
| } | |
| mIntPointer = nullptr; | |
| } | |
| if (mAttribPointer) | |
| { | |
| for (const EGLAttrib *curAttrib = mAttribPointer; curAttrib[0] != EGL_NONE; curAttrib += 2) | |
| { | |
| if (!validationFunc(val, display, curAttrib[0])) | |
| { | |
| return false; | |
| } | |
| mValidatedAttributes[curAttrib[0]] = curAttrib[1]; | |
| } | |
| mAttribPointer = nullptr; | |
| } | |
| return true; | |
| } | |
| void AttributeMap::initializeWithoutValidation() const | |
| { | |
| auto alwaysTrue = [](const ValidationContext *, const egl::Display *, EGLAttrib) { | |
| return true; | |
| }; | |
| (void)validate(nullptr, nullptr, alwaysTrue); | |
| } | |
| // static | |
| AttributeMap AttributeMap::CreateFromIntArray(const EGLint *attributes) | |
| { | |
| AttributeMap map; | |
| map.mIntPointer = attributes; | |
| return map; | |
| } | |
| // static | |
| AttributeMap AttributeMap::CreateFromAttribArray(const EGLAttrib *attributes) | |
| { | |
| AttributeMap map; | |
| map.mAttribPointer = attributes; | |
| return map; | |
| } | |
| bool AttributeMap::isValidated() const | |
| { | |
| return mIntPointer == nullptr && mAttribPointer == nullptr; | |
| } | |
| } // namespace egl |