summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'tesseract/src/ccstruct/pdblock.h')
-rw-r--r--tesseract/src/ccstruct/pdblock.h177
1 files changed, 177 insertions, 0 deletions
diff --git a/tesseract/src/ccstruct/pdblock.h b/tesseract/src/ccstruct/pdblock.h
new file mode 100644
index 00000000..fd1ed8de
--- /dev/null
+++ b/tesseract/src/ccstruct/pdblock.h
@@ -0,0 +1,177 @@
+/**********************************************************************
+ * 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(int16_t xmin, ///< bottom left
+ int16_t ymin,
+ int16_t xmax, ///< top right
+ int16_t 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.
+ Pix *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() {
+ 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:
+ int16_t ymin = 0; ///< bottom of rectangle
+ int16_t 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
+ int16_t get_line(int16_t y,
+ int16_t &xext);
+
+ private:
+ PDBLK * block; ///< block to iterate
+ BLOCK_RECT_IT rect_it; ///< rectangle iterator
+};
+
+} // namespace tesseract
+
+#endif