blob: b327c0b0905fb1f44662f43ed91ecd9921809144 [file] [log] [blame]
chudy@google.com902ebe52012-06-29 14:21:22 +00001
2/*
3 * Copyright 2012 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#include "SkObjectParser.h"
robertphillips@google.com67baba42013-01-02 20:20:31 +000010#include "SkRRect.h"
humper@google.comf515ffc2013-01-07 15:48:19 +000011#include "SkTypeface.h"
12#include "SkStream.h"
13#include "SkData.h"
14#include "SkFontDescriptor.h"
chudy@google.com902ebe52012-06-29 14:21:22 +000015
16/* TODO(chudy): Replace all std::strings with char */
17
chudy@google.com97cee972012-08-07 20:41:37 +000018SkString* SkObjectParser::BitmapToString(const SkBitmap& bitmap) {
robertphillips@google.com195952f2012-10-23 12:13:35 +000019 SkString* mBitmap = new SkString("SkBitmap: ");
20 mBitmap->append("W: ");
21 mBitmap->appendS32(bitmap.width());
22 mBitmap->append(" H: ");
23 mBitmap->appendS32(bitmap.height());
24
25 const char* gConfigStrings[] = {
skia.committer@gmail.com1e34ff72012-10-24 02:01:24 +000026 "None", "A1", "A8", "Index8", "RGB565", "ARGB4444", "ARGB8888", "RLE8"
robertphillips@google.com195952f2012-10-23 12:13:35 +000027 };
28 SkASSERT(SkBitmap::kConfigCount == 8);
29
30 mBitmap->append(" Config: ");
31 mBitmap->append(gConfigStrings[bitmap.getConfig()]);
32
33 if (bitmap.isOpaque()) {
34 mBitmap->append(" opaque");
35 } else {
36 mBitmap->append(" not-opaque");
37 }
38
39 if (bitmap.isImmutable()) {
40 mBitmap->append(" immutable");
41 } else {
42 mBitmap->append(" not-immutable");
43 }
44
45 if (bitmap.isVolatile()) {
46 mBitmap->append(" volatile");
47 } else {
48 mBitmap->append(" not-volatile");
49 }
50
51 mBitmap->append(" genID: ");
52 mBitmap->appendS32(bitmap.getGenerationID());
53
chudy@google.com902ebe52012-06-29 14:21:22 +000054 return mBitmap;
55}
56
chudy@google.com97cee972012-08-07 20:41:37 +000057SkString* SkObjectParser::BoolToString(bool doAA) {
58 SkString* mBool = new SkString("Bool doAA: ");
chudy@google.com902ebe52012-06-29 14:21:22 +000059 if (doAA) {
chudy@google.com97cee972012-08-07 20:41:37 +000060 mBool->append("True");
chudy@google.com902ebe52012-06-29 14:21:22 +000061 } else {
chudy@google.com97cee972012-08-07 20:41:37 +000062 mBool->append("False");
chudy@google.com902ebe52012-06-29 14:21:22 +000063 }
chudy@google.com97cee972012-08-07 20:41:37 +000064 return mBool;
chudy@google.com902ebe52012-06-29 14:21:22 +000065}
66
chudy@google.com97cee972012-08-07 20:41:37 +000067SkString* SkObjectParser::CustomTextToString(const char* text) {
68 SkString* mText = new SkString(text);
69 return mText;
chudy@google.com902ebe52012-06-29 14:21:22 +000070}
71
chudy@google.com97cee972012-08-07 20:41:37 +000072SkString* SkObjectParser::IntToString(int x, const char* text) {
73 SkString* mInt = new SkString(text);
74 mInt->append(" ");
75 mInt->appendScalar(SkIntToScalar(x));
76 return mInt;
chudy@google.com902ebe52012-06-29 14:21:22 +000077}
78
chudy@google.com97cee972012-08-07 20:41:37 +000079SkString* SkObjectParser::IRectToString(const SkIRect& rect) {
80 SkString* mRect = new SkString("SkIRect: ");
81 mRect->append("L: ");
robertphillips@google.com195952f2012-10-23 12:13:35 +000082 mRect->appendS32(rect.left());
chudy@google.com97cee972012-08-07 20:41:37 +000083 mRect->append(", T: ");
robertphillips@google.com195952f2012-10-23 12:13:35 +000084 mRect->appendS32(rect.top());
chudy@google.com97cee972012-08-07 20:41:37 +000085 mRect->append(", R: ");
robertphillips@google.com195952f2012-10-23 12:13:35 +000086 mRect->appendS32(rect.right());
chudy@google.com97cee972012-08-07 20:41:37 +000087 mRect->append(", B: ");
robertphillips@google.com195952f2012-10-23 12:13:35 +000088 mRect->appendS32(rect.bottom());
chudy@google.com902ebe52012-06-29 14:21:22 +000089 return mRect;
90}
91
chudy@google.com97cee972012-08-07 20:41:37 +000092SkString* SkObjectParser::MatrixToString(const SkMatrix& matrix) {
93 SkString* mMatrix = new SkString("SkMatrix: (");
94 for (int i = 0; i < 8; i++) {
95 mMatrix->appendScalar(matrix.get(i));
96 mMatrix->append("), (");
chudy@google.com902ebe52012-06-29 14:21:22 +000097 }
chudy@google.com97cee972012-08-07 20:41:37 +000098 mMatrix->appendScalar(matrix.get(8));
99 mMatrix->append(")");
100 return mMatrix;
101}
chudy@google.com902ebe52012-06-29 14:21:22 +0000102
chudy@google.com97cee972012-08-07 20:41:37 +0000103SkString* SkObjectParser::PaintToString(const SkPaint& paint) {
104 SkColor color = paint.getColor();
humper@google.comf515ffc2013-01-07 15:48:19 +0000105 SkString* mPaint = new SkString("<dl><dt>SkPaint:</dt><dd><dl><dt>Color:</dt><dd>0x");
chudy@google.com97cee972012-08-07 20:41:37 +0000106 mPaint->appendHex(color);
humper@google.comf515ffc2013-01-07 15:48:19 +0000107 mPaint->append("</dd>");
108
109 SkTypeface *typeface = paint.getTypeface();
110 if (typeface) {
111 SkDynamicMemoryWStream ostream;
112 typeface->serialize(&ostream);
113 SkData *data = SkAutoTUnref<SkData>(ostream.copyToData());
114
115 SkMemoryStream stream(data);
116 SkFontDescriptor descriptor(&stream);
117
118 mPaint->append("<dt>Font Family Name:</dt><dd>");
119 mPaint->append(descriptor.getFamilyName());
120 mPaint->append("</dd><dt>Font Full Name:</dt><dd>");
121 mPaint->append(descriptor.getFullName());
122 mPaint->append("</dd><dt>Font PS Name:</dt><dd>");
123 mPaint->append(descriptor.getPostscriptName());
124 mPaint->append("</dd><dt>Font File Name:</dt><dd>");
125 mPaint->append(descriptor.getFontFileName());
126 mPaint->append("</dd></dl></dl>");
127 }
robertphillips@google.com195952f2012-10-23 12:13:35 +0000128
chudy@google.com97cee972012-08-07 20:41:37 +0000129 return mPaint;
130}
131
132SkString* SkObjectParser::PathToString(const SkPath& path) {
robertphillips@google.com87201762012-10-18 13:30:18 +0000133 SkString* mPath = new SkString("Path (");
134
robertphillips@google.com51185fe2012-12-05 19:34:33 +0000135 static const char* gFillStrings[] = {
136 "Winding", "EvenOdd", "InverseWinding", "InverseEvenOdd"
137 };
138
139 mPath->append(gFillStrings[path.getFillType()]);
140 mPath->append(", ");
141
robertphillips@google.com87201762012-10-18 13:30:18 +0000142 static const char* gConvexityStrings[] = {
skia.committer@gmail.com6a748ad2012-10-19 02:01:19 +0000143 "Unknown", "Convex", "Concave"
robertphillips@google.com87201762012-10-18 13:30:18 +0000144 };
145 SkASSERT(SkPath::kConcave_Convexity == 2);
146
147 mPath->append(gConvexityStrings[path.getConvexity()]);
148 mPath->append(", ");
149
robertphillips@google.com195952f2012-10-23 12:13:35 +0000150 if (path.isRect(NULL)) {
151 mPath->append("isRect, ");
152 } else {
153 mPath->append("isNotRect, ");
154 }
155
robertphillips@google.com87201762012-10-18 13:30:18 +0000156 mPath->appendS32(path.countVerbs());
157 mPath->append("V, ");
158 mPath->appendS32(path.countPoints());
159 mPath->append("P): ");
160
161 static const char* gVerbStrings[] = {
162 "Move", "Line", "Quad", "Cubic", "Close", "Done"
163 };
164 static const int gPtsPerVerb[] = { 1, 1, 2, 3, 0, 0 };
165 static const int gPtOffsetPerVerb[] = { 0, 1, 1, 1, 0, 0 };
166 SkASSERT(SkPath::kDone_Verb == 5);
167
168 SkPath::Iter iter(const_cast<SkPath&>(path), false);
169 SkPath::Verb verb;
170 SkPoint points[4];
171
skia.committer@gmail.com6a748ad2012-10-19 02:01:19 +0000172 for(verb = iter.next(points, false);
173 verb != SkPath::kDone_Verb;
robertphillips@google.com87201762012-10-18 13:30:18 +0000174 verb = iter.next(points, false)) {
175
176 mPath->append(gVerbStrings[verb]);
177 mPath->append(" ");
178
179 for (int i = 0; i < gPtsPerVerb[verb]; ++i) {
180 mPath->append("(");
181 mPath->appendScalar(points[gPtOffsetPerVerb[verb]+i].fX);
182 mPath->append(", ");
183 mPath->appendScalar(points[gPtOffsetPerVerb[verb]+i].fY);
184 mPath->append(") ");
185 }
chudy@google.com97cee972012-08-07 20:41:37 +0000186 }
robertphillips@google.com87201762012-10-18 13:30:18 +0000187
robertphillips@google.com30d35f22012-11-06 16:45:36 +0000188 SkString* boundStr = SkObjectParser::RectToString(path.getBounds(), " Bound: ");
189
190 if (NULL != boundStr) {
191 mPath->append(*boundStr);
192 SkDELETE(boundStr);
193 }
194
chudy@google.com97cee972012-08-07 20:41:37 +0000195 return mPath;
196}
197
198SkString* SkObjectParser::PointsToString(const SkPoint pts[], size_t count) {
199 SkString* mPoints = new SkString("SkPoints pts[]: ");
200 for (unsigned int i = 0; i < count; i++) {
201 mPoints->append("(");
202 mPoints->appendScalar(pts[i].fX);
203 mPoints->append(",");
204 mPoints->appendScalar(pts[i].fY);
205 mPoints->append(")");
206 }
207 return mPoints;
208}
209
210SkString* SkObjectParser::PointModeToString(SkCanvas::PointMode mode) {
211 SkString* mMode = new SkString("SkCanvas::PointMode: ");
212 if (mode == SkCanvas::kPoints_PointMode) {
213 mMode->append("kPoints_PointMode");
214 } else if (mode == SkCanvas::kLines_PointMode) {
215 mMode->append("kLines_Mode");
216 } else if (mode == SkCanvas::kPolygon_PointMode) {
217 mMode->append("kPolygon_PointMode");
218 }
219 return mMode;
220}
221
robertphillips@google.com30d35f22012-11-06 16:45:36 +0000222SkString* SkObjectParser::RectToString(const SkRect& rect, const char* title) {
223
224 SkString* mRect = new SkString;
skia.committer@gmail.com72b2e6f2012-11-08 02:03:56 +0000225
robertphillips@google.com30d35f22012-11-06 16:45:36 +0000226 if (NULL == title) {
227 mRect->append("SkRect: ");
228 } else {
229 mRect->append(title);
230 }
chudy@google.com97cee972012-08-07 20:41:37 +0000231 mRect->append("(");
232 mRect->appendScalar(rect.left());
233 mRect->append(", ");
234 mRect->appendScalar(rect.top());
235 mRect->append(", ");
236 mRect->appendScalar(rect.right());
237 mRect->append(", ");
238 mRect->appendScalar(rect.bottom());
239 mRect->append(")");
240 return mRect;
241}
242
robertphillips@google.com67baba42013-01-02 20:20:31 +0000243SkString* SkObjectParser::RRectToString(const SkRRect& rrect, const char* title) {
244
245 SkString* mRRect = new SkString;
246
247 if (NULL == title) {
248 mRRect->append("SkRRect (");
249 if (rrect.isEmpty()) {
250 mRRect->append("empty");
251 } else if (rrect.isRect()) {
252 mRRect->append("rect");
253 } else if (rrect.isOval()) {
254 mRRect->append("oval");
255 } else if (rrect.isSimple()) {
256 mRRect->append("simple");
257 } else {
258 SkASSERT(rrect.isComplex());
259 mRRect->append("complex");
260 }
261 mRRect->append("): ");
262 } else {
263 mRRect->append(title);
264 }
265 mRRect->append("(");
266 mRRect->appendScalar(rrect.rect().left());
267 mRRect->append(", ");
268 mRRect->appendScalar(rrect.rect().top());
269 mRRect->append(", ");
270 mRRect->appendScalar(rrect.rect().right());
271 mRRect->append(", ");
272 mRRect->appendScalar(rrect.rect().bottom());
273 mRRect->append(") radii: (");
274 for (int i = 0; i < 4; ++i) {
275 const SkVector& radii = rrect.radii((SkRRect::Corner) i);
276 mRRect->appendScalar(radii.fX);
277 mRRect->append(", ");
278 mRRect->appendScalar(radii.fY);
279 if (i < 3) {
280 mRRect->append(", ");
281 }
282 }
283 mRRect->append(")");
284 return mRRect;
285}
286
chudy@google.com97cee972012-08-07 20:41:37 +0000287SkString* SkObjectParser::RegionOpToString(SkRegion::Op op) {
288 SkString* mOp = new SkString("SkRegion::Op: ");
289 if (op == SkRegion::kDifference_Op) {
290 mOp->append("kDifference_Op");
291 } else if (op == SkRegion::kIntersect_Op) {
292 mOp->append("kIntersect_Op");
293 } else if (op == SkRegion::kUnion_Op) {
294 mOp->append("kUnion_Op");
295 } else if (op == SkRegion::kXOR_Op) {
296 mOp->append("kXOR_Op");
297 } else if (op == SkRegion::kReverseDifference_Op) {
298 mOp->append("kReverseDifference_Op");
299 } else if (op == SkRegion::kReplace_Op) {
300 mOp->append("kReplace_Op");
301 } else {
302 mOp->append("Unknown Type");
303 }
chudy@google.com902ebe52012-06-29 14:21:22 +0000304 return mOp;
305}
306
chudy@google.com97cee972012-08-07 20:41:37 +0000307SkString* SkObjectParser::RegionToString(const SkRegion& region) {
308 SkString* mRegion = new SkString("SkRegion: Data unavailable.");
309 return mRegion;
chudy@google.com902ebe52012-06-29 14:21:22 +0000310}
311
chudy@google.com97cee972012-08-07 20:41:37 +0000312SkString* SkObjectParser::SaveFlagsToString(SkCanvas::SaveFlags flags) {
313 SkString* mFlags = new SkString("SkCanvas::SaveFlags: ");
chudy@google.com902ebe52012-06-29 14:21:22 +0000314 if(flags == SkCanvas::kMatrixClip_SaveFlag) {
chudy@google.com97cee972012-08-07 20:41:37 +0000315 mFlags->append("kMatrixClip_SaveFlag");
chudy@google.com902ebe52012-06-29 14:21:22 +0000316 } else if (flags == SkCanvas::kClip_SaveFlag) {
chudy@google.com97cee972012-08-07 20:41:37 +0000317 mFlags->append("kClip_SaveFlag");
chudy@google.com902ebe52012-06-29 14:21:22 +0000318 } else if (flags == SkCanvas::kHasAlphaLayer_SaveFlag) {
chudy@google.com97cee972012-08-07 20:41:37 +0000319 mFlags->append("kHasAlphaLayer_SaveFlag");
chudy@google.com902ebe52012-06-29 14:21:22 +0000320 } else if (flags == SkCanvas::kFullColorLayer_SaveFlag) {
chudy@google.com97cee972012-08-07 20:41:37 +0000321 mFlags->append("kFullColorLayer_SaveFlag");
chudy@google.com902ebe52012-06-29 14:21:22 +0000322 } else if (flags == SkCanvas::kClipToLayer_SaveFlag) {
chudy@google.com97cee972012-08-07 20:41:37 +0000323 mFlags->append("kClipToLayer_SaveFlag");
chudy@google.com902ebe52012-06-29 14:21:22 +0000324 } else if (flags == SkCanvas::kMatrixClip_SaveFlag) {
chudy@google.com97cee972012-08-07 20:41:37 +0000325 mFlags->append("kMatrixClip_SaveFlag");
chudy@google.com902ebe52012-06-29 14:21:22 +0000326 } else if (flags == SkCanvas::kARGB_NoClipLayer_SaveFlag) {
chudy@google.com97cee972012-08-07 20:41:37 +0000327 mFlags->append("kARGB_NoClipLayer_SaveFlag");
chudy@google.com902ebe52012-06-29 14:21:22 +0000328 } else if (flags == SkCanvas::kARGB_ClipLayer_SaveFlag) {
chudy@google.com97cee972012-08-07 20:41:37 +0000329 mFlags->append("kARGB_ClipLayer_SaveFlag");
chudy@google.com902ebe52012-06-29 14:21:22 +0000330 } else {
chudy@google.com97cee972012-08-07 20:41:37 +0000331 mFlags->append("Data Unavailable");
chudy@google.com902ebe52012-06-29 14:21:22 +0000332 }
chudy@google.com902ebe52012-06-29 14:21:22 +0000333 return mFlags;
334}
335
chudy@google.com97cee972012-08-07 20:41:37 +0000336SkString* SkObjectParser::ScalarToString(SkScalar x, const char* text) {
337 SkString* mScalar = new SkString(text);
338 mScalar->append(" ");
339 mScalar->appendScalar(x);
chudy@google.com902ebe52012-06-29 14:21:22 +0000340 return mScalar;
341}
342
chudy@google.com97cee972012-08-07 20:41:37 +0000343SkString* SkObjectParser::TextToString(const void* text, size_t byteLength) {
robertphillips@google.com94acc702012-09-06 18:43:21 +0000344 SkString* mText = new SkString(6+byteLength+1);
345 mText->append("Text: ");
346 mText->append((char*) text, byteLength);
chudy@google.com97cee972012-08-07 20:41:37 +0000347 return mText;
chudy@google.com902ebe52012-06-29 14:21:22 +0000348}