// // 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(get(key)); } EGLint AttributeMap::getAsInt(EGLAttrib key, EGLint defaultValue) const { return static_cast(get(key, static_cast(defaultValue))); } bool AttributeMap::isEmpty() const { return attribs().empty(); } std::vector AttributeMap::toIntVector() const { std::vector ret; for (const auto &pair : attribs()) { ret.push_back(static_cast(pair.first)); ret.push_back(static_cast(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(curAttrib[0])] = static_cast(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