/*
 * Copyright (C) 1999 Antti Koivisto (koivisto@kde.org)
 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights
 * reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 *
 */

#include "core/style/StyleRareInheritedData.h"

#include "core/style/AppliedTextDecoration.h"
#include "core/style/CursorData.h"
#include "core/style/DataEquivalency.h"
#include "core/style/ComputedStyle.h"
#include "core/style/ComputedStyleConstants.h"
#include "core/style/QuotesData.h"
#include "core/style/ShadowList.h"
#include "core/style/StyleImage.h"
#include "core/style/StyleInheritedVariables.h"

namespace blink {

struct SameSizeAsStyleRareInheritedData
    : public RefCounted<SameSizeAsStyleRareInheritedData> {
  void* style_image;
  Color first_color;
  float first_float;
  Color colors[7];
  void* own_ptrs[1];
  AtomicString atomic_strings[3];
  void* ref_ptrs[1];
  Persistent<void*> persistent_handles[2];
  Length lengths[1];
  float second_float;
  unsigned bitfields_[2];
  short paged_media_shorts[2];
  short hyphenation_shorts[3];
  uint8_t line_height_step;

  Color touch_colors;
  TabSize tab_size;
  void* variables[1];
  TextSizeAdjust text_size_adjust;
};

static_assert(sizeof(StyleRareInheritedData) <=
                  sizeof(SameSizeAsStyleRareInheritedData),
              "StyleRareInheritedData should stay small");

StyleRareInheritedData::StyleRareInheritedData()
    : list_style_image_(ComputedStyle::InitialListStyleImage()),
      text_stroke_width_(ComputedStyle::InitialTextStrokeWidth()),
      text_indent_(ComputedStyle::InitialTextIndent()),
      effective_zoom_(ComputedStyle::InitialZoom()),
      widows_(ComputedStyle::InitialWidows()),
      orphans_(ComputedStyle::InitialOrphans()),
      text_stroke_color_is_current_color_(true),
      text_fill_color_is_current_color_(true),
      text_emphasis_color_is_current_color_(true),
      caret_color_is_current_color_(false),
      caret_color_is_auto_(true),
      visited_link_text_stroke_color_is_current_color_(true),
      visited_link_text_fill_color_is_current_color_(true),
      visited_link_text_emphasis_color_is_current_color_(true),
      visited_link_caret_color_is_current_color_(false),
      visited_link_caret_color_is_auto_(true),
      text_security_(
          static_cast<unsigned>(ComputedStyle::InitialTextSecurity())),
      user_modify_(static_cast<unsigned>(EUserModify::kReadOnly)),
      word_break_(ComputedStyle::InitialWordBreak()),
      overflow_wrap_(ComputedStyle::InitialOverflowWrap()),
      line_break_(static_cast<unsigned>(LineBreak::kAuto)),
      user_select_(ComputedStyle::InitialUserSelect()),
      speak_(static_cast<unsigned>(ESpeak::kNormal)),
      hyphens_(kHyphensManual),
      text_emphasis_fill_(kTextEmphasisFillFilled),
      text_emphasis_mark_(kTextEmphasisMarkNone),
      text_emphasis_position_(kTextEmphasisPositionOver),
      text_align_last_(ComputedStyle::InitialTextAlignLast()),
      text_justify_(ComputedStyle::InitialTextJustify()),
      text_orientation_(kTextOrientationMixed),
      text_combine_(ComputedStyle::InitialTextCombine()),
      text_indent_line_(ComputedStyle::InitialTextIndentLine()),
      text_indent_type_(ComputedStyle::InitialTextIndentLine()),
      image_rendering_(ComputedStyle::InitialImageRendering()),
      text_underline_position_(ComputedStyle::InitialTextUnderlinePosition()),
      text_decoration_skip_(ComputedStyle::InitialTextDecorationSkip()),
      ruby_position_(ComputedStyle::InitialRubyPosition()),
      subtree_will_change_contents_(false),
      self_or_ancestor_has_dir_auto_attribute_(false),
      respect_image_orientation_(false),
      subtree_is_sticky_(false),
      hyphenation_limit_before_(-1),
      hyphenation_limit_after_(-1),
      hyphenation_limit_lines_(-1),
      line_height_step_(0),
      tap_highlight_color_(ComputedStyle::InitialTapHighlightColor()),
      tab_size_(ComputedStyle::InitialTabSize()),
      text_size_adjust_(ComputedStyle::InitialTextSizeAdjust()) {}

StyleRareInheritedData::StyleRareInheritedData(const StyleRareInheritedData& o)
    : RefCounted<StyleRareInheritedData>(),
      list_style_image_(o.list_style_image_),
      text_stroke_color_(o.text_stroke_color_),
      text_stroke_width_(o.text_stroke_width_),
      text_fill_color_(o.text_fill_color_),
      text_emphasis_color_(o.text_emphasis_color_),
      caret_color_(o.caret_color_),
      visited_link_text_stroke_color_(o.visited_link_text_stroke_color_),
      visited_link_text_fill_color_(o.visited_link_text_fill_color_),
      visited_link_text_emphasis_color_(o.visited_link_text_emphasis_color_),
      visited_link_caret_color_(o.visited_link_caret_color_),
      text_shadow_(o.text_shadow_),
      highlight_(o.highlight_),
      cursor_data_(o.cursor_data_),
      text_indent_(o.text_indent_),
      effective_zoom_(o.effective_zoom_),
      widows_(o.widows_),
      orphans_(o.orphans_),
      text_stroke_color_is_current_color_(
          o.text_stroke_color_is_current_color_),
      text_fill_color_is_current_color_(o.text_fill_color_is_current_color_),
      text_emphasis_color_is_current_color_(
          o.text_emphasis_color_is_current_color_),
      caret_color_is_current_color_(o.caret_color_is_current_color_),
      caret_color_is_auto_(o.caret_color_is_auto_),
      visited_link_text_stroke_color_is_current_color_(
          o.visited_link_text_stroke_color_is_current_color_),
      visited_link_text_fill_color_is_current_color_(
          o.visited_link_text_fill_color_is_current_color_),
      visited_link_text_emphasis_color_is_current_color_(
          o.visited_link_text_emphasis_color_is_current_color_),
      visited_link_caret_color_is_current_color_(
          o.visited_link_caret_color_is_current_color_),
      visited_link_caret_color_is_auto_(o.visited_link_caret_color_is_auto_),
      text_security_(o.text_security_),
      user_modify_(o.user_modify_),
      word_break_(o.word_break_),
      overflow_wrap_(o.overflow_wrap_),
      line_break_(o.line_break_),
      user_select_(o.user_select_),
      speak_(o.speak_),
      hyphens_(o.hyphens_),
      text_emphasis_fill_(o.text_emphasis_fill_),
      text_emphasis_mark_(o.text_emphasis_mark_),
      text_emphasis_position_(o.text_emphasis_position_),
      text_align_last_(o.text_align_last_),
      text_justify_(o.text_justify_),
      text_orientation_(o.text_orientation_),
      text_combine_(o.text_combine_),
      text_indent_line_(o.text_indent_line_),
      text_indent_type_(o.text_indent_type_),
      image_rendering_(o.image_rendering_),
      text_underline_position_(o.text_underline_position_),
      text_decoration_skip_(o.text_decoration_skip_),
      ruby_position_(o.ruby_position_),
      subtree_will_change_contents_(o.subtree_will_change_contents_),
      self_or_ancestor_has_dir_auto_attribute_(
          o.self_or_ancestor_has_dir_auto_attribute_),
      respect_image_orientation_(o.respect_image_orientation_),
      subtree_is_sticky_(o.subtree_is_sticky_),
      hyphenation_string_(o.hyphenation_string_),
      hyphenation_limit_before_(o.hyphenation_limit_before_),
      hyphenation_limit_after_(o.hyphenation_limit_after_),
      hyphenation_limit_lines_(o.hyphenation_limit_lines_),
      line_height_step_(o.line_height_step_),
      text_emphasis_custom_mark_(o.text_emphasis_custom_mark_),
      tap_highlight_color_(o.tap_highlight_color_),
      applied_text_decorations_(o.applied_text_decorations_),
      tab_size_(o.tab_size_),
      variables_(o.variables_),
      text_size_adjust_(o.text_size_adjust_) {}

StyleRareInheritedData::~StyleRareInheritedData() {}

bool StyleRareInheritedData::operator==(const StyleRareInheritedData& o) const {
  return text_stroke_color_ == o.text_stroke_color_ &&
         text_stroke_width_ == o.text_stroke_width_ &&
         text_fill_color_ == o.text_fill_color_ &&
         text_emphasis_color_ == o.text_emphasis_color_ &&
         caret_color_ == o.caret_color_ &&
         visited_link_text_stroke_color_ == o.visited_link_text_stroke_color_ &&
         visited_link_text_fill_color_ == o.visited_link_text_fill_color_ &&
         visited_link_text_emphasis_color_ ==
             o.visited_link_text_emphasis_color_ &&
         visited_link_caret_color_ == o.visited_link_caret_color_ &&
         tap_highlight_color_ == o.tap_highlight_color_ &&
         ShadowDataEquivalent(o) && highlight_ == o.highlight_ &&
         DataEquivalent(cursor_data_, o.cursor_data_) &&
         text_indent_ == o.text_indent_ &&
         effective_zoom_ == o.effective_zoom_ && widows_ == o.widows_ &&
         orphans_ == o.orphans_ &&
         text_stroke_color_is_current_color_ ==
             o.text_stroke_color_is_current_color_ &&
         text_fill_color_is_current_color_ ==
             o.text_fill_color_is_current_color_ &&
         text_emphasis_color_is_current_color_ ==
             o.text_emphasis_color_is_current_color_ &&
         caret_color_is_current_color_ == o.caret_color_is_current_color_ &&
         caret_color_is_auto_ == o.caret_color_is_auto_ &&
         visited_link_text_stroke_color_is_current_color_ ==
             o.visited_link_text_stroke_color_is_current_color_ &&
         visited_link_text_fill_color_is_current_color_ ==
             o.visited_link_text_fill_color_is_current_color_ &&
         visited_link_text_emphasis_color_is_current_color_ ==
             o.visited_link_text_emphasis_color_is_current_color_ &&
         visited_link_caret_color_is_current_color_ ==
             o.visited_link_caret_color_is_current_color_ &&
         visited_link_caret_color_is_auto_ ==
             o.visited_link_caret_color_is_auto_ &&
         text_security_ == o.text_security_ && user_modify_ == o.user_modify_ &&
         word_break_ == o.word_break_ && overflow_wrap_ == o.overflow_wrap_ &&
         line_break_ == o.line_break_ && user_select_ == o.user_select_ &&
         speak_ == o.speak_ && hyphens_ == o.hyphens_ &&
         hyphenation_limit_before_ == o.hyphenation_limit_before_ &&
         hyphenation_limit_after_ == o.hyphenation_limit_after_ &&
         hyphenation_limit_lines_ == o.hyphenation_limit_lines_ &&
         text_emphasis_fill_ == o.text_emphasis_fill_ &&
         text_emphasis_mark_ == o.text_emphasis_mark_ &&
         text_emphasis_position_ == o.text_emphasis_position_ &&
         text_align_last_ == o.text_align_last_ &&
         text_justify_ == o.text_justify_ &&
         text_orientation_ == o.text_orientation_ &&
         text_combine_ == o.text_combine_ &&
         text_indent_line_ == o.text_indent_line_ &&
         text_indent_type_ == o.text_indent_type_ &&
         subtree_will_change_contents_ == o.subtree_will_change_contents_ &&
         self_or_ancestor_has_dir_auto_attribute_ ==
             o.self_or_ancestor_has_dir_auto_attribute_ &&
         respect_image_orientation_ == o.respect_image_orientation_ &&
         subtree_is_sticky_ == o.subtree_is_sticky_ &&
         hyphenation_string_ == o.hyphenation_string_ &&
         line_height_step_ == o.line_height_step_ &&
         text_emphasis_custom_mark_ == o.text_emphasis_custom_mark_ &&
         QuotesDataEquivalent(o) && tab_size_ == o.tab_size_ &&
         image_rendering_ == o.image_rendering_ &&
         text_underline_position_ == o.text_underline_position_ &&
         text_decoration_skip_ == o.text_decoration_skip_ &&
         ruby_position_ == o.ruby_position_ &&
         DataEquivalent(list_style_image_, o.list_style_image_) &&
         DataEquivalent(applied_text_decorations_,
                        o.applied_text_decorations_) &&
         DataEquivalent(variables_, o.variables_) &&
         text_size_adjust_ == o.text_size_adjust_;
}

bool StyleRareInheritedData::ShadowDataEquivalent(
    const StyleRareInheritedData& o) const {
  return DataEquivalent(text_shadow_, o.text_shadow_);
}

bool StyleRareInheritedData::QuotesDataEquivalent(
    const StyleRareInheritedData& o) const {
  return DataEquivalent(quotes_, o.quotes_);
}

}  // namespace blink
