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