blob: 4cab8f2cade3ac254ae5f40d3c445878569ede0e [file] [log] [blame]
/*
* Copyright (C) 2013 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CSS_STYLE_COLOR_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_STYLE_COLOR_H_
#include "third_party/blink/public/mojom/frame/color_scheme.mojom-blink-forward.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/css_value_keywords.h"
#include "third_party/blink/renderer/platform/graphics/color.h"
#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
namespace blink {
class CORE_EXPORT StyleColor {
DISALLOW_NEW();
public:
StyleColor() = default;
explicit StyleColor(Color color)
: color_(color), color_keyword_(CSSValueID::kInvalid) {}
explicit StyleColor(RGBA32 color)
: color_(color), color_keyword_(CSSValueID::kInvalid) {}
explicit StyleColor(CSSValueID keyword) : color_keyword_(keyword) {}
// TODO(1081945): We need to store the color and keyword for system colors
// to allow forced colors mode to access system color keywords while the
// CSSSystemColorComputeToSelf feature is under development. Once
// CSSSystemColorComputeToSelf is enabled, we can remove this ctr and
// EffectiveColorKeyword() and use color_keyword_ directly, instead.
StyleColor(Color color, CSSValueID keyword)
: color_(color), color_keyword_(keyword) {}
static StyleColor CurrentColor() { return StyleColor(); }
bool IsCurrentColor() const {
return color_keyword_ == CSSValueID::kCurrentcolor;
}
bool IsSystemColor() const { return IsSystemColor(color_keyword_); }
Color GetColor() const {
DCHECK(IsNumeric());
return color_;
}
CSSValueID GetColorKeyword() const {
DCHECK(!IsNumeric());
return color_keyword_;
}
// TODO(1081945): Once CSSSystemColorComputeToSelf is enabled, we can remove
// |is_forced_color|.
Color Resolve(Color current_color,
mojom::blink::ColorScheme color_scheme,
bool is_forced_color = false) const;
// Resolve and override the resolved color's alpha channel as specified by
// |alpha|.
// TODO(1081945): Once CSSSystemColorComputeToSelf is enabled, we can remove
// |is_forced_color|.
Color ResolveWithAlpha(Color current_color,
mojom::blink::ColorScheme color_scheme,
int alpha,
bool is_forced_color = false) const;
bool IsNumeric() const {
return EffectiveColorKeyword() == CSSValueID::kInvalid;
}
static Color ColorFromKeyword(CSSValueID,
mojom::blink::ColorScheme color_scheme);
static bool IsColorKeyword(CSSValueID);
static bool IsSystemColor(CSSValueID);
inline bool operator==(const StyleColor& other) const {
DCHECK(IsValid());
DCHECK(other.IsValid());
return color_ == other.color_ && color_keyword_ == other.color_keyword_;
}
inline bool operator!=(const StyleColor& other) const {
return !(*this == other);
}
protected:
inline bool IsValid() const {
// At least one of color_keyword_ and color_ should retain its default
// value.
return EffectiveColorKeyword() == CSSValueID::kInvalid ||
color_ == Color() || IsSystemColor(EffectiveColorKeyword());
}
Color color_;
CSSValueID color_keyword_ = CSSValueID::kCurrentcolor;
private:
CSSValueID EffectiveColorKeyword() const;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_CSS_STYLE_COLOR_H_