910e62b5创建于 1月15日历史提交
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef PDF_PDF_RECT_H_
#define PDF_PDF_RECT_H_

#include <stddef.h>

#include "ui/gfx/geometry/rect_f.h"

namespace chrome_pdf {

// Represents PDF rectangles:
// - The origin is at the bottom-left.
// - All units are in points.
//
// Can be easily used with PDFium APIs that take either FS_RECTF, or 4 float
// pointers.
class PdfRect {
 public:
  constexpr PdfRect() : PdfRect(0, 0, 0, 0) {}
  // PdfRect and gfx::RectF have top/bottom flipped.
  constexpr explicit PdfRect(const gfx::RectF& rect)
      : left_(rect.x()),
        top_(rect.bottom()),
        right_(rect.right()),
        bottom_(rect.y()) {}
  constexpr PdfRect(float left, float bottom, float right, float top)
      : left_(left), top_(top), right_(right), bottom_(bottom) {}
  constexpr ~PdfRect() = default;

  float left() const { return left_; }
  float bottom() const { return bottom_; }
  float right() const { return right_; }
  float top() const { return top_; }

  // These return pointers so they can be directly passed into PDFium's public
  // APIs, which are written in C.
  float* writable_left() { return &left_; }
  float* writable_bottom() { return &bottom_; }
  float* writable_right() { return &right_; }
  float* writable_top() { return &top_; }

  float width() const { return right_ - left_; }
  float height() const { return top_ - bottom_; }

  gfx::RectF AsGfxRectF() const;

  void Offset(float horizontal, float vertical);

  bool IsEmpty() const { return !width() || !height(); }

  // When a PdfRect has top < bottom, or right < left, the values should be
  // swapped.
  void Normalize();

  void Scale(float scale_factor);

  void Intersect(const PdfRect& rect);

  void Union(const PdfRect& rect);

  friend constexpr bool operator==(const PdfRect&, const PdfRect&) = default;

  // Exposes offsetof() values for the private variables.
  static constexpr size_t offsetof_left() { return offsetof(PdfRect, left_); }
  static constexpr size_t offsetof_bottom() {
    return offsetof(PdfRect, bottom_);
  }
  static constexpr size_t offsetof_right() { return offsetof(PdfRect, right_); }
  static constexpr size_t offsetof_top() { return offsetof(PdfRect, top_); }

 private:
  // Do not change the ordering here, or add new member variables. This is
  // arranged to be the same order as PDFium's FS_RECTF.
  float left_;
  float top_;
  float right_;
  float bottom_;
};

}  // namespace chrome_pdf

#endif  // PDF_PDF_RECT_H_