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(&center); 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(&center); Print("radii="); Print(&radii); Print("arcTheta=", arcTheta); Cr();
153}
154
155
156void PicturePrinter::StrokeEllipse(BPoint center, BPoint radii) {
157	Indent(); Print("StrokeEllipse center="); Print(&center); Print("radii="); Print(&radii); Cr();
158}
159
160
161void PicturePrinter::FillEllipse(BPoint center, BPoint radii) {
162	Indent(); Print("FillEllipse center="); Print(&center); 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