SkObjectParser.cpp revision c77392ed58ec78ab19fa0e3ff99fb8110854fba2
1902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
2902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com/*
3902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com * Copyright 2012 Google Inc.
4902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com *
5902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com * Use of this source code is governed by a BSD-style license that can be
6902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com * found in the LICENSE file.
7902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com */
8902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
9902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "SkObjectParser.h"
104991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com#include "SkData.h"
114991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com#include "SkFontDescriptor.h"
1267baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com#include "SkRRect.h"
1376f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com#include "SkShader.h"
14f515ffc3d44975a09755276e572448061df3e2fehumper@google.com#include "SkStream.h"
154991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com#include "SkStringUtils.h"
164991b8f23482afc1494fd17647421ce68de53331robertphillips@google.com#include "SkTypeface.h"
17428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com#include "SkUtils.h"
18902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
19902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com/* TODO(chudy): Replace all std::strings with char */
20902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
2197cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.comSkString* SkObjectParser::BitmapToString(const SkBitmap& bitmap) {
22195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    SkString* mBitmap = new SkString("SkBitmap: ");
23195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    mBitmap->append("W: ");
24195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    mBitmap->appendS32(bitmap.width());
25195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    mBitmap->append(" H: ");
26195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    mBitmap->appendS32(bitmap.height());
27195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com
28c77392ed58ec78ab19fa0e3ff99fb8110854fba2reed    const char* gColorTypeStrings[] = {
29c77392ed58ec78ab19fa0e3ff99fb8110854fba2reed        "None", "A8", "565", "4444", "RGBA", "BGRA", "Index8"
30195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    };
31c77392ed58ec78ab19fa0e3ff99fb8110854fba2reed    SkASSERT(kLastEnum_SkColorType + 1 == SK_ARRAY_COUNT(gColorTypeStrings));
32195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com
33c77392ed58ec78ab19fa0e3ff99fb8110854fba2reed    mBitmap->append(" ColorType: ");
34c77392ed58ec78ab19fa0e3ff99fb8110854fba2reed    mBitmap->append(gColorTypeStrings[bitmap.colorType()]);
35195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com
36195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    if (bitmap.isOpaque()) {
37195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com        mBitmap->append(" opaque");
38195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    } else {
39195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com        mBitmap->append(" not-opaque");
40195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    }
41195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com
42195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    if (bitmap.isImmutable()) {
43195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com        mBitmap->append(" immutable");
44195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    } else {
45195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com        mBitmap->append(" not-immutable");
46195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    }
47195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com
48195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    if (bitmap.isVolatile()) {
49195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com        mBitmap->append(" volatile");
50195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    } else {
51195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com        mBitmap->append(" not-volatile");
52195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    }
53195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com
54195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    mBitmap->append(" genID: ");
55195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    mBitmap->appendS32(bitmap.getGenerationID());
56195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com
57902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    return mBitmap;
58902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
59902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
6097cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.comSkString* SkObjectParser::BoolToString(bool doAA) {
6197cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    SkString* mBool = new SkString("Bool doAA: ");
62902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    if (doAA) {
6397cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com        mBool->append("True");
64902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    } else {
6597cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com        mBool->append("False");
66902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
6797cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    return mBool;
68902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
69902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
7097cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.comSkString* SkObjectParser::CustomTextToString(const char* text) {
7197cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    SkString* mText = new SkString(text);
7297cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    return mText;
7397cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com}
7497cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com
7597cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.comSkString* SkObjectParser::IntToString(int x, const char* text) {
7697cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    SkString* mInt = new SkString(text);
7797cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    mInt->append(" ");
7897cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    mInt->appendScalar(SkIntToScalar(x));
7997cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    return mInt;
80902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
81902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
8297cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.comSkString* SkObjectParser::IRectToString(const SkIRect& rect) {
8397cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    SkString* mRect = new SkString("SkIRect: ");
8497cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    mRect->append("L: ");
85195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    mRect->appendS32(rect.left());
8697cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    mRect->append(", T: ");
87195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    mRect->appendS32(rect.top());
8897cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    mRect->append(", R: ");
89195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    mRect->appendS32(rect.right());
9097cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    mRect->append(", B: ");
91195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    mRect->appendS32(rect.bottom());
9297cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    return mRect;
9397cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com}
94902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
9597cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.comSkString* SkObjectParser::MatrixToString(const SkMatrix& matrix) {
96791f12e6cf558e0dd1689fbb0a6b5eddac9f42adrobertphillips@google.com    SkString* str = new SkString("SkMatrix: ");
970f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org#ifndef SK_IGNORE_TO_STRING
98791f12e6cf558e0dd1689fbb0a6b5eddac9f42adrobertphillips@google.com    matrix.toString(str);
9937a2b39ad19d779b2d4c04d49aac55894082018drobertphillips@google.com#endif
100791f12e6cf558e0dd1689fbb0a6b5eddac9f42adrobertphillips@google.com    return str;
10197cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com}
102902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
10397cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.comSkString* SkObjectParser::PaintToString(const SkPaint& paint) {
104791f12e6cf558e0dd1689fbb0a6b5eddac9f42adrobertphillips@google.com    SkString* str = new SkString;
1050f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org#ifndef SK_IGNORE_TO_STRING
106791f12e6cf558e0dd1689fbb0a6b5eddac9f42adrobertphillips@google.com    paint.toString(str);
10737a2b39ad19d779b2d4c04d49aac55894082018drobertphillips@google.com#endif
108791f12e6cf558e0dd1689fbb0a6b5eddac9f42adrobertphillips@google.com    return str;
10997cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com}
11097cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com
11197cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.comSkString* SkObjectParser::PathToString(const SkPath& path) {
112872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com    SkString* mPath = new SkString("Path (");
113872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com
11451185fe3d4403946d6cc5d5162e1f8e979b19f31robertphillips@google.com    static const char* gFillStrings[] = {
11551185fe3d4403946d6cc5d5162e1f8e979b19f31robertphillips@google.com        "Winding", "EvenOdd", "InverseWinding", "InverseEvenOdd"
11651185fe3d4403946d6cc5d5162e1f8e979b19f31robertphillips@google.com    };
11751185fe3d4403946d6cc5d5162e1f8e979b19f31robertphillips@google.com
11851185fe3d4403946d6cc5d5162e1f8e979b19f31robertphillips@google.com    mPath->append(gFillStrings[path.getFillType()]);
11951185fe3d4403946d6cc5d5162e1f8e979b19f31robertphillips@google.com    mPath->append(", ");
12051185fe3d4403946d6cc5d5162e1f8e979b19f31robertphillips@google.com
121872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com    static const char* gConvexityStrings[] = {
1226a748ad8d82576c4ce59e9b2409d41a93bf05cdfskia.committer@gmail.com        "Unknown", "Convex", "Concave"
123872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com    };
124872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com    SkASSERT(SkPath::kConcave_Convexity == 2);
125872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com
126872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com    mPath->append(gConvexityStrings[path.getConvexity()]);
127872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com    mPath->append(", ");
128872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com
129195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    if (path.isRect(NULL)) {
130195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com        mPath->append("isRect, ");
131195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    } else {
132195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com        mPath->append("isNotRect, ");
133195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com    }
134195952f0aee6e2dedf29d095e8be2edc2496dc18robertphillips@google.com
135872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com    mPath->appendS32(path.countVerbs());
136872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com    mPath->append("V, ");
137872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com    mPath->appendS32(path.countPoints());
138872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com    mPath->append("P): ");
139872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com
140872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com    static const char* gVerbStrings[] = {
1414a3ca94322510351f7304af2092d6513442ab9d7commit-bot@chromium.org        "Move", "Line", "Quad", "Conic", "Cubic", "Close", "Done"
142872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com    };
1434a3ca94322510351f7304af2092d6513442ab9d7commit-bot@chromium.org    static const int gPtsPerVerb[] = { 1, 1, 2, 2, 3, 0, 0 };
1444a3ca94322510351f7304af2092d6513442ab9d7commit-bot@chromium.org    static const int gPtOffsetPerVerb[] = { 0, 1, 1, 1, 1, 0, 0 };
1454a3ca94322510351f7304af2092d6513442ab9d7commit-bot@chromium.org    SkASSERT(SkPath::kDone_Verb == 6);
146872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com
147872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com    SkPath::Iter iter(const_cast<SkPath&>(path), false);
148872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com    SkPath::Verb verb;
149872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com    SkPoint points[4];
150872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com
1516a748ad8d82576c4ce59e9b2409d41a93bf05cdfskia.committer@gmail.com    for(verb = iter.next(points, false);
1526a748ad8d82576c4ce59e9b2409d41a93bf05cdfskia.committer@gmail.com        verb != SkPath::kDone_Verb;
153872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com        verb = iter.next(points, false)) {
154872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com
155872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com        mPath->append(gVerbStrings[verb]);
156872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com        mPath->append(" ");
157872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com
158872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com        for (int i = 0; i < gPtsPerVerb[verb]; ++i) {
159872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com            mPath->append("(");
160872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com            mPath->appendScalar(points[gPtOffsetPerVerb[verb]+i].fX);
161872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com            mPath->append(", ");
162872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com            mPath->appendScalar(points[gPtOffsetPerVerb[verb]+i].fY);
1634a3ca94322510351f7304af2092d6513442ab9d7commit-bot@chromium.org            mPath->append(")");
164872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com        }
1654a3ca94322510351f7304af2092d6513442ab9d7commit-bot@chromium.org
1664a3ca94322510351f7304af2092d6513442ab9d7commit-bot@chromium.org        if (SkPath::kConic_Verb == verb) {
1674a3ca94322510351f7304af2092d6513442ab9d7commit-bot@chromium.org            mPath->append("(");
1684a3ca94322510351f7304af2092d6513442ab9d7commit-bot@chromium.org            mPath->appendScalar(iter.conicWeight());
1694a3ca94322510351f7304af2092d6513442ab9d7commit-bot@chromium.org            mPath->append(")");
1704a3ca94322510351f7304af2092d6513442ab9d7commit-bot@chromium.org        }
1714a3ca94322510351f7304af2092d6513442ab9d7commit-bot@chromium.org
1724a3ca94322510351f7304af2092d6513442ab9d7commit-bot@chromium.org        mPath->append(" ");
17397cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    }
174872017694b29fd08256ac99e3221bcd0b8a3f32brobertphillips@google.com
17530d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com    SkString* boundStr = SkObjectParser::RectToString(path.getBounds(), "    Bound: ");
17630d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com
17730d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com    if (NULL != boundStr) {
17830d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com        mPath->append(*boundStr);
17930d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com        SkDELETE(boundStr);
18030d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com    }
18130d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com
182902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    return mPath;
183902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
184902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
18597cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.comSkString* SkObjectParser::PointsToString(const SkPoint pts[], size_t count) {
18697cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    SkString* mPoints = new SkString("SkPoints pts[]: ");
187902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    for (unsigned int i = 0; i < count; i++) {
18897cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com        mPoints->append("(");
18997cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com        mPoints->appendScalar(pts[i].fX);
19097cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com        mPoints->append(",");
19197cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com        mPoints->appendScalar(pts[i].fY);
19297cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com        mPoints->append(")");
193902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
19497cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    return mPoints;
195902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
196902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
19797cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.comSkString* SkObjectParser::PointModeToString(SkCanvas::PointMode mode) {
19897cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    SkString* mMode = new SkString("SkCanvas::PointMode: ");
19992b11f610376dea7192ade22dde31c8bb8ede76cchudy@google.com    if (mode == SkCanvas::kPoints_PointMode) {
20097cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com        mMode->append("kPoints_PointMode");
20192b11f610376dea7192ade22dde31c8bb8ede76cchudy@google.com    } else if (mode == SkCanvas::kLines_PointMode) {
20297cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com        mMode->append("kLines_Mode");
20392b11f610376dea7192ade22dde31c8bb8ede76cchudy@google.com    } else if (mode == SkCanvas::kPolygon_PointMode) {
20497cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com        mMode->append("kPolygon_PointMode");
20592b11f610376dea7192ade22dde31c8bb8ede76cchudy@google.com    }
20692b11f610376dea7192ade22dde31c8bb8ede76cchudy@google.com    return mMode;
20792b11f610376dea7192ade22dde31c8bb8ede76cchudy@google.com}
20892b11f610376dea7192ade22dde31c8bb8ede76cchudy@google.com
20930d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.comSkString* SkObjectParser::RectToString(const SkRect& rect, const char* title) {
21030d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com
21130d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com    SkString* mRect = new SkString;
21272b2e6fff3f54c6aa80a98eab4c73f02a8cd450dskia.committer@gmail.com
21330d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com    if (NULL == title) {
21430d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com        mRect->append("SkRect: ");
21530d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com    } else {
21630d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com        mRect->append(title);
21730d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com    }
21897cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    mRect->append("(");
21997cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    mRect->appendScalar(rect.left());
22097cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    mRect->append(", ");
22197cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    mRect->appendScalar(rect.top());
22297cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    mRect->append(", ");
22397cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    mRect->appendScalar(rect.right());
22497cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    mRect->append(", ");
22597cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    mRect->appendScalar(rect.bottom());
22697cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    mRect->append(")");
227902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    return mRect;
228902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
229902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
23067baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.comSkString* SkObjectParser::RRectToString(const SkRRect& rrect, const char* title) {
23167baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com
23267baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    SkString* mRRect = new SkString;
23367baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com
23467baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    if (NULL == title) {
23567baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com        mRRect->append("SkRRect (");
23667baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com        if (rrect.isEmpty()) {
23767baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com            mRRect->append("empty");
23867baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com        } else if (rrect.isRect()) {
23967baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com            mRRect->append("rect");
24067baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com        } else if (rrect.isOval()) {
24167baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com            mRRect->append("oval");
24267baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com        } else if (rrect.isSimple()) {
24367baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com            mRRect->append("simple");
244f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org        } else if (rrect.isNinePatch()) {
245f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org            mRRect->append("nine-patch");
24667baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com        } else {
24767baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com            SkASSERT(rrect.isComplex());
24867baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com            mRRect->append("complex");
24967baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com        }
25067baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com        mRRect->append("): ");
25167baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    } else {
25267baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com        mRRect->append(title);
25367baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    }
25467baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    mRRect->append("(");
25567baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    mRRect->appendScalar(rrect.rect().left());
25667baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    mRRect->append(", ");
25767baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    mRRect->appendScalar(rrect.rect().top());
25867baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    mRRect->append(", ");
25967baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    mRRect->appendScalar(rrect.rect().right());
26067baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    mRRect->append(", ");
26167baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    mRRect->appendScalar(rrect.rect().bottom());
26267baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    mRRect->append(") radii: (");
26367baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    for (int i = 0; i < 4; ++i) {
26467baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com        const SkVector& radii = rrect.radii((SkRRect::Corner) i);
26567baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com        mRRect->appendScalar(radii.fX);
26667baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com        mRRect->append(", ");
26767baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com        mRRect->appendScalar(radii.fY);
26867baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com        if (i < 3) {
26967baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com            mRRect->append(", ");
27067baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com        }
27167baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    }
27267baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    mRRect->append(")");
27367baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    return mRRect;
27467baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com}
27567baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com
27697cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.comSkString* SkObjectParser::RegionOpToString(SkRegion::Op op) {
27797cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    SkString* mOp = new SkString("SkRegion::Op: ");
278902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    if (op == SkRegion::kDifference_Op) {
27997cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com        mOp->append("kDifference_Op");
280902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    } else if (op == SkRegion::kIntersect_Op) {
28197cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com        mOp->append("kIntersect_Op");
282902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    } else if (op == SkRegion::kUnion_Op) {
28397cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com        mOp->append("kUnion_Op");
284902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    } else if (op == SkRegion::kXOR_Op) {
28597cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com        mOp->append("kXOR_Op");
286902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    } else if (op == SkRegion::kReverseDifference_Op) {
28797cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com        mOp->append("kReverseDifference_Op");
288902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    } else if (op == SkRegion::kReplace_Op) {
28997cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com        mOp->append("kReplace_Op");
290902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    } else {
29197cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com        mOp->append("Unknown Type");
292902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
293902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    return mOp;
294902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
295902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
29697cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.comSkString* SkObjectParser::RegionToString(const SkRegion& region) {
29797cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    SkString* mRegion = new SkString("SkRegion: Data unavailable.");
29897cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    return mRegion;
299902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
300902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
30197cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.comSkString* SkObjectParser::SaveFlagsToString(SkCanvas::SaveFlags flags) {
30297cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    SkString* mFlags = new SkString("SkCanvas::SaveFlags: ");
303d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com    if (flags & SkCanvas::kMatrix_SaveFlag) {
304d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com        mFlags->append("kMatrix_SaveFlag ");
305d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com    }
306d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com    if (flags & SkCanvas::kClip_SaveFlag) {
307d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com        mFlags->append("kClip_SaveFlag ");
308d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com    }
309d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com    if (flags & SkCanvas::kHasAlphaLayer_SaveFlag) {
310d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com        mFlags->append("kHasAlphaLayer_SaveFlag ");
311d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com    }
312d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com    if (flags & SkCanvas::kFullColorLayer_SaveFlag) {
313d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com        mFlags->append("kFullColorLayer_SaveFlag ");
314d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com    }
315d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com    if (flags & SkCanvas::kClipToLayer_SaveFlag) {
316d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com        mFlags->append("kClipToLayer_SaveFlag ");
317902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
318902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    return mFlags;
319902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
320902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
32197cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.comSkString* SkObjectParser::ScalarToString(SkScalar x, const char* text) {
32297cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    SkString* mScalar = new SkString(text);
32397cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    mScalar->append(" ");
32497cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    mScalar->appendScalar(x);
325902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    return mScalar;
326902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
327902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
328428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.comSkString* SkObjectParser::TextToString(const void* text, size_t byteLength,
329428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com                                       SkPaint::TextEncoding encoding) {
330428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com
331428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com    SkString* decodedText = new SkString();
332428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com    switch (encoding) {
333428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com        case SkPaint::kUTF8_TextEncoding: {
334428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com            decodedText->append("UTF-8: ");
335428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com            decodedText->append((const char*)text, byteLength);
336428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com            break;
337428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com        }
338428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com        case SkPaint::kUTF16_TextEncoding: {
339428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com            decodedText->append("UTF-16: ");
340f61ebc0927d773fe4152a3521cdc3de0112f636eskia.committer@gmail.com            size_t sizeNeeded = SkUTF16_ToUTF8((uint16_t*)text,
341f61ebc0927d773fe4152a3521cdc3de0112f636eskia.committer@gmail.com                                                SkToS32(byteLength / 2),
342a4662865e37a2ca95b5e3379072f6a274acc8ac8robertphillips@google.com                                                NULL);
343b9050d73f98912cdac6a4e058523e6a92e497f69scroggo@google.com            SkAutoSTMalloc<0x100, char> utf8(sizeNeeded);
344a4662865e37a2ca95b5e3379072f6a274acc8ac8robertphillips@google.com            SkUTF16_ToUTF8((uint16_t*)text, SkToS32(byteLength / 2), utf8);
345428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com            decodedText->append(utf8, sizeNeeded);
346428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com            break;
347428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com        }
348428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com        case SkPaint::kUTF32_TextEncoding: {
349428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com            decodedText->append("UTF-32: ");
350428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com            const SkUnichar* begin = (const SkUnichar*)text;
351428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com            const SkUnichar* end = (const SkUnichar*)((const char*)text + byteLength);
352428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com            for (const SkUnichar* unichar = begin; unichar < end; ++unichar) {
353428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com                decodedText->appendUnichar(*unichar);
354428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com            }
355428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com            break;
356428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com        }
357428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com        case SkPaint::kGlyphID_TextEncoding: {
358428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com            decodedText->append("GlyphID: ");
359428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com            const uint16_t* begin = (const uint16_t*)text;
360428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com            const uint16_t* end = (const uint16_t*)((const char*)text + byteLength);
361428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com            for (const uint16_t* glyph = begin; glyph < end; ++glyph) {
362428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com                decodedText->append("0x");
363428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com                decodedText->appendHex(*glyph);
364428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com                decodedText->append(" ");
365428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com            }
366428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com            break;
367428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com        }
368428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com        default:
369428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com            decodedText->append("Unknown text encoding.");
370428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com            break;
371428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com    }
372428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com
373428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com    return decodedText;
374902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
375