/*
 * Copyright (C) 1999 Antti Koivisto (koivisto@kde.org)
 * Copyright (C) 2004, 2005, 2006, 2007, 2008 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/StyleRareNonInheritedData.h"

#include "core/animation/css/CSSAnimationData.h"
#include "core/animation/css/CSSTransitionData.h"
#include "core/style/ContentData.h"
#include "core/style/DataEquivalency.h"
#include "core/style/ComputedStyle.h"
#include "core/style/ShadowList.h"
#include "core/style/StyleFilterData.h"
#include "core/style/StyleNonInheritedVariables.h"
#include "core/style/StyleTransformData.h"

namespace blink {

class SameSizeStyleRareNonInheritedData
    : public RefCounted<StyleRareNonInheritedData> {
 public:
  float floats[3];
  int integers;

  LengthPoint length_points[2];
  LineClampValue line_clamps;
  DraggableRegionMode draggable_regions;

  void* data_refs[8];
  DataPersistent<void*> data_persistents[2];
  void* own_ptrs[4];
  Persistent<void*> persistent_handles[2];
  void* ref_ptrs[3];
  void* unique_ptrs[1];

  FillLayer fill_layers;
  NinePieceImage nine_pieces;
  FloatSize float_size;
  Length lengths;
  OutlineValue outline;

  StyleColor style_colors[8];

  Vector<String> callback_selectors_;

  StyleContentAlignmentData content_alignment_data[2];
  StyleSelfAlignmentData self_alignment_data[4];

  unsigned bit_fields_[2];
};

static_assert(sizeof(StyleRareNonInheritedData) ==
                  sizeof(SameSizeStyleRareNonInheritedData),
              "StyleRareNonInheritedData_should_stay_small");

StyleRareNonInheritedData::StyleRareNonInheritedData()
    : opacity_(ComputedStyle::InitialOpacity()),
      perspective_(ComputedStyle::InitialPerspective()),
      shape_image_threshold_(ComputedStyle::InitialShapeImageThreshold()),
      order_(ComputedStyle::InitialOrder()),
      perspective_origin_(ComputedStyle::InitialPerspectiveOrigin()),
      object_position_(ComputedStyle::InitialObjectPosition()),
      line_clamp_(ComputedStyle::InitialLineClamp()),
      draggable_region_mode_(static_cast<unsigned>(kDraggableRegionNone)),
      shape_outside_(ComputedStyle::InitialShapeOutside()),
      clip_path_(ComputedStyle::InitialClipPath()),
      mask_(kMaskFillLayer, true),
      mask_box_image_(NinePieceImage::MaskDefaults()),
      page_size_(),
      shape_margin_(ComputedStyle::InitialShapeMargin()),
      text_decoration_color_(StyleColor::CurrentColor()),
      visited_link_text_decoration_color_(StyleColor::CurrentColor()),
      visited_link_background_color_(ComputedStyle::InitialBackgroundColor()),
      visited_link_outline_color_(StyleColor::CurrentColor()),
      visited_link_border_left_color_(StyleColor::CurrentColor()),
      visited_link_border_right_color_(StyleColor::CurrentColor()),
      visited_link_border_top_color_(StyleColor::CurrentColor()),
      visited_link_border_bottom_color_(StyleColor::CurrentColor()),
      variables_(ComputedStyle::InitialNonInheritedVariables()),
      align_content_(ComputedStyle::InitialContentAlignment()),
      align_items_(ComputedStyle::InitialDefaultAlignment()),
      align_self_(ComputedStyle::InitialSelfAlignment()),
      justify_content_(ComputedStyle::InitialContentAlignment()),
      justify_items_(ComputedStyle::InitialSelfAlignment()),
      justify_self_(ComputedStyle::InitialSelfAlignment()),
      page_size_type_(static_cast<unsigned>(PageSizeType::kAuto)),
      transform_style_3d_(ComputedStyle::InitialTransformStyle3D()),
      backface_visibility_(ComputedStyle::InitialBackfaceVisibility()),
      user_drag_(ComputedStyle::InitialUserDrag()),
      text_overflow_(ComputedStyle::InitialTextOverflow()),
      margin_before_collapse_(kMarginCollapseCollapse),
      margin_after_collapse_(kMarginCollapseCollapse),
      appearance_(ComputedStyle::InitialAppearance()),
      text_decoration_style_(ComputedStyle::InitialTextDecorationStyle()),
      has_current_opacity_animation_(false),
      has_current_transform_animation_(false),
      has_current_filter_animation_(false),
      has_current_backdrop_filter_animation_(false),
      running_opacity_animation_on_compositor_(false),
      running_transform_animation_on_compositor_(false),
      running_filter_animation_on_compositor_(false),
      running_backdrop_filter_animation_on_compositor_(false),
      is_stacking_context_(false),
      effective_blend_mode_(ComputedStyle::InitialBlendMode()),
      touch_action_(ComputedStyle::InitialTouchAction()),
      object_fit_(ComputedStyle::InitialObjectFit()),
      isolation_(ComputedStyle::InitialIsolation()),
      contain_(ComputedStyle::InitialContain()),
      scroll_behavior_(ComputedStyle::InitialScrollBehavior()),
      scroll_snap_type_(ComputedStyle::InitialScrollSnapType()),
      requires_accelerated_compositing_for_external_reasons_(false),
      has_inline_transform_(false),
      resize_(ComputedStyle::InitialResize()),
      has_compositor_proxy_(false),
      has_author_background_(false),
      has_author_border_(false) {}

StyleRareNonInheritedData::StyleRareNonInheritedData(
    const StyleRareNonInheritedData& o)
    : RefCounted<StyleRareNonInheritedData>(),
      opacity_(o.opacity_),
      perspective_(o.perspective_),
      shape_image_threshold_(o.shape_image_threshold_),
      order_(o.order_),
      perspective_origin_(o.perspective_origin_),
      object_position_(o.object_position_),
      line_clamp_(o.line_clamp_),
      draggable_region_mode_(o.draggable_region_mode_),
      deprecated_flexible_box_(o.deprecated_flexible_box_),
      flexible_box_(o.flexible_box_),
      multi_col_(o.multi_col_),
      transform_(o.transform_),
      will_change_(o.will_change_),
      filter_(o.filter_),
      backdrop_filter_(o.backdrop_filter_),
      grid_(o.grid_),
      grid_item_(o.grid_item_),
      scroll_snap_(o.scroll_snap_),
      content_(o.content_ ? o.content_->Clone() : nullptr),
      counter_directives_(o.counter_directives_ ? o.counter_directives_->Clone()
                                                : nullptr),
      animations_(o.animations_ ? o.animations_->Clone() : nullptr),
      transitions_(o.transitions_ ? o.transitions_->Clone() : nullptr),
      box_shadow_(o.box_shadow_),
      box_reflect_(o.box_reflect_),
      shape_outside_(o.shape_outside_),
      clip_path_(o.clip_path_),
      mask_(o.mask_),
      mask_box_image_(o.mask_box_image_),
      page_size_(o.page_size_),
      shape_margin_(o.shape_margin_),
      outline_(o.outline_),
      text_decoration_color_(o.text_decoration_color_),
      visited_link_text_decoration_color_(
          o.visited_link_text_decoration_color_),
      visited_link_background_color_(o.visited_link_background_color_),
      visited_link_outline_color_(o.visited_link_outline_color_),
      visited_link_border_left_color_(o.visited_link_border_left_color_),
      visited_link_border_right_color_(o.visited_link_border_right_color_),
      visited_link_border_top_color_(o.visited_link_border_top_color_),
      visited_link_border_bottom_color_(o.visited_link_border_bottom_color_),
      variables_(o.variables_ ? o.variables_->Clone() : nullptr),
      align_content_(o.align_content_),
      align_items_(o.align_items_),
      align_self_(o.align_self_),
      justify_content_(o.justify_content_),
      justify_items_(o.justify_items_),
      justify_self_(o.justify_self_),
      page_size_type_(o.page_size_type_),
      transform_style_3d_(o.transform_style_3d_),
      backface_visibility_(o.backface_visibility_),
      user_drag_(o.user_drag_),
      text_overflow_(o.text_overflow_),
      margin_before_collapse_(o.margin_before_collapse_),
      margin_after_collapse_(o.margin_after_collapse_),
      appearance_(o.appearance_),
      text_decoration_style_(o.text_decoration_style_),
      has_current_opacity_animation_(o.has_current_opacity_animation_),
      has_current_transform_animation_(o.has_current_transform_animation_),
      has_current_filter_animation_(o.has_current_filter_animation_),
      has_current_backdrop_filter_animation_(
          o.has_current_backdrop_filter_animation_),
      running_opacity_animation_on_compositor_(
          o.running_opacity_animation_on_compositor_),
      running_transform_animation_on_compositor_(
          o.running_transform_animation_on_compositor_),
      running_filter_animation_on_compositor_(
          o.running_filter_animation_on_compositor_),
      running_backdrop_filter_animation_on_compositor_(
          o.running_backdrop_filter_animation_on_compositor_),
      is_stacking_context_(o.is_stacking_context_),
      effective_blend_mode_(o.effective_blend_mode_),
      touch_action_(o.touch_action_),
      object_fit_(o.object_fit_),
      isolation_(o.isolation_),
      contain_(o.contain_),
      scroll_behavior_(o.scroll_behavior_),
      scroll_snap_type_(o.scroll_snap_type_),
      requires_accelerated_compositing_for_external_reasons_(
          o.requires_accelerated_compositing_for_external_reasons_),
      has_inline_transform_(o.has_inline_transform_),
      resize_(o.resize_),
      has_compositor_proxy_(o.has_compositor_proxy_),
      has_author_background_(o.has_author_background_),
      has_author_border_(o.has_author_border_) {}

StyleRareNonInheritedData::~StyleRareNonInheritedData() {}

bool StyleRareNonInheritedData::operator==(
    const StyleRareNonInheritedData& o) const {
  return opacity_ == o.opacity_ && perspective_ == o.perspective_ &&
         shape_image_threshold_ == o.shape_image_threshold_ &&
         order_ == o.order_ && perspective_origin_ == o.perspective_origin_ &&
         object_position_ == o.object_position_ &&
         line_clamp_ == o.line_clamp_ &&
         draggable_region_mode_ == o.draggable_region_mode_ &&
         deprecated_flexible_box_ == o.deprecated_flexible_box_ &&
         flexible_box_ == o.flexible_box_ && multi_col_ == o.multi_col_ &&
         transform_ == o.transform_ && will_change_ == o.will_change_ &&
         filter_ == o.filter_ && backdrop_filter_ == o.backdrop_filter_ &&
         grid_ == o.grid_ && grid_item_ == o.grid_item_ &&
         scroll_snap_ == o.scroll_snap_ &&
         DataEquivalent(content_, o.content_) &&
         DataEquivalent(counter_directives_, o.counter_directives_) &&
         DataEquivalent(box_shadow_, o.box_shadow_) &&
         DataEquivalent(box_reflect_, o.box_reflect_) &&
         DataEquivalent(animations_, o.animations_) &&
         DataEquivalent(transitions_, o.transitions_) &&
         DataEquivalent(shape_outside_, o.shape_outside_) && mask_ == o.mask_ &&
         mask_box_image_ == o.mask_box_image_ && page_size_ == o.page_size_ &&
         shape_margin_ == o.shape_margin_ && outline_ == o.outline_ &&
         DataEquivalent(clip_path_, o.clip_path_) &&
         text_decoration_color_ == o.text_decoration_color_ &&
         visited_link_text_decoration_color_ ==
             o.visited_link_text_decoration_color_ &&
         visited_link_background_color_ == o.visited_link_background_color_ &&
         visited_link_outline_color_ == o.visited_link_outline_color_ &&
         visited_link_border_left_color_ == o.visited_link_border_left_color_ &&
         visited_link_border_right_color_ ==
             o.visited_link_border_right_color_ &&
         visited_link_border_top_color_ == o.visited_link_border_top_color_ &&
         visited_link_border_bottom_color_ ==
             o.visited_link_border_bottom_color_ &&
         callback_selectors_ == o.callback_selectors_ &&
         DataEquivalent(variables_, o.variables_) &&
         align_content_ == o.align_content_ && align_items_ == o.align_items_ &&
         align_self_ == o.align_self_ &&
         justify_content_ == o.justify_content_ &&
         justify_items_ == o.justify_items_ &&
         justify_self_ == o.justify_self_ &&
         page_size_type_ == o.page_size_type_ &&
         transform_style_3d_ == o.transform_style_3d_ &&
         backface_visibility_ == o.backface_visibility_ &&
         user_drag_ == o.user_drag_ && text_overflow_ == o.text_overflow_ &&
         margin_before_collapse_ == o.margin_before_collapse_ &&
         margin_after_collapse_ == o.margin_after_collapse_ &&
         appearance_ == o.appearance_ &&
         text_decoration_style_ == o.text_decoration_style_ &&
         has_current_opacity_animation_ == o.has_current_opacity_animation_ &&
         has_current_transform_animation_ ==
             o.has_current_transform_animation_ &&
         has_current_filter_animation_ == o.has_current_filter_animation_ &&
         has_current_backdrop_filter_animation_ ==
             o.has_current_backdrop_filter_animation_ &&
         is_stacking_context_ == o.is_stacking_context_ &&
         effective_blend_mode_ == o.effective_blend_mode_ &&
         touch_action_ == o.touch_action_ && object_fit_ == o.object_fit_ &&
         isolation_ == o.isolation_ && contain_ == o.contain_ &&
         scroll_behavior_ == o.scroll_behavior_ &&
         scroll_snap_type_ == o.scroll_snap_type_ &&
         requires_accelerated_compositing_for_external_reasons_ ==
             o.requires_accelerated_compositing_for_external_reasons_ &&
         has_inline_transform_ == o.has_inline_transform_ &&
         resize_ == o.resize_ &&
         has_compositor_proxy_ == o.has_compositor_proxy_ &&
         has_author_background_ == o.has_author_background_ &&
         has_author_border_ == o.has_author_border_;
}

}  // namespace blink
