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, переписав алгоритмы растеризации на Компонентный Паскаль. Правда, работы там - не хило. ![]() Вот такая демка уже работает, пишет векторную модель в изображение 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/ |