Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(778)

Unified Diff: examples/keyboard_client/keyboard_client.cc

Issue 1247903003: Add spellcheck and word suggestion to the prediction service (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: format README and CHROMIUM.diff Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « DEPS ('k') | mojo/services/prediction/public/interfaces/prediction.mojom » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: examples/keyboard_client/keyboard_client.cc
diff --git a/examples/keyboard_client/keyboard_client.cc b/examples/keyboard_client/keyboard_client.cc
index a9ef5e1412fbc6063abef7e286ac09cf4d7dff57..e3103234176f290b06bf794a89e7d9ab9c7889df 100644
--- a/examples/keyboard_client/keyboard_client.cc
+++ b/examples/keyboard_client/keyboard_client.cc
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <algorithm>
+
#include "base/bind.h"
#include "base/macros.h"
#include "mojo/application/application_runner_chromium.h"
@@ -219,16 +221,7 @@ class KeyboardDelegate : public mojo::ApplicationDelegate,
void CommitText(const mojo::String& text,
int32_t new_cursor_position) override {
- std::string combined(text_[1]);
- combined.append(text);
- SkRect bounds;
- text_paint_.measureText(combined.data(), combined.size(), &bounds);
- if (bounds.width() > text_view_->bounds().width) {
- text_[0] = text_[1];
- text_[1] = text;
- } else {
- text_[1].append(text);
- }
+ text_.append(text);
DrawText();
}
@@ -236,10 +229,10 @@ class KeyboardDelegate : public mojo::ApplicationDelegate,
int32_t after_length) override {
// treat negative and zero |before_length| values as no-op.
if (before_length > 0) {
- if (before_length > static_cast<int32_t>(text_[1].size())) {
- before_length = text_[1].size();
+ if (before_length > static_cast<int32_t>(text_.size())) {
+ before_length = text_.size();
}
- text_[1].erase(text_[1].end() - before_length, text_[1].end());
+ text_.erase(text_.end() - before_length, text_.end());
}
DrawText();
}
@@ -316,20 +309,63 @@ class KeyboardDelegate : public mojo::ApplicationDelegate,
float row_height = text_view_height_ / 2.0f;
float text_baseline_offset = row_height / 5.0f;
-
- if (!text_[0].empty()) {
- canvas->drawText(text_[0].data(), text_[0].size(), 0.0f,
- row_height - text_baseline_offset, text_paint_);
- }
-
- if (!text_[1].empty()) {
- canvas->drawText(text_[1].data(), text_[1].size(), 0.0f,
- (2.0f * row_height) - text_baseline_offset, text_paint_);
+ if (!text_.empty()) {
+ SkRect sk_rect;
+ text_paint_.measureText((const void*)(text_.c_str()), text_.length(),
+ &sk_rect);
+
+ if (sk_rect.width() > text_view_->bounds().width) {
+ std::string reverse_text = text_;
+ std::reverse(reverse_text.begin(), reverse_text.end());
+
+ size_t processed1 = text_paint_.breakText(
+ (const void*)(reverse_text.c_str()), strlen(reverse_text.c_str()),
+ text_view_->bounds().width);
+ size_t processed2 = text_paint_.breakText(
+ (const void*)(reverse_text.c_str() + processed1),
+ strlen(reverse_text.c_str()) - processed1,
+ text_view_->bounds().width);
+ if (processed1 + processed2 < text_.length()) {
+ DrawSecondLine(canvas, text_.length() - processed1, processed1,
+ row_height, text_baseline_offset);
+ DrawFirstLine(canvas, text_.length() - processed1 - processed2,
+ processed2, row_height, text_baseline_offset);
+ } else {
+ size_t processed3 =
+ text_paint_.breakText((const void*)(text_.c_str()),
+ text_.length(), text_view_->bounds().width);
+ DrawFirstLine(canvas, 0, processed3, row_height,
+ text_baseline_offset);
+ DrawSecondLine(canvas, processed3, text_.length() - processed3,
+ row_height, text_baseline_offset);
+ }
+ } else {
+ DrawSecondLine(canvas, 0, text_.length(), row_height,
+ text_baseline_offset);
+ }
}
canvas->flush();
}
+ void DrawFirstLine(SkCanvas* canvas,
+ const size_t offset,
+ const size_t length,
+ const float row_height,
+ const float text_baseline_offset) {
+ canvas->drawText(text_.data() + offset, length, 0.0f,
+ row_height - text_baseline_offset, text_paint_);
+ }
+
+ void DrawSecondLine(SkCanvas* canvas,
+ const size_t offset,
+ const size_t length,
+ const float row_height,
+ const float text_baseline_offset) {
+ canvas->drawText(text_.data() + offset, length, 0.0f,
+ (2.0f * row_height) - text_baseline_offset, text_paint_);
+ }
+
void DrawRootView(SkCanvas* canvas) {
canvas->clear(SK_ColorDKGRAY);
canvas->flush();
@@ -352,7 +388,7 @@ class KeyboardDelegate : public mojo::ApplicationDelegate,
scoped_ptr<ViewTextureUploader> text_view_texture_uploader_;
scoped_ptr<ViewTextureUploader> root_view_texture_uploader_;
int text_view_height_;
- std::string text_[2];
+ std::string text_;
SkPaint text_paint_;
base::WeakPtrFactory<KeyboardDelegate> weak_factory_;
« no previous file with comments | « DEPS ('k') | mojo/services/prediction/public/interfaces/prediction.mojom » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698