1/* 2 3PicturePrinter 4 5Copyright (c) 2002 OpenBeOS. 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"); Cr(); 206 Print(numRects, rects); 207} 208 209 210void PicturePrinter::ClipToPicture(BPicture *picture, BPoint point, bool clip_to_inverse_picture) { 211 Indent(); 212 Print(clip_to_inverse_picture ? "ClipToInversePicture" : "ClipToPicture"); 213 Print("point=", &point); Cr(); 214 PicturePrinter printer(fIndent+1); 215 printer.Iterate(picture); 216} 217 218 219void PicturePrinter::PushState() { 220 Indent(); Print("PushState"); Cr(); 221 IncIndent(); 222} 223 224 225void PicturePrinter::PopState() { 226 DecIndent(); 227 Indent(); Print("PopState"); Cr(); 228} 229 230 231void PicturePrinter::EnterStateChange() { 232 Indent(); Print("EnterStateChange"); Cr(); 233} 234 235 236void PicturePrinter::ExitStateChange() { 237 Indent(); Print("ExitStateChange"); Cr(); 238} 239 240 241void PicturePrinter::EnterFontState() { 242 Indent(); Print("EnterFontState"); Cr(); 243} 244 245 246void PicturePrinter::ExitFontState() { 247 Indent(); Print("ExitFontState"); Cr(); 248} 249 250 251void PicturePrinter::SetOrigin(BPoint pt) { 252 Indent(); Print("SetOrigin"); Print(&pt); Cr(); 253} 254 255 256void PicturePrinter::SetPenLocation(BPoint pt) { 257 Indent(); Print("SetPenLocation"); Print(&pt); Cr(); 258} 259 260 261void PicturePrinter::SetDrawingMode(drawing_mode mode) { 262 Indent(); Print("SetDrawingMode"); 263 switch (mode) { 264 case B_OP_COPY: Print("B_OP_COPY"); break; 265 case B_OP_OVER: Print("B_OP_OVER"); break; 266 case B_OP_ERASE: Print("B_OP_ERASE"); break; 267 case B_OP_INVERT: Print("B_OP_INVERT"); break; 268 case B_OP_SELECT: Print("B_OP_SELECT"); break; 269 case B_OP_ALPHA: Print("B_OP_ALPHA"); break; 270 case B_OP_MIN: Print("B_OP_MIN"); break; 271 case B_OP_MAX: Print("B_OP_MAX"); break; 272 case B_OP_ADD: Print("B_OP_ADD"); break; 273 case B_OP_SUBTRACT: Print("B_OP_SUBTRACT"); break; 274 case B_OP_BLEND: Print("B_OP_BLEND"); break; 275 default: Print("Unknown mode: ", (float)mode); 276 } 277 Cr(); 278} 279 280 281void PicturePrinter::SetLineMode(cap_mode capMode, join_mode joinMode, float miterLimit) { 282 Indent(); Print("SetLineMode"); 283 switch (capMode) { 284 case B_BUTT_CAP: Print("B_BUTT_CAP"); break; 285 case B_ROUND_CAP: Print("B_ROUND_CAP"); break; 286 case B_SQUARE_CAP: Print("B_SQUARE_CAP"); break; 287 } 288 switch (joinMode) { 289 case B_MITER_JOIN: Print("B_MITER_JOIN"); break; 290 case B_ROUND_JOIN: Print("B_ROUND_JOIN"); break; 291 case B_BUTT_JOIN: Print("B_BUTT_JOIN"); break; 292 case B_SQUARE_JOIN: Print("B_SQUARE_JOIN"); break; 293 case B_BEVEL_JOIN: Print("B_BEVEL_JOIN"); break; 294 } 295 Print("miterLimit", miterLimit); 296 Cr(); 297} 298 299 300void PicturePrinter::SetPenSize(float size) { 301 Indent(); Print("SetPenSize", size); Cr(); 302} 303 304 305void PicturePrinter::SetForeColor(rgb_color color) { 306 Indent(); Print("SetForeColor"); Print(color); Cr(); 307} 308 309 310void PicturePrinter::SetBackColor(rgb_color color) { 311 Indent(); Print("SetBackColor"); Print(color); Cr(); 312} 313 314static bool compare(pattern a, pattern b) { 315 for (int i = 0; i < 8; i ++) { 316 if (a.data[i] != b.data[i]) return false; 317 } 318 return true; 319} 320 321void PicturePrinter::SetStipplePattern(pattern p) { 322 Indent(); Print("SetStipplePattern"); 323 if (compare(p, B_SOLID_HIGH)) Print("B_SOLID_HIGH"); 324 else if (compare(p, B_SOLID_LOW)) Print("B_SOLID_LOW"); 325 else if (compare(p, B_MIXED_COLORS)) Print("B_MIXED_COLORS"); 326 else { 327 for (int i = 0; i < 8; i++) { 328 printf("%2.2x ", (unsigned int)p.data[i]); 329 } 330 } 331 Cr(); 332} 333 334 335void PicturePrinter::SetScale(float scale) { 336 Indent(); Print("SetScale", scale); Cr(); 337} 338 339 340void PicturePrinter::SetFontFamily(char *family) { 341 Indent(); Print("SetFontFamily"); Print(family); Cr(); 342} 343 344 345void PicturePrinter::SetFontStyle(char *style) { 346 Indent(); Print("SetFontStyle"); Print(style); Cr(); 347} 348 349 350void PicturePrinter::SetFontSpacing(int32 spacing) { 351 Indent(); Print("SetFontSpacing"); 352 switch(spacing) { 353 case B_CHAR_SPACING: Print("B_CHAR_SPACING"); break; 354 case B_STRING_SPACING: Print("B_STRING_SPACING"); break; 355 case B_BITMAP_SPACING: Print("B_BITMAP_SPACING"); break; 356 case B_FIXED_SPACING: Print("B_FIXED_SPACING"); break; 357 default: Print("Unknown: ", (float)spacing); 358 } 359 Cr(); 360} 361 362 363void PicturePrinter::SetFontSize(float size) { 364 Indent(); Print("SetFontSize", size); Cr(); 365} 366 367 368void PicturePrinter::SetFontRotate(float rotation) { 369 Indent(); Print("SetFontRotation", rotation); Cr(); 370} 371 372 373void PicturePrinter::SetFontEncoding(int32 encoding) { 374 Indent(); Print("SetFontEncoding"); 375 switch (encoding) { 376 case B_UNICODE_UTF8: Print("B_UNICODE_UTF8"); break; 377 case B_ISO_8859_1: Print("B_ISO_8859_1"); break; 378 case B_ISO_8859_2: Print("B_ISO_8859_2"); break; 379 case B_ISO_8859_3: Print("B_ISO_8859_3"); break; 380 case B_ISO_8859_4: Print("B_ISO_8859_4"); break; 381 case B_ISO_8859_5: Print("B_ISO_8859_5"); break; 382 case B_ISO_8859_6: Print("B_ISO_8859_6"); break; 383 case B_ISO_8859_7: Print("B_ISO_8859_7"); break; 384 case B_ISO_8859_8: Print("B_ISO_8859_8"); break; 385 case B_ISO_8859_9: Print("B_ISO_8859_9"); break; 386 case B_ISO_8859_10: Print("B_ISO_8859_10"); break; 387 case B_MACINTOSH_ROMAN: Print("B_MACINTOSH_ROMAN"); break; 388 default: Print("Unknown:", (float)encoding); 389 } 390 Cr(); 391} 392 393#define PRINT_FLAG(flag) \ 394 if (flags & flag) { f |= flag; Print(#flag); } 395 396void PicturePrinter::SetFontFlags(int32 flags) { 397 Indent(); Print("SetFontFlags"); 398 int f = 0; 399 if (flags == 0) Print("none set"); 400 PRINT_FLAG(B_DISABLE_ANTIALIASING); 401 PRINT_FLAG(B_FORCE_ANTIALIASING); 402 if (flags != f) printf("Unknown Additional Flags %" B_PRId32 "", flags & ~f); 403 Cr(); 404} 405 406 407void PicturePrinter::SetFontShear(float shear) { 408 Indent(); Print("SetFontShear", shear); Cr(); 409} 410 411 412void PicturePrinter::SetFontFace(int32 flags) { 413 Indent(); Print("SetFontFace"); 414 int32 f = 0; 415 if (flags == 0) Print("none set"); 416 PRINT_FLAG(B_REGULAR_FACE); 417 PRINT_FLAG(B_BOLD_FACE); 418 PRINT_FLAG(B_ITALIC_FACE); 419 PRINT_FLAG(B_NEGATIVE_FACE); 420 PRINT_FLAG(B_OUTLINED_FACE); 421 PRINT_FLAG(B_UNDERSCORE_FACE); 422 PRINT_FLAG(B_STRIKEOUT_FACE); 423 if (flags != f) printf("Unknown Additional Flags %" B_PRId32 "", flags & ~f); 424 Cr(); 425} 426 427 428// Implementation of ShapePrinter 429ShapePrinter::ShapePrinter(PicturePrinter* printer) 430 : fPrinter(printer) 431{ 432 fPrinter->IncIndent(); 433} 434 435ShapePrinter::~ShapePrinter() { 436 fPrinter->DecIndent(); 437} 438 439status_t 440ShapePrinter::IterateBezierTo(int32 bezierCount, BPoint *control) 441{ 442 fPrinter->Indent(); fPrinter->Print("BezierTo"); fPrinter->Cr(); 443 for (int32 i = 0; i < bezierCount; i++, control += 3) { 444 fPrinter->Indent(1); 445 fPrinter->Print(i / 3.0); 446 fPrinter->Print(&control[0]); 447 fPrinter->Print(&control[1]); 448 fPrinter->Print(&control[2]); 449 fPrinter->Cr(); 450 } 451 return B_OK; 452} 453 454status_t 455ShapePrinter::IterateClose(void) 456{ 457 fPrinter->Indent(); fPrinter->Print("Close"); fPrinter->Cr(); 458 return B_OK; 459} 460 461status_t 462ShapePrinter::IterateLineTo(int32 lineCount, BPoint *linePoints) 463{ 464 fPrinter->Indent(); fPrinter->Print("LineTo"); fPrinter->Cr(); 465 BPoint *p = linePoints; 466 for (int32 i = 0; i < lineCount; i++) { 467 fPrinter->Indent(1); fPrinter->Print(p); fPrinter->Cr(); 468 p++; 469 } 470 return B_OK; 471} 472 473status_t 474ShapePrinter::IterateMoveTo(BPoint *point) 475{ 476 fPrinter->Indent(); fPrinter->Print("MoveTo", point); fPrinter->Cr(); 477 return B_OK; 478} 479 480