1 /* 2 * Copyright 2013 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "SkString.h" 9 #include "SkStringUtils.h" 10 #include "SkUtils.h" 11 12 void SkAddFlagToString(SkString* string, bool flag, const char* flagStr, bool* needSeparator) { 13 if (flag) { 14 if (*needSeparator) { 15 string->append("|"); 16 } 17 string->append(flagStr); 18 *needSeparator = true; 19 } 20 } 21 22 void SkAppendScalar(SkString* str, SkScalar value, SkScalarAsStringType asType) { 23 switch (asType) { 24 case kHex_SkScalarAsStringType: 25 str->appendf("SkBits2Float(0x%08x)", SkFloat2Bits(value)); 26 break; 27 case kDec_SkScalarAsStringType: { 28 SkString tmp; 29 tmp.printf("%g", value); 30 if (tmp.contains('.')) { 31 tmp.appendUnichar('f'); 32 } 33 str->append(tmp); 34 break; 35 } 36 } 37 } 38 39 SkString SkTabString(const SkString& string, int tabCnt) { 40 if (tabCnt <= 0) { 41 return string; 42 } 43 SkString tabs; 44 for (int i = 0; i < tabCnt; ++i) { 45 tabs.append("\t"); 46 } 47 SkString result; 48 static const char newline[] = "\n"; 49 const char* input = string.c_str(); 50 int nextNL = SkStrFind(input, newline); 51 while (nextNL >= 0) { 52 if (nextNL > 0) { 53 result.append(tabs); 54 } 55 result.append(input, nextNL + 1); 56 input += nextNL + 1; 57 nextNL = SkStrFind(input, newline); 58 } 59 if (*input != '\0') { 60 result.append(tabs); 61 result.append(input); 62 } 63 return result; 64 } 65 66 SkString SkStringFromUTF16(const uint16_t* src, size_t count) { 67 SkString ret; 68 if (count > 0) { 69 SkASSERT(src); 70 size_t n = 0; 71 const uint16_t* end = src + count; 72 for (const uint16_t* ptr = src; ptr < end;) { 73 const uint16_t* last = ptr; 74 SkUnichar u = SkUTF16_NextUnichar(&ptr); 75 size_t s = SkUTF8_FromUnichar(u); 76 if (n > SK_MaxU32 - s) { 77 end = last; // truncate input string 78 break; 79 } 80 n += s; 81 } 82 ret = SkString(n); 83 char* out = ret.writable_str(); 84 for (const uint16_t* ptr = src; ptr < end;) { 85 out += SkUTF8_FromUnichar(SkUTF16_NextUnichar(&ptr), out); 86 } 87 SkASSERT(out == ret.writable_str() + n); 88 } 89 return ret; 90 } 91