Mercurial > hgrepos > Python2 > PyMuPDF
diff mupdf-source/thirdparty/tesseract/src/viewer/scrollview.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/viewer/scrollview.h Mon Sep 15 11:43:07 2025 +0200 @@ -0,0 +1,429 @@ +/////////////////////////////////////////////////////////////////////// +// File: scrollview.h +// Description: ScrollView +// Author: Joern Wanke +// +// (C) Copyright 2007, Google Inc. +// 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. +// +/////////////////////////////////////////////////////////////////////// +// +// ScrollView is designed as an UI which can be run remotely. This is the +// client code for it, the server part is written in java. The client consists +// mainly of 2 parts: +// The "core" ScrollView which sets up the remote connection, +// takes care of event handling etc. +// The other part of ScrollView consists of predefined API calls through LUA, +// which can basically be used to get a zoomable canvas in which it is possible +// to draw lines, text etc. +// Technically, thanks to LUA, its even possible to bypass the here defined LUA +// API calls at all and generate a java user interface from scratch (or +// basically generate any kind of java program, possibly even dangerous ones). + +#ifndef TESSERACT_VIEWER_SCROLLVIEW_H_ +#define TESSERACT_VIEWER_SCROLLVIEW_H_ + +#include "image.h" + +#include <tesseract/export.h> + +#include <cstdio> +#include <memory> +#include <mutex> + +namespace tesseract { + +#if !defined(__GNUC__) && !defined(__attribute__) +# define __attribute__(attr) // compiler without support for __attribute__ +#endif + +class ScrollView; +class SVNetwork; +class SVSemaphore; +struct SVPolyLineBuffer; + +enum SVEventType { + SVET_DESTROY, // Window has been destroyed by user. + SVET_EXIT, // User has destroyed the last window by clicking on the 'X'. + SVET_CLICK, // Left button pressed. + SVET_SELECTION, // Left button selection. + SVET_INPUT, // There is some input (single key or a whole string). + SVET_MOUSE, // The mouse has moved with a button pressed. + SVET_MOTION, // The mouse has moved with no button pressed. + SVET_HOVER, // The mouse has stayed still for a second. + SVET_POPUP, // A command selected through a popup menu. + SVET_MENU, // A command selected through the menubar. + SVET_ANY, // Any of the above. + + SVET_COUNT // Array sizing. +}; + +struct SVEvent { + ~SVEvent() { + delete[] parameter; + } + std::unique_ptr<SVEvent> copy() const; + SVEventType type = SVET_DESTROY; // What kind of event. + ScrollView *window = nullptr; // Window event relates to. + char *parameter = nullptr; // Any string that might have been passed as argument. + int x = 0; // Coords of click or selection. + int y = 0; + int x_size = 0; // Size of selection. + int y_size = 0; + int command_id = 0; // The ID of the possibly associated event (e.g. MENU) + int counter = 0; // Used to detect which kind of event to process next. + + SVEvent() = default; + SVEvent(const SVEvent &); + SVEvent &operator=(const SVEvent &); +}; + +// The SVEventHandler class is used for Event handling: If you register your +// class as SVEventHandler to a ScrollView Window, the SVEventHandler will be +// called whenever an appropriate event occurs. +class TESS_API SVEventHandler { +public: + virtual ~SVEventHandler(); + + // Gets called by the SV Window. Does nothing on default, overwrite this + // to implement the desired behaviour + virtual void Notify(const SVEvent *sve) { + (void)sve; + } +}; + +// The ScrollView class provides the external API to the scrollviewer process. +// The scrollviewer process manages windows and displays images, graphics and +// text while allowing the user to zoom and scroll the windows arbitrarily. +// Each ScrollView class instance represents one window, and stuff is drawn in +// the window through method calls on the class. The constructor is used to +// create the class instance (and the window). +class TESS_API ScrollView { +public: + // Color enum for pens and brushes. + enum Color { + NONE, + BLACK, + WHITE, + RED, + YELLOW, + GREEN, + CYAN, + BLUE, + MAGENTA, + AQUAMARINE, + DARK_SLATE_BLUE, + LIGHT_BLUE, + MEDIUM_BLUE, + MIDNIGHT_BLUE, + NAVY_BLUE, + SKY_BLUE, + SLATE_BLUE, + STEEL_BLUE, + CORAL, + BROWN, + SANDY_BROWN, + GOLD, + GOLDENROD, + DARK_GREEN, + DARK_OLIVE_GREEN, + FOREST_GREEN, + LIME_GREEN, + PALE_GREEN, + YELLOW_GREEN, + LIGHT_GREY, + DARK_SLATE_GREY, + DIM_GREY, + GREY, + KHAKI, + MAROON, + ORANGE, + ORCHID, + PINK, + PLUM, + INDIAN_RED, + ORANGE_RED, + VIOLET_RED, + SALMON, + TAN, + TURQUOISE, + DARK_TURQUOISE, + VIOLET, + WHEAT, + GREEN_YELLOW // Make sure this one is last. + }; + + ~ScrollView(); + +#ifndef GRAPHICS_DISABLED + + // Create a window. The pixel size of the window may be 0,0, in which case + // a default size is selected based on the size of your canvas. + // The canvas may not be 0,0 in size! + ScrollView(const char *name, int x_pos, int y_pos, int x_size, int y_size, int x_canvas_size, + int y_canvas_size); + // With a flag whether the x axis is reversed. + ScrollView(const char *name, int x_pos, int y_pos, int x_size, int y_size, int x_canvas_size, + int y_canvas_size, bool y_axis_reversed); + // Connect to a server other than localhost. + ScrollView(const char *name, int x_pos, int y_pos, int x_size, int y_size, int x_canvas_size, + int y_canvas_size, bool y_axis_reversed, const char *server_name); + /******************************************************************************* + * Event handling + * To register as listener, the class has to derive from the SVEventHandler + * class, which consists of a notifyMe(SVEvent*) function that should be + * overwritten to process the event the way you want. + *******************************************************************************/ + + // Add an Event Listener to this ScrollView Window. + void AddEventHandler(SVEventHandler *listener); + + // Block until an event of the given type is received. + std::unique_ptr<SVEvent> AwaitEvent(SVEventType type); + + /******************************************************************************* + * Getters and Setters + *******************************************************************************/ + + // Returns the title of the window. + const char *GetName() { + return window_name_; + } + + // Returns the unique ID of the window. + int GetId() { + return window_id_; + } + + /******************************************************************************* + * API functions for LUA calls + * the implementations for these can be found in svapi.cc + * (keep in mind that the window is actually created through the ScrollView + * constructor, so this is not listed here) + *******************************************************************************/ + + // Draw an image on (x,y). + void Draw(Image image, int x_pos, int y_pos); + + // Flush buffers and update display. + static void Update(); + + // Exit the program. + static void Exit(); + + // Update the contents of a specific window. + void UpdateWindow(); + + // Erase all content from the window, but do not destroy it. + void Clear(); + + // Set pen color with an enum. + void Pen(Color color); + + // Set pen color to RGB (0-255). + void Pen(int red, int green, int blue); + + // Set pen color to RGBA (0-255). + void Pen(int red, int green, int blue, int alpha); + + // Set brush color with an enum. + void Brush(Color color); + + // Set brush color to RGB (0-255). + void Brush(int red, int green, int blue); + + // Set brush color to RGBA (0-255). + void Brush(int red, int green, int blue, int alpha); + + // Set attributes for future text, like font name (e.g. + // "Times New Roman"), font size etc.. + // Note: The underlined flag is currently not supported + void TextAttributes(const char *font, int pixel_size, bool bold, bool italic, bool underlined); + + // Draw line from (x1,y1) to (x2,y2) with the current pencolor. + void Line(int x1, int y1, int x2, int y2); + + // Set the stroke width of the pen. + void Stroke(float width); + + // Draw a rectangle given upper left corner and lower right corner. + // The current pencolor is used as outline, the brushcolor to fill the shape. + void Rectangle(int x1, int y1, int x2, int y2); + + // Draw an ellipse centered on (x,y). + // The current pencolor is used as outline, the brushcolor to fill the shape. + void Ellipse(int x, int y, int width, int height); + + // Draw text with the current pencolor + void Text(int x, int y, const char *mystring); + + // Draw an image from a local filename. This should be faster than + // createImage. WARNING: This only works on a local machine. This also only + // works image types supported by java (like bmp,jpeg,gif,png) since the image + // is opened by the server. + void Draw(const char *image, int x_pos, int y_pos); + + // Set the current position to draw from (x,y). In conjunction with... + void SetCursor(int x, int y); + + // ...this function, which draws a line from the current to (x,y) and then + // sets the new position to the new (x,y), this can be used to easily draw + // polygons using vertices + void DrawTo(int x, int y); + + // Set the SVWindow visible/invisible. + void SetVisible(bool visible); + + // Set the SVWindow always on top or not always on top. + void AlwaysOnTop(bool b); + + // Shows a modal dialog with "msg" as question and returns 'y' or 'n'. + int ShowYesNoDialog(const char *msg); + + // Shows a modal dialog with "msg" as question and returns a char* string. + // Constraint: As return, only words (e.g. no whitespaces etc.) are allowed. + char *ShowInputDialog(const char *msg); + + // Adds a messagebox to the SVWindow. This way, it can show the messages... + void AddMessageBox(); + + // ...which can be added by this command. + // This is intended as an "debug" output window. + void AddMessage(const char *message); + void AddMessageF(const char *format, ...) __attribute__((format(printf, 2, 3))); + + // Zoom the window to the rectangle given upper left corner and + // lower right corner. + void ZoomToRectangle(int x1, int y1, int x2, int y2); + + // Custom messages (manipulating java code directly) can be send through this. + // Send a message to the server and attach the Id of the corresponding window. + // Note: This should only be called if you are know what you are doing, since + // you are fiddling with the Java objects on the server directly. Calling + // this just for fun will likely break your application! + // It is public so you can actually take use of the LUA functionalities, but + // be careful! + void SendMsg(const char* msg, ...) __attribute__((format(printf, 2, 3))); + + // Custom messages (manipulating java code directly) can be send through this. + // Send a message to the server without adding the + // window id. Used for global events like Exit(). + // Note: This should only be called if you are know what you are doing, since + // you are fiddling with the Java objects on the server directly. Calling + // this just for fun will likely break your application! + // It is public so you can actually take use of the LUA functionalities, but + // be careful! + static void SendRawMessage(const char *msg); + + /******************************************************************************* + * Add new menu entries to parent. If parent is "", the entry gets added to + *the main menubar (toplevel). + *******************************************************************************/ + // This adds a new submenu to the menubar. + void MenuItem(const char *parent, const char *name); + + // This adds a new (normal) menu entry with an associated eventID, which + // should be unique among menubar eventIDs. + void MenuItem(const char *parent, const char *name, int cmdEvent); + + // This adds a new checkbox entry, which might initially be flagged. + void MenuItem(const char *parent, const char *name, int cmdEvent, bool flagged); + + // This adds a new popup submenu to the popup menu. If parent is "", the entry + // gets added at "toplevel" popupmenu. + void PopupItem(const char *parent, const char *name); + + // This adds a new popup entry with the associated eventID, which should be + // unique among popup eventIDs. + // If value and desc are given, on a click the server will ask you to modify + // the value and return the new value. + void PopupItem(const char *parent, const char *name, int cmdEvent, const char *value, + const char *desc); + + // Returns the correct Y coordinate for a window, depending on whether it + // might have to be flipped (by ySize). + int TranslateYCoordinate(int y); + + char Wait(); + +private: + // Transfers a binary Image. + void TransferBinaryImage(Image image); + // Transfers a gray scale Image. + void TransferGrayImage(Image image); + // Transfers a 32-Bit Image. + void Transfer32bppImage(Image image); + + // Sets up ScrollView, depending on the variables from the constructor. + void Initialize(const char *name, int x_pos, int y_pos, int x_size, int y_size, int x_canvas_size, + int y_canvas_size, bool y_axis_reversed, const char *server_name); + + // Send the current buffered polygon (if any) and clear it. + void SendPolygon(); + + // Start the message receiving thread. + static void MessageReceiver(); + + // Place an event into the event_table (synchronized). + void SetEvent(const SVEvent *svevent); + + // Wake up the semaphore. + void Signal(); + + // Returns the unique, shared network stream. + static SVNetwork *GetStream() { + return stream_; + } + + // Starts a new event handler. + // Called asynchronously whenever a new window is created. + void StartEventHandler(); + + // Escapes the ' character with a \, so it can be processed by LUA. + char *AddEscapeChars(const char *input); + + // The event handler for this window. + SVEventHandler *event_handler_; + // The name of the window. + const char *window_name_; + // The id of the window. + int window_id_; + // The points of the currently under-construction polyline. + SVPolyLineBuffer *points_; + // Whether the axis is reversed. + bool y_axis_is_reversed_; + // Set to true only after the event handler has terminated. + bool event_handler_ended_; + // If the y axis is reversed, flip all y values by ySize. + int y_size_; + // # of created windows (used to assign an id to each ScrollView* for svmap). + static int nr_created_windows_; + // Serial number of sent images to ensure that the viewer knows they + // are distinct. + static int image_index_; + + // The stream through which the c++ client is connected to the server. + static SVNetwork *stream_; + + // Table of all the currently queued events. + std::unique_ptr<SVEvent> event_table_[SVET_COUNT]; + + // Mutex to access the event_table_ in a synchronized fashion. + std::mutex mutex_; + + // Semaphore to the thread belonging to this window. + SVSemaphore *semaphore_; +#endif // !GRAPHICS_DISABLED +}; + +} // namespace tesseract + +#endif // TESSERACT_VIEWER_SCROLLVIEW_H_
