Вернуться к разделу "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)