OLD | NEW |
| (Empty) |
1 | |
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" | |
10 #include "SkData.h" | |
11 #include "SkFontDescriptor.h" | |
12 #include "SkRRect.h" | |
13 #include "SkShader.h" | |
14 #include "SkStream.h" | |
15 #include "SkStringUtils.h" | |
16 #include "SkTypeface.h" | |
17 #include "SkUtils.h" | |
18 | |
19 /* TODO(chudy): Replace all std::strings with char */ | |
20 | |
21 SkString* SkObjectParser::BitmapToString(const SkBitmap& bitmap) { | |
22 SkString* mBitmap = new SkString("SkBitmap: "); | |
23 mBitmap->append("W: "); | |
24 mBitmap->appendS32(bitmap.width()); | |
25 mBitmap->append(" H: "); | |
26 mBitmap->appendS32(bitmap.height()); | |
27 | |
28 const char* gConfigStrings[] = { | |
29 "None", "A1", "A8", "Index8", "RGB565", "ARGB4444", "ARGB8888", "RLE8" | |
30 }; | |
31 SkASSERT(SkBitmap::kConfigCount == 8); | |
32 | |
33 mBitmap->append(" Config: "); | |
34 mBitmap->append(gConfigStrings[bitmap.getConfig()]); | |
35 | |
36 if (bitmap.isOpaque()) { | |
37 mBitmap->append(" opaque"); | |
38 } else { | |
39 mBitmap->append(" not-opaque"); | |
40 } | |
41 | |
42 if (bitmap.isImmutable()) { | |
43 mBitmap->append(" immutable"); | |
44 } else { | |
45 mBitmap->append(" not-immutable"); | |
46 } | |
47 | |
48 if (bitmap.isVolatile()) { | |
49 mBitmap->append(" volatile"); | |
50 } else { | |
51 mBitmap->append(" not-volatile"); | |
52 } | |
53 | |
54 mBitmap->append(" genID: "); | |
55 mBitmap->appendS32(bitmap.getGenerationID()); | |
56 | |
57 return mBitmap; | |
58 } | |
59 | |
60 SkString* SkObjectParser::BoolToString(bool doAA) { | |
61 SkString* mBool = new SkString("Bool doAA: "); | |
62 if (doAA) { | |
63 mBool->append("True"); | |
64 } else { | |
65 mBool->append("False"); | |
66 } | |
67 return mBool; | |
68 } | |
69 | |
70 SkString* SkObjectParser::CustomTextToString(const char* text) { | |
71 SkString* mText = new SkString(text); | |
72 return mText; | |
73 } | |
74 | |
75 SkString* SkObjectParser::IntToString(int x, const char* text) { | |
76 SkString* mInt = new SkString(text); | |
77 mInt->append(" "); | |
78 mInt->appendScalar(SkIntToScalar(x)); | |
79 return mInt; | |
80 } | |
81 | |
82 SkString* SkObjectParser::IRectToString(const SkIRect& rect) { | |
83 SkString* mRect = new SkString("SkIRect: "); | |
84 mRect->append("L: "); | |
85 mRect->appendS32(rect.left()); | |
86 mRect->append(", T: "); | |
87 mRect->appendS32(rect.top()); | |
88 mRect->append(", R: "); | |
89 mRect->appendS32(rect.right()); | |
90 mRect->append(", B: "); | |
91 mRect->appendS32(rect.bottom()); | |
92 return mRect; | |
93 } | |
94 | |
95 SkString* SkObjectParser::MatrixToString(const SkMatrix& matrix) { | |
96 SkString* str = new SkString("SkMatrix: "); | |
97 #ifdef SK_DEVELOPER | |
98 matrix.toString(str); | |
99 #endif | |
100 return str; | |
101 } | |
102 | |
103 SkString* SkObjectParser::PaintToString(const SkPaint& paint) { | |
104 SkString* str = new SkString; | |
105 #ifdef SK_DEVELOPER | |
106 paint.toString(str); | |
107 #endif | |
108 return str; | |
109 } | |
110 | |
111 SkString* SkObjectParser::PathToString(const SkPath& path) { | |
112 SkString* mPath = new SkString("Path ("); | |
113 | |
114 static const char* gFillStrings[] = { | |
115 "Winding", "EvenOdd", "InverseWinding", "InverseEvenOdd" | |
116 }; | |
117 | |
118 mPath->append(gFillStrings[path.getFillType()]); | |
119 mPath->append(", "); | |
120 | |
121 static const char* gConvexityStrings[] = { | |
122 "Unknown", "Convex", "Concave" | |
123 }; | |
124 SkASSERT(SkPath::kConcave_Convexity == 2); | |
125 | |
126 mPath->append(gConvexityStrings[path.getConvexity()]); | |
127 mPath->append(", "); | |
128 | |
129 if (path.isRect(NULL)) { | |
130 mPath->append("isRect, "); | |
131 } else { | |
132 mPath->append("isNotRect, "); | |
133 } | |
134 | |
135 mPath->appendS32(path.countVerbs()); | |
136 mPath->append("V, "); | |
137 mPath->appendS32(path.countPoints()); | |
138 mPath->append("P): "); | |
139 | |
140 static const char* gVerbStrings[] = { | |
141 "Move", "Line", "Quad", "Conic", "Cubic", "Close", "Done" | |
142 }; | |
143 static const int gPtsPerVerb[] = { 1, 1, 2, 2, 3, 0, 0 }; | |
144 static const int gPtOffsetPerVerb[] = { 0, 1, 1, 1, 1, 0, 0 }; | |
145 SkASSERT(SkPath::kDone_Verb == 6); | |
146 | |
147 SkPath::Iter iter(const_cast<SkPath&>(path), false); | |
148 SkPath::Verb verb; | |
149 SkPoint points[4]; | |
150 | |
151 for(verb = iter.next(points, false); | |
152 verb != SkPath::kDone_Verb; | |
153 verb = iter.next(points, false)) { | |
154 | |
155 mPath->append(gVerbStrings[verb]); | |
156 mPath->append(" "); | |
157 | |
158 for (int i = 0; i < gPtsPerVerb[verb]; ++i) { | |
159 mPath->append("("); | |
160 mPath->appendScalar(points[gPtOffsetPerVerb[verb]+i].fX); | |
161 mPath->append(", "); | |
162 mPath->appendScalar(points[gPtOffsetPerVerb[verb]+i].fY); | |
163 mPath->append(")"); | |
164 } | |
165 | |
166 if (SkPath::kConic_Verb == verb) { | |
167 mPath->append("("); | |
168 mPath->appendScalar(iter.conicWeight()); | |
169 mPath->append(")"); | |
170 } | |
171 | |
172 mPath->append(" "); | |
173 } | |
174 | |
175 SkString* boundStr = SkObjectParser::RectToString(path.getBounds(), " Bou
nd: "); | |
176 | |
177 if (NULL != boundStr) { | |
178 mPath->append(*boundStr); | |
179 SkDELETE(boundStr); | |
180 } | |
181 | |
182 return mPath; | |
183 } | |
184 | |
185 SkString* SkObjectParser::PointsToString(const SkPoint pts[], size_t count) { | |
186 SkString* mPoints = new SkString("SkPoints pts[]: "); | |
187 for (unsigned int i = 0; i < count; i++) { | |
188 mPoints->append("("); | |
189 mPoints->appendScalar(pts[i].fX); | |
190 mPoints->append(","); | |
191 mPoints->appendScalar(pts[i].fY); | |
192 mPoints->append(")"); | |
193 } | |
194 return mPoints; | |
195 } | |
196 | |
197 SkString* SkObjectParser::PointModeToString(SkCanvas::PointMode mode) { | |
198 SkString* mMode = new SkString("SkCanvas::PointMode: "); | |
199 if (mode == SkCanvas::kPoints_PointMode) { | |
200 mMode->append("kPoints_PointMode"); | |
201 } else if (mode == SkCanvas::kLines_PointMode) { | |
202 mMode->append("kLines_Mode"); | |
203 } else if (mode == SkCanvas::kPolygon_PointMode) { | |
204 mMode->append("kPolygon_PointMode"); | |
205 } | |
206 return mMode; | |
207 } | |
208 | |
209 SkString* SkObjectParser::RectToString(const SkRect& rect, const char* title) { | |
210 | |
211 SkString* mRect = new SkString; | |
212 | |
213 if (NULL == title) { | |
214 mRect->append("SkRect: "); | |
215 } else { | |
216 mRect->append(title); | |
217 } | |
218 mRect->append("("); | |
219 mRect->appendScalar(rect.left()); | |
220 mRect->append(", "); | |
221 mRect->appendScalar(rect.top()); | |
222 mRect->append(", "); | |
223 mRect->appendScalar(rect.right()); | |
224 mRect->append(", "); | |
225 mRect->appendScalar(rect.bottom()); | |
226 mRect->append(")"); | |
227 return mRect; | |
228 } | |
229 | |
230 SkString* SkObjectParser::RRectToString(const SkRRect& rrect, const char* title)
{ | |
231 | |
232 SkString* mRRect = new SkString; | |
233 | |
234 if (NULL == title) { | |
235 mRRect->append("SkRRect ("); | |
236 if (rrect.isEmpty()) { | |
237 mRRect->append("empty"); | |
238 } else if (rrect.isRect()) { | |
239 mRRect->append("rect"); | |
240 } else if (rrect.isOval()) { | |
241 mRRect->append("oval"); | |
242 } else if (rrect.isSimple()) { | |
243 mRRect->append("simple"); | |
244 } else { | |
245 SkASSERT(rrect.isComplex()); | |
246 mRRect->append("complex"); | |
247 } | |
248 mRRect->append("): "); | |
249 } else { | |
250 mRRect->append(title); | |
251 } | |
252 mRRect->append("("); | |
253 mRRect->appendScalar(rrect.rect().left()); | |
254 mRRect->append(", "); | |
255 mRRect->appendScalar(rrect.rect().top()); | |
256 mRRect->append(", "); | |
257 mRRect->appendScalar(rrect.rect().right()); | |
258 mRRect->append(", "); | |
259 mRRect->appendScalar(rrect.rect().bottom()); | |
260 mRRect->append(") radii: ("); | |
261 for (int i = 0; i < 4; ++i) { | |
262 const SkVector& radii = rrect.radii((SkRRect::Corner) i); | |
263 mRRect->appendScalar(radii.fX); | |
264 mRRect->append(", "); | |
265 mRRect->appendScalar(radii.fY); | |
266 if (i < 3) { | |
267 mRRect->append(", "); | |
268 } | |
269 } | |
270 mRRect->append(")"); | |
271 return mRRect; | |
272 } | |
273 | |
274 SkString* SkObjectParser::RegionOpToString(SkRegion::Op op) { | |
275 SkString* mOp = new SkString("SkRegion::Op: "); | |
276 if (op == SkRegion::kDifference_Op) { | |
277 mOp->append("kDifference_Op"); | |
278 } else if (op == SkRegion::kIntersect_Op) { | |
279 mOp->append("kIntersect_Op"); | |
280 } else if (op == SkRegion::kUnion_Op) { | |
281 mOp->append("kUnion_Op"); | |
282 } else if (op == SkRegion::kXOR_Op) { | |
283 mOp->append("kXOR_Op"); | |
284 } else if (op == SkRegion::kReverseDifference_Op) { | |
285 mOp->append("kReverseDifference_Op"); | |
286 } else if (op == SkRegion::kReplace_Op) { | |
287 mOp->append("kReplace_Op"); | |
288 } else { | |
289 mOp->append("Unknown Type"); | |
290 } | |
291 return mOp; | |
292 } | |
293 | |
294 SkString* SkObjectParser::RegionToString(const SkRegion& region) { | |
295 SkString* mRegion = new SkString("SkRegion: Data unavailable."); | |
296 return mRegion; | |
297 } | |
298 | |
299 SkString* SkObjectParser::SaveFlagsToString(SkCanvas::SaveFlags flags) { | |
300 SkString* mFlags = new SkString("SkCanvas::SaveFlags: "); | |
301 if(flags == SkCanvas::kMatrixClip_SaveFlag) { | |
302 mFlags->append("kMatrixClip_SaveFlag"); | |
303 } else if (flags == SkCanvas::kClip_SaveFlag) { | |
304 mFlags->append("kClip_SaveFlag"); | |
305 } else if (flags == SkCanvas::kHasAlphaLayer_SaveFlag) { | |
306 mFlags->append("kHasAlphaLayer_SaveFlag"); | |
307 } else if (flags == SkCanvas::kFullColorLayer_SaveFlag) { | |
308 mFlags->append("kFullColorLayer_SaveFlag"); | |
309 } else if (flags == SkCanvas::kClipToLayer_SaveFlag) { | |
310 mFlags->append("kClipToLayer_SaveFlag"); | |
311 } else if (flags == SkCanvas::kMatrixClip_SaveFlag) { | |
312 mFlags->append("kMatrixClip_SaveFlag"); | |
313 } else if (flags == SkCanvas::kARGB_NoClipLayer_SaveFlag) { | |
314 mFlags->append("kARGB_NoClipLayer_SaveFlag"); | |
315 } else if (flags == SkCanvas::kARGB_ClipLayer_SaveFlag) { | |
316 mFlags->append("kARGB_ClipLayer_SaveFlag"); | |
317 } else { | |
318 mFlags->append("Data Unavailable"); | |
319 } | |
320 return mFlags; | |
321 } | |
322 | |
323 SkString* SkObjectParser::ScalarToString(SkScalar x, const char* text) { | |
324 SkString* mScalar = new SkString(text); | |
325 mScalar->append(" "); | |
326 mScalar->appendScalar(x); | |
327 return mScalar; | |
328 } | |
329 | |
330 SkString* SkObjectParser::TextToString(const void* text, size_t byteLength, | |
331 SkPaint::TextEncoding encoding) { | |
332 | |
333 SkString* decodedText = new SkString(); | |
334 switch (encoding) { | |
335 case SkPaint::kUTF8_TextEncoding: { | |
336 decodedText->append("UTF-8: "); | |
337 decodedText->append((const char*)text, byteLength); | |
338 break; | |
339 } | |
340 case SkPaint::kUTF16_TextEncoding: { | |
341 decodedText->append("UTF-16: "); | |
342 size_t sizeNeeded = SkUTF16_ToUTF8((uint16_t*)text, byteLength / 2,
NULL); | |
343 char* utf8 = new char[sizeNeeded]; | |
344 SkUTF16_ToUTF8((uint16_t*)text, byteLength / 2, utf8); | |
345 decodedText->append(utf8, sizeNeeded); | |
346 delete utf8; | |
347 break; | |
348 } | |
349 case SkPaint::kUTF32_TextEncoding: { | |
350 decodedText->append("UTF-32: "); | |
351 const SkUnichar* begin = (const SkUnichar*)text; | |
352 const SkUnichar* end = (const SkUnichar*)((const char*)text + byteLe
ngth); | |
353 for (const SkUnichar* unichar = begin; unichar < end; ++unichar) { | |
354 decodedText->appendUnichar(*unichar); | |
355 } | |
356 break; | |
357 } | |
358 case SkPaint::kGlyphID_TextEncoding: { | |
359 decodedText->append("GlyphID: "); | |
360 const uint16_t* begin = (const uint16_t*)text; | |
361 const uint16_t* end = (const uint16_t*)((const char*)text + byteLeng
th); | |
362 for (const uint16_t* glyph = begin; glyph < end; ++glyph) { | |
363 decodedText->append("0x"); | |
364 decodedText->appendHex(*glyph); | |
365 decodedText->append(" "); | |
366 } | |
367 break; | |
368 } | |
369 default: | |
370 decodedText->append("Unknown text encoding."); | |
371 break; | |
372 } | |
373 | |
374 return decodedText; | |
375 } | |
OLD | NEW |