diff mupdf-source/thirdparty/tesseract/src/ccstruct/pdblock.h @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mupdf-source/thirdparty/tesseract/src/ccstruct/pdblock.h	Mon Sep 15 11:43:07 2025 +0200
@@ -0,0 +1,184 @@
+/**********************************************************************
+ * File:        pdblock.h  (Formerly pdblk.h)
+ * Description: Page block class definition.
+ * Author:      Ray Smith
+ *
+ * (C) Copyright 1991, Hewlett-Packard Ltd.
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ *
+ **********************************************************************/
+
+#ifndef PDBLOCK_H
+#define PDBLOCK_H
+
+#include "clst.h"
+#include "polyblk.h"
+
+struct Pix;
+
+namespace tesseract {
+
+class PDBLK; // forward decl
+
+CLISTIZEH(PDBLK)
+/// page block
+class PDBLK {
+  friend class BLOCK_RECT_IT; ///< block iterator
+  friend class BLOCK;         ///< Page Block
+
+public:
+  /// empty constructor
+  PDBLK() {
+    hand_poly = nullptr;
+    index_ = 0;
+  }
+  /// simple constructor
+  PDBLK(TDimension xmin, ///< bottom left
+        TDimension ymin,
+        TDimension xmax, ///< top right
+        TDimension ymax);
+
+  /// set vertex lists
+  ///@param left list of left vertices
+  ///@param right list of right vertices
+  void set_sides(ICOORDELT_LIST *left, ICOORDELT_LIST *right);
+
+  /// destructor
+  ~PDBLK() {
+    delete hand_poly;
+  }
+
+  POLY_BLOCK *poly_block() const {
+    return hand_poly;
+  }
+  /// set the poly block
+  void set_poly_block(POLY_BLOCK *blk) {
+    hand_poly = blk;
+  }
+  /// get box
+  void bounding_box(ICOORD &bottom_left,       // bottom left
+                    ICOORD &top_right) const { // topright
+    bottom_left = box.botleft();
+    top_right = box.topright();
+  }
+  /// get real box
+  const TBOX &bounding_box() const {
+    return box;
+  }
+
+  int index() const {
+    return index_;
+  }
+  void set_index(int value) {
+    index_ = value;
+  }
+
+  /// is pt inside block
+  bool contains(ICOORD pt);
+
+  /// reposition block
+  void move(const ICOORD vec); // by vector
+
+  // Returns a binary Pix mask with a 1 pixel for every pixel within the
+  // block. Rotates the coordinate system by rerotation prior to rendering.
+  // If not nullptr, mask_box is filled with the position box of the returned
+  // mask image.
+  Image render_mask(const FCOORD &rerotation, TBOX *mask_box);
+
+#ifndef GRAPHICS_DISABLED
+  /// draw histogram
+  ///@param window window to draw in
+  ///@param serial serial number
+  ///@param colour colour to draw in
+  void plot(ScrollView *window, int32_t serial, ScrollView::Color colour);
+#endif // !GRAPHICS_DISABLED
+
+  /// assignment
+  ///@param source from this
+  PDBLK &operator=(const PDBLK &source);
+
+protected:
+  POLY_BLOCK *hand_poly;    ///< weird as well
+  ICOORDELT_LIST leftside;  ///< left side vertices
+  ICOORDELT_LIST rightside; ///< right side vertices
+  TBOX box;                 ///< bounding box
+  int index_;               ///< Serial number of this block.
+};
+
+class BLOCK_RECT_IT // rectangle iterator
+{
+public:
+  /// constructor
+  ///@param blkptr block to iterate
+  BLOCK_RECT_IT(PDBLK *blkptr);
+
+  /// start (new) block
+  void set_to_block(PDBLK *blkptr); // block to iterate
+
+  /// start iteration
+  void start_block();
+
+  /// next rectangle
+  void forward();
+
+  /// test end
+  bool cycled_rects() const {
+    return left_it.cycled_list() && right_it.cycled_list();
+  }
+
+  /// current rectangle
+  ///@param bleft bottom left
+  ///@param tright top right
+  void bounding_box(ICOORD &bleft, ICOORD &tright) {
+    // bottom left
+    bleft = ICOORD(left_it.data()->x(), ymin);
+    // top right
+    tright = ICOORD(right_it.data()->x(), ymax);
+  }
+
+private:
+  TDimension ymin = 0;    ///< bottom of rectangle
+  TDimension ymax = 0;    ///< top of rectangle
+  PDBLK *block = nullptr; ///< block to iterate
+  ICOORDELT_IT left_it;   ///< boundary iterators
+  ICOORDELT_IT right_it;
+};
+
+/// rectangle iterator
+class BLOCK_LINE_IT {
+public:
+  /// constructor
+  ///@param blkptr from block
+  BLOCK_LINE_IT(PDBLK *blkptr) : rect_it(blkptr) {
+    block = blkptr; // remember block
+  }
+
+  /// start (new) block
+  ///@param blkptr block to start
+  void set_to_block(PDBLK *blkptr) {
+    block = blkptr; // remember block
+                    // set iterator
+    rect_it.set_to_block(blkptr);
+  }
+
+  /// get a line
+  ///@param y line to get
+  ///@param xext output extent
+  TDimension get_line(TDimension y, TDimension &xext);
+
+private:
+  PDBLK *block;          ///< block to iterate
+  BLOCK_RECT_IT rect_it; ///< rectangle iterator
+};
+
+} // namespace tesseract
+
+#endif