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 "include/core/SkString.h" |
9 | #include "src/core/SkStringUtils.h" |
10 | #include "src/utils/SkUTF.h" |
11 | |
12 | void SkAppendScalar(SkString* str, SkScalar value, SkScalarAsStringType asType) { |
13 | switch (asType) { |
14 | case kHex_SkScalarAsStringType: |
15 | str->appendf("SkBits2Float(0x%08x)" , SkFloat2Bits(value)); |
16 | break; |
17 | case kDec_SkScalarAsStringType: { |
18 | SkString tmp; |
19 | tmp.printf("%g" , value); |
20 | if (tmp.contains('.')) { |
21 | tmp.appendUnichar('f'); |
22 | } |
23 | str->append(tmp); |
24 | break; |
25 | } |
26 | } |
27 | } |
28 | |
29 | SkString SkTabString(const SkString& string, int tabCnt) { |
30 | if (tabCnt <= 0) { |
31 | return string; |
32 | } |
33 | SkString tabs; |
34 | for (int i = 0; i < tabCnt; ++i) { |
35 | tabs.append("\t" ); |
36 | } |
37 | SkString result; |
38 | static const char newline[] = "\n" ; |
39 | const char* input = string.c_str(); |
40 | int nextNL = SkStrFind(input, newline); |
41 | while (nextNL >= 0) { |
42 | if (nextNL > 0) { |
43 | result.append(tabs); |
44 | } |
45 | result.append(input, nextNL + 1); |
46 | input += nextNL + 1; |
47 | nextNL = SkStrFind(input, newline); |
48 | } |
49 | if (*input != '\0') { |
50 | result.append(tabs); |
51 | result.append(input); |
52 | } |
53 | return result; |
54 | } |
55 | |
56 | SkString SkStringFromUTF16(const uint16_t* src, size_t count) { |
57 | SkString ret; |
58 | const uint16_t* stop = src + count; |
59 | if (count > 0) { |
60 | SkASSERT(src); |
61 | size_t n = 0; |
62 | const uint16_t* end = src + count; |
63 | for (const uint16_t* ptr = src; ptr < end;) { |
64 | const uint16_t* last = ptr; |
65 | SkUnichar u = SkUTF::NextUTF16(&ptr, stop); |
66 | size_t s = SkUTF::ToUTF8(u); |
67 | if (n > UINT32_MAX - s) { |
68 | end = last; // truncate input string |
69 | break; |
70 | } |
71 | n += s; |
72 | } |
73 | ret = SkString(n); |
74 | char* out = ret.writable_str(); |
75 | for (const uint16_t* ptr = src; ptr < end;) { |
76 | out += SkUTF::ToUTF8(SkUTF::NextUTF16(&ptr, stop), out); |
77 | } |
78 | SkASSERT(out == ret.writable_str() + n); |
79 | } |
80 | return ret; |
81 | } |
82 | |