Вернуться к разделу "OpenOCR".


                Описание ED-формата. Написана 2.11.98 Боженовым Артемом.
                (C) Cognitive Tech

Ed-формат употребляется при передаче результатов распознавания от ядра
к конвертерам, которые производят фрагментацию и прочие необходимые
преобразования текста (как то отписывание в виде txt, rtf и прочих форматах)

В файле может храниться только одна распознанная страница. Ее номер хранится в 
заголовке файла (см. sheet_disk_descr.sheet_numb).

Файл, как не трудно догадаться, имеет расширение ed.

Он состоит из набора блоков, каждый из которых начинается с тэга
(кода данных), за которым следует соответстующая ему структура.
Код данных являтся первым байтом данной структуры (поле
code), т.е. не дублируется 2 раза. Все тэги должны иметь код, не
превосходящий 0x1f. Список тэгов приведен в прил.1

Далее везде имется в виду, что BYTE это 1 беззнаковый байт, а WORD это 
2 беззнаковых байта.

Все упоминающиеся смещения указываются в пикселях(кажется).

Под текущей версией подразумевется вариант, используемый в cuneiform96-97

Сейчас будет список тэгов и пояснения:

			З А Г О Л О В О К

                код SS_SHEET_DESCR - заголовок файла

Самый первый байт файла.

Файл должен(?) начинаться со структуры

struct sheet_disk_descr
 {
 Word8 code;                  //=0x0A
 Int8 quant_fragm;
 Word16 sheet_numb;
 Word16 descr_lth;
 Word8 byte_flag;
 Word16 resolution;
 Word16  incline;
 Word16 version; 
 Int8 tabl[11];
 };
где 
quant_fragm - число фрагментов в листе. ВСЕГДА должен присутствовать хотя 
	      бы 1 фрагмент.
sheet_numb  - номер листа (либо с нуля, либо 0 - номер листа отсутствует(?))
descr_lth   - длина описателя листа, включая описатели фрагментов,
              расположенные следом.
resolution  - разрешение tiff'а в dpi
incline     - разворот картинки. Вычисляется по формуле 
              incline=(xideal-xreal)/yreal*2048=(yreal-yideal)/xreal*2048
tabl[13]    - зарезервировано    

Далее один за одним идут описатели фрагментов (всего quant_fragm штук), каждый
из которых начинается с 

                код SS_FRAGMENT - описатель нового фрагмента

!!!!Заметим, что ВНЕ заголовка код SS_FRAGMENT означает _СОВСЕМ_ДРУГОЕ_!!!
    (см. ниже) и в текущей версии не используется

!!!Также заметим, что в текущей версии эта структура не используется. Т.е.
создается один фиктивный фрагмент для совместимости, а данные по реальным
фрагментам хранятся при помощи SS_TEXT_REF(см.)

Структура содержит информацию по фрагментам. Номер фрагмента соответствует 
положению этой структуры в файле.

struct fragm_disk_descr
 {
 Word8 code;                           //=0x0B
 Word16 row;                           // coordinates of left upper
 Word16 col;                           // angle of fragment's frame
 Word16 height;                        // height of fragment
 Word16 w_width;                       // Q.w_width of fragment
 Int8 type;
 Word8 kegl;                           // kegl for following fragm
 Word8 font;                            // font ~~~~~~~~~~~~~~~~~~
 Word8 language;                       /* language for fragment*/
 Word8 type_underl;                    // type specifications of font
 };                                   //     for additional information
                                      //     look at underline

  row          - строка     (координаты верхнего левого
  col          - столбец     угла рамки фрагмента )
  height       - высота     (рамки
  w_width      - ширина      фрагмента)
  type         - тип        (0-текстовый,1-графический)
		 Также может принимать следующие значения:
                 #define FD_TYPE_TEXT 0
                 #define FD_TYPE_PICT 1
                 #define FD_TYPE_TABLE 2
                 #define FD_TYPE_EMPTY 3

  kegl         - кегль
  font         - фонт
  language     - язык фрагмента
  type_underl  - тип подчеркивания   (смотри спецификации типа в
                                     спецсимволе SS_UNDERLINE - Подчеркивание)



!!!  В соответствии с текущей версией ed файла далее идет блок описателей 
!!!  фрагментов, реализованный на базе тэга SS_TEXT_REF(см). Заголовок
!!!  оканчивается тэгом SS_TEXT_REF с полем type =SSR_FRAG_END(см).


Далее идет собственно файл.

			Т Е Л О   Ф А Й Л А

                код SS_BITMAP_REF - информация о привязке

Структура хранит информацию по привязке о идущем ЗА НЕЙ (в файле) символе
(или другом подобном элементе, таком как HalfSpace - см. ниже)

Если между двумя такими структурами не встречается ни одного объекта, к которому
можно было бы применить информацию, содержащуюся в структуре (чего в принципе
быть не должно), то содержимое первой структуры игнорируется. Обратно, если
после этой структуры идет более одного такого объекта( символа и.т.п.), то
информация из структуры применяется к ним всем.

struct bit_map_ref
 {
 Word8 code;                 //  == SS_BITMAP_REF
 Word8 pos;
 Word16 row;                  //  Reference box
 Word16 col;
 Word16 width;
 Word16 height;
 };

row,col      - коотрдинаты левого верхнего угла объекта, 
width,height - высота и ширина.

                SS_TEXT_REF - описатель текста
		(SS_REMARK)

struct text_ref
 {                                     // 0 - letter
 Word8 code;                            // 1 -
 Word8 type;                            // 2 - word
 Word16 object;                           // 3 - string
 };

code = 0x01
В текущей версии поле type сообщает о том, что лежит в поле object. 
Блок используется как альтернатива старой
системе форматирования текста и гибче ее. Список значений type - Прил.4.

Сведения по значению поля type и object:

        	Серия о фрагменте

Используется как альтернатива SS_FRAGMENT из заголовка. Блоки со значением
type=SSR_FRAG_... должны встречаться только в заголовке файла. Вся информация,
заключенная между стуктурами с type=SSR_FRAG_TYPE считается относяйщейся к 
одному фрагменту. Данные должны лежать в порядке, соответствующем появлению
строк с атрибутом SSR_LINE_FN в теле файла. Т.о. писать эти блоки в 
файл надо по следующему алгоритму:

while(текущий фрагмент < общего числа фрагментов)
{ 
  SSR_FRAG_TYPE, 
  SSR_FRAG_N,X,W,Y,H,BASE(если есть такая иформация есть),
  if(тип фрагмента == TAB_BEG) 
  {
     SSR_FRAG_PNUM, 
     for(i=0;i<числа колонок;i++)
     {
         SSR_FRAG_COLXW с x координтой i-й колонки,
	 SSR_FRAG_COLXW с шириной i-й колонки
     },
  }
  if(тип фрагмента == MCOL_BEG)
  {
     SSR_FRAG_PNUM
  }
  текущий фрагмент++,
}
SSR_FRAG_END,
текущий фрагмент=0,
while(текущий фрагмент < общего числа фрагментов)
{
  if(текущий фрагмент центрирован относительно другого фрагмента)
  {
    SSR_FRAG_SN,
    SSR_FRAG_REL
  }
  текущий фрагмент++,
}
SSR_SHEET_TYPE


Теперь подробнее:

SSR_FRAG_TYPE - тип фрагмента. Возможные типы - в прил.5. Описания будут.
		object - собственно тип
	TP_ONE_LINE      0x0001
	TP_LEFT_ALLIGN   0x0002
	TP_RIGHT_ALLIGN  0x0004
	TP_CENTER        0x0008
	TP_POS_INDENT    0x0010
	TP_NEG_INDENT    0x0020
	TP_BULLET        0x0040
	TP_POESY         0x0080
	TP_LN_SPACE      0x0100
	TP_NOT_RECOG     0x0200
	TP_BORDER        0x0400
	TP_BRACKET       0x8000
	TP_MCOL_BEG      (TP_BRACKET|0x1000)- начало многоколоночной секции
	TP_NEW_COL       (TP_BRACKET|0x2000)- начало новой колонки внутри многоколоночной секции
	TP_MCOL_END      (TP_BRACKET|0x3000)- конец многоколоночноой секции 
	TP_TAB_BEG       (TP_BRACKET|0x4000)
	TP_NEW_ROW       (TP_BRACKET|0x5000)
	TP_DEL           (TP_NOT_RECOG|TP_BORDER)
	TP_FICT_FR_FLAGS (TP_BORDER|TP_BRACKET)

FICT_FR_FLAGS - фрагменты, у которых object&FICT_FR_FLAGS!=0 являются
фиктивными, т.е. не присутствуют в теле файла в виде SS_FRAGMENT, а служат лишь
для указания форматирования текста.


SSR_FRAG_N - номер фрагмента, данный пользователем на этапе сегментации(?)
	     object - собственно номер

SSR_FRAG_X -         горизонтальное расположение фрагмента в tiff'е	
SSR_FRAG_W -         object - соотв. левый край и ширина фрагмента

SSR_FRAG_Y -         вертикальное расположение фрагмента в tiff'е
SSR_FRAG_H -         object - соотв. верхний край и высота фрагмента

SSR_FRAG_BASE - Regular margin from 'x'

SSR_FRAG_PNUM - если тип фрагмента TAB_BEG или MCOL_BEG, то object - количество 
                соответственно ячеек/колонок.

SSR_FRAG_COLXW - гориз.расположение столбцов таблицы. Структуры должны
		 идти парами в первой object - x координата, во второй
		 object - ширина. Такие стурктуры дожны 
		 идти в блоке, имеющим тип TAB_BEG

SSR_FRAG_SN    - object: номер фрагмента, данный ему распознавалкой(т.е. 
                 порядковый номер в файле	 
SSR_FRAG_REL   - object: for centered fragment - number given automatically 
                 of centered parent

SSR_FRAG_END - завершает описатели фрагментов. object - количество описанных
	       фрагментов.

		Серия о строке

Блоки из этой серии лежат независимо от тэга SS_LINE_BEG. И как бы образуют
заголовок строки. Пишутся по алгоритму:

if(строка фиктивная)
{
   SSR_LINE_FICT
   конец
}
SSR_LINE_FN,
SSR_LINE_TYPE,
SSR_LINE_NUMBER(это не обязательно),
if (начало абзаца)
{
   SSR_LINE_PARAGRAPH
   SSR_LINE_INDENT
}
if (строка составная)
   SSR_LINE_NPIECES
if (начало абзатца с маркером)
{
   SSR_LINE_PARAGRAPH
   SSR_LINE_INDENT
}
SSR_LINE_X,
SSR_LINE_W,
SSR_LINE_BASELINE,
SSR_LINE_HEIGHT


Теперь подробнее:

SSR_LINE_FN - object: порядковый номер фрагмента, которому принадлежит строка

SSR_LINE_PARAGRAPH - Строка является началом нового абзатца. Object принимает 
                     значения:
      #define ORD_LN   0
      #define NEW_PAR  0x1        // new paragraph
      #define BUL_PAR  0x2        // paragraph with bullet
                     Если строка - не начало обзатца, то этот тэг можно не ставить

SSR_LINE_TYPE - object: тип строки

	                   0x0         for deleted line
      #define DL_HUGE_XW   0x1      // XW changed due to huge letter
      #define DL_HUGE      0x2      // Huge letter
      #define DL_ASSEMBLY  0x4      // Line assembled from pieces
      #define DL_SINGLE    0x8      // Single-letter line

SSR_LINE_BULIND - object - размер отступа для маркера (буллита)(если есть)

SSR_LINE_INDENT - object - размер отступа начала обзатца(если есть)

SSR_LINE_X -    Горизонтальная позиция в tiff'е
SSR_LINE_W -    object - соотв. левый край и ширина строки

SSR_LINE_BASELINE - 3d baseline position (ideal)

SSR_LINE_HEIGHT - Height beetween 2nd and 3rd baselines

SSR_LINE_NPIECES - идет в сломаной строке(когда тип строки - DL_ASSEMBLY). 
		   object - Number of original pieces within line - 1 

SSR_LINE_FICT - означает, что строка - фиктивная (не должна учитываться)
                object - игнорируется


Также type может принимать следующие значения:

SSR_LINE_NUMBER         и тогда object - это порядковый номер строки в файле
                        (хотя зачем он нужен - непонятно: его и так можно 
                         вычислить)
SSR_WORD_BOLD           и тогда object - это density of word
SSR_SHEET_TYPE          и тогда object - 0 или 1 в зависимости от ExistSheets 


		Серия о поломатой строке

Эти тэги встречаются в середина строки и означают изменение величин,
заданных тэгами SSR_LINE_...(см.)

type=SSR_BROKEN_X
означает скачек в x координате строки. object игнорируется. 
Эквивалентен SS_LINE_BEG

type=SSR_BROKEN_W
object игнорируется. Означает игнорирование начала строки?

type=SSR_BROKEN_BASELINE
скачек в бейслайне, который есть 3d baseline position (ideal). object - 
новый baseline

type=SSR_BROKEN_HEIGHT
скачек в высоте строки, которая есть Height beetween 2nd and 3rd baselines.
object - новая высота

                код SS_FRAGMENT - начало нового фрагмента

!!!В текущей версии не применяется. Информация о принадлежности строки фрагменту
   находится в SS_TEXT_REF type=SSR_LINE_FN;
!!!

Обозначает начало нового фрагмента. Данные по фрагменту находятся в 
соответствующем описателе в заголовке файла.
Также обозначает начало новой строки
(см. SS_LINE_BEG: fragm_disk.depth==line_beg.base_line)
Т.о. не следует после SS_FRAGMENT ставить SS_LINE_BEG.

struct fragm_disk
 {
 Word8 code;                  //=0x0B
 Word8 fragm_numb;
 Word16 depth;
 };
     fragm_numb - номер начинающегося фрагмента(от нуля)
     depth      - смещение  основания текущей строки от верхней
	          границы фрагмента.


                код SS_LANGUAGE - язык распознавания

этот тэг игнорируется?? Это необходимо в связи с несовершенностью
редатора, который не умеет его правильно обрабатывать. Например после
редактирования английского символа он превратился в русский. ТЭГ языка
сохраняется при этом английский. Это приводит к ошибке при конвертировании
TIGERа.

struct EdTagLanguage  
{
    Word8 code; 		// 0x0f
    Word8 language;
};
language - код языка (см. прил.2)

                код SS_EXTENTION - начало расширенного блока

этот тэг был введен для расширения формата ed и дабавления ему гибкости.
За ним идет содержательная структура. 

struct edExtention
{
        Word8 code;   /* always 0x1C */
        Word16 Ecode;  /* New extention code */
        Word16 length; /* Length in bytes */
};

   Ecode  - содержит один из расширенных кодов( см. ниже), описывающий 
            содержательную структуру. 
   length - размер этой структуры, _ВКЛЮЧАЯ_ размер структуры edExtention.
		
                код SS_LINE_BEG -  новая строка

!!!В текущей версии поля height и base_line не используются. Эти и другие 
   параметры строки описывется при помощи структуры SS_TEXT_REF
!!!

Обозначает начало новой строки символов. Есть мнение, что height не 
используется, т.к. эта структура очень похожа на fragm_disk(см. SS_FRAGMENT)

Строка считается принадлежащей последнему встретившемуся фрагменту.

struct line_beg
 {
 Word8 code;			//0x0D
 Word8 height;
 Word16 base_line;                         // displacement for current
 };                                     //     line to upper frame of fragment
                                //  i.e.Vertical offset from the fragm. start

 height    - зарезервировано(?). По другим данным это
	     высота строки, которая есть Height beetween 2nd and 3rd baselines
 base_line - смещение (смещение текущей линии относительно
		       верхней границы фрагмента)

                код SS_FONT_KEGL - информация о шрифте

Информация о шрифте идущего ЗА НЕЙ (в файле) символа
(или другого подобного элемента, такого как HalfSpace - см. ниже)

Для него верно все то же, что и для CC_BITMAPREF

struct font_kegl                       //  1 - serific
 {                                     //  2 - gelvetic
 Word8 code;                            //  4 - bold
 Word8 new_kegl;                        //  8 - light
 Word16 new_font;                        // 16 - italic
 };                          	       // 32 - straight                                    
				       // 64 - underlined

code     = 0x02
new_kegl - новый кегль
new_font - новый фонт(В столбик перечислены возможные варианты, возможны комбинации)

                код SS_POS_HALF_SPACE - положительный полупробел
			(добавление промежутка)

Вставляет в текущую строку символ SS_POS_HALF_SPACE
(?)В ранних версиях код 0x1f означал SS_NEG_HALF_SPACE, 
а 0x1e - SS_POS_HALF_SPACE

struct pos_half_space
 {
 Word8 code;              		//0x1f
 Word8 authenticity_degree;
 };

authenticity_degree - степень достоверности, т.е. вероятность правильного 
                      распознавания символа
                     ( 0<=authenticity_degree<=255 )

                SS_NEG_HALF_SPACE - Отрицательный полупробел

(?)В ранних версиях код 0x1f означал SS_NEG_HALF_SPACE, 
а 0x1e - SS_POS_HALF_SPACE

struct neg_half_space
 {
 Word8 code;                             //0x1e
 Word8 authenticity_degree;
 };

authenticity_degree - степень достоверности

                SS_TABUL - символ табуляции

Вставляет символ табуляции в текущую строку после текущего символа

struct tabul
 {
 Word8 code;				//0x08
 Word8 numb_in_tab_tabul;                // number of position in
 };                                     //         table of tabulation

numb_in_tab_tabul - номер позиции в таблице табуляций(см.SS_TABL_TABUL)

                SS_KEGL - Кегль

struct kegl
 {
 Word8 code;           //0x03
 Word8 new_kegl;
 };

new_kegl - новый кегль

                SS_SHIFT - сдвиг

struct shift
 {
 Word8 code;                 //0x04
 Word8 kegl;
 Word16 clearance;                         // value of lift or descent
 };                                     // lift positive
                                        // descent negative

kegl      - кегль
clearance - смещение  (значение подъема или спуска относительно
	    базовой строки,подъем выражается положительной
	    величиной,спуск-отрицательной)
                
		SS_RETR_LEVEL - Востановить уровень

struct retrieve_level
 {
 Word8 code;		//0x05
 Word8 kegl;
 };

kegl - кегль

                SS_UNDERLINE - Подчеркивание

struct underline
 {                                     // 0 - thin straight
 Word8 code;                           // 1- half thick straight
 Word8 type;                           // 2- thick straight
 };                                    // 3- thin cursive
                                       // 4- half thick cursive
                                       // 5- thick cursive
                                       // 6- beg of underline
                                       // 7- end of underline

code = 0x06
type - тип (0-тонкий прямой,1-полужирный прямой, 2- жирный прямой,
	   3-тонкий курсив,4-полужирный курсив,5-жирный курсив,
	   6-начало подчеркивания,7-конец подчеркивания)


                SS_DENS_PRINT - Плотность печати

struct dens_print
 {
 Word8 code;                             //0x07
 Word8 dens_atr;                         // attribute of print's
 };                                     //                 density

dens_atr - атрибут плотности печати

                SS_TABL_TABUL - Таблица табуляции

struct tabl_tabul
 {
 Word8 code;			//0x09
 Word8 lth;                              // scale of arow
 Word16 arow_pos[1] ;
 };

lth         - длина массива
arow_pos[1] - первый элемент массива

                SS_STEP_BACK - Абзацный отступ

!!!В текущей версии не применяется. Вместо него использутся SS_TEXT_REF
   c type=SSR_LINE_INDENT

struct step_back
 {                                   	//0x0c
 Word8 code;
 Word8 Step_back;                        // value of backstep
 };

m_step_back - отступ

                SS_POSITION - Позиция

!!!В текущей версии не применяется. Вместо него использутся SS_TEXT_REF
   c type=SSR_LINE_X

struct position
 {
 Word8 code;                             //0x0E
 Word8 store;
 Word16 pos;                               // position in line for
 };                                     //     left frame of  fragm

store - запас
pos   - позиция         (позиция в линии относительно левой границы
			 фрагмента)


                SS_TABL_CONFORM_SIZES - Таблица соответствия размеров

struct table_conform_sizes
 {
 Word8 code;			//0x10
 Word8 store;
 Int8 tab_val_A [9*2];                   // table of sizes of letter A
 };                                      //     for kegles from 4 to 12

store           - запас
tab_val_A [9*2] - таблица [9x2](Элементы таблицы-значения размеров большой 
                  буквы А для кеглей 4-12 включительно.Длина элемента 1-байт.)


                SS_GROUP_WORDS - Группа слов

struct group_words
 {
 Word8 code;			//0x11
 Word8 gr_wd_type;                        // 0 - beg of group
 };                                       // 1 - cur. word of group
                                          // 2 - end
                                          // 3 - partition between groups

gr_wd_type - тип   (тип:0-начало группы,
			1-текущее слово группы,
			2-конец группы,
			3-разделение между группами.)

                SS_GROUP_SYMBOLS - группа символов

struct group_symbols
 {
 Word8 code;			//0x12
 Word8 gr_sb_type;
 };

gr_sb_type - тип   (тип:0-начало группы,
			1-текущее слово группы,
			2-конец группы,
			3-разделение между группами.)

                SS_BORDER

struct border
    {
    Word8 code;          // 0x16 SS_BORDER
    Word8 type;          // 1 - left
#define b_vert 1        // 2 - right
#define b_hor  4        // 4 - top
			// 8 - bottom
    Word16  length;        // Length of border in pixels
    Word16  x,y;           // Coordinates of line begin
    };

                SS_TABLE_HEADER

struct table_header
    {
    Word8    code;       // 0x17 SS_TABLE_HEADER
    Word8    cols;       // Number of columns
    Word16     lth;        // Total length of record
    Word16     nfrag[1];    // List of fragments in header of table
    };

                SS_LIST_OF_FRAGMENTS

struct list_of_fragments
    {
    Word8    code;       // 0x18 SS_LIST_OF_FRAGMENTS
    Word8    cols;       // Number of columns
    Word16     lth;        // Total length of record
    Word16     nfrag[1];   // List of fragments in table
    };

                SS_AKSANT - Ударение

struct aksant
 {
 Word8 code1;			//0x1D
 Word8 code;
 };
 code1 - символ(?)
 code  - символ


Если мы наткнулись на неописанный выше тэг, и его значение меньше, чем 0x20,
то значит кто-то расширил ed формат( чего делать не следовало), и
все что нам остается - выйти с сообщением о невозможности причитать
конец файла.

Если же неописанный выше тэг имеет значение, большее или равное
0x20(код пробела), то это не тэг, а код распознанного символа. 

Символ считается принадлежащим последней встретившейся строке.

!!! Появлению самого превого символа на странице должен предшествовать блок,
означающий начало строки (SS_FRAGMENT либо SS_LINE_BEG)!!! 
Если такого блока не было, то символ следует
игнорировать(?).

  Символ - это,последовательность пар: альтернативный полиграфический
символ, его вероятность.Символ и вероятность занимают по одному байту.
Ноль в младшем бите вероятности служит признаком конца последова-
тельности. Символ,обладающий наибольшей вероятностью в пределах
заданной последовательности, до правки оператором стоит первым.

Теперь то же, но моими словами. В файле хранится
не более 8(?) различных вариантов распознавания этого сивола, т.е.
не более 8 подряд идущих структур

struct letter
{
    Word8    bType;          //  ASCII code.  >= ' '.
    Word8    bAttrib;          
};

bType   - распознанная буква
bAttrib - достоверность распознавания

Если поле bAttrib содержит 1 в младшем бите(т.е.bAttrib&1==1), то это не
последняя альтернатива - следует считать еще одну такую же структуру. Иначе-
последняя, далее идет новый блок. Если мы сделаем (bAttrib & 254), то получим
достоверность определения соответствующей буквы. По идее среди всевозможных
вариантов надо выбрать тот, у которого эта достоверность максимальна.


		Р А С Ш И Р Е Н Н Ы Й   ED


(см.SS_EXTENTION)
Каждый блок из этой группы представляет собой структуру, начинающюяся
с edExtention, где содержится информация о том, что же тут собственно лежит.
Поле edExtention.Ecode может принимать одно из значений. Эти значения разбиты на 
логические группы:

 0x0000 - 0x00FF special code 
 0x0100 - 0x01FF table description 
 0x0200 - 0x02FF picture description 
 0x0300 - 0xEFFF Your code please...

 0xF000 - 0xFFFF temporary code for debugging ( ! Not used in release version !)

#define ITS_EDEXT_SPECIAL(a)   (a>=0x0000 && a<0x0100)
#define ITS_EDEXT_TABLE(a)     (a>=0x0100 && a<0x0200)
#define ITS_EDEXT_PICTURE(a)   (a>=0x0200 && a<0x0300)

Эти макросы помогут в работе с кодом расширения.

 ITS_EDEXT_SPECIAL(Ecode) коды из этого диапозона зарезервированы для
дальнейшего использования.

 ITS_EDEXT_TABLE(Ecode) коды из этого диапозона описывают таблицы.

 ITS_EDEXT_PICTURE(Ecode) коды из этого диапозона описывают картинки.

 Коды 0x0300 - 0xEFFF можно использовать по Вашему усмотрению. Сообщите нам о
том какой диапозон Вы намерены использовать, чтобы не пересекаться.

 Коды 0xF000 - 0xFFFF резервируются для отладочных целей. Не используйте их в
окончательных вариантах версий.

Теперь конкретные значения:
		EDEXT_VERSION - версия

		EDEXT_TABLE_START - описатель таблицы

Этот код инициализирует работу с таблицей. Он указывает на структуру описания
таблицы.

typedef struct sTable
{
 EDEXT 	  head;
 Int32      Sh;           // число горизонтальных линий
 Int32      Sv;           // число вертикальных линий
 Int32      angle;        // угол наклона таблицы в 1/1024 радиана
 Int32      VerCount;     // число вертикальных линий подлежащих удалению
                        // средствами программы распознавания
 Int32 ShiftX;            // смещение верхнего левого угла таблицы от
 Int32 ShiftY;            // того же угла изображения
} edTable;

		EDEXT_TABLE_VER
Этот код указывает на массив чисел - X координаты вертикальных линий.
Число чисел Sv в структуре sTable. Тип INT.

		EDEXT_TABLE_HOR         
Этот код указывает на массив чисел - Y координаты горизонтальных
линий.  Число чисел Sh в структуре sTable. Тип INT.

		EDEXT_TABLE_TAB         
Этот код указывает на массив чисел определяющих матрицу описания таблицы.
Каждый элемент матрицы есть число - пользовательский номер фрагмента
(user_num), который расположен в этой таблице. Если соседние ячейки матрицы
имеют одинаковый номер, тогда эти ячейки матрицы определяют одну ячейку
таблицы. Число чисел в структуре определяется как (Sh-1)*(Sv-1).  Тип INT.

		EDEXT_TABLE_VERLINE     
Этот код указывает на массив чисел - X,Y координаты вертикальных линий
подлежащих удалению.  Число чисел равно VertCount*2. Тип INT.

		EDEXT_CTP	 	
Этот код указывает на структуру ctp_hdr. Этот код инициализирует работу с
картинками. (смотри CTP.H)
 struct ctp_hdr {
        #define SIGNA   "CT Picture"
        BYTE Signatura[10];
        };
Эта структура лежит в самом начале ctp файла


		EDEXT_PICTURE - описатель картинки

предваряет структуру

struct ctp_pic_hdr {
Word32	pic_size;	// in bytes
Word16	x_off;		// in pixels
Word16	y_off;		// in pixels
Word16	w;		// in pixels
Word16	h;		// in pixels
Word16	resolution;
Word16	bpl;		// bytes per line. Only if native format
Word8    bitpix;
Word8	type;
Word8    PicName[32];
};

где type может принимать значения

#define ctp_BW          0
#define ctp_greytone    1
#define ctp_color	2
#define ctp_2xx		10 // compressed
#define ctp_4xx		11 // contured
#define ctp_native      64 /* if type less this const
			      It one of native formats */
#define ctp_tiff        65
#define ctp_gif         66
#define ctp_pcx         67
#define ctp_bmp         68
#define ctp_wmf		69
#define ctp_jpeg	70

 Эта структура описывает конкретную картинку. Все элементы этой структуры,
кроме PicName носят справочный характер. В элементе PicName указано имя
файла, где хранится картинка.  Сейчас (10.10.96) предпологается , что она
раcположена в поддиректории, где лежит ED, одноименной имени ED файла .

Эта структура лежит в ctp файле сразу после ctp_hdr


		Сводная табличка расширенных кодов

#define EDEXT_VERSION		0x0000

#define EDEXT_TABLE_START 	0x0100 // edTable struct
#define EDEXT_TABLE_VER         0x0101 // array horiz. coord of vert lines (x0,x1,...)
#define EDEXT_TABLE_HOR         0x0102 // array vert. coord of horiz. lines (y0,y1,...)
#define EDEXT_TABLE_TAB         0x0103 // array ID of items
#define EDEXT_TABLE_VERLINE     0x0104 // array not delete vert lines (x00,y00,x01,y01,...)

#define EDEXT_CTP	 	0x0200 // filename of CTP file
#define EDEXT_PICTURE           0x0201 // struct of <edPicture>



Прил.1
Список тэгов

#define SS_BITMAP_REF 		0x00
#define SS_TEXT_REF 		0x01
#define SS_REMARK SS_TEXT_REF
#define SS_FONT_KEGL 		0x02
#define SS_KEGL 		0x03
#define SS_SHIFT 		0x04
#define SS_RETR_LEVEL 		0x05
#define SS_UNDERLINE 		0x06
#define SS_DENS_PRINT 		0x07
#define SS_TABUL 		0x08
#define SS_TABL_TABUL 		0x09
#define SS_SHEET_DESCR 		0x0a
#define SS_FRAGMENT 		0x0b
#define SS_STEP_BACK 		0x0c
#define SS_LINE_BEG 		0x0d
#define SS_POSITION 		0x0e
#define SS_LANGUAGE 		0x0f
#define SS_TABL_CONFORM_SIZES 	0x10
#define SS_GROUP_WORDS 		0x11
#define SS_GROUP_SYMBOLS 	0x12
#define SS_PARAGRAPH     	0x15
#define SS_BORDER        	0x16
#define SS_TABLE_HEADER  	0x17
#define SS_LIST_OF_FRAGMENTS 	0x18
#define SS_AKSANT 		0x1d
#define SS_NEG_HALF_SPACE 	0x1e
#define SS_POS_HALF_SPACE 	0x1f

Прил.2
Список кодов языков для структуры EDCC_LANGUAGE

LANG_ENGLISH    ангоийский
LANG_GERMAN     немецкий
LANG_FRENCH     французский
LANG_RUSSIAN    русский
LANG_SWEDISH    шведский
LANG_SPANISH    испанский
LANG_ITALIAN    итальянский
LANG_RUSENG     рус&англ
LANG_UKRAINIAN  ураинский
LANG_SERBIAN    сербский
LANG_CROATIAN   хорватский
LANG_DANISH     датский
LANG_PORTUGUESE португальский
LANG_DUTCH      голландский

#define LANG_ENGLISH 0
#define LANG_GERMAN  1
#define LANG_FRENCH  2
#define LANG_RUSSIAN 3
#define LANG_SWEDISH 4
#define LANG_SPANISH 5
#define LANG_ITALIAN 6
#define LANG_RUSENG  7
#define LANG_UKRAINIAN  8
#define LANG_SERBIAN    9
#define LANG_CROATIAN  10
#define LANG_DANISH     11
#define LANG_PORTUGUESE 12
#define LANG_DUTCH      13

Прил.3
Размеры стандартных блоков

Если размер больше или равен 0x40, то значит, что настоящий размер хранится в
самой структуре, по смещению, равному: (значение в таблице & 0xf).
Длина этого размера - 2 байта,если значение в таблице >=0x80 и
1 байт в противном случае.

static unsigned char ed_table[]=
    {
    sizeof (struct bit_map_ref),        /* 0  SS_BITMAP_REF         */
    sizeof (struct text_ref),           /* 1  SS_TEXT_REF           */
    sizeof (struct font_kegl),          /* 2  SS_FONT_KEGL          */
    sizeof (struct kegl),               /* 3  SS_KEGL               */
    sizeof (struct shift),              /* 4  SS_SHIFT              */
    sizeof (struct retrieve_level),     /* 5  SS_RETR_LEVEL         */
    sizeof (struct underline),          /* 6  SS_UNDERLINE          */
    sizeof (struct dens_print),         /* 7  SS_DENS_PRINT         */
    sizeof (struct tabul),              /* 8  SS_TABUL              */
    0x41,                               /* 9  SS_TABL_TABUL         */
    0x84,                               /* 0A SS_SHEET_DESCR        */
    sizeof (struct fragm_disk),         /* 0B SS_FRAGMENT           */
    sizeof (struct step_back),          /* 0C SS_STEP_BACK          */
    sizeof (struct line_beg),           /* 0D SS_LINE_BEG           */
    sizeof (struct position),           /* 0E SS_POSITION           */
    sizeof(struct EdTagLanguage),       /* 0F SS_LANGUAGE           */
    sizeof (struct table_conform_sizes),/* 10 SS_TABL_CONFORM_SIZES */
    sizeof (struct group_words),        /* 11 SS_GROUP_WORDS        */
    sizeof (struct group_symbols),      /* 12 SS_GROUP_SYMBOLS      */
    0,                                  /* 13 Unused code           */
    0,                                  /* 14 Unused code           */
    2,                                  /* 15 ASCII symbol 'Start Paragraph'      */
    sizeof (struct border),             /* 16 SS_BORDER             */
    0x82,                               /* 17 SS_TABLE_HEADER       */
    0x82,                               /* 18 SS_LIST_OF FRAGMENTS  */
    0,                                  /* 19 Unused code           */
    0,                                  /* 1A Unused code           */
    0,                                  /* 1B Unused code           */
    0x83,                               /* 1C Special code of Extention ED */
    sizeof (struct aksant),             /* 1D SS_AKSANT             */
    sizeof (struct neg_half_space),     /* 1E SS_NEG_HALF_SPACE     */
    sizeof (struct pos_half_space)      /* 1F SS_POS_HALF_SPACE     */
    };

		Таблица кодов для спецсимволов.
-----------------------------------------------------------------------------
идентифицирующий код | длина в байтах|        название
---------------------|---------------|-----------------------------------------
0x00		     |     6         | ссылка на графический образ
0x01		     |     4         | ссылка на текст
0x02		     |     4         | фонт и кегль
0x03                 |     2         | кегль
0x04		     |     4         | сдвиг
0x05		     |     2         | востановить уровень
0x06		     |     2         | подчеркивание
0x07  		     |     2         | плотность печати
0x08                 |     2         | табуляция
0x09		     |     ?         | таблица табуляции
0x0a		     |     ?         | описатель листа
0x0b		     |     14        | описатель фрагмента
				       (Встречаются только в заголовке
				       следом за описателем листа)
0x0b                 |     4         | начало фрагмента
0x0с                 |     2         | отступ
0x0d		     |     4         | начало линии
0x0e		     |     4         | позиция
0x10		     |     18        | таблица соответсвия размеров
0x11		     |     2         | группа слов
0x12		     |     2         | группа символов
0x1d		     |     2         | ударение
0x1e		     |     2         | положительный полупробел
0x1f		     |     2         | отрицательный полупробел
-------------------------------------------------------------------------------

Прил.4 Коды описателей типа для SS_TEXT_REF(SS_REMARK)

#define SSR_HUGE		0    /* Internal remark about huge letter */

/* Seria within broken line: first - BROKEN_X, last - BROKEN_W  */
#define SSR_BROKEN_BASELINE	1
#define SSR_BROKEN_HEIGHT	2
#define SSR_BROKEN_X		3
#define SSR_BROKEN_W		4

/* Seria about line: first - LINE_FN, other - optional  */
#define SSR_LINE_FN		5
#define SSR_LINE_PARAGRAPH	6
#define SSR_LINE_TYPE		7
#define SSR_LINE_INDENT		8
#define SSR_LINE_NPIECES        9
#define SSR_LINE_FICT		16
#define SSR_LINE_BULIND		23
#define SSR_LINE_X		24
#define SSR_LINE_W		25
#define SSR_LINE_BASELINE	26
#define SSR_LINE_HEIGHT		27

/* Seria about fragment: first - FRAG_TYPE      */
#define SSR_FRAG_TYPE		10
#define SSR_FRAG_BASE		11
#define SSR_FRAG_X		12
#define SSR_FRAG_W		13
#define SSR_FRAG_N		14
#define SSR_FRAG_SN		17
#define SSR_FRAG_REL		18
#define SSR_FRAG_Y   		19
#define SSR_FRAG_H		20
#define SSR_FRAG_PNUM		21
#define SSR_FRAG_COLXW		28

#define SSR_FRAG_END		15	/* end of fragments list  */

/* Misceleneaus  */

#define SSR_LINE_NUMBER		22	/* Internal line number  */
#define SSR_WORD_BOLD           32      /* density of word */
#define SSR_SHEET_TYPE          33      /* type of sheet */

Прил.5 
#define ONE_LINE      0x0001
#define LEFT_ALLIGN   0x0002
#define RIGHT_ALLIGN  0x0004
#define CENTER        0x0008
#define POS_INDENT    0x0010
#define NEG_INDENT    0x0020
#define BULLET        0x0040
#define POESY         0x0080
#define LN_SPACE      0x0100
#define NOT_RECOG     0x0200
#define BORDER        0x0400
#define BRACKET       0x8000
#define MCOL_BEG      (BRACKET|0x1000)
#define NEW_COL       (BRACKET|0x2000)
#define MCOL_END      (BRACKET|0x3000)
#define TAB_BEG       (BRACKET|0x4000)
#define NEW_ROW       (BRACKET|0x5000)
#define DEL           (NOT_RECOG|BORDER)
#define FICT_FR_FLAGS (BORDER|BRACKET)
Hosted by uCoz