Вернуться к разделу "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 беззнаковых байта.

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

Под текущей версией подразумевется вариант, используемый в CuneiForm 96-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_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 */

/* Miscelenous */

#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