diff options
author | asvitkine@chromium.org <asvitkine@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-12 17:17:58 +0000 |
---|---|---|
committer | asvitkine@chromium.org <asvitkine@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-12 17:17:58 +0000 |
commit | faf3574e5c98b92046d73eb047b3fb890edaf02a (patch) | |
tree | 2a977cb12cb636bd1229e29893444a46daae5258 /ui/gfx/skia_util.cc | |
parent | 79ac3cb9d555d88017e53d86e7021ab9461c778c (diff) | |
download | chromium_src-faf3574e5c98b92046d73eb047b3fb890edaf02a.zip chromium_src-faf3574e5c98b92046d73eb047b3fb890edaf02a.tar.gz chromium_src-faf3574e5c98b92046d73eb047b3fb890edaf02a.tar.bz2 |
Various improvements to |gfx::RemoveAcceleratorChar()|.
- Operate on string16's instead of std::string's.
- Handle surrogate pairs correctly.
- Add out parameters returning the accelerated char pos and span.
These changes are necessary for my upcoming change to use this function
in a new CanvasSkia text drawing implementation.
BUG=none
TEST=Additional test cases added to skia_util_unittest.c.
Review URL: http://codereview.chromium.org/8229010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@105107 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/gfx/skia_util.cc')
-rw-r--r-- | ui/gfx/skia_util.cc | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/ui/gfx/skia_util.cc b/ui/gfx/skia_util.cc index 3b08273..b0f3bd1 100644 --- a/ui/gfx/skia_util.cc +++ b/ui/gfx/skia_util.cc @@ -4,6 +4,7 @@ #include "ui/gfx/skia_util.h" +#include "base/i18n/char_iterator.h" #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkColorPriv.h" #include "third_party/skia/include/core/SkShader.h" @@ -58,20 +59,41 @@ bool BitmapsAreEqual(const SkBitmap& bitmap1, const SkBitmap& bitmap2) { return (size1 == size2) && (0 == memcmp(addr1, addr2, bitmap1.getSize())); } -std::string RemoveAcceleratorChar(const std::string& s, - char accelerator_char) { +string16 RemoveAcceleratorChar(const string16& s, + char16 accelerator_char, + int *accelerated_char_pos, + int *accelerated_char_span) { bool escaped = false; - std::string accelerator_removed; + int last_char_pos = -1; + int last_char_span = 0; + base::i18n::UTF16CharIterator chars(&s); + string16 accelerator_removed; + accelerator_removed.reserve(s.size()); - for (size_t i = 0; i < s.size(); ++i) { - if (s[i] != accelerator_char || escaped) { - accelerator_removed.push_back(s[i]); + while (!chars.end()) { + int32 c = chars.get(); + int array_pos = chars.array_pos(); + chars.Advance(); + + if (c != accelerator_char || escaped) { + int span = chars.array_pos() - array_pos; + if (escaped && c != accelerator_char) { + last_char_pos = accelerator_removed.size(); + last_char_span = span; + } + for (int i = 0; i < span; i++) + accelerator_removed.push_back(s[array_pos + i]); escaped = false; } else { escaped = true; } } + if (accelerated_char_pos) + *accelerated_char_pos = last_char_pos; + if (accelerated_char_span) + *accelerated_char_span = last_char_span; + return accelerator_removed; } |