1/* 2 3PictureIterator 4 5Copyright (c) 2001, 2002 Haiku. 6 7Authors: 8 Philippe Houdoin 9 Simon Gauvin 10 Michael Pfeiffer 11 12Permission is hereby granted, free of charge, to any person obtaining a copy of 13this software and associated documentation files (the "Software"), to deal in 14the Software without restriction, including without limitation the rights to 15use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 16of the Software, and to permit persons to whom the Software is furnished to do 17so, subject to the following conditions: 18 19The above copyright notice and this permission notice shall be included in all 20copies or substantial portions of the Software. 21 22THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 26LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 27OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 28THE SOFTWARE. 29 30*/ 31 32#include "PictureIterator.h" 33 34// BPicture playback handlers class instance redirectors 35static void _MovePenBy(void *p, BPoint delta) { return ((PictureIterator *) p)->MovePenBy(delta); } 36static void _StrokeLine(void *p, BPoint start, BPoint end) { return ((PictureIterator *) p)->StrokeLine(start, end); } 37static void _StrokeRect(void *p, BRect rect) { return ((PictureIterator *) p)->StrokeRect(rect); } 38static void _FillRect(void *p, BRect rect) { return ((PictureIterator *) p)->FillRect(rect); } 39static void _StrokeRoundRect(void *p, BRect rect, BPoint radii) { return ((PictureIterator *) p)->StrokeRoundRect(rect, radii); } 40static void _FillRoundRect(void *p, BRect rect, BPoint radii) { return ((PictureIterator *) p)->FillRoundRect(rect, radii); } 41static void _StrokeBezier(void *p, BPoint *control) { return ((PictureIterator *) p)->StrokeBezier(control); } 42static void _FillBezier(void *p, BPoint *control) { return ((PictureIterator *) p)->FillBezier(control); } 43static void _StrokeArc(void *p, BPoint center, BPoint radii, float startTheta, float arcTheta) { return ((PictureIterator *) p)->StrokeArc(center, radii, startTheta, arcTheta); } 44static void _FillArc(void *p, BPoint center, BPoint radii, float startTheta, float arcTheta) { return ((PictureIterator *) p)->FillArc(center, radii, startTheta, arcTheta); } 45static void _StrokeEllipse(void *p, BPoint center, BPoint radii) { return ((PictureIterator *) p)->StrokeEllipse(center, radii); } 46static void _FillEllipse(void *p, BPoint center, BPoint radii) { return ((PictureIterator *) p)->FillEllipse(center, radii); } 47static void _StrokePolygon(void *p, int32 numPoints, BPoint *points, bool isClosed) { return ((PictureIterator *) p)->StrokePolygon(numPoints, points, isClosed); } 48static void _FillPolygon(void *p, int32 numPoints, BPoint *points, bool isClosed) { return ((PictureIterator *) p)->FillPolygon(numPoints, points, isClosed); } 49static void _StrokeShape(void * p, BShape *shape) { return ((PictureIterator *) p)->StrokeShape(shape); } 50static void _FillShape(void * p, BShape *shape) { return ((PictureIterator *) p)->FillShape(shape); } 51static void _DrawString(void *p, char *string, float deltax, float deltay) { return ((PictureIterator *) p)->DrawString(string, deltax, deltay); } 52static void _DrawPixels(void *p, BRect src, BRect dest, int32 width, int32 height, int32 bytesPerRow, int32 pixelFormat, int32 flags, void *data) 53 { return ((PictureIterator *) p)->DrawPixels(src, dest, width, height, bytesPerRow, pixelFormat, flags, data); } 54static void _SetClippingRects(void *p, BRect *rects, uint32 numRects) { return ((PictureIterator *) p)->SetClippingRects(rects, numRects); } 55static void _ClipToPicture(void * p, BPicture *picture, BPoint point, bool clip_to_inverse_picture) { return ((PictureIterator *) p)->ClipToPicture(picture, point, clip_to_inverse_picture); } 56static void _PushState(void *p) { return ((PictureIterator *) p)->PushState(); } 57static void _PopState(void *p) { return ((PictureIterator *) p)->PopState(); } 58static void _EnterStateChange(void *p) { return ((PictureIterator *) p)->EnterStateChange(); } 59static void _ExitStateChange(void *p) { return ((PictureIterator *) p)->ExitStateChange(); } 60static void _EnterFontState(void *p) { return ((PictureIterator *) p)->EnterFontState(); } 61static void _ExitFontState(void *p) { return ((PictureIterator *) p)->ExitFontState(); } 62static void _SetOrigin(void *p, BPoint pt) { return ((PictureIterator *) p)->SetOrigin(pt); } 63static void _SetPenLocation(void *p, BPoint pt) { return ((PictureIterator *) p)->SetPenLocation(pt); } 64static void _SetDrawingMode(void *p, drawing_mode mode) { return ((PictureIterator *) p)->SetDrawingMode(mode); } 65static void _SetLineMode(void *p, cap_mode capMode, join_mode joinMode, float miterLimit) { return ((PictureIterator *) p)->SetLineMode(capMode, joinMode, miterLimit); } 66static void _SetPenSize(void *p, float size) { return ((PictureIterator *) p)->SetPenSize(size); } 67static void _SetForeColor(void *p, rgb_color color) { return ((PictureIterator *) p)->SetForeColor(color); } 68static void _SetBackColor(void *p, rgb_color color) { return ((PictureIterator *) p)->SetBackColor(color); } 69static void _SetStipplePattern(void *p, pattern pat) { return ((PictureIterator *) p)->SetStipplePattern(pat); } 70static void _SetScale(void *p, float scale) { return ((PictureIterator *) p)->SetScale(scale); } 71static void _SetFontFamily(void *p, char *family) { return ((PictureIterator *) p)->SetFontFamily(family); } 72static void _SetFontStyle(void *p, char *style) { return ((PictureIterator *) p)->SetFontStyle(style); } 73static void _SetFontSpacing(void *p, int32 spacing) { return ((PictureIterator *) p)->SetFontSpacing(spacing); } 74static void _SetFontSize(void *p, float size) { return ((PictureIterator *) p)->SetFontSize(size); } 75static void _SetFontRotate(void *p, float rotation) { return ((PictureIterator *) p)->SetFontRotate(rotation); } 76static void _SetFontEncoding(void *p, int32 encoding) { return ((PictureIterator *) p)->SetFontEncoding(encoding); } 77static void _SetFontFlags(void *p, int32 flags) { return ((PictureIterator *) p)->SetFontFlags(flags); } 78static void _SetFontShear(void *p, float shear) { return ((PictureIterator *) p)->SetFontShear(shear); } 79static void _SetFontFace(void * p, int32 flags) { return ((PictureIterator *) p)->SetFontFace(flags); } 80 81// undefined or undocumented operation handlers... 82static void _op0(void * p) { return ((PictureIterator *) p)->Op(0); } 83static void _op19(void * p) { return ((PictureIterator *) p)->Op(19); } 84static void _op45(void * p) { return ((PictureIterator *) p)->Op(45); } 85static void _op47(void * p) { return ((PictureIterator *) p)->Op(47); } 86static void _op48(void * p) { return ((PictureIterator *) p)->Op(48); } 87static void _op49(void * p) { return ((PictureIterator *) p)->Op(49); } 88 89// Private Variables 90// ----------------- 91 92static void * 93playbackHandlers[] = { 94 (void *)_op0, // 0 no operation 95 (void *)_MovePenBy, // 1 MovePenBy(void *user, BPoint delta) 96 (void *)_StrokeLine, // 2 StrokeLine(void *user, BPoint start, BPoint end) 97 (void *)_StrokeRect, // 3 StrokeRect(void *user, BRect rect) 98 (void *)_FillRect, // 4 FillRect(void *user, BRect rect) 99 (void *)_StrokeRoundRect, // 5 StrokeRoundRect(void *user, BRect rect, BPoint radii) 100 (void *)_FillRoundRect, // 6 FillRoundRect(void *user, BRect rect, BPoint radii) 101 (void *)_StrokeBezier, // 7 StrokeBezier(void *user, BPoint *control) 102 (void *)_FillBezier, // 8 FillBezier(void *user, BPoint *control) 103 (void *)_StrokeArc, // 9 StrokeArc(void *user, BPoint center, BPoint radii, float startTheta, float arcTheta) 104 (void *)_FillArc, // 10 FillArc(void *user, BPoint center, BPoint radii, float startTheta, float arcTheta) 105 (void *)_StrokeEllipse, // 11 StrokeEllipse(void *user, BPoint center, BPoint radii) 106 (void *)_FillEllipse, // 12 FillEllipse(void *user, BPoint center, BPoint radii) 107 (void *)_StrokePolygon, // 13 StrokePolygon(void *user, int32 numPoints, BPoint *points, bool isClosed) 108 (void *)_FillPolygon, // 14 FillPolygon(void *user, int32 numPoints, BPoint *points, bool isClosed) 109 (void *)_StrokeShape, // 15 StrokeShape(void *user, BShape *shape) 110 (void *)_FillShape, // 16 FillShape(void *user, BShape *shape) 111 (void *)_DrawString, // 17 DrawString(void *user, char *string, float deltax, float deltay) 112 (void *)_DrawPixels, // 18 DrawPixels(void *user, BRect src, BRect dest, int32 width, int32 height, int32 bytesPerRow, int32 pixelFormat, int32 flags, void *data) 113 (void *)_op19, // 19 *reserved* 114 (void *)_SetClippingRects, // 20 SetClippingRects(void *user, BRect *rects, uint32 numRects) 115 (void *)_ClipToPicture, // 21 ClipToPicture(void *user, BPicture *picture, BPoint pt, bool clip_to_inverse_picture) 116 (void *)_PushState, // 22 PushState(void *user) 117 (void *)_PopState, // 23 PopState(void *user) 118 (void *)_EnterStateChange, // 24 EnterStateChange(void *user) 119 (void *)_ExitStateChange, // 25 ExitStateChange(void *user) 120 (void *)_EnterFontState, // 26 EnterFontState(void *user) 121 (void *)_ExitFontState, // 27 ExitFontState(void *user) 122 (void *)_SetOrigin, // 28 SetOrigin(void *user, BPoint pt) 123 (void *)_SetPenLocation, // 29 SetPenLocation(void *user, BPoint pt) 124 (void *)_SetDrawingMode, // 30 SetDrawingMode(void *user, drawing_mode mode) 125 (void *)_SetLineMode, // 31 SetLineMode(void *user, cap_mode capMode, join_mode joinMode, float miterLimit) 126 (void *)_SetPenSize, // 32 SetPenSize(void *user, float size) 127 (void *)_SetForeColor, // 33 SetForeColor(void *user, rgb_color color) 128 (void *)_SetBackColor, // 34 SetBackColor(void *user, rgb_color color) 129 (void *)_SetStipplePattern, // 35 SetStipplePattern(void *user, pattern p) 130 (void *)_SetScale, // 36 SetScale(void *user, float scale) 131 (void *)_SetFontFamily, // 37 SetFontFamily(void *user, char *family) 132 (void *)_SetFontStyle, // 38 SetFontStyle(void *user, char *style) 133 (void *)_SetFontSpacing, // 39 SetFontSpacing(void *user, int32 spacing) 134 (void *)_SetFontSize, // 40 SetFontSize(void *user, float size) 135 (void *)_SetFontRotate, // 41 SetFontRotate(void *user, float rotation) 136 (void *)_SetFontEncoding, // 42 SetFontEncoding(void *user, int32 encoding) 137 (void *)_SetFontFlags, // 43 SetFontFlags(void *user, int32 flags) 138 (void *)_SetFontShear, // 44 SetFontShear(void *user, float shear) 139 (void *)_op45, // 45 *reserved* 140 (void *)_SetFontFace, // 46 SetFontFace(void *user, int32 flags) 141 (void *)_op47, 142 (void *)_op48, 143 (void *)_op49, 144 145 NULL 146 }; 147 148void 149PictureIterator::Iterate(BPicture* picture) { 150 picture->Play(playbackHandlers, 50, this); 151} 152