// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_TABLE_NG_TABLE_LAYOUT_ALGORITHM_HELPERS_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_TABLE_NG_TABLE_LAYOUT_ALGORITHM_HELPERS_H_

#include "third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm_types.h"
#include "third_party/blink/renderer/core/style/computed_style_constants.h"

namespace blink {

class NGTableNode;

// Table size distribution algorithms.
class CORE_EXPORT NGTableAlgorithmHelpers {
 public:
  // Compute maximum number of table columns that can deduced from single cell
  // and its colspan.
  static wtf_size_t ComputeMaxColumn(wtf_size_t current_column,
                                     wtf_size_t colspan,
                                     bool is_fixed_table_layout) {
    // In fixed mode, every column is preserved.
    if (is_fixed_table_layout)
      return current_column + colspan;
    return current_column + 1;
  }

  // |undistributable_space| is size of space not occupied by cells
  // (borders, border spacing).
  static MinMaxSizes ComputeGridInlineMinMax(
      const NGTableNode& node,
      const NGTableTypes::Columns& column_constraints,
      LayoutUnit undistributable_space,
      bool is_fixed_layout,
      bool is_layout_pass,
      bool skip_collapsed_columns);

  static void DistributeColspanCellsToColumns(
      const NGTableTypes::ColspanCells& colspan_cells,
      LayoutUnit inline_border_spacing,
      bool is_fixed_layout,
      NGTableTypes::Columns* column_constraints);

  static Vector<LayoutUnit> SynchronizeAssignableTableInlineSizeAndColumns(
      LayoutUnit assignable_table_inline_size,
      LayoutUnit inline_border_spacing,
      bool is_fixed_layout,
      const NGTableTypes::Columns& column_constraints);

  static void DistributeRowspanCellToRows(
      const NGTableTypes::RowspanCell& rowspan_cell,
      LayoutUnit border_block_spacing,
      NGTableTypes::Rows* rows);

  static void DistributeSectionFixedBlockSizeToRows(
      const wtf_size_t start_row,
      const wtf_size_t end_row,
      LayoutUnit section_fixed_block_size,
      LayoutUnit border_block_spacing,
      LayoutUnit percentage_resolution_block_size,
      NGTableTypes::Rows* rows);

  static void DistributeTableBlockSizeToSections(
      LayoutUnit border_block_spacing,
      LayoutUnit table_block_size,
      NGTableTypes::Sections* sections,
      NGTableTypes::Rows* rows);
};

}  // namespace blink

#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_TABLE_NG_TABLE_LAYOUT_ALGORITHM_HELPERS_H_
