Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stdio.h> | 5 #include <stdio.h> |
| 6 #include <stdlib.h> | 6 #include <stdlib.h> |
| 7 | 7 |
| 8 #include "ppapi/c/ppb_image_data.h" | 8 #include "ppapi/c/ppb_image_data.h" |
| 9 #include "ppapi/cpp/graphics_2d.h" | 9 #include "ppapi/cpp/graphics_2d.h" |
| 10 #include "ppapi/cpp/image_data.h" | 10 #include "ppapi/cpp/image_data.h" |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 41 } | 41 } |
| 42 | 42 |
| 43 } // namespace | 43 } // namespace |
| 44 | 44 |
| 45 class Graphics2DInstance : public pp::Instance { | 45 class Graphics2DInstance : public pp::Instance { |
| 46 public: | 46 public: |
| 47 explicit Graphics2DInstance(PP_Instance instance) | 47 explicit Graphics2DInstance(PP_Instance instance) |
| 48 : pp::Instance(instance), | 48 : pp::Instance(instance), |
| 49 callback_factory_(this), | 49 callback_factory_(this), |
| 50 mouse_down_(false), | 50 mouse_down_(false), |
| 51 buffer_(NULL) {} | 51 buffer_(NULL), |
| 52 device_scale_(1.0f) {} | |
| 52 | 53 |
| 53 ~Graphics2DInstance() { delete[] buffer_; } | 54 ~Graphics2DInstance() { delete[] buffer_; } |
| 54 | 55 |
| 55 virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]) { | 56 virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]) { |
| 56 RequestInputEvents(PP_INPUTEVENT_CLASS_MOUSE); | 57 RequestInputEvents(PP_INPUTEVENT_CLASS_MOUSE); |
| 57 | 58 |
| 58 unsigned int seed = 1; | 59 unsigned int seed = 1; |
| 59 srand(seed); | 60 srand(seed); |
| 60 CreatePalette(); | 61 CreatePalette(); |
| 61 return true; | 62 return true; |
| 62 } | 63 } |
| 63 | 64 |
| 64 virtual void DidChangeView(const pp::View& view) { | 65 virtual void DidChangeView(const pp::View& view) { |
| 65 pp::Size new_size = view.GetRect().size(); | 66 device_scale_ = view.GetDeviceScale(); |
| 67 pp::Size new_size = pp::Size(view.GetRect().width() * device_scale_, | |
| 68 view.GetRect().height() * device_scale_); | |
| 66 | 69 |
| 67 if (!CreateContext(new_size)) | 70 if (!CreateContext(new_size)) |
| 68 return; | 71 return; |
| 69 | 72 |
| 70 // When flush_context_ is null, it means there is no Flush callback in | 73 // When flush_context_ is null, it means there is no Flush callback in |
| 71 // flight. This may have happened if the context was not created | 74 // flight. This may have happened if the context was not created |
| 72 // successfully, or if this is the first call to DidChangeView (when the | 75 // successfully, or if this is the first call to DidChangeView (when the |
| 73 // module first starts). In either case, start the main loop. | 76 // module first starts). In either case, start the main loop. |
| 74 if (flush_context_.is_null()) | 77 if (flush_context_.is_null()) |
| 75 MainLoop(0); | 78 MainLoop(0); |
| 76 } | 79 } |
| 77 | 80 |
| 78 virtual bool HandleInputEvent(const pp::InputEvent& event) { | 81 virtual bool HandleInputEvent(const pp::InputEvent& event) { |
| 79 if (!buffer_) | 82 if (!buffer_) |
| 80 return true; | 83 return true; |
| 81 | 84 |
| 82 if (event.GetType() == PP_INPUTEVENT_TYPE_MOUSEDOWN || | 85 if (event.GetType() == PP_INPUTEVENT_TYPE_MOUSEDOWN || |
| 83 event.GetType() == PP_INPUTEVENT_TYPE_MOUSEMOVE) { | 86 event.GetType() == PP_INPUTEVENT_TYPE_MOUSEMOVE) { |
| 84 pp::MouseInputEvent mouse_event(event); | 87 pp::MouseInputEvent mouse_event(event); |
| 85 | 88 |
| 86 if (mouse_event.GetButton() == PP_INPUTEVENT_MOUSEBUTTON_NONE) | 89 if (mouse_event.GetButton() == PP_INPUTEVENT_MOUSEBUTTON_NONE) |
| 87 return true; | 90 return true; |
| 88 | 91 |
| 89 mouse_ = mouse_event.GetPosition(); | 92 mouse_ = pp::Point(mouse_event.GetPosition().x() * device_scale_, |
| 93 mouse_event.GetPosition().y() * device_scale_); | |
| 90 mouse_down_ = true; | 94 mouse_down_ = true; |
| 91 } | 95 } |
| 92 | 96 |
| 93 if (event.GetType() == PP_INPUTEVENT_TYPE_MOUSEUP) | 97 if (event.GetType() == PP_INPUTEVENT_TYPE_MOUSEUP) |
| 94 mouse_down_ = false; | 98 mouse_down_ = false; |
| 95 | 99 |
| 96 return true; | 100 return true; |
| 97 } | 101 } |
| 98 | 102 |
| 99 private: | 103 private: |
| 100 void CreatePalette() { | 104 void CreatePalette() { |
| 101 for (int i = 0; i < 64; ++i) { | 105 for (int i = 0; i < 64; ++i) { |
| 102 // Black -> Red | 106 // Black -> Red |
| 103 palette_[i] = MakeColor(i * 2, 0, 0); | 107 palette_[i] = MakeColor(i * 2, 0, 0); |
| 104 palette_[i + 64] = MakeColor(128 + i * 2, 0, 0); | 108 palette_[i + 64] = MakeColor(128 + i * 2, 0, 0); |
| 105 // Red -> Yellow | 109 // Red -> Yellow |
| 106 palette_[i + 128] = MakeColor(255, i * 4, 0); | 110 palette_[i + 128] = MakeColor(255, i * 4, 0); |
| 107 // Yellow -> White | 111 // Yellow -> White |
| 108 palette_[i + 192] = MakeColor(255, 255, i * 4); | 112 palette_[i + 192] = MakeColor(255, 255, i * 4); |
| 109 } | 113 } |
| 110 } | 114 } |
| 111 | 115 |
| 112 bool CreateContext(const pp::Size& new_size) { | 116 bool CreateContext(const pp::Size& new_size) { |
| 113 const bool kIsAlwaysOpaque = true; | 117 const bool kIsAlwaysOpaque = true; |
| 114 context_ = pp::Graphics2D(this, new_size, kIsAlwaysOpaque); | 118 context_ = pp::Graphics2D(this, new_size, kIsAlwaysOpaque); |
| 119 // Call SetScale before BindGraphics so the image is scaled correctly on | |
| 120 // HiDPI displays. | |
| 121 context_.SetScale(1.0f / device_scale_); | |
| 115 if (!BindGraphics(context_)) { | 122 if (!BindGraphics(context_)) { |
| 116 fprintf(stderr, "Unable to bind 2d context!\n"); | 123 fprintf(stderr, "Unable to bind 2d context!\n"); |
| 117 context_ = pp::Graphics2D(); | 124 context_ = pp::Graphics2D(); |
| 118 return false; | 125 return false; |
| 119 } | 126 } |
| 120 | 127 |
| 121 // Allocate a buffer of palette entries of the same size as the new context. | 128 // Allocate a buffer of palette entries of the same size as the new context. |
| 122 buffer_ = new uint8_t[new_size.width() * new_size.height()]; | 129 buffer_ = new uint8_t[new_size.width() * new_size.height()]; |
| 123 size_ = new_size; | 130 size_ = new_size; |
| 124 | 131 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 175 } | 182 } |
| 176 | 183 |
| 177 void DrawMouse() { | 184 void DrawMouse() { |
| 178 if (!mouse_down_) | 185 if (!mouse_down_) |
| 179 return; | 186 return; |
| 180 | 187 |
| 181 int width = size_.width(); | 188 int width = size_.width(); |
| 182 int height = size_.height(); | 189 int height = size_.height(); |
| 183 | 190 |
| 184 // Draw a circle at the mouse position. | 191 // Draw a circle at the mouse position. |
| 185 int radius = kMouseRadius; | 192 int radius = kMouseRadius * device_scale_; |
|
binji
2014/07/17 00:11:38
no warning here about truncating from float to int
Josh Horwich
2014/07/17 00:20:58
I haven't seen any (here, and the pp::Size / pp::P
| |
| 186 int cx = mouse_.x(); | 193 int cx = mouse_.x(); |
| 187 int cy = mouse_.y(); | 194 int cy = mouse_.y(); |
| 188 int minx = cx - radius <= 0 ? 1 : cx - radius; | 195 int minx = cx - radius <= 0 ? 1 : cx - radius; |
| 189 int maxx = cx + radius >= width ? width - 1 : cx + radius; | 196 int maxx = cx + radius >= width ? width - 1 : cx + radius; |
| 190 int miny = cy - radius <= 0 ? 1 : cy - radius; | 197 int miny = cy - radius <= 0 ? 1 : cy - radius; |
| 191 int maxy = cy + radius >= height ? height - 1 : cy + radius; | 198 int maxy = cy + radius >= height ? height - 1 : cy + radius; |
| 192 for (int y = miny; y < maxy; ++y) { | 199 for (int y = miny; y < maxy; ++y) { |
| 193 for (int x = minx; x < maxx; ++x) { | 200 for (int x = minx; x < maxx; ++x) { |
| 194 if ((x - cx) * (x - cx) + (y - cy) * (y - cy) < radius * radius) | 201 if ((x - cx) * (x - cx) + (y - cy) * (y - cy) < radius * radius) |
| 195 buffer_[y * width + x] = RandUint8(192, 255); | 202 buffer_[y * width + x] = RandUint8(192, 255); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 254 } | 261 } |
| 255 | 262 |
| 256 pp::CompletionCallbackFactory<Graphics2DInstance> callback_factory_; | 263 pp::CompletionCallbackFactory<Graphics2DInstance> callback_factory_; |
| 257 pp::Graphics2D context_; | 264 pp::Graphics2D context_; |
| 258 pp::Graphics2D flush_context_; | 265 pp::Graphics2D flush_context_; |
| 259 pp::Size size_; | 266 pp::Size size_; |
| 260 pp::Point mouse_; | 267 pp::Point mouse_; |
| 261 bool mouse_down_; | 268 bool mouse_down_; |
| 262 uint8_t* buffer_; | 269 uint8_t* buffer_; |
| 263 uint32_t palette_[256]; | 270 uint32_t palette_[256]; |
| 271 float device_scale_; | |
| 264 }; | 272 }; |
| 265 | 273 |
| 266 class Graphics2DModule : public pp::Module { | 274 class Graphics2DModule : public pp::Module { |
| 267 public: | 275 public: |
| 268 Graphics2DModule() : pp::Module() {} | 276 Graphics2DModule() : pp::Module() {} |
| 269 virtual ~Graphics2DModule() {} | 277 virtual ~Graphics2DModule() {} |
| 270 | 278 |
| 271 virtual pp::Instance* CreateInstance(PP_Instance instance) { | 279 virtual pp::Instance* CreateInstance(PP_Instance instance) { |
| 272 return new Graphics2DInstance(instance); | 280 return new Graphics2DInstance(instance); |
| 273 } | 281 } |
| 274 }; | 282 }; |
| 275 | 283 |
| 276 namespace pp { | 284 namespace pp { |
| 277 Module* CreateModule() { return new Graphics2DModule(); } | 285 Module* CreateModule() { return new Graphics2DModule(); } |
| 278 } // namespace pp | 286 } // namespace pp |
| OLD | NEW |