1/* 2 3PicturePrinter 4 5Copyright (c) 2002 Haiku. 6 7Author: 8 Michael Pfeiffer 9 10Permission is hereby granted, free of charge, to any person obtaining a copy of 11this software and associated documentation files (the "Software"), to deal in 12the Software without restriction, including without limitation the rights to 13use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 14of the Software, and to permit persons to whom the Software is furnished to do 15so, subject to the following conditions: 16 17The above copyright notice and this permission notice shall be included in all 18copies or substantial portions of the Software. 19 20THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 26THE SOFTWARE. 27 28*/ 29 30#include <stdio.h> 31 32#include "PicturePrinter.h" 33 34PicturePrinter::PicturePrinter(int indent) 35 : fIndent(indent) 36 { 37 } 38 39void PicturePrinter::Print(const char* text) { 40 printf("%s ", text); 41} 42 43void PicturePrinter::Print(BPoint* p) { 44 printf("point (%f, %f) ", p->x, p->y); 45} 46 47void PicturePrinter::Print(BRect* r) { 48 printf("rect [l: %f, t: %f, r: %f, b: %f] ", r->left, r->top, r->right, r->bottom); 49} 50 51void PicturePrinter::Print(int numPoints, BPoint* points) { 52 for (int i = 0; i < numPoints; i ++) { 53 Indent(1); printf("%d ", i); Print(&points[i]); Cr(); 54 } 55} 56 57void PicturePrinter::Print(int numRects, BRect* rects) { 58 for (int i = 0; i < numRects; i ++) { 59 Indent(1); printf("%d ", i); Print(&rects[i]); Cr(); 60 } 61} 62 63void PicturePrinter::Print(BShape* shape) { 64 printf("Shape %p\n", shape); 65 ShapePrinter printer(this); 66 printer.Iterate(shape); 67} 68 69void PicturePrinter::Print(const char* text, float f) { 70 printf("%s %f ", text, f); 71} 72 73void PicturePrinter::Print(const char* text, BPoint* point) { 74 Print(text); Print(point); 75} 76 77void PicturePrinter::Print(rgb_color color) { 78 printf("color r: %d g: %d b: %d", color.red, color.green, color.blue); 79} 80 81void PicturePrinter::Print(float f) { 82 printf("%f ", f); 83} 84 85void PicturePrinter::Cr() { 86 printf("\n"); 87} 88 89void PicturePrinter::Indent(int inc) { 90 for (int i = fIndent + inc; i > 0; i --) printf(" "); 91} 92 93void PicturePrinter::IncIndent() { 94 fIndent ++; 95} 96 97void PicturePrinter::DecIndent() { 98 fIndent --; 99} 100 101void PicturePrinter::Op(int number) { 102 Indent(); printf("Unknown operator %d\n", number); Cr(); 103} 104 105 106void PicturePrinter::MovePenBy(BPoint delta) { 107 Indent(); Print("MovePenBy"); Print(&delta); Cr(); 108} 109 110 111void PicturePrinter::StrokeLine(BPoint start, BPoint end) { 112 Indent(); Print("StrokeLine"); Print(&start); Print(&end); Cr(); 113} 114 115 116void PicturePrinter::StrokeRect(BRect rect) { 117 Indent(); Print("StrokeRect"); Print(&rect); Cr(); 118} 119 120 121void PicturePrinter::FillRect(BRect rect) { 122 Indent(); Print("FillRect"); Print(&rect); Cr(); 123} 124 125 126void PicturePrinter::StrokeRoundRect(BRect rect, BPoint radii) { 127 Indent(); Print("StrokeRoundRect"); Print(&rect); Print("radii", &radii); Cr(); 128} 129 130 131void PicturePrinter::FillRoundRect(BRect rect, BPoint radii) { 132 Indent(); Print("FillRoundRect"); Print(&rect); Print("radii", &radii); Cr(); 133} 134 135 136void PicturePrinter::StrokeBezier(BPoint *control) { 137 Indent(); Print("StrokeBezier"); Print(4, control); Cr(); 138} 139 140 141void PicturePrinter::FillBezier(BPoint *control) { 142 Indent(); Print("FillBezier"); Print(4, control); Cr(); 143} 144 145 146void PicturePrinter::StrokeArc(BPoint center, BPoint radii, float startTheta, float arcTheta) { 147 Indent(); Print("StrokeArc center="); Print(¢er); Print("radii="); Print(&radii); Print("arcTheta=", arcTheta); Cr(); 148} 149 150 151void PicturePrinter::FillArc(BPoint center, BPoint radii, float startTheta, float arcTheta) { 152 Indent(); Print("FillArc center="); Print(¢er); Print("radii="); Print(&radii); Print("arcTheta=", arcTheta); Cr(); 153} 154 155 156void PicturePrinter::StrokeEllipse(BPoint center, BPoint radii) { 157 Indent(); Print("StrokeEllipse center="); Print(¢er); Print("radii="); Print(&radii); Cr(); 158} 159 160 161void PicturePrinter::FillEllipse(BPoint center, BPoint radii) { 162 Indent(); Print("FillEllipse center="); Print(¢er); Print("radii="); Print(&radii); Cr(); 163} 164 165 166void PicturePrinter::StrokePolygon(int32 numPoints, BPoint *points, bool isClosed) { 167 Indent(); Print("StrokePolygon"); 168 printf("%s ", isClosed ? "closed" : "open"); Cr(); 169 Print(numPoints, points); 170} 171 172 173void PicturePrinter::FillPolygon(int32 numPoints, BPoint *points, bool isClosed) { 174 Indent(); Print("FillPolygon"); 175 printf("%s ", isClosed ? "closed" : "open"); Cr(); 176 Print(numPoints, points); 177} 178 179 180void PicturePrinter::StrokeShape(BShape *shape) { 181 Indent(); Print("StrokeShape"); Print(shape); Cr(); 182} 183 184 185void PicturePrinter::FillShape(BShape *shape) { 186 Indent(); Print("FillShape"); Print(shape); Cr(); 187} 188 189 190void PicturePrinter::DrawString(char *string, float escapement_nospace, float escapement_space) { 191 Indent(); Print("DrawString"); 192 Print("escapement_nospace", escapement_nospace); 193 Print("escapement_space", escapement_space); 194 Print("text:"); Print(string); Cr(); 195} 196 197 198void PicturePrinter::DrawPixels(BRect src, BRect dest, int32 width, int32 height, int32 bytesPerRow, int32 pixelFormat, int32 flags, void *data) { 199 Indent(); Print("DrawPixels"); Cr(); 200} 201 202 203void PicturePrinter::SetClippingRects(BRect *rects, uint32 numRects) { 204 Indent(); Print("SetClippingRects"); 205 if (numRects == 0) Print("none"); 206 Cr(); 207 Print(numRects, rects); 208} 209 210 211void PicturePrinter::ClipToPicture(BPicture *picture, BPoint point, bool clip_to_inverse_picture) { 212 Indent(); 213 Print(clip_to_inverse_picture ? "ClipToInversePicture" : "ClipToPicture"); 214 Print("point=", &point); Cr(); 215 PicturePrinter printer(fIndent+1); 216 printer.Iterate(picture); 217} 218 219 220void PicturePrinter::PushState() { 221 Indent(); Print("PushState"); Cr(); 222 IncIndent(); 223} 224 225 226void PicturePrinter::PopState() { 227 DecIndent(); 228 Indent(); Print("PopState"); Cr(); 229} 230 231 232void PicturePrinter::EnterStateChange() { 233 Indent(); Print("EnterStateChange"); Cr(); 234} 235 236 237void PicturePrinter::ExitStateChange() { 238 Indent(); Print("ExitStateChange"); Cr(); 239} 240 241 242void PicturePrinter::EnterFontState() { 243 Indent(); Print("EnterFontState"); Cr(); 244} 245 246 247void PicturePrinter::ExitFontState() { 248 Indent(); Print("ExitFontState"); Cr(); 249} 250 251 252void PicturePrinter::SetOrigin(BPoint pt) { 253 Indent(); Print("SetOrigin"); Print(&pt); Cr(); 254} 255 256 257void PicturePrinter::SetPenLocation(BPoint pt) { 258 Indent(); Print("SetPenLocation"); Print(&pt); Cr(); 259} 260 261 262void PicturePrinter::SetDrawingMode(drawing_mode mode) { 263 Indent(); Print("SetDrawingMode"); 264 switch (mode) { 265 case B_OP_COPY: Print("B_OP_COPY"); break; 266 case B_OP_OVER: Print("B_OP_OVER"); break; 267 case B_OP_ERASE: Print("B_OP_ERASE"); break; 268 case B_OP_INVERT: Print("B_OP_INVERT"); break; 269 case B_OP_SELECT: Print("B_OP_SELECT"); break; 270 case B_OP_ALPHA: Print("B_OP_ALPHA"); break; 271 case B_OP_MIN: Print("B_OP_MIN"); break; 272 case B_OP_MAX: Print("B_OP_MAX"); break; 273 case B_OP_ADD: Print("B_OP_ADD"); break; 274 case B_OP_SUBTRACT: Print("B_OP_SUBTRACT"); break; 275 case B_OP_BLEND: Print("B_OP_BLEND"); break; 276 default: Print("Unknown mode: ", (float)mode); 277 } 278 Cr(); 279} 280 281 282void PicturePrinter::SetLineMode(cap_mode capMode, join_mode joinMode, float miterLimit) { 283 Indent(); Print("SetLineMode"); 284 switch (capMode) { 285 case B_BUTT_CAP: Print("B_BUTT_CAP"); break; 286 case B_ROUND_CAP: Print("B_ROUND_CAP"); break; 287 case B_SQUARE_CAP: Print("B_SQUARE_CAP"); break; 288 } 289 switch (joinMode) { 290 case B_MITER_JOIN: Print("B_MITER_JOIN"); break; 291 case B_ROUND_JOIN: Print("B_ROUND_JOIN"); break; 292 case B_BUTT_JOIN: Print("B_BUTT_JOIN"); break; 293 case B_SQUARE_JOIN: Print("B_SQUARE_JOIN"); break; 294 case B_BEVEL_JOIN: Print("B_BEVEL_JOIN"); break; 295 } 296 Print("miterLimit", miterLimit); 297 Cr(); 298} 299 300 301void PicturePrinter::SetPenSize(float size) { 302 Indent(); Print("SetPenSize", size); Cr(); 303} 304 305 306void PicturePrinter::SetForeColor(rgb_color color) { 307 Indent(); Print("SetForeColor"); Print(color); Cr(); 308} 309 310 311void PicturePrinter::SetBackColor(rgb_color color) { 312 Indent(); Print("SetBackColor"); Print(color); Cr(); 313} 314 315static bool compare(pattern a, pattern b) { 316 for (int i = 0; i < 8; i ++) { 317 if (a.data[i] != b.data[i]) return false; 318 } 319 return true; 320} 321 322void PicturePrinter::SetStipplePattern(pattern p) { 323 Indent(); Print("SetStipplePattern"); 324 if (compare(p, B_SOLID_HIGH)) Print("B_SOLID_HIGH"); 325 else if (compare(p, B_SOLID_LOW)) Print("B_SOLID_LOW"); 326 else if (compare(p, B_MIXED_COLORS)) Print("B_MIXED_COLORS"); 327 else { 328 for (int i = 0; i < 8; i++) { 329 printf("%2.2x ", (unsigned int)p.data[i]); 330 } 331 } 332 Cr(); 333} 334 335 336void PicturePrinter::SetScale(float scale) { 337 Indent(); Print("SetScale", scale); Cr(); 338} 339 340 341void PicturePrinter::SetFontFamily(char *family) { 342 Indent(); Print("SetFontFamily"); Print(family); Cr(); 343} 344 345 346void PicturePrinter::SetFontStyle(char *style) { 347 Indent(); Print("SetFontStyle"); Print(style); Cr(); 348} 349 350 351void PicturePrinter::SetFontSpacing(int32 spacing) { 352 Indent(); Print("SetFontSpacing"); 353 switch(spacing) { 354 case B_CHAR_SPACING: Print("B_CHAR_SPACING"); break; 355 case B_STRING_SPACING: Print("B_STRING_SPACING"); break; 356 case B_BITMAP_SPACING: Print("B_BITMAP_SPACING"); break; 357 case B_FIXED_SPACING: Print("B_FIXED_SPACING"); break; 358 default: Print("Unknown: ", (float)spacing); 359 } 360 Cr(); 361} 362 363 364void PicturePrinter::SetFontSize(float size) { 365 Indent(); Print("SetFontSize", size); Cr(); 366} 367 368 369void PicturePrinter::SetFontRotate(float rotation) { 370 Indent(); Print("SetFontRotation", rotation); Cr(); 371} 372 373 374void PicturePrinter::SetFontEncoding(int32 encoding) { 375 Indent(); Print("SetFontEncoding"); 376 switch (encoding) { 377 case B_UNICODE_UTF8: Print("B_UNICODE_UTF8"); break; 378 case B_ISO_8859_1: Print("B_ISO_8859_1"); break; 379 case B_ISO_8859_2: Print("B_ISO_8859_2"); break; 380 case B_ISO_8859_3: Print("B_ISO_8859_3"); break; 381 case B_ISO_8859_4: Print("B_ISO_8859_4"); break; 382 case B_ISO_8859_5: Print("B_ISO_8859_5"); break; 383 case B_ISO_8859_6: Print("B_ISO_8859_6"); break; 384 case B_ISO_8859_7: Print("B_ISO_8859_7"); break; 385 case B_ISO_8859_8: Print("B_ISO_8859_8"); break; 386 case B_ISO_8859_9: Print("B_ISO_8859_9"); break; 387 case B_ISO_8859_10: Print("B_ISO_8859_10"); break; 388 case B_MACINTOSH_ROMAN: Print("B_MACINTOSH_ROMAN"); break; 389 default: Print("Unknown:", (float)encoding); 390 } 391 Cr(); 392} 393 394#define PRINT_FLAG(flag) \ 395 if (flags & flag) { f |= flag; Print(#flag); } 396 397void PicturePrinter::SetFontFlags(int32 flags) { 398 Indent(); Print("SetFontFlags"); 399 int f = 0; 400 if (flags == 0) Print("none set"); 401 PRINT_FLAG(B_DISABLE_ANTIALIASING); 402 PRINT_FLAG(B_FORCE_ANTIALIASING); 403 if (flags != f) printf("Unknown Additional Flags %" B_PRId32 "", flags & ~f); 404 Cr(); 405} 406 407 408void PicturePrinter::SetFontShear(float shear) { 409 Indent(); Print("SetFontShear", shear); Cr(); 410} 411 412 413void PicturePrinter::SetFontFace(int32 flags) { 414 Indent(); Print("SetFontFace"); 415 int32 f = 0; 416 if (flags == 0) Print("none set"); 417 PRINT_FLAG(B_REGULAR_FACE); 418 PRINT_FLAG(B_BOLD_FACE); 419 PRINT_FLAG(B_ITALIC_FACE); 420 PRINT_FLAG(B_NEGATIVE_FACE); 421 PRINT_FLAG(B_OUTLINED_FACE); 422 PRINT_FLAG(B_UNDERSCORE_FACE); 423 PRINT_FLAG(B_STRIKEOUT_FACE); 424 if (flags != f) printf("Unknown Additional Flags %" B_PRId32 "", flags & ~f); 425 Cr(); 426} 427 428 429// Implementation of ShapePrinter 430ShapePrinter::ShapePrinter(PicturePrinter* printer) 431 : fPrinter(printer) 432{ 433 fPrinter->IncIndent(); 434} 435 436ShapePrinter::~ShapePrinter() { 437 fPrinter->DecIndent(); 438} 439 440status_t 441ShapePrinter::IterateBezierTo(int32 bezierCount, BPoint *control) 442{ 443 fPrinter->Indent(); fPrinter->Print("BezierTo"); fPrinter->Cr(); 444 for (int32 i = 0; i < bezierCount; i++, control += 3) { 445 fPrinter->Indent(1); 446 fPrinter->Print(i / 3.0); 447 fPrinter->Print(&control[0]); 448 fPrinter->Print(&control[1]); 449 fPrinter->Print(&control[2]); 450 fPrinter->Cr(); 451 } 452 return B_OK; 453} 454 455status_t 456ShapePrinter::IterateClose(void) 457{ 458 fPrinter->Indent(); fPrinter->Print("Close"); fPrinter->Cr(); 459 return B_OK; 460} 461 462status_t 463ShapePrinter::IterateLineTo(int32 lineCount, BPoint *linePoints) 464{ 465 fPrinter->Indent(); fPrinter->Print("LineTo"); fPrinter->Cr(); 466 BPoint *p = linePoints; 467 for (int32 i = 0; i < lineCount; i++) { 468 fPrinter->Indent(1); fPrinter->Print(p); fPrinter->Cr(); 469 p++; 470 } 471 return B_OK; 472} 473 474status_t 475ShapePrinter::IterateMoveTo(BPoint *point) 476{ 477 fPrinter->Indent(); fPrinter->Print("MoveTo", point); fPrinter->Cr(); 478 return B_OK; 479} 480 481