summaryrefslogtreecommitdiff
path: root/src/corelib/render/software/agg-demos/readme.txt
blob: f284ecafebf4e87b1271b014b3a74343c2d93478 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
================================================================================

 Anti-Grain Geometry - Version 2.4
 Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)

 Anti-Grain Geometry - Version 2.4 Release Milano 3 (AggPas 2.4 RM3)
 Pascal Port By: Milan Marusinec alias Milano
                 milan@marusinec.sk
                 http://www.aggpas.org
                 Copyright (c) 2005-2008

================================================================================
 News
================================================================================
 
 22.01.2008 - AggPas - version 2.4 Release Milano 3
 ----------
 
 - Library source code is updated all over to keep up with new possibilities 
   of AGG C/C++ 2.4 version. Some code is slightly changed and there are also 
   a newly ported units. However this update is not rewrite, for example image 
   and pattern stuff and path storage is kept from 2.3 (same functionality). 
   See examples for 14 new demos. 
   
 - Flash compound rasterizer - fully ported, full functional
 - Gaussian and stack blurs
 - Two more composition modes - invert & invert rgb
 - Focal gradient with extended center point
 - New gradients: Contour, Assymetric conic, Bitmap
 - Bitmap caching - see the Particles demo
 - SVG demo now works also with expat.dll
 - FreeType2 bindings - freetype demos are now fully ported
 - Agg2D API and also TAgg2D for Delphi VCL (over 100 API commands)

 - Documentation for TAgg2D API is available at:
 
   http://www.aggpas.org/documentation

   This documentation is not a part of software distribution package, because
   it is planned to be an independent live document evolving over time.

   
 26.06.2006 - AggPas - version 2.3 Release Milano 2
 ----------
 
 - SVG demo is ported for now. See svg_test.dpr & svg directory in src.
   As a part of the SVG demo, I had also ported partialy the Expat library.
   See Expat directory & read the readme.txt if you are interested more.

 - Whole source code of AggPas library was adjusted to be compilable under 
   the emerging 64bit FreePascal compiler. The adjustment includes changing
   the "integer(pointer(x ) )" constructs to the "ptrcomp(pointer(x ) )".
   Ptrcomp is defined in the agg_basics.pas and depending on the CPU64 
   conditional it is either integer or int64.

================================================================================
 Remarks
================================================================================
 
 I'm glad to hear that AGG and my work on AggPas inspired Mr. Lars Brubaker 
 to make a native port in C#.
 
 Try it at: http://agg-sharp.sourceforge.net/
 
 From the .9 demo seen so far, it looks very promising. Maybe over a year,
 I will try to help with the C# version to get finished (not promise).
 
 Keep on the good work Lars !
    
================================================================================
 Introduction
================================================================================

 AggPas is an Object Pascal port of the Anti-Grain Geometry library - AGG,
 originally written by Maxim Shemanarev in industrially standard C++. 
 AGG as well as AggPas is Open Source and free of charge 2D vector graphic
 library.
 
 AGG (and AggPas too) doesn't depend on any graphic API or technology. 
 Basically, you can think of AGG as of a rendering engine that produces pixel 
 images in memory from some vectorial data. But of course, AGG can do much 
 more than that. The ideas and the philosophy of AGG are ...
 
 Read more at: http://www.antigrain.com/about
 
 This version of AGG library is the Object Pascal one and this Readme Note 
 is dealing with issues mainly around the Pascal version.

================================================================================
 Installation notes & compiling
================================================================================ 

 AggPas can be currently compiled on the platforms with compilers 
 according to the following matrix:
 
 +----------------------+---------------------+---------------------+
 | Platform / Compiler  |  Free Pascal (FPC)  |   Delphi (Borland)  |
 +======================+=====================+=====================+
 | Windows Win32 API    | versions 2.0 and up | versions 2.0 and up |
 +----------------------+---------------------+---------------------+
 | Linux X11            | versions 2.0 and up | * no support *      |
 +----------------------+---------------------+---------------------+
 | Mac OS X Carbon      | versions 2.0 and up | * no support *      |
 +----------------------+---------------------+---------------------+
 
 After downloading and unpacking the library distribution archive I recommend
 to run the find_compilers_xxx utility, where xxx is the name of the platform.
 It will scan the current working directory for the Agg demo projects and
 create appropriate up to-date compile scripts. On the permission-based 
 file systems (linux & mac) it will also assign the "execute" file attributes
 to the script files. Then, to compile all of the demos, you just run 
 appropriate compile script from the command line (terminal). The utility also
 excludes from compile scripts those demos, which are primarily targeted
 to different platforms (for ex. TT & gpc demos compiles only on windows).

 AggPas was tested on the following systems:

 * Windows XP, Windows 2000
 * Mac OS X 10.4.5
 * Fedora Core 4 
 
================================================================================
 Port comments
================================================================================

 The Object Pascal version (AggPas) was created mainly during the first three
 months of the year 2006. This port is based on the C++ version 2.3, which was
 officialy released on 25 September 2005.

 AggPas port is the pure manual work. There were used no c_to_pascal conversion 
 utilities and the port is the native-one, which means it uses no external dll
 bindings - it's all just the native pascal code. 
 
 This Pascal library has nearly all of the original C++ version functionality. 
 I will mention the differences more around on later. All of the demos were 
 ported (except 3 of them), and they do exactly all that the C++ version demos 
 do.
 
 AggPas supports the following rendering buffer pixel formats:
 
 - gray8 ,gray8_pre
 - gray8_bgr24r ,gray8_pre_bgr24r
 - gray8_bgr24g ,gray8_pre_bgr24g
 - gray8_bgr24b ,gray8_pre_bgr24b
 
 - rgb555 ,rgb555_pre ,rgb555_gamma
 - rgb565 ,rgb565_pre ,rgb565_gamma
 
 - bgr24 ,bgr24_pre ,bgr24_gamma
 - rgb24 ,rgb24_pre ,rgb24_gamma

 - bgra32 ,bgra32_pre
 - rgba32 ,rgba32_pre
 - argb32 ,argb32_pre
 - abgr32 ,abgr32_pre
 
 - custom_blend_rgba

 The high precision pixel formats support is not implemented for now, mainly 
 for the reason, I haven't any real-world examples to try and test with. 
 There are also some other issues related to the color data structure and 
 it's data members, which are of byte size per color component now. In C++ 
 version it was solved using the templates, but in Pascal i would have to find 
 another solution.

 C++ TEMPLATES
 =============

 Well, well, well. I was forced to remove the Maxim's template based 
 architecture and to replace it with the conventional one - object oriented, 
 because in Object Pascal there are no templates. Due to that there is a 
 speed penalty consequence. AggPas is in fact slower by 20 - 50%. 

 Despite the speed decrease, the AggPas is still a very usable super-trooper 2d 
 vector graphic library. Unless you are willing to make a real-time (30 fps >) 
 rendering, there is still a great benefit of incorporating it into your Pascal 
 based projects. Try to compile the demos and see for yourself ...

 On the other hand, I believe I had opened the doors for someone to try to 
 port the Agg into some other language(s). Is there anybody out capable
 of making the template-less Java or C# native-port version ? Trust me, it's 
 worth doing so.

 For those agg-fanatics with spare 3 or so months (like me), willing to create
 some cool agg-native-port, I am giving here some hints:

 AggPas was ported demo by demo in the following order:

 Simple:  pure_api, component_rendering ,polymorphic_renderers ,rasterizers ,
          rounded_rect ,aa_demo ,bspline ,scanline_boolean ,idea ,trans_polar ,
          aa_test ,circles ,gamma_correction ,gamma_ctrl ,gouraud ,rasterizers2
        
 Lion:    lion ,lion_lens ,lion_outline ,perspective ,simple_blur ,alpha_mask ,
          alpha_mask2, multi_clip

 Fonts:   conv_contour ,raster_text ,trans_curve1 ,trans_curve2 ,truetype_test

 England: alpha_mask3 ,gpc_test ,scanline_boolean2

 Complex: alpha_gradient ,bezier_div ,conv_dash_marker ,conv_stroke ,gradients ,
          graph_test ,pattern_fill
         
 Images:  line_patterns ,image1 ,image_alpha ,image_filters ,image_filters2 ,
          image_fltr_graph ,image_perspective ,image_resample ,image_transforms ,
          pattern_perspective ,distortions ,compositing

 After finishing all of the demos above, the whole library consisting of 120+ 
 files folded up. I must appreciate Maxim's work for completness at this point,
 because only four source files left unused in the library:
 
 - agg_conv_close_polygon.h
 - agg_conv_unclose_polygon.h
 - agg_rendering_buffer_dynarow.h
 - agg_trans_lens.h
 
 But as I said, 3 demos were ported not and I believe those source files are 
 used just there (see the What's next on the end of this readme).

 Start porting with pure_api and all units it uses. Other unit's ports comes
 automatically, as you will go through more and more demos.

 Create appropriate basic data types (agg_basics) and then use them. The most
 used types throughout agg are "int" and "unsigned" which are "longint" and
 "longword" in pascal.

 Be cautious of arithmetic shift right operation (>>) on signed integers. 
 In pascal, there was an incompatibility with the C++ implementation.
 On the assembler level, pascal compilers were always generating "shr" (i386)
 "srw" (powerpc) instructions instead of "sar" (i386) "sraw" (powerpc) ops.
 I hacked this situation with shr_intXX function calls whenever arithmeticaly
 shifting right signed integers (see the end of agg_basics.pas file).
 That leads of cource to speed penalty, because of additional function call,
 but not doing so is very crucial - lots of agg algos depends on ">>".


 Back to the Pascal port Issues
 ============================== 
 
 Accessors:

 The names of getters and setters methods of class objects are a little bit 
 modified against the c version mostly due to the fact, that pascal doesn't
 distinguish between same methods names, if they are differentiating only by
 the return value. I used one rule: If the method is setter, then it has
 the underscore after the name (eg: width_, like width=something). If the
 method is getter, then it has the underscore before the name (eg: _width,
 like something=width). [See agg_vcgen_stroke for example].

 Source code comment marks:

 Here and there around the AggPas source code, following comment marks
 can be found:
 
 {untested} - unit or procedure/function, which was ported but not tested
              (there was no reference to it's use from demos)
  
 {not_implemented} - procedure/function, which was not ported, because
                     related features were not implemented in port
 
 {hack} - marks some nonstandard solution
 
 {..} - part of the code, which is unfinished. There is just
        one unit with this marks - agg_color_conv.pas, with lots
        of pixel format conversion functions. Sorry, I was too 
        lazy to finish this one. I did all conversion functions, 
        which are used by the demos. If you'll need some more,
        finish it yourself. It's not that hard (but many of them).

 Compiling mode:

 The "agg_mode.inc" is the main compiler mode configuration file.
 The only one item, you would wish to change is the AGG_DEBUG conditional,
 which turns on/off the debug mode compilation settings. With the
 AGG_DEBUG not defined the range checking for example is turned off,
 which should lead to building the faster and smallest code.


 Bugs
 ====

 All bugs i know of in AggPas are related to the compiler issues.
 These are:

 In Delphi on Windows:

 - The SetDIBitsToDevice WinAPI call sometimes fails, but only in Delphi.
   In FPC it always works OK. Due to Delphi, I hacked this with solution,
   which puts on fail the image to the screen anyway, but with some speed 
   penalty of course. (See agg_win32_bmp.pas::pixel_map::draw fn).

 In FPC on Windows:
 
 - GetGlyphOutline(X) WinAPI call is working not. The consequence of this
   is that the True-type demos compiled with FPC work not. 
   I have reported this problem to the FPC people (bug report 4827).
   They have fixed it and in upcoming version 2.0.3 of FreePascal compiler
   it should be OK.

 In FPC on Windows and Linux:

 - Demos gouraud.dpr & aa_test.dpr generate some broken gouraud shading 
   patterns. I think, this is an compiler error issue, because in FPC
   on Mac (which is powerpc) - it is OK, from the same source code, as
   well as in Delphi.

 If anybody knows how to fix those (or other) bugs, don't hesitate to
 send me a mail or fix it yourself and let me know.
   
   
 MacPort comments
 ================

 The speed of the library on the PowerPC Mac target is rather slow.
 I suspect, this is due to the FPC compiler, which itself is not much
 optimized for PowerPC targets. Maybe I'm wrong, but the size of the
 compiled executables is about 1.4 Megs, compared to the 200 KB C++
 versions of the same demos.

 The agg demo framework has on Mac in Pascal following improvements
 over the C++ version:

 - resizing of windows
 - right click
 - app.message displays the "long" C strings
 - keyboard support is better (sort of hack) with Alt+F4 for quit

 When compiling on Mac, there is a need of additional libraries,
 which are not a part of the Free Pascal installation. They are
 the Universal Pascal Interfaces (UPI), which are a part of the
 Apple Universal Interfaces, which can be downloaded at:
 
  ftp://ftp.apple.com/developer/Development_Kits/UniversalInterfaces3.4.2.dmg

 To compile AggPas on Mac succesfully you will need the following
 files in the upi directory of AggPas:
  
 - Carbon.o
 - Carbon.ppu
 - ImageCompression.o
 - ImageCompression.ppu
 - QuickTimeComponents.o
 - QuickTimeComponents.ppu

 If you had downloaded the Mac .dmg AggPas archive, it already 
 contains above mentioned files, so you don't have to download
 anything else - just compile. In the case, you want to recompile
 the UPI for yourself, do following:
 
  1. Click on the UniversalInterfaces3.4.2.dmg archive
  2. Change directory to Universal/Interfaces/PInterfaces
  3. Copy all files to AggPas/UPInterfaces
  4. Execute ./build_upi script


 LinuxPort comments
 ==================

 The linux port of agg demo framework has one small improvement
 over the C++ version -> It displays the app.message(s) in window
 instead of sending the text to the stderr output.


================================================================================
 What's next
================================================================================
 
 I mentioned above, that 3 demos (out of 50+) were ported not.
 These are:
 
 - mol_view: 
 
   I'm sorry, but this one was the last one, I was lazy to port.
   Besides, there were no new units used.
 
 - freetype_test (& related trans_curve1/2_ft):
   
   [Update] Fully working in AggPas 2.4 RM3.

 
 All for now
 Yours Milano
 
================================================================================
 End of file
================================================================================