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 17749f085dddff10473b6ebf832a974288300224e60bsalomon if (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::kHasAlphaLayer_SaveFlag) { 304d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com mFlags->append("kHasAlphaLayer_SaveFlag "); 305d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com } 306d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com if (flags & SkCanvas::kFullColorLayer_SaveFlag) { 307d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com mFlags->append("kFullColorLayer_SaveFlag "); 308d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com } 309d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com if (flags & SkCanvas::kClipToLayer_SaveFlag) { 310d3ae1d62312791b4355d47f41562de7b11e95636fmalita@google.com mFlags->append("kClipToLayer_SaveFlag "); 311902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 312902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com return mFlags; 313902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 314902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 31597cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.comSkString* SkObjectParser::ScalarToString(SkScalar x, const char* text) { 31697cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com SkString* mScalar = new SkString(text); 31797cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com mScalar->append(" "); 31897cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com mScalar->appendScalar(x); 319902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com return mScalar; 320902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 321902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 322428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.comSkString* SkObjectParser::TextToString(const void* text, size_t byteLength, 323428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com SkPaint::TextEncoding encoding) { 324428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com 325428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com SkString* decodedText = new SkString(); 326428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com switch (encoding) { 327428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com case SkPaint::kUTF8_TextEncoding: { 328428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com decodedText->append("UTF-8: "); 329428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com decodedText->append((const char*)text, byteLength); 330428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com break; 331428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com } 332428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com case SkPaint::kUTF16_TextEncoding: { 333428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com decodedText->append("UTF-16: "); 334f61ebc0927d773fe4152a3521cdc3de0112f636eskia.committer@gmail.com size_t sizeNeeded = SkUTF16_ToUTF8((uint16_t*)text, 335f61ebc0927d773fe4152a3521cdc3de0112f636eskia.committer@gmail.com SkToS32(byteLength / 2), 336a4662865e37a2ca95b5e3379072f6a274acc8ac8robertphillips@google.com NULL); 337b9050d73f98912cdac6a4e058523e6a92e497f69scroggo@google.com SkAutoSTMalloc<0x100, char> utf8(sizeNeeded); 338a4662865e37a2ca95b5e3379072f6a274acc8ac8robertphillips@google.com SkUTF16_ToUTF8((uint16_t*)text, SkToS32(byteLength / 2), utf8); 339428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com decodedText->append(utf8, sizeNeeded); 340428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com break; 341428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com } 342428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com case SkPaint::kUTF32_TextEncoding: { 343428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com decodedText->append("UTF-32: "); 344428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com const SkUnichar* begin = (const SkUnichar*)text; 345428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com const SkUnichar* end = (const SkUnichar*)((const char*)text + byteLength); 346428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com for (const SkUnichar* unichar = begin; unichar < end; ++unichar) { 347428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com decodedText->appendUnichar(*unichar); 348428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com } 349428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com break; 350428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com } 351428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com case SkPaint::kGlyphID_TextEncoding: { 352428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com decodedText->append("GlyphID: "); 353428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com const uint16_t* begin = (const uint16_t*)text; 354428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com const uint16_t* end = (const uint16_t*)((const char*)text + byteLength); 355428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com for (const uint16_t* glyph = begin; glyph < end; ++glyph) { 356428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com decodedText->append("0x"); 357428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com decodedText->appendHex(*glyph); 358428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com decodedText->append(" "); 359428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com } 360428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com break; 361428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com } 362428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com default: 363428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com decodedText->append("Unknown text encoding."); 364428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com break; 365428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com } 366428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com 367428fc4a37b66ac927d5b8c3a2938e578ea70cbb8bungeman@google.com return decodedText; 368902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 369