Home | History | Annotate | Download | only in core
      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