diff mupdf-source/thirdparty/tesseract/src/ccstruct/ocrblock.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/ocrblock.h	Mon Sep 15 11:43:07 2025 +0200
@@ -0,0 +1,227 @@
+/**********************************************************************
+ * File:        ocrblock.h  (Formerly block.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 OCRBLOCK_H
+#define OCRBLOCK_H
+
+#include "ocrpara.h"
+#include "ocrrow.h"
+#include "pdblock.h"
+
+namespace tesseract {
+
+class BLOCK; // forward decl
+
+ELISTIZEH(BLOCK)
+
+class TESS_API BLOCK : public ELIST_LINK
+// page block
+{
+  friend class BLOCK_RECT_IT; // block iterator
+public:
+  BLOCK() : re_rotation_(1.0f, 0.0f), classify_rotation_(1.0f, 0.0f), skew_(1.0f, 0.0f) {}
+  BLOCK(const char *name, ///< filename
+        bool prop,        ///< proportional
+        int16_t kern,     ///< kerning
+        int16_t space,    ///< spacing
+        TDimension xmin,  ///< bottom left
+        TDimension ymin,
+        TDimension xmax,  ///< top right
+        TDimension ymax);
+
+  ~BLOCK() = default;
+
+  /**
+   * set space size etc.
+   * @param prop proportional
+   * @param kern inter char size
+   * @param space inter word size
+   * @param ch_pitch pitch if fixed
+   */
+  void set_stats(bool prop, int16_t kern, int16_t space, int16_t ch_pitch) {
+    proportional = prop;
+    kerning = static_cast<int8_t>(kern);
+    spacing = space;
+    pitch = ch_pitch;
+  }
+  /// set char size
+  void set_xheight(int32_t height) {
+    xheight = height;
+  }
+  /// set font class
+  void set_font_class(int16_t font) {
+    font_class = font;
+  }
+  /// return proportional
+  bool prop() const {
+    return proportional;
+  }
+  bool right_to_left() const {
+    return right_to_left_;
+  }
+  void set_right_to_left(bool value) {
+    right_to_left_ = value;
+  }
+  /// return pitch
+  int32_t fixed_pitch() const {
+    return pitch;
+  }
+  /// return kerning
+  int16_t kern() const {
+    return kerning;
+  }
+  /// return font class
+  int16_t font() const {
+    return font_class;
+  }
+  /// return spacing
+  int16_t space() const {
+    return spacing;
+  }
+  /// return filename
+  const char *name() const {
+    return filename.c_str();
+  }
+  /// return xheight
+  int32_t x_height() const {
+    return xheight;
+  }
+  float cell_over_xheight() const {
+    return cell_over_xheight_;
+  }
+  void set_cell_over_xheight(float ratio) {
+    cell_over_xheight_ = ratio;
+  }
+  /// get rows
+  ROW_LIST *row_list() {
+    return &rows;
+  }
+  // Compute the margins between the edges of each row and this block's
+  // polyblock, and store the results in the rows.
+  void compute_row_margins();
+
+  // get paragraphs
+  PARA_LIST *para_list() {
+    return &paras_;
+  }
+  /// get blobs
+  C_BLOB_LIST *blob_list() {
+    return &c_blobs;
+  }
+  C_BLOB_LIST *reject_blobs() {
+    return &rej_blobs;
+  }
+  FCOORD re_rotation() const {
+    return re_rotation_; // How to transform coords back to image.
+  }
+  void set_re_rotation(const FCOORD &rotation) {
+    re_rotation_ = rotation;
+  }
+  FCOORD classify_rotation() const {
+    return classify_rotation_; // Apply this before classifying.
+  }
+  void set_classify_rotation(const FCOORD &rotation) {
+    classify_rotation_ = rotation;
+  }
+  FCOORD skew() const {
+    return skew_; // Direction of true horizontal.
+  }
+  void set_skew(const FCOORD &skew) {
+    skew_ = skew;
+  }
+  const ICOORD &median_size() const {
+    return median_size_;
+  }
+  void set_median_size(int x, int y) {
+    median_size_.set_x(x);
+    median_size_.set_y(y);
+  }
+
+  Image render_mask(TBOX *mask_box) {
+    return pdblk.render_mask(re_rotation_, mask_box);
+  }
+
+  // Returns the bounding box including the desired combination of upper and
+  // lower noise/diacritic elements.
+  TBOX restricted_bounding_box(bool upper_dots, bool lower_dots) const;
+
+  // Reflects the polygon in the y-axis and recomputes the bounding_box.
+  // Does nothing to any contained rows/words/blobs etc.
+  void reflect_polygon_in_y_axis();
+
+  void rotate(const FCOORD &rotation);
+
+  /// decreasing y order
+  void sort_rows();
+
+  /// shrink white space
+  void compress();
+
+  /// check proportional
+  void check_pitch();
+
+  /// shrink white space and move by vector
+  void compress(const ICOORD vec);
+
+  /// dump whole table
+  void print(FILE *fp, bool dump);
+
+  BLOCK &operator=(const BLOCK &source);
+  PDBLK pdblk; ///< Page Description Block
+
+private:
+  bool proportional = false;       ///< proportional
+  bool right_to_left_ = false;     ///< major script is right to left.
+  int8_t kerning = 0;              ///< inter blob gap
+  int16_t spacing = 0;             ///< inter word gap
+  int16_t pitch = 0;               ///< pitch of non-props
+  int16_t font_class = 0;          ///< correct font class
+  int32_t xheight = 0;             ///< height of chars
+  float cell_over_xheight_ = 0.0f; ///< Ratio of cell height to xheight.
+  std::string filename;            ///< name of block
+  ROW_LIST rows;                   ///< rows in block
+  PARA_LIST paras_;                ///< paragraphs of block
+  C_BLOB_LIST c_blobs;             ///< before textord
+  C_BLOB_LIST rej_blobs;           ///< duff stuff
+  FCOORD re_rotation_;             ///< How to transform coords back to image.
+  FCOORD classify_rotation_;       ///< Apply this before classifying.
+  FCOORD skew_;                    ///< Direction of true horizontal.
+  ICOORD median_size_;             ///< Median size of blobs.
+};
+
+// A function to print segmentation stats for the given block list.
+void PrintSegmentationStats(BLOCK_LIST *block_list);
+
+// Extracts blobs fromo the given block list and adds them to the output list.
+// The block list must have been created by performing a page segmentation.
+void ExtractBlobsFromSegmentation(BLOCK_LIST *blocks, C_BLOB_LIST *output_blob_list);
+
+// Refreshes the words in the block_list by using blobs in the
+// new_blobs list.
+// Block list must have word segmentation in it.
+// It consumes the blobs provided in the new_blobs list. The blobs leftover in
+// the new_blobs list after the call weren't matched to any blobs of the words
+// in block list.
+// The output not_found_blobs is a list of blobs from the original segmentation
+// in the block_list for which no corresponding new blobs were found.
+void RefreshWordBlobsFromNewBlobs(BLOCK_LIST *block_list, C_BLOB_LIST *new_blobs,
+                                  C_BLOB_LIST *not_found_blobs);
+
+} // namespace tesseract
+
+#endif