Логика описана в CPage::ProcessingAndRecordingOfPageData
I Этап
- Собираются шейпы с векторной графикой (DrawPath -> m_arShapes)
- Копируются текущие Pen и Brush,
- определяется тип шейпа VectorTexture или VectorGraphics
- первоначально определяем положение на стронице (перед текстом/позади текста - пока плохо работает, когда удалялись белые прямоугольники было лучше)
- задаются геометрические параметры
- определяется тип графики (Rectangle, Curve, ComplicatedFigure, NoGraphics) и подтип (LongDash, Dash, Dot, Wave)
- Собираются шейпы-картинки (WriteImage -> m_arImages)
- задаются геометрические параметры и тип шейпа Picture
- Собираются буквы и сразу распределются по текстовым линиям. Отдельно собираются DiacriticalSymbol (CollectTextData -> m_arTextLine, m_arDiacriticalSymbol)
- отбрасываем все пробелы (нужно будет добавить доп юникоды для других типов пробелов)
- работа FontManager
- задаются геометрические параметры
- генерим или проверяем на наличие стиль (копируются и анализируются текущие Font, Brush, PickFontName, PickFontStyle)
II Этап Собрали все объекты для текущей страницы. Начинаем анализ.
- Анализируем графику - AnalyzeCollectedShapes()
- BuildTables(); - собираем таблицы из шейпов (в разработке)
- DetermineLinesType() - превращаем шейпы в горизонтальные линии в зависимости от геометрии, удаляем обработанные шейпы, определяем тип полученной линии на основании типа графики (Rectangle, Curve, ComplicatedFigure, NoGraphics) и подтипа (LongDash, Dash, Dot, Wave). (2 вложенных цикла m_arShapes - m_arShapes с сортировкой вектора)
- AnalyzeCollectedTextLines() - добавляем свойства каждому символу отдельно
- Определяем взаимотношения между символами - FontEffects, VertAlignTypeBetweenConts, IsDuplicate (2 вложенных цикла m_arSymbol - m_arSymbol) (удаляем отработанные символы)
- DetermineStrikeoutsUnderlinesHighlights() - определяем взаимоотношения между графикой и символами Strikeouts, Underlines, Highlights, FontEffect (2 вложенных цикла m_arShapes - m_arSymbol) (удаляем отработанные шейпы)
- AddDiacriticalSymbols() - добавляем DiacriticalSymbol
- MergeLinesByVertAlignType() - объединяем линии с определенными eVertAlignType
- DeleteTextClipPage() - удаление линий вне страницы (1 цикл m_arTextLine)
- DetermineTextColumns() - определяем колонки текста и добавляем в таблицу (в разработке)
- BuildLines() - собираем из символов слова, добавляем пробелы
- DetermineDominantGraphics() - нужно, чтобы выделить шейп, который будет использоваться в качестве шейдинга параграфа (2 вложенных цикла m_arTextLine - m_arConts)
- BuildParagraphes() - собираем из текстовых строк параграфы/шейпы и добавляем в m_arOutputObjects
III Этап ToXml