Chromium Code Reviews| Index: services/keyboard_native/key_layout.cc |
| diff --git a/services/keyboard_native/key_layout.cc b/services/keyboard_native/key_layout.cc |
| index 2ec750deb6345057fa6aebd9251945c1c075f118..9b6918285ce6aca2b3925802ef8797e885bae667 100644 |
| --- a/services/keyboard_native/key_layout.cc |
| +++ b/services/keyboard_native/key_layout.cc |
| @@ -5,9 +5,14 @@ |
| #include "base/bind.h" |
| #include "base/bind_helpers.h" |
| #include "base/macros.h" |
| +#include "services/keyboard_native/kActionIcon.h" |
| +#include "services/keyboard_native/kDeleteIcon.h" |
| +#include "services/keyboard_native/kLowerCaseIcon.h" |
| +#include "services/keyboard_native/kUpperCaseIcon.h" |
| #include "services/keyboard_native/key_layout.h" |
| #include "skia/ext/refptr.h" |
| #include "third_party/skia/include/core/SkTypeface.h" |
| +#include "ui/gfx/codec/png_codec.h" |
| namespace keyboard { |
| @@ -36,6 +41,38 @@ void KeyLayout::TextKey::OnTouchUp() { |
| touch_up_callback_.Run(*this); |
| } |
| +KeyLayout::ImageKey::ImageKey( |
| + const char* text, |
|
jamesr
2015/05/27 23:30:31
does this use |text| ?
APW
2015/05/28 17:54:25
|text| is used by the TextKey as a fallback in-cas
|
| + base::Callback<void(const TextKey&)> touch_up_callback, |
| + const mojo::embed::Data& data) |
| + : TextKey(text, touch_up_callback), bitmap_() { |
| + bool result = gfx::PNGCodec::Decode( |
| + reinterpret_cast<const unsigned char*>(data.data), data.size, &bitmap_); |
| + DCHECK(result); |
| + DCHECK(bitmap_.width() > 0); |
| + DCHECK(bitmap_.height() > 0); |
| +} |
| + |
| +KeyLayout::ImageKey::~ImageKey() { |
| +} |
| + |
| +void KeyLayout::ImageKey::Draw(SkCanvas* canvas, |
| + SkPaint paint, |
| + const gfx::RectF& rect) { |
| + float width_scale = rect.width() / bitmap_.width(); |
| + float height_scale = rect.height() / bitmap_.height(); |
| + float scale = width_scale > height_scale ? height_scale : width_scale; |
| + float target_width = bitmap_.width() * scale; |
| + float target_height = bitmap_.height() * scale; |
| + float delta_width = rect.width() - target_width; |
| + float target_x = rect.x() + (delta_width / 2.0f); |
| + float delta_height = rect.height() - target_height; |
| + float target_y = rect.y() + (delta_height / 2.0f); |
| + canvas->drawBitmapRect(bitmap_, SkRect::MakeXYWH(target_x, target_y, |
| + target_width, target_height), |
| + &paint); |
| +} |
| + |
| KeyLayout::KeyLayout() |
| : on_text_callback_(), |
| layout_(&letters_layout_), |
| @@ -221,6 +258,15 @@ void KeyLayout::InitKeyMaps() { |
| base::Callback<void(const TextKey&)> switch_to_symbols_callback = |
| base::Bind(&KeyLayout::OnKeySwitchToSymbols, weak_factory_.GetWeakPtr()); |
| + ImageKey* switch_to_upper_case_image_key = new ImageKey( |
| + "/\\", switch_to_upper_case_callback, keyboard_native::kUpperCaseIcon); |
| + ImageKey* switch_to_lower_case_image_key = new ImageKey( |
| + "\\/", switch_to_lower_case_callback, keyboard_native::kLowerCaseIcon); |
| + ImageKey* delete_image_key = |
| + new ImageKey("<-", delete_callback, keyboard_native::kDeleteIcon); |
| + ImageKey* action_image_key = |
| + new ImageKey(":)", do_nothing_callback, keyboard_native::kActionIcon); |
| + |
| std::vector<Key*> lower_case_key_map_row_one = { |
| new TextKey("q", emit_text_callback), |
| new TextKey("w", emit_text_callback), |
| @@ -245,7 +291,7 @@ void KeyLayout::InitKeyMaps() { |
| new TextKey("l", emit_text_callback)}; |
| std::vector<Key*> lower_case_key_map_row_three = { |
| - new TextKey("/\\", switch_to_upper_case_callback), |
| + switch_to_upper_case_image_key, |
| new TextKey("z", emit_text_callback), |
| new TextKey("x", emit_text_callback), |
| new TextKey("c", emit_text_callback), |
| @@ -253,14 +299,14 @@ void KeyLayout::InitKeyMaps() { |
| new TextKey("b", emit_text_callback), |
| new TextKey("n", emit_text_callback), |
| new TextKey("m", emit_text_callback), |
| - new TextKey("del", delete_callback)}; |
| + delete_image_key}; |
| std::vector<Key*> lower_case_key_map_row_four = { |
| new TextKey("sym", switch_to_symbols_callback), |
| new TextKey(",", emit_text_callback), |
| new TextKey(" ", emit_text_callback), |
| new TextKey(".", emit_text_callback), |
| - new TextKey("act", do_nothing_callback)}; |
| + action_image_key}; |
| lower_case_key_map_ = {lower_case_key_map_row_one, |
| lower_case_key_map_row_two, |
| @@ -291,7 +337,7 @@ void KeyLayout::InitKeyMaps() { |
| new TextKey("L", emit_text_callback)}; |
| std::vector<Key*> upper_case_key_map_row_three = { |
| - new TextKey("\\/", switch_to_lower_case_callback), |
| + switch_to_lower_case_image_key, |
| new TextKey("Z", emit_text_callback), |
| new TextKey("X", emit_text_callback), |
| new TextKey("C", emit_text_callback), |
| @@ -299,14 +345,14 @@ void KeyLayout::InitKeyMaps() { |
| new TextKey("B", emit_text_callback), |
| new TextKey("N", emit_text_callback), |
| new TextKey("M", emit_text_callback), |
| - new TextKey("DEL", delete_callback)}; |
| + delete_image_key}; |
| std::vector<Key*> upper_case_key_map_row_four = { |
| new TextKey("SYM", switch_to_symbols_callback), |
| new TextKey(",", emit_text_callback), |
| new TextKey(" ", emit_text_callback), |
| new TextKey(".", emit_text_callback), |
| - new TextKey("ACT", do_nothing_callback)}; |
| + action_image_key}; |
| upper_case_key_map_ = {upper_case_key_map_row_one, |
| upper_case_key_map_row_two, |
| @@ -345,7 +391,7 @@ void KeyLayout::InitKeyMaps() { |
| new TextKey(";", emit_text_callback), |
| new TextKey("!", emit_text_callback), |
| new TextKey("?", emit_text_callback), |
| - new TextKey("del", delete_callback)}; |
| + delete_image_key}; |
| std::vector<Key*> symbols_key_map_row_four = { |
| new TextKey("ABC", switch_to_lower_case_callback), |
| @@ -354,7 +400,7 @@ void KeyLayout::InitKeyMaps() { |
| new TextKey(" ", emit_text_callback), |
| new TextKey("/", emit_text_callback), |
| new TextKey(".", emit_text_callback), |
| - new TextKey("act", do_nothing_callback)}; |
| + action_image_key}; |
| symbols_key_map_ = {symbols_key_map_row_one, |
| symbols_key_map_row_two, |