The pdDocSetVectorCallback function registers a callback function to be called during the rasterization of vector based objects performed by pdDocDraw. Vector based objects are any visual PowerDoc objects that consist of one or more vectorial shapes and which D-Type Power Engine renders using D-Type Rasterizer.
Parameter | Description |
---|---|
power_doc |
Handle of the associated Power Engine document. |
misc_bits |
Reserved for future use. Must be set to 0. |
user_vector_func |
A pointer to your own callback function that will be called as pdDocDraw performs the rasterization of vector based objects. Your function must be declared as follows: DT_SWORD your_user_vector_func(DT_ID_ULONG flags, DT_SLONG x, DT_SLONG y, const DT_UBYTE* instr_buffer, const DT_RECT_SLONG* extent, DT_ID_SWORD bitmap_flag, DT_ID_UWORD layer, DT_PD_DOCDRAW_CANVAS* canvas, void* user_param) where your_user_vector_func is the name of your own C function, flags represents a set of rasterization specific flags, x and y are the coordinates of the shape's origin point, instr_buffer is a pointer to a read-only buffer that contains a complete description of the shape to be rasterized, extent is a pointer to the DT_RECT_SLONG structure which represents an imaginary box that encloses that shape, bitmap_flag is a flag passed to D-Type Rasterizer, and canvas is a pointer to the DT_PD_DOCDRAW_CANVAS structure that provides additional information about the vector object that contains the shape to be rasterized. The user_param parameter is a pointer to your own data type that you will receive during the callback. The x and y coordinates as well as the coordinates of the imaginary box that encloses the shape are in pixels. The description of the shape to be rasterized in the instr_buffer is in the DV_SHAPE_BUFFER_ABSOLUTE format. This is one of the formats supported by the dtShapeDoOutput function. For details, see the description of the dtShapeDoOutput function in D-Type Standard Engine Manual. The flags parameter specifies how the shape is to be rasterized. At present, this parameter can have one of the following values:
For details on the Nonzero Winding Number rule, see the dtRasterizerSetFillRule function in D-Type Standard Engine Manual. The layer parameter specifies which part of the vector based object the shape is associated with. At present, this parameter can have one of the following values:
The bitmap_flag parameter has the same meaning as the bitmap_flag parameter passed to the dtShapeDoOutput function. The canvas parameter can be used to obtain additional information about the vector based object and its context, for example its Img and Obj index, Status, Attribs, Page and other information stored inside the DT_PD_DOCDRAW_CANVAS structure. This structure does not explicitly provide any information about the style characteristics of the shape to be rasterized (e.g. color, transparency), however your application can obtain this information by utilizing the Img and Obj index. Your function is called one or more times for each vector based object that is rendered. Exactly how many callbacks per object your function receives depends on how many layers and independent vectorial shapes there are in your object. For example, if your vector based object contains the shadow and body layer and both layers contain a single independent shape, you will receive two callbacks for this object (2 layers x 1 independent shape). The first callback will be for the shadow, the second for the body. Similarly, if your vector based object contains a single layer (e.g. only the body) with three independent shapes, you will receive three callbacks for this object (1 layer x 3 independent shapes). The callbacks are always initiated in the same order in which the vectorial shapes are rendered (i.e. increasing z-order / bottom-to-top). Vector based objects are any visual PowerDoc objects that consist of one or more vectorial shapes (i.e. shapes that are constructed using straight or curved line segments), excluding glyphs, and which D-Type Power Engine renders using D-Type Rasterizer. Theoretically, any visual PowerDoc object can trigger the pdDocSetVectorCallback callback. However, certain objects do not contain any vectorial shapes (e.g. Pattern, Gradient, Bitmap Image) and never trigger this callback. In contrast, certain objects always contain vectorial shapes and, thus, almost always trigger the pdDocSetVectorCallback callback. Examples are the Line, Arc, Polyline (also Bezier and B-Spline curve), Library Polyline, Rectangle, Circle/Ellipse, True Circle/Ellipse, Slice, Custom Shape or Polygon, Library Shape, Grid objects. Glyphs (found in e.g. Glyph, Char, Text Line, Text Arc, Text Path, Text Area, Text Design, Rich Text Line, Rich Text Arc, Rich Text Path, Rich Text Area or Rich Text Design) do not trigger the pdDocSetVectorCallback callback (instead they trigger the pdDocSetGlyphCallback callback). However, certain text effects that are applied to (or added to) glyphs can trigger the pdDocSetVectorCallback callback. For example, the text underline and strike-through effects will trigger the pdDocSetVectorCallback callback because these effects are essentially vectorial shapes that are added to the glyphs. In this case, there will be one pdDocSetVectorCallback callback per glyph per independent shape. For example, 10 glyphs with the double underline effect will trigger 20 callbacks (or 10 glyphs x 2 underlines). All these callbacks will be associated with the underline / strike-through layer. If, during the rasterization process, the pdDocDraw function determines that a vector based object is completely outside the visible page area, the object will not be rasterized and, consequently, will not trigger any pdDocSetVectorCallback callbacks. The fact that your application received the pdDocSetVectorCallback callback is an indication that D-Type Power Engine is about to render a shape using D-Type Rasterizer. The information that is passed to your callback function via the flags, x, y, instr_buffer, extent and bitmap_flag parameters is the same information that is passed to D-Type Rasterizer. Therefore, your application can cache this data and render the shape later using D-Type Rasterizer. For details, see the description of the dtShapeDoOutput function. Your function should return one of the following values:
The consequence of returning -2 is that the shape will not be rendered (leaving a gap in the output) without any effect on other shapes in the same vector based object or other vector based objects. Regardless of the return value, the rasterization process continues; there is no way for your callback function to immediately terminate or alter the flow of the rasterization process. Setting the user_vector_func parameter to DV_NULL when calling pdDocSetVectorCallback will permanently unregister a previously registered callback function. Once this is done, any subsequent calls to pdDocDraw will no longer initiate any callbacks during the rasterization of vector based objects. |
user_param |
A void pointer to your own data type that you will receive during the callback. This pointer is passed back to your function during the callback to help you track the state of execution or provide other information useful to your application. This pointer is not accessed or modified by D-Type Engine in any way; it is simply sent back to your function as supplied. You can set this parameter to DV_NULL if you have no need for it. |
If the function was successful, the return value is 1. Otherwise, the function returns 0 (bad input).
Important Note for MS Windows Users: When passing D-Type a pointer to your own callback function, beware of the calling convention of your C/C++ environment. On MS Windows, all D-Type API functions that accept a pointer to your own callback function assume that your function uses the _cdecl convention. For example, in dtype.h on MS Windows the dtFontSetErrorCallback function is defined as follows:
DT_SWORD _stdcall dtFontSetErrorCallback(DT_DTENGINE engine, void (_cdecl *font_error_func)(const DT_CHAR* error_message, void* user_param), void* user_param);
Therefore, your own callback function must be defined as follows:
void _cdecl your_font_error_function(const DT_CHAR* error_message, void* your_param)
This note applies to any D-Type functions that expect a pointer to your own callback function (e.g. dtFontSetErrorCallback, pdDocSetDrawCallback, pdDocSetGlyphCallback, pdDocSetVectorCallback, txTextSetScriptCallback and possibly others in the future). Failing to add the _cdecl keyword may result in crashes and other undefined behavior, or your code may simply fail to compile.
The following example is a modification of the example_powerdoc_output sample program that ships with D-Type Power Engine. In this example, MyVectorCallbackFunc is set up as the document's vector callback function. This function prints to the standard output some debug information about each shape that is about to be rasterized. At the same time this function instructs pdDocDraw not to rasterize shapes that are associated with PowerDoc image whose Img index is 3. Further down it can be seen that this image points to the object whose Obj index is 18. This object has one layer, body, defined via the pdBodyPtr link. This layer corresponds to a single vectorial shape and, therefore, pdDocDraw triggers a single vector callback for this vector based object. The output of the MyVectorCallbackFunc function confirms this.
#include <memory.h> #include <math.h> // Main D-Type header file #include "dtype.h" // Header for this file #include "engine.h" DT_SWORD MyVectorCallbackFunc(DT_ULONG flags, DT_SLONG x, DT_SLONG y, const DT_UBYTE* instr_buffer, const DT_RECT_SLONG* extent, DT_ID_SWORD bitmap_flag, DT_ID_UWORD layer, const DT_PD_DOCDRAW_CANVAS* canvas, void* user_param) { printf("Got vector callback for Img %ld, Obj %ld (flags=%ld, bitmap_flag=%d, layer=%d, user_param=%p), x=%ld, y=%ld, extent=(%ld, %ld, %ld, %ld)\n", canvas->Img, canvas->Obj, flags, bitmap_flag, layer, user_param, x, y, extent->xmn, extent->ymn, extent->xmx, extent->ymx); if (canvas->Img == 3) return -2; /* exclude image #3 from output -- this is Smiley's eye */ return 1; /* render all other images */ } // CDTPowerEngine constructor CDTPowerEngine::CDTPowerEngine() { Engine = DV_NULL; PowerDoc = DV_NULL; DT_STREAM_FILE(sd, "dtype.inf"); if (pdEngineIniViaStream(&Engine, &sd, DV_NULL) == 0) return; if (pdDocIni(&PowerDoc, Engine) == 0) return; InitDoc(); /* Set document's vector callback function */ pdDocSetVectorCallback(PowerDoc, 0, MyVectorCallbackFunc, DV_NULL); } // CDTPowerEngine destructor CDTPowerEngine::~CDTPowerEngine() { pdDocExt(PowerDoc); pdEngineExt(Engine); } // Public methods DT_UBYTE* CDTPowerEngine::GetMemoryImage(DT_SWORD page, DT_FLOAT zoom, DT_SLONG x, DT_SLONG y, DT_SWORD clip_w, DT_SWORD clip_h) { DT_SLONG bytes_per_pixel = SURFACE_BPP; DT_UBYTE clear_byte = 255; DT_MDC dc_mem; // Create memory surface dc_mem.w = clip_w; #ifdef WIN32 /* flip the surface vertically */ dc_mem.h = clip_h; #else dc_mem.h = -clip_h; #endif dc_mem.l = bytes_per_pixel * clip_w * clip_h; if ((dc_mem.m = (DT_UBYTE*)malloc(dc_mem.l)) == DV_NULL) return DV_NULL; memset(dc_mem.m, clear_byte, dc_mem.l); if (Engine == DV_NULL) return dc_mem.m; pdDocSetScale(PowerDoc, zoom); // Draw PowerDoc page to D-Type memory surface pdDocDraw(PowerDoc, page, x, y, SURFACE_FORMAT, 0, &dc_mem, DV_NULL); return dc_mem.m; } // Private methods void CDTPowerEngine::InitDoc() { /* PART 1a: Defining objects and their properties */ DT_ID_SLONG obj[21]; obj[0] = pdObjAdd(PowerDoc, 0, "Ellipse Outline Color"); obj[1] = pdObjAdd(PowerDoc, 0, "Ellipse Body Color"); obj[2] = pdObjAdd(PowerDoc, 0, "Ellipse Shadow Color"); obj[3] = pdObjAdd(PowerDoc, 0, "Ellipse Outline"); obj[4] = pdObjAdd(PowerDoc, 0, "Ellipse Shadow"); obj[5] = pdObjAdd(PowerDoc, 0, "Ellipse"); obj[6] = pdObjAdd(PowerDoc, 0, "Ellipse Outline Color"); obj[7] = pdObjAdd(PowerDoc, 0, "Ellipse Body Color"); obj[8] = pdObjAdd(PowerDoc, 0, "Ellipse Outline"); obj[9] = pdObjAdd(PowerDoc, 0, "Ellipse"); obj[10] = pdObjAdd(PowerDoc, 0, "Arc Color"); obj[11] = pdObjAdd(PowerDoc, 0, "Arc Line Width"); obj[12] = pdObjAdd(PowerDoc, 0, "Arc"); obj[13] = pdObjAdd(PowerDoc, 0, "Ellipse Outline Color"); obj[14] = pdObjAdd(PowerDoc, 0, "Ellipse Body Color"); obj[15] = pdObjAdd(PowerDoc, 0, "Ellipse Outline"); obj[16] = pdObjAdd(PowerDoc, 0, "Ellipse"); obj[17] = pdObjAdd(PowerDoc, 0, "Ellipse Body Color"); obj[18] = pdObjAdd(PowerDoc, 0, "Ellipse"); obj[19] = pdObjAdd(PowerDoc, 0, "TextLine Typography"); obj[20] = pdObjAdd(PowerDoc, 0, "TextLine"); /* Properties for object 0 */ pdPropAdd(PowerDoc, obj[0], pdRGBT, (DT_UBYTE*)"50641400", PD_HEX); /* Properties for object 1 */ pdPropAdd(PowerDoc, obj[1], pdRGBT, (DT_UBYTE*)"FFFF0000", PD_HEX); /* Properties for object 2 */ pdPropAdd(PowerDoc, obj[2], pdRGBT, (DT_UBYTE*)"80808078", PD_HEX); /* Properties for object 3 */ pdLinkAdd(PowerDoc, obj[3], pdStylePtr, obj[0]); pdPropAdd(PowerDoc, obj[3], pdLineThickness, (DT_UBYTE*)"340", PD_WORD_UNSIGNED); /* Properties for object 4 */ pdLinkAdd(PowerDoc, obj[4], pdStylePtr, obj[2]); pdPropAdd(PowerDoc, obj[4], pdShadowDx, (DT_UBYTE*)"5", PD_WORD_SIGNED); pdPropAdd(PowerDoc, obj[4], pdShadowDy, (DT_UBYTE*)"5", PD_WORD_SIGNED); /* Properties for object 5 */ pdPropAdd(PowerDoc, obj[5], pdDw, (DT_UBYTE*)"480", PD_LONG_SIGNED); pdPropAdd(PowerDoc, obj[5], pdDh, (DT_UBYTE*)"480", PD_LONG_SIGNED); pdLinkAdd(PowerDoc, obj[5], pdBodyPtr, obj[1]); pdLinkAdd(PowerDoc, obj[5], pdOutlinePtr, obj[3]); pdLinkAdd(PowerDoc, obj[5], pdShadowPtr, obj[4]); /* Properties for object 6 */ pdPropAdd(PowerDoc, obj[6], pdRGBT, (DT_UBYTE*)"50641400", PD_HEX); /* Properties for object 7 */ pdPropAdd(PowerDoc, obj[7], pdRGBT, (DT_UBYTE*)"FFFFFF00", PD_HEX); /* Properties for object 8 */ pdPropAdd(PowerDoc, obj[8], pdLineThickness, (DT_UBYTE*)"340", PD_WORD_UNSIGNED); pdLinkAdd(PowerDoc, obj[8], pdStylePtr, obj[6]); /* Properties for object 9 */ pdLinkAdd(PowerDoc, obj[9], pdOutlinePtr, obj[8]); pdLinkAdd(PowerDoc, obj[9], pdBodyPtr, obj[7]); pdPropAdd(PowerDoc, obj[9], pdDw, (DT_UBYTE*)"140", PD_LONG_SIGNED); pdPropAdd(PowerDoc, obj[9], pdDh, (DT_UBYTE*)"140", PD_LONG_SIGNED); /* Properties for object 10 */ pdPropAdd(PowerDoc, obj[10], pdRGBT, (DT_UBYTE*)"50641400", PD_HEX); /* Properties for object 11 */ pdLinkAdd(PowerDoc, obj[11], pdStylePtr, obj[10]); pdPropAdd(PowerDoc, obj[11], pdLineThickness, (DT_UBYTE*)"1700", PD_WORD_UNSIGNED); /* Properties for object 12 */ pdLinkAdd(PowerDoc, obj[12], pdLinePtr, obj[11]); pdPropAdd(PowerDoc, obj[12], pdAngleTheta, (DT_UBYTE*)"120", PD_WORD_SIGNED); pdPropAdd(PowerDoc, obj[12], pdAngleAlpha, (DT_UBYTE*)"30", PD_WORD_UNSIGNED); pdPropAdd(PowerDoc, obj[12], pdRadiusHor, (DT_UBYTE*)"160", PD_LONG_SIGNED); pdPropAdd(PowerDoc, obj[12], pdRadiusVer, (DT_UBYTE*)"160", PD_LONG_SIGNED); /* Properties for object 13 */ pdPropAdd(PowerDoc, obj[13], pdRGBT, (DT_UBYTE*)"50641400", PD_HEX); /* Properties for object 14 */ pdPropAdd(PowerDoc, obj[14], pdRGBT, (DT_UBYTE*)"FFC01400", PD_HEX); /* Properties for object 15 */ pdPropAdd(PowerDoc, obj[15], pdLineThickness, (DT_UBYTE*)"240", PD_WORD_UNSIGNED); pdLinkAdd(PowerDoc, obj[15], pdStylePtr, obj[13]); /* Properties for object 16 */ pdLinkAdd(PowerDoc, obj[16], pdOutlinePtr, obj[15]); pdLinkAdd(PowerDoc, obj[16], pdBodyPtr, obj[14]); pdPropAdd(PowerDoc, obj[16], pdDh, (DT_UBYTE*)"130", PD_LONG_SIGNED); pdPropAdd(PowerDoc, obj[16], pdDw, (DT_UBYTE*)"160", PD_LONG_SIGNED); /* Properties for object 17 */ pdPropAdd(PowerDoc, obj[17], pdRGBT, (DT_UBYTE*)"50641400", PD_HEX); /* Properties for object 18 */ pdLinkAdd(PowerDoc, obj[18], pdBodyPtr, obj[17]); pdPropAdd(PowerDoc, obj[18], pdDw, (DT_UBYTE*)"70", PD_LONG_SIGNED); pdPropAdd(PowerDoc, obj[18], pdDh, (DT_UBYTE*)"70", PD_LONG_SIGNED); /* Properties for object 19 */ pdPropAdd(PowerDoc, obj[19], pdFontIndex, (DT_UBYTE*)"3", PD_WORD_SIGNED); pdPropAdd(PowerDoc, obj[19], pdFontDw, (DT_UBYTE*)"70", PD_WORD_SIGNED); pdPropAdd(PowerDoc, obj[19], pdFontDh, (DT_UBYTE*)"100", PD_WORD_SIGNED); pdPropAdd(PowerDoc, obj[19], pdSkewHor, (DT_UBYTE*)"0", PD_WORD_SIGNED); pdPropAdd(PowerDoc, obj[19], pdSkewVer, (DT_UBYTE*)"0", PD_WORD_SIGNED); pdPropAdd(PowerDoc, obj[19], pdRotation, (DT_UBYTE*)"0", PD_WORD_SIGNED); pdLinkAdd(PowerDoc, obj[19], pdBodyPtr, obj[17]); /* Properties for object 20 */ pdPropAdd(PowerDoc, obj[20], pdAngleRotation, (DT_UBYTE*)"0", PD_WORD_SIGNED); pdPropAdd(PowerDoc, obj[20], pdTextString_08, (DT_UBYTE*)"Sample PowerDoc Output", PD_ASC); pdLinkAdd(PowerDoc, obj[20], pdTypographyPtr, obj[19]); /* PART 1b: Image placement */ pdImgAdd(PowerDoc, obj[5], 0, 100, 170, 0, 0, 0, pdDrawEllipse, DV_NULL); /* Img 0 */ pdImgAdd(PowerDoc, obj[9], 0, 180, 250, 0, 0, 0, pdDrawEllipse, DV_NULL); /* Img 1 */ pdImgAdd(PowerDoc, obj[12], 0, 340, 410, 0, 0, 0, pdDrawArc, DV_NULL); /* Img 2 */ pdImgAdd(PowerDoc, obj[18], 0, 205, 260, 0, 0, 0, pdDrawEllipse, DV_NULL); /* Img 3 */ pdImgAdd(PowerDoc, obj[9], 0, 360, 250, 0, 0, 0, pdDrawEllipse, DV_NULL); /* Img 4 */ pdImgAdd(PowerDoc, obj[18], 0, 385, 260, 0, 0, 0, pdDrawEllipse, DV_NULL); /* Img 5 */ pdImgAdd(PowerDoc, obj[16], 0, 260, 340, 0, 0, 0, pdDrawEllipse, DV_NULL); /* Img 6 */ pdImgAdd(PowerDoc, obj[20], 0, 300, 100, 0, 0, 0, pdDrawTextLine, DV_NULL); /* Img 7 */ /* PART 2: Load additional documents from disk */ DT_STREAM_FILE(sd1, "../../files/powerdoc/starburst-with_text.pdc"); pdDocAppendFromStream(PowerDoc, 0, 700, 100, &sd1); DT_STREAM_FILE(sd2, "../../files/powerdoc/tiger.pdc"); pdDocAppendFromStream(PowerDoc, 0, 0, 700, &sd2); DT_STREAM_FILE(sd3, "../../files/powerdoc/pie_chart.pdc"); pdDocAppendFromStream(PowerDoc, 0, 700, 700, &sd3); }
Output:
Note that the MyVectorCallbackFunc function removed PowerDoc image with Img index 3 from the output. So our Smiley lost one eye.
Debug information that MyVectorCallbackFunc function prints to the standard output is shown below. Note that some objects do not trigger any vector callbacks. For example, object with Img index 7 does not trigger any vector callbacks because this is the Text Line object (as explained above this object triggers the glyph callback instead). Also, remember that vector based objects that are completely outside the visible page area may not trigger any pdDocSetVectorCallback callbacks.
Got vector callback for Img 0, Obj 5 (flags=0, bitmap_flag=-1, layer=1, user_param=0x0), x=2, y=2, extent=(57, 97, 337, 377) Got vector callback for Img 0, Obj 5 (flags=2, bitmap_flag=0, layer=2, user_param=0x0), x=0, y=0, extent=(57, 97, 337, 377) Got vector callback for Img 0, Obj 5 (flags=0, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(57, 97, 337, 377) Got vector callback for Img 1, Obj 9 (flags=0, bitmap_flag=0, layer=2, user_param=0x0), x=0, y=0, extent=(103, 144, 186, 227) Got vector callback for Img 1, Obj 9 (flags=0, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(103, 144, 186, 227) Got vector callback for Img 2, Obj 12 (flags=1, bitmap_flag=0, layer=2, user_param=0x0), x=0, y=0, extent=(103, 143, 291, 331) Got vector callback for Img 3, Obj 18 (flags=0, bitmap_flag=0, layer=2, user_param=0x0), x=0, y=0, extent=(118, 149, 161, 192) Got vector callback for Img 4, Obj 9 (flags=0, bitmap_flag=0, layer=2, user_param=0x0), x=0, y=0, extent=(207, 144, 290, 227) Got vector callback for Img 4, Obj 9 (flags=0, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(207, 144, 290, 227) Got vector callback for Img 5, Obj 18 (flags=0, bitmap_flag=0, layer=2, user_param=0x0), x=0, y=0, extent=(222, 149, 265, 192) Got vector callback for Img 6, Obj 16 (flags=0, bitmap_flag=0, layer=2, user_param=0x0), x=0, y=0, extent=(149, 196, 244, 273) Got vector callback for Img 6, Obj 16 (flags=0, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(149, 196, 244, 273) Got vector callback for Img 8, Obj 22 (flags=0, bitmap_flag=0, layer=2, user_param=0x0), x=-424, y=-77, extent=(434, 86, 723, 374) Got vector callback for Img 11, Obj 35 (flags=0, bitmap_flag=0, layer=2, user_param=0x0), x=0, y=0, extent=(28, 545, 53, 578) Got vector callback for Img 11, Obj 35 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(50, 574, 53, 578) Got vector callback for Img 11, Obj 35 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(28, 548, 52, 578) Got vector callback for Img 11, Obj 35 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(28, 545, 53, 577) Got vector callback for Img 12, Obj 36 (flags=0, bitmap_flag=0, layer=2, user_param=0x0), x=0, y=0, extent=(40, 541, 54, 576) Got vector callback for Img 12, Obj 36 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(51, 573, 54, 576) Got vector callback for Img 12, Obj 36 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(40, 541, 54, 576) Got vector callback for Img 12, Obj 36 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(40, 541, 54, 575) Got vector callback for Img 13, Obj 37 (flags=0, bitmap_flag=0, layer=2, user_param=0x0), x=0, y=0, extent=(35, 591, 71, 604) Got vector callback for Img 13, Obj 37 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(68, 598, 71, 600) Got vector callback for Img 13, Obj 37 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(35, 591, 71, 604) Got vector callback for Img 13, Obj 37 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(35, 591, 70, 604) Got vector callback for Img 14, Obj 38 (flags=0, bitmap_flag=0, layer=2, user_param=0x0), x=0, y=0, extent=(35, 603, 70, 621) Got vector callback for Img 14, Obj 38 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(66, 603, 70, 606) Got vector callback for Img 14, Obj 38 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(36, 604, 70, 621) Got vector callback for Img 14, Obj 38 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(35, 603, 69, 621) Got vector callback for Img 15, Obj 39 (flags=0, bitmap_flag=0, layer=2, user_param=0x0), x=0, y=0, extent=(32, 599, 67, 613) Got vector callback for Img 15, Obj 39 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(64, 600, 67, 603) Got vector callback for Img 15, Obj 39 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(32, 599, 67, 613) Got vector callback for Img 15, Obj 39 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(32, 599, 66, 613) Got vector callback for Img 16, Obj 40 (flags=0, bitmap_flag=0, layer=2, user_param=0x0), x=0, y=0, extent=(24, 575, 61, 593) Got vector callback for Img 16, Obj 40 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(58, 589, 61, 593) Got vector callback for Img 16, Obj 40 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(24, 576, 61, 593) Got vector callback for Img 16, Obj 40 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(24, 575, 60, 592) Got vector callback for Img 17, Obj 41 (flags=0, bitmap_flag=0, layer=2, user_param=0x0), x=0, y=0, extent=(20, 580, 57, 596) Got vector callback for Img 17, Obj 41 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(53, 592, 57, 595) Got vector callback for Img 17, Obj 41 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(20, 581, 56, 596) Got vector callback for Img 17, Obj 41 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(20, 580, 55, 594) Got vector callback for Img 18, Obj 42 (flags=0, bitmap_flag=0, layer=2, user_param=0x0), x=0, y=0, extent=(18, 587, 55, 600) Got vector callback for Img 18, Obj 42 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(52, 594, 55, 598) Got vector callback for Img 18, Obj 42 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(18, 587, 55, 600) Got vector callback for Img 18, Obj 42 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(18, 587, 54, 600) Got vector callback for Img 19, Obj 43 (flags=0, bitmap_flag=0, layer=2, user_param=0x0), x=0, y=0, extent=(25, 576, 61, 598) Got vector callback for Img 19, Obj 43 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(58, 595, 61, 598) Got vector callback for Img 19, Obj 43 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(25, 578, 61, 598) Got vector callback for Img 19, Obj 43 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(25, 576, 61, 597) Got vector callback for Img 20, Obj 44 (flags=0, bitmap_flag=0, layer=2, user_param=0x0), x=0, y=0, extent=(18, 552, 49, 581) Got vector callback for Img 20, Obj 44 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(47, 578, 49, 581) Got vector callback for Img 20, Obj 44 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(18, 555, 49, 581) Got vector callback for Img 20, Obj 44 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(18, 552, 49, 580) Got vector callback for Img 21, Obj 45 (flags=0, bitmap_flag=0, layer=2, user_param=0x0), x=0, y=0, extent=(16, 561, 50, 585) Got vector callback for Img 21, Obj 45 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(47, 582, 50, 585) Got vector callback for Img 21, Obj 45 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(16, 563, 50, 585) Got vector callback for Img 21, Obj 45 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(16, 561, 49, 584) Got vector callback for Img 22, Obj 46 (flags=0, bitmap_flag=0, layer=2, user_param=0x0), x=0, y=0, extent=(14, 566, 50, 588) Got vector callback for Img 22, Obj 46 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(47, 584, 50, 588) Got vector callback for Img 22, Obj 46 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(14, 568, 50, 588) Got vector callback for Img 22, Obj 46 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(14, 566, 49, 587) Got vector callback for Img 23, Obj 48 (flags=0, bitmap_flag=0, layer=2, user_param=0x0), x=0, y=0, extent=(46, 572, 305, 746) Got vector callback for Img 23, Obj 48 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(45, 585, 50, 598) Got vector callback for Img 23, Obj 48 (flags=1, bitmap_flag=0, layer=3, user_param=0x0), x=0, y=0, extent=(45, 594, 54, 612) ... etc ...