diff --git a/menu/menu_setting.c b/menu/menu_setting.c index bac6157114..9e1b4e4463 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -2494,7 +2494,7 @@ static bool setting_append_list( settings_data_list_current_add_flags(list, list_info, SD_FLAG_LAKKA_ADVANCED); #if !defined(IOS) - /* Apple rejects iOS apps that lets you forcibly quit an application. */ + /* Apple rejects iOS apps that let you forcibly quit them. */ CONFIG_ACTION( list, list_info, MENU_ENUM_LABEL_QUIT_RETROARCH, diff --git a/translation/drivers/translation_cached_google.c b/translation/drivers/translation_cached_google.c index 0e694b1128..9a736512f2 100644 --- a/translation/drivers/translation_cached_google.c +++ b/translation/drivers/translation_cached_google.c @@ -9,12 +9,12 @@ static void translation_cached_google_free(void* data) { } -static char* translation_cached_google_translate_text(const char* game_text) +static char* translation_cached_google_translate_text(void* data, const char* game_text) { return ""; } -static char* translation_cached_google_translate_image(struct ocr_image_info image) +static char* translation_cached_google_translate_image(void* data, struct ocr_image_info image) { return ""; } diff --git a/translation/drivers_ocr/ocr_null.c b/translation/drivers_ocr/ocr_null.c index 3ffd874ea2..610e9ea27c 100644 --- a/translation/drivers_ocr/ocr_null.c +++ b/translation/drivers_ocr/ocr_null.c @@ -1,6 +1,6 @@ #include "../ocr_driver.h" -static void* ocr_null_init() +static void* ocr_null_init(int game_character_set) { return NULL; } @@ -9,7 +9,7 @@ static void ocr_null_free(void* data) { } -char* ocr_null_get_text(struct ocr_image_info image) +char* ocr_null_get_text(void* data, struct ocr_image_info image) { return ""; } diff --git a/translation/drivers_ocr/ocr_tesseract.c b/translation/drivers_ocr/ocr_tesseract.c index 9b0157a7bc..7623c6523b 100644 --- a/translation/drivers_ocr/ocr_tesseract.c +++ b/translation/drivers_ocr/ocr_tesseract.c @@ -1,7 +1,40 @@ -#include "../ocr_driver.h" +#include -static void* ocr_tesseract_init() +#include "../ocr_driver.h" +#include "tesseract/wrapper/tess_get_text.h" + +static void* ocr_tesseract_init(int game_character_set) { + const char* tess_char_set = NULL; + switch (game_character_set) + { + case RETRO_LANGUAGE_JAPANESE: + tess_char_set = "jpn"; + break; + + case RETRO_LANGUAGE_ENGLISH: + tess_char_set = "eng"; + break; + + case RETRO_LANGUAGE_SPANISH: + tess_char_set = "spa"; + break; + } + + if (!tess_char_set) + return NULL; + + char* lang_data_dir = NULL; + + /* TODO: get lang data from system dir */ + + bool pass = tess_init(lang_data_dir, tess_char_set); + if (pass) + { + /* data is unused by tesseract */ + return (void*)32; + } + return NULL; } @@ -9,9 +42,31 @@ static void ocr_tesseract_free(void* data) { } -char* ocr_tesseract_get_text(struct ocr_image_info image) +char* ocr_tesseract_get_text(void* data, struct ocr_image_info image) { - return ""; + tess_image temp_image; + + temp_image.width = image.width; + temp_image.height = image.height; + temp_image.data = image.data; + + switch (image.pixel_format) + { + case RETRO_PIXEL_FORMAT_0RGB1555: + case RETRO_PIXEL_FORMAT_RGB565: + temp_image.bytes_per_pixel = 2; + break + + case RETRO_PIXEL_FORMAT_XRGB8888: + temp_image.bytes_per_pixel = 4; + break; + + default: + /* unsupported format */ + return ""; + } + + return tess_get_text(temp_image); } const ocr_driver_t ocr_tesseract = { diff --git a/translation/drivers_ocr/tesseract/capi.h b/translation/drivers_ocr/tesseract/capi.h deleted file mode 100644 index 8195c68f12..0000000000 --- a/translation/drivers_ocr/tesseract/capi.h +++ /dev/null @@ -1,397 +0,0 @@ -/////////////////////////////////////////////////////////////////////// -// File: capi.h -// Description: C-API TessBaseAPI -// -// (C) Copyright 2012, 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. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef API_CAPI_H_ -#define API_CAPI_H_ - -#ifdef TESS_CAPI_INCLUDE_BASEAPI -# include "baseapi.h" -# include "pageiterator.h" -# include "resultiterator.h" -# include "renderer.h" -#else -# include "platform.h" -# include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef TESS_CALL -# if defined(WIN32) -# define TESS_CALL __cdecl -# else -# define TESS_CALL -# endif -#endif - -#ifndef BOOL -# define BOOL int -# define TRUE 1 -# define FALSE 0 -#endif - -#ifdef TESS_CAPI_INCLUDE_BASEAPI -typedef tesseract::TessResultRenderer TessResultRenderer; -typedef tesseract::TessTextRenderer TessTextRenderer; -typedef tesseract::TessHOcrRenderer TessHOcrRenderer; -typedef tesseract::TessPDFRenderer TessPDFRenderer; -typedef tesseract::TessUnlvRenderer TessUnlvRenderer; -typedef tesseract::TessBoxTextRenderer TessBoxTextRenderer; -typedef tesseract::TessBaseAPI TessBaseAPI; -typedef tesseract::PageIterator TessPageIterator; -typedef tesseract::ResultIterator TessResultIterator; -typedef tesseract::MutableIterator TessMutableIterator; -typedef tesseract::ChoiceIterator TessChoiceIterator; -typedef tesseract::OcrEngineMode TessOcrEngineMode; -typedef tesseract::PageSegMode TessPageSegMode; -typedef tesseract::ImageThresholder TessImageThresholder; -typedef tesseract::PageIteratorLevel TessPageIteratorLevel; -typedef tesseract::DictFunc TessDictFunc; -typedef tesseract::ProbabilityInContextFunc TessProbabilityInContextFunc; -// typedef tesseract::ParamsModelClassifyFunc TessParamsModelClassifyFunc; -typedef tesseract::FillLatticeFunc TessFillLatticeFunc; -typedef tesseract::Dawg TessDawg; -typedef tesseract::TruthCallback TessTruthCallback; -typedef tesseract::Orientation TessOrientation; -typedef tesseract::ParagraphJustification TessParagraphJustification; -typedef tesseract::WritingDirection TessWritingDirection; -typedef tesseract::TextlineOrder TessTextlineOrder; -typedef PolyBlockType TessPolyBlockType; -#else -typedef struct TessResultRenderer TessResultRenderer; -typedef struct TessTextRenderer TessTextRenderer; -typedef struct TessHOcrRenderer TessHOcrRenderer; -typedef struct TessPDFRenderer TessPDFRenderer; -typedef struct TessUnlvRenderer TessUnlvRenderer; -typedef struct TessBoxTextRenderer TessBoxTextRenderer; -typedef struct TessBaseAPI TessBaseAPI; -typedef struct TessPageIterator TessPageIterator; -typedef struct TessResultIterator TessResultIterator; -typedef struct TessMutableIterator TessMutableIterator; -typedef struct TessChoiceIterator TessChoiceIterator; -typedef enum TessOcrEngineMode { OEM_TESSERACT_ONLY, OEM_LSTM_ONLY, OEM_TESSERACT_LSTM_COMBINED, OEM_DEFAULT } TessOcrEngineMode; -typedef enum TessPageSegMode { PSM_OSD_ONLY, PSM_AUTO_OSD, PSM_AUTO_ONLY, PSM_AUTO, PSM_SINGLE_COLUMN, PSM_SINGLE_BLOCK_VERT_TEXT, - PSM_SINGLE_BLOCK, PSM_SINGLE_LINE, PSM_SINGLE_WORD, PSM_CIRCLE_WORD, PSM_SINGLE_CHAR, PSM_SPARSE_TEXT, - PSM_SPARSE_TEXT_OSD, PSM_COUNT } TessPageSegMode; -typedef enum TessPageIteratorLevel { RIL_BLOCK, RIL_PARA, RIL_TEXTLINE, RIL_WORD, RIL_SYMBOL} TessPageIteratorLevel; -typedef enum TessPolyBlockType { PT_UNKNOWN, PT_FLOWING_TEXT, PT_HEADING_TEXT, PT_PULLOUT_TEXT, PT_EQUATION, PT_INLINE_EQUATION, - PT_TABLE, PT_VERTICAL_TEXT, PT_CAPTION_TEXT, PT_FLOWING_IMAGE, PT_HEADING_IMAGE, - PT_PULLOUT_IMAGE, PT_HORZ_LINE, PT_VERT_LINE, PT_NOISE, PT_COUNT } TessPolyBlockType; -typedef enum TessOrientation { ORIENTATION_PAGE_UP, ORIENTATION_PAGE_RIGHT, ORIENTATION_PAGE_DOWN, ORIENTATION_PAGE_LEFT } TessOrientation; -typedef enum TessParagraphJustification { JUSTIFICATION_UNKNOWN, JUSTIFICATION_LEFT, JUSTIFICATION_CENTER, JUSTIFICATION_RIGHT } TessParagraphJustification; -typedef enum TessWritingDirection { WRITING_DIRECTION_LEFT_TO_RIGHT, WRITING_DIRECTION_RIGHT_TO_LEFT, WRITING_DIRECTION_TOP_TO_BOTTOM } TessWritingDirection; -typedef enum TessTextlineOrder { TEXTLINE_ORDER_LEFT_TO_RIGHT, TEXTLINE_ORDER_RIGHT_TO_LEFT, TEXTLINE_ORDER_TOP_TO_BOTTOM } TessTextlineOrder; -typedef struct ETEXT_DESC ETEXT_DESC; -#endif - -struct Pix; -struct Boxa; -struct Pixa; - -/* General free functions */ - -TESS_API const char* - TESS_CALL TessVersion(); -TESS_API void TESS_CALL TessDeleteText(char* text); -TESS_API void TESS_CALL TessDeleteTextArray(char** arr); -TESS_API void TESS_CALL TessDeleteIntArray(int* arr); -#ifdef TESS_CAPI_INCLUDE_BASEAPI -TESS_API void TESS_CALL TessDeleteBlockList(BLOCK_LIST* block_list); -#endif - -/* Renderer API */ -TESS_API TessResultRenderer* TESS_CALL TessTextRendererCreate(const char* outputbase); -TESS_API TessResultRenderer* TESS_CALL TessHOcrRendererCreate(const char* outputbase); -TESS_API TessResultRenderer* TESS_CALL TessHOcrRendererCreate2(const char* outputbase, BOOL font_info); -TESS_API TessResultRenderer* TESS_CALL TessPDFRendererCreate(const char* outputbase, const char* datadir, - BOOL textonly); -TESS_API TessResultRenderer* TESS_CALL TessUnlvRendererCreate(const char* outputbase); -TESS_API TessResultRenderer* TESS_CALL TessBoxTextRendererCreate(const char* outputbase); - -TESS_API void TESS_CALL TessDeleteResultRenderer(TessResultRenderer* renderer); -TESS_API void TESS_CALL TessResultRendererInsert(TessResultRenderer* renderer, TessResultRenderer* next); -TESS_API TessResultRenderer* - TESS_CALL TessResultRendererNext(TessResultRenderer* renderer); -TESS_API BOOL TESS_CALL TessResultRendererBeginDocument(TessResultRenderer* renderer, const char* title); -TESS_API BOOL TESS_CALL TessResultRendererAddImage(TessResultRenderer* renderer, TessBaseAPI* api); -TESS_API BOOL TESS_CALL TessResultRendererEndDocument(TessResultRenderer* renderer); - -TESS_API const char* TESS_CALL TessResultRendererExtention(TessResultRenderer* renderer); -TESS_API const char* TESS_CALL TessResultRendererTitle(TessResultRenderer* renderer); -TESS_API int TESS_CALL TessResultRendererImageNum(TessResultRenderer* renderer); - -/* Base API */ - -TESS_API TessBaseAPI* - TESS_CALL TessBaseAPICreate(); -TESS_API void TESS_CALL TessBaseAPIDelete(TessBaseAPI* handle); - -TESS_API size_t TESS_CALL TessBaseAPIGetOpenCLDevice(TessBaseAPI* handle, void **device); - -TESS_API void TESS_CALL TessBaseAPISetInputName( TessBaseAPI* handle, const char* name); -TESS_API const char* TESS_CALL TessBaseAPIGetInputName(TessBaseAPI* handle); - -TESS_API void TESS_CALL TessBaseAPISetInputImage(TessBaseAPI* handle, struct Pix* pix); -TESS_API struct Pix* TESS_CALL TessBaseAPIGetInputImage(TessBaseAPI* handle); - -TESS_API int TESS_CALL TessBaseAPIGetSourceYResolution(TessBaseAPI* handle); -TESS_API const char* TESS_CALL TessBaseAPIGetDatapath(TessBaseAPI* handle); - -TESS_API void TESS_CALL TessBaseAPISetOutputName(TessBaseAPI* handle, const char* name); - -TESS_API BOOL TESS_CALL TessBaseAPISetVariable(TessBaseAPI* handle, const char* name, const char* value); -TESS_API BOOL TESS_CALL TessBaseAPISetDebugVariable(TessBaseAPI* handle, const char* name, const char* value); - -TESS_API BOOL TESS_CALL TessBaseAPIGetIntVariable( const TessBaseAPI* handle, const char* name, int* value); -TESS_API BOOL TESS_CALL TessBaseAPIGetBoolVariable( const TessBaseAPI* handle, const char* name, BOOL* value); -TESS_API BOOL TESS_CALL TessBaseAPIGetDoubleVariable(const TessBaseAPI* handle, const char* name, double* value); -TESS_API const char* - TESS_CALL TessBaseAPIGetStringVariable(const TessBaseAPI* handle, const char* name); - -TESS_API void TESS_CALL TessBaseAPIPrintVariables( const TessBaseAPI* handle, FILE* fp); -TESS_API BOOL TESS_CALL TessBaseAPIPrintVariablesToFile(const TessBaseAPI* handle, const char* filename); -#ifdef TESS_CAPI_INCLUDE_BASEAPI -TESS_API BOOL TESS_CALL TessBaseAPIGetVariableAsString(TessBaseAPI* handle, const char* name, STRING* val); -#endif - -#ifdef TESS_CAPI_INCLUDE_BASEAPI -TESS_API int TESS_CALL TessBaseAPIInit(TessBaseAPI* handle, const char* datapath, const char* language, - TessOcrEngineMode mode, char** configs, int configs_size, - const STRING* vars_vec, size_t vars_vec_size, - const STRING* vars_values, size_t vars_values_size, BOOL set_only_init_params); -#endif -TESS_API int TESS_CALL TessBaseAPIInit1(TessBaseAPI* handle, const char* datapath, const char* language, TessOcrEngineMode oem, - char** configs, int configs_size); -TESS_API int TESS_CALL TessBaseAPIInit2(TessBaseAPI* handle, const char* datapath, const char* language, TessOcrEngineMode oem); -TESS_API int TESS_CALL TessBaseAPIInit3(TessBaseAPI* handle, const char* datapath, const char* language); - -TESS_API int TESS_CALL TessBaseAPIInit4(TessBaseAPI* handle, const char* datapath, const char* language, TessOcrEngineMode mode, - char** configs, int configs_size, - char** vars_vec, char** vars_values, size_t vars_vec_size, - BOOL set_only_non_debug_params); - -TESS_API const char* - TESS_CALL TessBaseAPIGetInitLanguagesAsString(const TessBaseAPI* handle); -TESS_API char** - TESS_CALL TessBaseAPIGetLoadedLanguagesAsVector(const TessBaseAPI* handle); -TESS_API char** - TESS_CALL TessBaseAPIGetAvailableLanguagesAsVector(const TessBaseAPI* handle); - -TESS_API int TESS_CALL TessBaseAPIInitLangMod(TessBaseAPI* handle, const char* datapath, const char* language); -TESS_API void TESS_CALL TessBaseAPIInitForAnalysePage(TessBaseAPI* handle); - -TESS_API void TESS_CALL TessBaseAPIReadConfigFile(TessBaseAPI* handle, const char* filename); -TESS_API void TESS_CALL TessBaseAPIReadDebugConfigFile(TessBaseAPI* handle, const char* filename); - -TESS_API void TESS_CALL TessBaseAPISetPageSegMode(TessBaseAPI* handle, TessPageSegMode mode); -TESS_API TessPageSegMode - TESS_CALL TessBaseAPIGetPageSegMode(const TessBaseAPI* handle); - -TESS_API char* TESS_CALL TessBaseAPIRect(TessBaseAPI* handle, const unsigned char* imagedata, - int bytes_per_pixel, int bytes_per_line, - int left, int top, int width, int height); - -TESS_API void TESS_CALL TessBaseAPIClearAdaptiveClassifier(TessBaseAPI* handle); - -TESS_API void TESS_CALL TessBaseAPISetImage(TessBaseAPI* handle, const unsigned char* imagedata, int width, int height, - int bytes_per_pixel, int bytes_per_line); -TESS_API void TESS_CALL TessBaseAPISetImage2(TessBaseAPI* handle, struct Pix* pix); - -TESS_API void TESS_CALL TessBaseAPISetSourceResolution(TessBaseAPI* handle, int ppi); - -TESS_API void TESS_CALL TessBaseAPISetRectangle(TessBaseAPI* handle, int left, int top, int width, int height); - -#ifdef TESS_CAPI_INCLUDE_BASEAPI -TESS_API void TESS_CALL TessBaseAPISetThresholder(TessBaseAPI* handle, TessImageThresholder* thresholder); -#endif - -TESS_API struct Pix* - TESS_CALL TessBaseAPIGetThresholdedImage( TessBaseAPI* handle); -TESS_API struct Boxa* - TESS_CALL TessBaseAPIGetRegions( TessBaseAPI* handle, struct Pixa** pixa); -TESS_API struct Boxa* - TESS_CALL TessBaseAPIGetTextlines( TessBaseAPI* handle, struct Pixa** pixa, int** blockids); -TESS_API struct Boxa* - TESS_CALL TessBaseAPIGetTextlines1( TessBaseAPI* handle, const BOOL raw_image, const int raw_padding, - struct Pixa** pixa, int** blockids, int** paraids); -TESS_API struct Boxa* - TESS_CALL TessBaseAPIGetStrips( TessBaseAPI* handle, struct Pixa** pixa, int** blockids); -TESS_API struct Boxa* - TESS_CALL TessBaseAPIGetWords( TessBaseAPI* handle, struct Pixa** pixa); -TESS_API struct Boxa* - TESS_CALL TessBaseAPIGetConnectedComponents(TessBaseAPI* handle, struct Pixa** cc); -TESS_API struct Boxa* - TESS_CALL TessBaseAPIGetComponentImages( TessBaseAPI* handle, const TessPageIteratorLevel level, const BOOL text_only, - struct Pixa** pixa, int** blockids); -TESS_API struct Boxa* - TESS_CALL TessBaseAPIGetComponentImages1( TessBaseAPI* handle, const TessPageIteratorLevel level, const BOOL text_only, - const BOOL raw_image, const int raw_padding, - struct Pixa** pixa, int** blockids, int** paraids); - -TESS_API int TESS_CALL TessBaseAPIGetThresholdedImageScaleFactor(const TessBaseAPI* handle); - -TESS_API void TESS_CALL TessBaseAPIDumpPGM(TessBaseAPI* handle, const char* filename); - -TESS_API TessPageIterator* - TESS_CALL TessBaseAPIAnalyseLayout(TessBaseAPI* handle); - -TESS_API int TESS_CALL TessBaseAPIRecognize(TessBaseAPI* handle, ETEXT_DESC* monitor); -TESS_API int TESS_CALL TessBaseAPIRecognizeForChopTest(TessBaseAPI* handle, ETEXT_DESC* monitor); -TESS_API BOOL TESS_CALL TessBaseAPIProcessPages(TessBaseAPI* handle, const char* filename, const char* retry_config, - int timeout_millisec, TessResultRenderer* renderer); -TESS_API BOOL TESS_CALL TessBaseAPIProcessPage(TessBaseAPI* handle, struct Pix* pix, int page_index, const char* filename, - const char* retry_config, int timeout_millisec, TessResultRenderer* renderer); - -TESS_API TessResultIterator* - TESS_CALL TessBaseAPIGetIterator(TessBaseAPI* handle); -TESS_API TessMutableIterator* - TESS_CALL TessBaseAPIGetMutableIterator(TessBaseAPI* handle); - -TESS_API char* TESS_CALL TessBaseAPIGetUTF8Text(TessBaseAPI* handle); -TESS_API char* TESS_CALL TessBaseAPIGetHOCRText(TessBaseAPI* handle, int page_number); -TESS_API char* TESS_CALL TessBaseAPIGetBoxText(TessBaseAPI* handle, int page_number); -TESS_API char* TESS_CALL TessBaseAPIGetUNLVText(TessBaseAPI* handle); -TESS_API int TESS_CALL TessBaseAPIMeanTextConf(TessBaseAPI* handle); -TESS_API int* TESS_CALL TessBaseAPIAllWordConfidences(TessBaseAPI* handle); -TESS_API BOOL TESS_CALL TessBaseAPIAdaptToWordStr(TessBaseAPI* handle, TessPageSegMode mode, const char* wordstr); - -TESS_API void TESS_CALL TessBaseAPIClear(TessBaseAPI* handle); -TESS_API void TESS_CALL TessBaseAPIEnd(TessBaseAPI* handle); - -TESS_API int TESS_CALL TessBaseAPIIsValidWord(TessBaseAPI* handle, const char* word); -TESS_API BOOL TESS_CALL TessBaseAPIGetTextDirection(TessBaseAPI* handle, int* out_offset, float* out_slope); - -#ifdef TESS_CAPI_INCLUDE_BASEAPI -TESS_API void TESS_CALL TessBaseAPISetDictFunc(TessBaseAPI* handle, TessDictFunc f); -TESS_API void TESS_CALL TessBaseAPIClearPersistentCache(TessBaseAPI* handle); -TESS_API void TESS_CALL TessBaseAPISetProbabilityInContextFunc(TessBaseAPI* handle, TessProbabilityInContextFunc f); - -TESS_API void TESS_CALL TessBaseAPISetFillLatticeFunc(TessBaseAPI* handle, TessFillLatticeFunc f); - -// Call TessDeleteText(*best_script_name) to free memory allocated by this function -TESS_API BOOL TESS_CALL TessBaseAPIDetectOrientationScript(TessBaseAPI* handle, - int* orient_deg, float* orient_conf, const char **script_name, float* script_conf); - -TESS_API void TESS_CALL TessBaseAPIGetFeaturesForBlob(TessBaseAPI* handle, TBLOB* blob, INT_FEATURE_STRUCT* int_features, - int* num_features, int* FeatureOutlineIndex); - -TESS_API ROW* TESS_CALL TessFindRowForBox(BLOCK_LIST* blocks, int left, int top, int right, int bottom); -TESS_API void TESS_CALL TessBaseAPIRunAdaptiveClassifier(TessBaseAPI* handle, TBLOB* blob, int num_max_matches, - int* unichar_ids, float* ratings, int* num_matches_returned); -#endif - -TESS_API const char* - TESS_CALL TessBaseAPIGetUnichar(TessBaseAPI* handle, int unichar_id); - -#ifdef TESS_CAPI_INCLUDE_BASEAPI -TESS_API const TessDawg* - TESS_CALL TessBaseAPIGetDawg(const TessBaseAPI* handle, int i); -TESS_API int TESS_CALL TessBaseAPINumDawgs(const TessBaseAPI* handle); -#endif - -#ifdef TESS_CAPI_INCLUDE_BASEAPI -TESS_API ROW* TESS_CALL TessMakeTessOCRRow(float baseline, float xheight, float descender, float ascender); -TESS_API TBLOB* - TESS_CALL TessMakeTBLOB(Pix* pix); -TESS_API void TESS_CALL TessNormalizeTBLOB(TBLOB* tblob, ROW* row, BOOL numeric_mode); - -TESS_API TessOcrEngineMode - TESS_CALL TessBaseAPIOem(const TessBaseAPI* handle); -TESS_API void TESS_CALL TessBaseAPIInitTruthCallback(TessBaseAPI* handle, TessTruthCallback* cb); -#endif - -TESS_API void TESS_CALL TessBaseAPISetMinOrientationMargin(TessBaseAPI* handle, double margin); -#ifdef TESS_CAPI_INCLUDE_BASEAPI -TESS_API void TESS_CALL TessBaseGetBlockTextOrientations(TessBaseAPI* handle, int** block_orientation, BOOL** vertical_writing); - -TESS_API BLOCK_LIST* - TESS_CALL TessBaseAPIFindLinesCreateBlockList(TessBaseAPI* handle); -#endif - -/* Page iterator */ - -TESS_API void TESS_CALL TessPageIteratorDelete(TessPageIterator* handle); -TESS_API TessPageIterator* - TESS_CALL TessPageIteratorCopy(const TessPageIterator* handle); - -TESS_API void TESS_CALL TessPageIteratorBegin(TessPageIterator* handle); -TESS_API BOOL TESS_CALL TessPageIteratorNext(TessPageIterator* handle, TessPageIteratorLevel level); -TESS_API BOOL TESS_CALL TessPageIteratorIsAtBeginningOf(const TessPageIterator* handle, TessPageIteratorLevel level); -TESS_API BOOL TESS_CALL TessPageIteratorIsAtFinalElement(const TessPageIterator* handle, TessPageIteratorLevel level, - TessPageIteratorLevel element); - -TESS_API BOOL TESS_CALL TessPageIteratorBoundingBox(const TessPageIterator* handle, TessPageIteratorLevel level, - int* left, int* top, int* right, int* bottom); -TESS_API TessPolyBlockType - TESS_CALL TessPageIteratorBlockType(const TessPageIterator* handle); - -TESS_API struct Pix* - TESS_CALL TessPageIteratorGetBinaryImage(const TessPageIterator* handle, TessPageIteratorLevel level); -TESS_API struct Pix* - TESS_CALL TessPageIteratorGetImage(const TessPageIterator* handle, TessPageIteratorLevel level, int padding, - struct Pix* original_image, int* left, int* top); - -TESS_API BOOL TESS_CALL TessPageIteratorBaseline(const TessPageIterator* handle, TessPageIteratorLevel level, - int* x1, int* y1, int* x2, int* y2); - -TESS_API void TESS_CALL TessPageIteratorOrientation(TessPageIterator* handle, TessOrientation* orientation, - TessWritingDirection* writing_direction, TessTextlineOrder* textline_order, - float* deskew_angle); - -TESS_API void TESS_CALL TessPageIteratorParagraphInfo(TessPageIterator* handle, TessParagraphJustification* justification, - BOOL *is_list_item, BOOL *is_crown, int *first_line_indent); - -/* Result iterator */ - -TESS_API void TESS_CALL TessResultIteratorDelete(TessResultIterator* handle); -TESS_API TessResultIterator* - TESS_CALL TessResultIteratorCopy(const TessResultIterator* handle); -TESS_API TessPageIterator* - TESS_CALL TessResultIteratorGetPageIterator(TessResultIterator* handle); -TESS_API const TessPageIterator* - TESS_CALL TessResultIteratorGetPageIteratorConst(const TessResultIterator* handle); -TESS_API TessChoiceIterator* - TESS_CALL TessResultIteratorGetChoiceIterator(const TessResultIterator* handle); - -TESS_API BOOL TESS_CALL TessResultIteratorNext(TessResultIterator* handle, TessPageIteratorLevel level); -TESS_API char* TESS_CALL TessResultIteratorGetUTF8Text(const TessResultIterator* handle, TessPageIteratorLevel level); -TESS_API float TESS_CALL TessResultIteratorConfidence(const TessResultIterator* handle, TessPageIteratorLevel level); -TESS_API const char* - TESS_CALL TessResultIteratorWordRecognitionLanguage(const TessResultIterator* handle); -TESS_API const char* - TESS_CALL TessResultIteratorWordFontAttributes(const TessResultIterator* handle, BOOL* is_bold, BOOL* is_italic, - BOOL* is_underlined, BOOL* is_monospace, BOOL* is_serif, - BOOL* is_smallcaps, int* pointsize, int* font_id); - -TESS_API BOOL TESS_CALL TessResultIteratorWordIsFromDictionary(const TessResultIterator* handle); -TESS_API BOOL TESS_CALL TessResultIteratorWordIsNumeric(const TessResultIterator* handle); -TESS_API BOOL TESS_CALL TessResultIteratorSymbolIsSuperscript(const TessResultIterator* handle); -TESS_API BOOL TESS_CALL TessResultIteratorSymbolIsSubscript(const TessResultIterator* handle); -TESS_API BOOL TESS_CALL TessResultIteratorSymbolIsDropcap(const TessResultIterator* handle); - -TESS_API void TESS_CALL TessChoiceIteratorDelete(TessChoiceIterator* handle); -TESS_API BOOL TESS_CALL TessChoiceIteratorNext(TessChoiceIterator* handle); -TESS_API const char* TESS_CALL TessChoiceIteratorGetUTF8Text(const TessChoiceIterator* handle); -TESS_API float TESS_CALL TessChoiceIteratorConfidence(const TessChoiceIterator* handle); - -#ifdef __cplusplus -} -#endif - -#endif // API_CAPI_H_ diff --git a/translation/drivers_ocr/tesseract/wrapper/tess_get_text.cpp b/translation/drivers_ocr/tesseract/wrapper/tess_get_text.cpp new file mode 100644 index 0000000000..9b18083daa --- /dev/null +++ b/translation/drivers_ocr/tesseract/wrapper/tess_get_text.cpp @@ -0,0 +1,45 @@ +#include +#include "tess_get_text.h" + +#define ERROR_BUFFER_LENGTH 1000 + +static tesseract::TessBaseAPI *api; +static char* one_time_return_pointer = NULL; + +char tess_last_error[ERROR_BUFFER_LENGTH]; + +bool tess_init(const char* lang_data_dir, const char* language) +{ + api = new tesseract::TessBaseAPI(); + snprintf(tess_last_error, ERROR_BUFFER_LENGTH, "No errors!\n"); + + if (api->Init(lang_data_dir, language)) { + snprintf(tess_last_error, ERROR_BUFFER_LENGTH, "Could not initialize tesseract.\n"); + return false; + } +} + +void tess_deinit() +{ + if (one_time_return_pointer) + { + delete [] one_time_return_pointer; + } + + if (api) + { + api->End(); + } +} + +char* tess_get_text(tess_image image) +{ + if (one_time_return_pointer) + { + delete [] one_time_return_pointer; + } + + api->SetImage(image.data, image.width, image.height, image.bytes_per_pixel, image.width * image.bytes_per_pixel/*bytes per line*/); + one_time_return_pointer = api->GetUTF8Text(); + return one_time_return_pointer; +} \ No newline at end of file diff --git a/translation/drivers_ocr/tesseract/wrapper/tess_get_text.h b/translation/drivers_ocr/tesseract/wrapper/tess_get_text.h new file mode 100644 index 0000000000..ee2358ff76 --- /dev/null +++ b/translation/drivers_ocr/tesseract/wrapper/tess_get_text.h @@ -0,0 +1,27 @@ +#ifndef TESS_GET_TEXT +#define TESS_GET_TEXT + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + unsigned width; + unsigned height; + unsigned bytes_per_pixel; + void* data; +}tess_image; + +extern char tess_last_error[]; + +//if running in RetroArch language should be "eng" or "jpn" +bool tess_init(const char* lang_data_dir, const char* language); +void tess_deinit(); +char* tess_get_text(tess_image image); + +#ifdef __cplusplus +} +#endif + + +#endif \ No newline at end of file diff --git a/translation/ocr_driver.c b/translation/ocr_driver.c index 3f694f99bd..38bd2fb51d 100644 --- a/translation/ocr_driver.c +++ b/translation/ocr_driver.c @@ -1,4 +1,8 @@ +#include +#include + #include "ocr_driver.h" +#include "../configuration.h" static const ocr_driver_t *ocr_backends[] = { #ifdef HAVE_TESSERACT @@ -11,13 +15,31 @@ static const ocr_driver_t *ocr_backends[] = { static const ocr_driver_t *current_ocr_backend = NULL; static void *ocr_data = NULL; + +static const ocr_driver_t *ocr_find_backend(const char* ident) +{ + unsigned i; + + for (i = 0; ocr_backends[i]; i++) + { + if (string_is_equal(ocr_backends[i]->ident, ident)) + return ocr_backends[i]; + } + + return NULL; +} + bool ocr_driver_init(void) { - /*TODO: find name of active driver*/ - + settings_t *settings = config_get_ptr(); + int game_char_set = RETRO_LANGUAGE_DUMMY; + current_ocr_backend = ocr_find_backend(settings->arrays.ocr_driver); ocr_data = NULL; + + /* TODO: get game language */ + if (current_ocr_backend) - ocr_data = (*current_ocr_backend->init)(); + ocr_data = (*current_ocr_backend->init)(game_char_set); return ocr_data != NULL; } diff --git a/translation/ocr_driver.h b/translation/ocr_driver.h index ad16870019..d9241cc8d4 100644 --- a/translation/ocr_driver.h +++ b/translation/ocr_driver.h @@ -1,18 +1,22 @@ #ifndef __OCR_DRIVER__H #define __OCR_DRIVER__H +#include +#include + +RETRO_BEGIN_DECLS + struct ocr_image_info { - int game_character_set; - unsigned image_width; - unsigned image_height; + unsigned width; + unsigned height; unsigned pixel_format; - void* image_data; + void* data; }; typedef struct ocr_driver { - void* (*init)(); + void* (*init)(int game_character_set); void (*free)(void* data); /* returned char pointers do not need to be freed but are 1 time use, they may be destroyed on the next call to get_text */ @@ -32,4 +36,6 @@ void ocr_driver_free(void); /* returned char pointers do not need to be freed but are 1 time use, they may be destroyed on the next call to ocr_driver_get_text */ char* ocr_driver_get_text(struct ocr_image_info image); +RETRO_END_DECLS + #endif \ No newline at end of file diff --git a/translation/translation_driver.c b/translation/translation_driver.c index aa39fd44b4..9c46b99b0a 100644 --- a/translation/translation_driver.c +++ b/translation/translation_driver.c @@ -1,5 +1,8 @@ +#include + #include "translation_driver.h" #include "ocr_driver.h" +#include "../configuration.h" static const translation_driver_t *translation_backends[] = { &translation_cached_google, @@ -10,11 +13,26 @@ static const translation_driver_t *translation_backends[] = { static const translation_driver_t *current_translation_backend = NULL; static void *translation_data = NULL; + +static const translation_driver_t *translation_find_backend(const char* ident) +{ + unsigned i; + + for (i = 0; translation_backends[i]; i++) + { + if (string_is_equal(translation_backends[i]->ident, ident)) + return translation_backends[i]; + } + + return NULL; +} + bool translation_driver_init(void) { - /*TODO: find name of active driver*/ - + settings_t *settings = config_get_ptr(); + current_translation_backend = translation_find_backend(settings->arrays.translation_driver); translation_data = NULL; + if (current_translation_backend) translation_data = (*current_translation_backend->init)(); return translation_data != NULL; diff --git a/translation/translation_driver.h b/translation/translation_driver.h index 92647dff3d..561a2952c1 100644 --- a/translation/translation_driver.h +++ b/translation/translation_driver.h @@ -1,8 +1,13 @@ #ifndef __TRANSLATION_DRIVER__H #define __TRANSLATION_DRIVER__H +#include +#include + #include "ocr_driver.h" +RETRO_BEGIN_DECLS + enum translation_init_errors { TRANSLATION_INIT_SUCCESS = 0, @@ -41,4 +46,6 @@ void translation_driver_free(void); /* returned char pointers do not need to be freed but are 1 time use, they may be destroyed on the next call to translation_driver_translate_image */ char* translation_driver_translate_image(struct ocr_image_info image); +RETRO_END_DECLS + #endif \ No newline at end of file