OberonCore
https://forum.oberoncore.ru/

Векторная 2D-графика
https://forum.oberoncore.ru/viewtopic.php?f=47&t=2603
Страница 1 из 1

Автор:  Роман М. [ Вторник, 27 Апрель, 2010 16:33 ]
Заголовок сообщения:  Векторная 2D-графика

Решил попробовать свои силы в создании компонента с применением модели 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.

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

Это было бы очень полезно реализовать. Здорово, что занимаетесь этим.
А ведь вьюшка ведь тоже как поверхность выходит, а принтерная поверхность по сути генерирует 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 переделывает именно в векторном формате.

Автор:  Роман М. [ Среда, 28 Апрель, 2010 15:10 ]
Заголовок сообщения:  Re: Векторная 2D-графика

Цитата:
Что если сделать Cairo расширением Views?
В планах имеется.
На базе какой модели нужно расширять вьюшку Cairo? Views.View? Cairo, полагаю, более продвинутый по возможностям, чем стандартный View.

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/