blob: d8dbe838da043f6c8015479242d48ce6e3d01857 [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"
humper@google.comf515ffc2013-01-07 15:48:19 +000010#include "SkData.h"
11#include "SkFontDescriptor.h"
bungemand3ebb482015-08-05 13:57:49 -070012#include "SkPath.h"
robertphillips@google.com4991b8f2013-01-28 20:21:59 +000013#include "SkRRect.h"
14#include "SkShader.h"
15#include "SkStream.h"
16#include "SkStringUtils.h"
17#include "SkTypeface.h"
bungeman@google.com428fc4a2013-03-07 20:30:32 +000018#include "SkUtils.h"
chudy@google.com902ebe52012-06-29 14:21:22 +000019
20/* TODO(chudy): Replace all std::strings with char */
21
chudy@google.com97cee972012-08-07 20:41:37 +000022SkString* SkObjectParser::BitmapToString(const SkBitmap& bitmap) {
robertphillips@google.com195952f2012-10-23 12:13:35 +000023 SkString* mBitmap = new SkString("SkBitmap: ");
24 mBitmap->append("W: ");
25 mBitmap->appendS32(bitmap.width());
26 mBitmap->append(" H: ");
27 mBitmap->appendS32(bitmap.height());
28
reedc77392e2014-06-02 13:07:26 -070029 const char* gColorTypeStrings[] = {
robertphillips46bffd62015-03-24 11:09:07 -070030 "None", "A8", "565", "4444", "RGBA", "BGRA", "Index8", "G8"
robertphillips@google.com195952f2012-10-23 12:13:35 +000031 };
reedc77392e2014-06-02 13:07:26 -070032 SkASSERT(kLastEnum_SkColorType + 1 == SK_ARRAY_COUNT(gColorTypeStrings));
robertphillips@google.com195952f2012-10-23 12:13:35 +000033
reedc77392e2014-06-02 13:07:26 -070034 mBitmap->append(" ColorType: ");
35 mBitmap->append(gColorTypeStrings[bitmap.colorType()]);
robertphillips@google.com195952f2012-10-23 12:13:35 +000036
37 if (bitmap.isOpaque()) {
38 mBitmap->append(" opaque");
39 } else {
40 mBitmap->append(" not-opaque");
41 }
42
43 if (bitmap.isImmutable()) {
44 mBitmap->append(" immutable");
45 } else {
46 mBitmap->append(" not-immutable");
47 }
48
49 if (bitmap.isVolatile()) {
50 mBitmap->append(" volatile");
51 } else {
52 mBitmap->append(" not-volatile");
53 }
54
55 mBitmap->append(" genID: ");
56 mBitmap->appendS32(bitmap.getGenerationID());
57
chudy@google.com902ebe52012-06-29 14:21:22 +000058 return mBitmap;
59}
60
chudy@google.com97cee972012-08-07 20:41:37 +000061SkString* SkObjectParser::BoolToString(bool doAA) {
62 SkString* mBool = new SkString("Bool doAA: ");
chudy@google.com902ebe52012-06-29 14:21:22 +000063 if (doAA) {
chudy@google.com97cee972012-08-07 20:41:37 +000064 mBool->append("True");
chudy@google.com902ebe52012-06-29 14:21:22 +000065 } else {
chudy@google.com97cee972012-08-07 20:41:37 +000066 mBool->append("False");
chudy@google.com902ebe52012-06-29 14:21:22 +000067 }
chudy@google.com97cee972012-08-07 20:41:37 +000068 return mBool;
chudy@google.com902ebe52012-06-29 14:21:22 +000069}
70
chudy@google.com97cee972012-08-07 20:41:37 +000071SkString* SkObjectParser::CustomTextToString(const char* text) {
72 SkString* mText = new SkString(text);
73 return mText;
chudy@google.com902ebe52012-06-29 14:21:22 +000074}
75
chudy@google.com97cee972012-08-07 20:41:37 +000076SkString* SkObjectParser::IntToString(int x, const char* text) {
77 SkString* mInt = new SkString(text);
78 mInt->append(" ");
79 mInt->appendScalar(SkIntToScalar(x));
80 return mInt;
chudy@google.com902ebe52012-06-29 14:21:22 +000081}
82
chudy@google.com97cee972012-08-07 20:41:37 +000083SkString* SkObjectParser::IRectToString(const SkIRect& rect) {
84 SkString* mRect = new SkString("SkIRect: ");
85 mRect->append("L: ");
robertphillips@google.com195952f2012-10-23 12:13:35 +000086 mRect->appendS32(rect.left());
chudy@google.com97cee972012-08-07 20:41:37 +000087 mRect->append(", T: ");
robertphillips@google.com195952f2012-10-23 12:13:35 +000088 mRect->appendS32(rect.top());
chudy@google.com97cee972012-08-07 20:41:37 +000089 mRect->append(", R: ");
robertphillips@google.com195952f2012-10-23 12:13:35 +000090 mRect->appendS32(rect.right());
chudy@google.com97cee972012-08-07 20:41:37 +000091 mRect->append(", B: ");
robertphillips@google.com195952f2012-10-23 12:13:35 +000092 mRect->appendS32(rect.bottom());
chudy@google.com902ebe52012-06-29 14:21:22 +000093 return mRect;
94}
95
chudy@google.com97cee972012-08-07 20:41:37 +000096SkString* SkObjectParser::MatrixToString(const SkMatrix& matrix) {
robertphillips@google.com791f12e2013-02-14 13:53:53 +000097 SkString* str = new SkString("SkMatrix: ");
commit-bot@chromium.org0f10f7b2014-03-13 18:02:17 +000098#ifndef SK_IGNORE_TO_STRING
robertphillips@google.com791f12e2013-02-14 13:53:53 +000099 matrix.toString(str);
robertphillips@google.com37a2b392013-02-14 14:40:27 +0000100#endif
robertphillips@google.com791f12e2013-02-14 13:53:53 +0000101 return str;
chudy@google.com97cee972012-08-07 20:41:37 +0000102}
chudy@google.com902ebe52012-06-29 14:21:22 +0000103
robertphillips@google.com735edb02013-01-10 18:54:11 +0000104SkString* SkObjectParser::PaintToString(const SkPaint& paint) {
robertphillips@google.com791f12e2013-02-14 13:53:53 +0000105 SkString* str = new SkString;
commit-bot@chromium.org0f10f7b2014-03-13 18:02:17 +0000106#ifndef SK_IGNORE_TO_STRING
robertphillips@google.com791f12e2013-02-14 13:53:53 +0000107 paint.toString(str);
robertphillips@google.com37a2b392013-02-14 14:40:27 +0000108#endif
robertphillips@google.com791f12e2013-02-14 13:53:53 +0000109 return str;
chudy@google.com97cee972012-08-07 20:41:37 +0000110}
111
112SkString* SkObjectParser::PathToString(const SkPath& path) {
robertphillips@google.com87201762012-10-18 13:30:18 +0000113 SkString* mPath = new SkString("Path (");
114
robertphillips@google.com51185fe2012-12-05 19:34:33 +0000115 static const char* gFillStrings[] = {
116 "Winding", "EvenOdd", "InverseWinding", "InverseEvenOdd"
117 };
118
119 mPath->append(gFillStrings[path.getFillType()]);
120 mPath->append(", ");
121
robertphillips@google.com87201762012-10-18 13:30:18 +0000122 static const char* gConvexityStrings[] = {
skia.committer@gmail.com6a748ad2012-10-19 02:01:19 +0000123 "Unknown", "Convex", "Concave"
robertphillips@google.com87201762012-10-18 13:30:18 +0000124 };
125 SkASSERT(SkPath::kConcave_Convexity == 2);
126
127 mPath->append(gConvexityStrings[path.getConvexity()]);
128 mPath->append(", ");
129
robertphillips@google.com195952f2012-10-23 12:13:35 +0000130 if (path.isRect(NULL)) {
131 mPath->append("isRect, ");
132 } else {
133 mPath->append("isNotRect, ");
134 }
135
robertphillips@google.com87201762012-10-18 13:30:18 +0000136 mPath->appendS32(path.countVerbs());
137 mPath->append("V, ");
138 mPath->appendS32(path.countPoints());
139 mPath->append("P): ");
140
141 static const char* gVerbStrings[] = {
commit-bot@chromium.org4a3ca942013-06-04 21:51:06 +0000142 "Move", "Line", "Quad", "Conic", "Cubic", "Close", "Done"
robertphillips@google.com87201762012-10-18 13:30:18 +0000143 };
commit-bot@chromium.org4a3ca942013-06-04 21:51:06 +0000144 static const int gPtsPerVerb[] = { 1, 1, 2, 2, 3, 0, 0 };
145 static const int gPtOffsetPerVerb[] = { 0, 1, 1, 1, 1, 0, 0 };
146 SkASSERT(SkPath::kDone_Verb == 6);
robertphillips@google.com87201762012-10-18 13:30:18 +0000147
148 SkPath::Iter iter(const_cast<SkPath&>(path), false);
149 SkPath::Verb verb;
150 SkPoint points[4];
151
skia.committer@gmail.com6a748ad2012-10-19 02:01:19 +0000152 for(verb = iter.next(points, false);
153 verb != SkPath::kDone_Verb;
robertphillips@google.com87201762012-10-18 13:30:18 +0000154 verb = iter.next(points, false)) {
155
156 mPath->append(gVerbStrings[verb]);
157 mPath->append(" ");
158
159 for (int i = 0; i < gPtsPerVerb[verb]; ++i) {
160 mPath->append("(");
161 mPath->appendScalar(points[gPtOffsetPerVerb[verb]+i].fX);
162 mPath->append(", ");
163 mPath->appendScalar(points[gPtOffsetPerVerb[verb]+i].fY);
commit-bot@chromium.org4a3ca942013-06-04 21:51:06 +0000164 mPath->append(")");
robertphillips@google.com87201762012-10-18 13:30:18 +0000165 }
commit-bot@chromium.org4a3ca942013-06-04 21:51:06 +0000166
167 if (SkPath::kConic_Verb == verb) {
168 mPath->append("(");
169 mPath->appendScalar(iter.conicWeight());
170 mPath->append(")");
171 }
172
173 mPath->append(" ");
chudy@google.com97cee972012-08-07 20:41:37 +0000174 }
robertphillips@google.com87201762012-10-18 13:30:18 +0000175
robertphillips@google.com30d35f22012-11-06 16:45:36 +0000176 SkString* boundStr = SkObjectParser::RectToString(path.getBounds(), " Bound: ");
177
bsalomon49f085d2014-09-05 13:34:00 -0700178 if (boundStr) {
robertphillips@google.com30d35f22012-11-06 16:45:36 +0000179 mPath->append(*boundStr);
180 SkDELETE(boundStr);
181 }
182
chudy@google.com97cee972012-08-07 20:41:37 +0000183 return mPath;
184}
185
186SkString* SkObjectParser::PointsToString(const SkPoint pts[], size_t count) {
187 SkString* mPoints = new SkString("SkPoints pts[]: ");
188 for (unsigned int i = 0; i < count; i++) {
189 mPoints->append("(");
190 mPoints->appendScalar(pts[i].fX);
191 mPoints->append(",");
192 mPoints->appendScalar(pts[i].fY);
193 mPoints->append(")");
194 }
195 return mPoints;
196}
197
198SkString* SkObjectParser::PointModeToString(SkCanvas::PointMode mode) {
199 SkString* mMode = new SkString("SkCanvas::PointMode: ");
200 if (mode == SkCanvas::kPoints_PointMode) {
201 mMode->append("kPoints_PointMode");
202 } else if (mode == SkCanvas::kLines_PointMode) {
203 mMode->append("kLines_Mode");
204 } else if (mode == SkCanvas::kPolygon_PointMode) {
205 mMode->append("kPolygon_PointMode");
206 }
207 return mMode;
208}
209
robertphillips@google.com30d35f22012-11-06 16:45:36 +0000210SkString* SkObjectParser::RectToString(const SkRect& rect, const char* title) {
211
212 SkString* mRect = new SkString;
skia.committer@gmail.com72b2e6f2012-11-08 02:03:56 +0000213
robertphillips@google.com30d35f22012-11-06 16:45:36 +0000214 if (NULL == title) {
215 mRect->append("SkRect: ");
216 } else {
217 mRect->append(title);
218 }
chudy@google.com97cee972012-08-07 20:41:37 +0000219 mRect->append("(");
220 mRect->appendScalar(rect.left());
221 mRect->append(", ");
222 mRect->appendScalar(rect.top());
223 mRect->append(", ");
224 mRect->appendScalar(rect.right());
225 mRect->append(", ");
226 mRect->appendScalar(rect.bottom());
227 mRect->append(")");
228 return mRect;
229}
230
robertphillips@google.com67baba42013-01-02 20:20:31 +0000231SkString* SkObjectParser::RRectToString(const SkRRect& rrect, const char* title) {
232
233 SkString* mRRect = new SkString;
234
235 if (NULL == title) {
236 mRRect->append("SkRRect (");
237 if (rrect.isEmpty()) {
238 mRRect->append("empty");
239 } else if (rrect.isRect()) {
240 mRRect->append("rect");
241 } else if (rrect.isOval()) {
242 mRRect->append("oval");
243 } else if (rrect.isSimple()) {
244 mRRect->append("simple");
commit-bot@chromium.orgf338d7c2014-03-17 21:17:30 +0000245 } else if (rrect.isNinePatch()) {
246 mRRect->append("nine-patch");
robertphillips@google.com67baba42013-01-02 20:20:31 +0000247 } else {
248 SkASSERT(rrect.isComplex());
249 mRRect->append("complex");
250 }
251 mRRect->append("): ");
252 } else {
253 mRRect->append(title);
254 }
255 mRRect->append("(");
256 mRRect->appendScalar(rrect.rect().left());
257 mRRect->append(", ");
258 mRRect->appendScalar(rrect.rect().top());
259 mRRect->append(", ");
260 mRRect->appendScalar(rrect.rect().right());
261 mRRect->append(", ");
262 mRRect->appendScalar(rrect.rect().bottom());
263 mRRect->append(") radii: (");
264 for (int i = 0; i < 4; ++i) {
265 const SkVector& radii = rrect.radii((SkRRect::Corner) i);
266 mRRect->appendScalar(radii.fX);
267 mRRect->append(", ");
268 mRRect->appendScalar(radii.fY);
269 if (i < 3) {
270 mRRect->append(", ");
271 }
272 }
273 mRRect->append(")");
274 return mRRect;
275}
276
chudy@google.com97cee972012-08-07 20:41:37 +0000277SkString* SkObjectParser::RegionOpToString(SkRegion::Op op) {
278 SkString* mOp = new SkString("SkRegion::Op: ");
279 if (op == SkRegion::kDifference_Op) {
280 mOp->append("kDifference_Op");
281 } else if (op == SkRegion::kIntersect_Op) {
282 mOp->append("kIntersect_Op");
283 } else if (op == SkRegion::kUnion_Op) {
284 mOp->append("kUnion_Op");
285 } else if (op == SkRegion::kXOR_Op) {
286 mOp->append("kXOR_Op");
287 } else if (op == SkRegion::kReverseDifference_Op) {
288 mOp->append("kReverseDifference_Op");
289 } else if (op == SkRegion::kReplace_Op) {
290 mOp->append("kReplace_Op");
291 } else {
292 mOp->append("Unknown Type");
293 }
chudy@google.com902ebe52012-06-29 14:21:22 +0000294 return mOp;
295}
296
chudy@google.com97cee972012-08-07 20:41:37 +0000297SkString* SkObjectParser::RegionToString(const SkRegion& region) {
298 SkString* mRegion = new SkString("SkRegion: Data unavailable.");
299 return mRegion;
chudy@google.com902ebe52012-06-29 14:21:22 +0000300}
301
chudy@google.com97cee972012-08-07 20:41:37 +0000302SkString* SkObjectParser::SaveFlagsToString(SkCanvas::SaveFlags flags) {
303 SkString* mFlags = new SkString("SkCanvas::SaveFlags: ");
fmalita@google.comd3ae1d62013-07-11 16:25:55 +0000304 if (flags & SkCanvas::kHasAlphaLayer_SaveFlag) {
305 mFlags->append("kHasAlphaLayer_SaveFlag ");
306 }
307 if (flags & SkCanvas::kFullColorLayer_SaveFlag) {
308 mFlags->append("kFullColorLayer_SaveFlag ");
309 }
310 if (flags & SkCanvas::kClipToLayer_SaveFlag) {
311 mFlags->append("kClipToLayer_SaveFlag ");
chudy@google.com902ebe52012-06-29 14:21:22 +0000312 }
chudy@google.com902ebe52012-06-29 14:21:22 +0000313 return mFlags;
314}
315
chudy@google.com97cee972012-08-07 20:41:37 +0000316SkString* SkObjectParser::ScalarToString(SkScalar x, const char* text) {
317 SkString* mScalar = new SkString(text);
318 mScalar->append(" ");
319 mScalar->appendScalar(x);
chudy@google.com902ebe52012-06-29 14:21:22 +0000320 return mScalar;
321}
322
bungeman@google.com428fc4a2013-03-07 20:30:32 +0000323SkString* SkObjectParser::TextToString(const void* text, size_t byteLength,
324 SkPaint::TextEncoding encoding) {
325
326 SkString* decodedText = new SkString();
327 switch (encoding) {
328 case SkPaint::kUTF8_TextEncoding: {
329 decodedText->append("UTF-8: ");
330 decodedText->append((const char*)text, byteLength);
331 break;
332 }
333 case SkPaint::kUTF16_TextEncoding: {
334 decodedText->append("UTF-16: ");
skia.committer@gmail.comf61ebc02013-11-22 07:02:24 +0000335 size_t sizeNeeded = SkUTF16_ToUTF8((uint16_t*)text,
336 SkToS32(byteLength / 2),
robertphillips@google.coma4662862013-11-21 14:24:16 +0000337 NULL);
scroggo@google.comb9050d72013-08-26 21:20:04 +0000338 SkAutoSTMalloc<0x100, char> utf8(sizeNeeded);
robertphillips@google.coma4662862013-11-21 14:24:16 +0000339 SkUTF16_ToUTF8((uint16_t*)text, SkToS32(byteLength / 2), utf8);
bungeman@google.com428fc4a2013-03-07 20:30:32 +0000340 decodedText->append(utf8, sizeNeeded);
bungeman@google.com428fc4a2013-03-07 20:30:32 +0000341 break;
342 }
343 case SkPaint::kUTF32_TextEncoding: {
344 decodedText->append("UTF-32: ");
345 const SkUnichar* begin = (const SkUnichar*)text;
346 const SkUnichar* end = (const SkUnichar*)((const char*)text + byteLength);
347 for (const SkUnichar* unichar = begin; unichar < end; ++unichar) {
348 decodedText->appendUnichar(*unichar);
349 }
350 break;
351 }
352 case SkPaint::kGlyphID_TextEncoding: {
353 decodedText->append("GlyphID: ");
354 const uint16_t* begin = (const uint16_t*)text;
355 const uint16_t* end = (const uint16_t*)((const char*)text + byteLength);
356 for (const uint16_t* glyph = begin; glyph < end; ++glyph) {
357 decodedText->append("0x");
358 decodedText->appendHex(*glyph);
359 decodedText->append(" ");
360 }
361 break;
362 }
363 default:
364 decodedText->append("Unknown text encoding.");
365 break;
366 }
367
368 return decodedText;
chudy@google.com902ebe52012-06-29 14:21:22 +0000369}