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