OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 26 Апрель, 2024 22:59

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Векторная 2D-графика
СообщениеДобавлено: Вторник, 27 Апрель, 2010 16:33 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Решил попробовать свои силы в создании компонента с применением модели Model-View-Controller, разбираясь в принципе работы библиотеки Cairo по её исходникам.

Абстрактная модель работает по приципу фабрики (абстракция-реализация), хотя и требует доработки. Зависимости от каркаса БлэкБокса нет, однако построена по тому же принципу. Есть Model, Writer, View, Directory. Можно даже добавить в будущем экспорт/импорт в/из модель/и с помощью Internalize, Externalize.

Сначала строится векторная модель, которая ничего не знает о целевой поверхности. Ею может быть векторный документ (PS, PDF, SVG), рисуемая поверхность (GDI+, Xlib, Quartz, ...) или буфер изображения в памяти. Как только модель построена, её можно отображать в любой вид Views.Surface: DocumentSurface, DrawableSurface, ImageSurface.

Реализация пока лишь частичная и испольуется всё та же библиотека Cairo. В дальнейшем планируется отвязаться от связки реализации с Cairo, переписав алгоритмы растеризации на Компонентный Паскаль. Правда, работы там - не хило. :roll:

Вот такая демка уже работает, пишет векторную модель в изображение PNG:
Код:
MODULE VgDemo;
   
   IMPORT Types := VgTypes, Models := VgModels, StdModels := VgStdModels, Views := VgViews,
      StdLog;
   
   PROCEDURE Run*;
      VAR
         drawingModel: Models.Model;
         pattern: StdModels.SolidPattern;
         path: Models.Path;
         surface: Views.Surface;
   BEGIN
      drawingModel := Models.dir.New(70, 50);
      ASSERT(drawingModel # NIL, 20);
      
      path := drawingModel.NewPathWriter(NIL);
      ASSERT(path # NIL, 20);
      
      path.MoveTo(50, 35, Types.ABSOLUTE);
      path.LineTo(10, 15, Types.ABSOLUTE);
      path.LineTo(20, 22, Types.ABSOLUTE);
      path.CurveTo(0, 5, 12, 43, 32, 8, Types.ABSOLUTE);
      path.ClosePath;
      StdLog.String("Status: "); StdLog.Int(Types.status); StdLog.Ln;
      
      (*
      path.MoveTo(25, 43, Types.ABSOLUTE);
      path.LineTo(-25, -43, Types.ABSOLUTE);
      path.LineTo(-25, 43, Types.ABSOLUTE);
      path.CurveTo(20, -15, 45, -31, -2, 8, Types.ABSOLUTE);
      path.ClosePath;
      StdLog.String("Status: "); StdLog.Int(Types.status); StdLog.Ln;
      *)
      
      pattern := StdModels.NewSolidPattern() (StdModels.SolidPattern);
      ASSERT(pattern # NIL, 21);
      pattern.SetColorRGB(0.8, 0.6, 0.24);
      
      drawingModel.SetLineWidth(0.2);
      drawingModel.SetSource(pattern);
      
      surface := Views.dir.New(drawingModel);
      ASSERT(surface # NIL, 21);
      surface.Fill;
      surface.Destroy;
      
      drawingModel.Destroy
   END Run;
   
END VgDemo.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Векторная 2D-графика
СообщениеДобавлено: Среда, 28 Апрель, 2010 13:43 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3777
Это было бы очень полезно реализовать. Здорово, что занимаетесь этим.
А ведь вьюшка ведь тоже как поверхность выходит, а принтерная поверхность по сути генерирует ps (наверное так).
Что если сделать Cairo расширением Views? Вообще это возможно? Тогда фрейм как бы станет лэйаутом и ports будет абстрактным классом для векторной графики?

Тогда чтобы создать каринку в Cairo нужно только будет указать:
TYPE
Axes* = POINTER TO ABSTRACT RECORD (Cairo.View) END;
axes: Axes;

PROCEDURE (axes: Axes) Restore (f: Views.Frame; fl, ft, fr, fb: INTEGER);
BEGIN
f.DrawLine(...);
END Restore.

Или по типу как принтер реализован. Типо такого должно получится
Cairo.Png(view, '300dpi');

Сейчас векторную графику в PDF экспортирую отправляя из blackBox на печать вьюшку на виртуальный принтер, он ее в PS переделывает именно в векторном формате.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Векторная 2D-графика
СообщениеДобавлено: Среда, 28 Апрель, 2010 15:10 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Цитата:
Что если сделать Cairo расширением Views?
В планах имеется.
На базе какой модели нужно расширять вьюшку Cairo? Views.View? Cairo, полагаю, более продвинутый по возможностям, чем стандартный View.

Экспорт в PDF и другие векторные форматы уже сейчас можно реализовать. А с рисуемыми поверхностями надо разбираться, равно как и View, с которым мне ещё не доводилось иметь дела.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB