summaryrefslogtreecommitdiffstats
path: root/ui/gfx/skia_util.cc
diff options
context:
space:
mode:
authorasvitkine@chromium.org <asvitkine@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-12 17:17:58 +0000
committerasvitkine@chromium.org <asvitkine@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-12 17:17:58 +0000
commitfaf3574e5c98b92046d73eb047b3fb890edaf02a (patch)
tree2a977cb12cb636bd1229e29893444a46daae5258 /ui/gfx/skia_util.cc
parent79ac3cb9d555d88017e53d86e7021ab9461c778c (diff)
downloadchromium_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.cc34
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;
}