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