|  | // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include <algorithm> | 
|  |  | 
|  | #include "ppapi/cpp/graphics_2d.h" | 
|  | #include "ppapi/cpp/image_data.h" | 
|  | #include "ppapi/cpp/input_event.h" | 
|  | #include "ppapi/cpp/instance.h" | 
|  | #include "ppapi/cpp/module.h" | 
|  | #include "ppapi/cpp/mouse_cursor.h" | 
|  | #include "ppapi/cpp/view.h" | 
|  |  | 
|  | void FillRect(pp::ImageData* image, int left, int top, int width, int height, | 
|  | uint32_t color) { | 
|  | for (int y = std::max(0, top); | 
|  | y < std::min(image->size().height() - 1, top + height); | 
|  | y++) { | 
|  | for (int x = std::max(0, left); | 
|  | x < std::min(image->size().width() - 1, left + width); | 
|  | x++) | 
|  | *image->GetAddr32(pp::Point(x, y)) = color; | 
|  | } | 
|  | } | 
|  |  | 
|  | class MyInstance : public pp::Instance { | 
|  | public: | 
|  | MyInstance(PP_Instance instance) | 
|  | : pp::Instance(instance), width_(0), height_(0) { | 
|  | RequestInputEvents(PP_INPUTEVENT_CLASS_MOUSE); | 
|  | } | 
|  |  | 
|  | virtual ~MyInstance() { | 
|  | } | 
|  |  | 
|  | virtual void DidChangeView(const pp::View& view) { | 
|  | width_ = view.GetRect().width(); | 
|  | height_ = view.GetRect().height(); | 
|  | } | 
|  |  | 
|  | virtual bool HandleInputEvent(const pp::InputEvent& event) { | 
|  | switch (event.GetType()) { | 
|  | case PP_INPUTEVENT_TYPE_MOUSEDOWN: | 
|  | return true; | 
|  | case PP_INPUTEVENT_TYPE_MOUSEMOVE: | 
|  | HandleMove(pp::MouseInputEvent(event)); | 
|  | return true; | 
|  | case PP_INPUTEVENT_TYPE_KEYDOWN: | 
|  | return true; | 
|  | default: | 
|  | return false; | 
|  | } | 
|  | } | 
|  |  | 
|  | void HandleMove(const pp::MouseInputEvent& event) { | 
|  | pp::Point point = event.GetPosition(); | 
|  | int segments = 3; | 
|  | if (point.y() < height_ / segments) { | 
|  | // Top part gets custom cursor of wait. | 
|  | pp::MouseCursor::SetCursor(this, PP_MOUSECURSOR_TYPE_WAIT); | 
|  | } else if (point.y() < (height_ / segments) * 2) { | 
|  | // Next part gets custom image cursor. | 
|  | pp::ImageData cursor(this, pp::ImageData::GetNativeImageDataFormat(), | 
|  | pp::Size(32, 32), true); | 
|  | // Note that in real life you will need to handle the case where the | 
|  | // native format is different. | 
|  | FillRect(&cursor, 0, 0, 32, 32, 0x80000080); | 
|  | pp::MouseCursor::SetCursor(this, PP_MOUSECURSOR_TYPE_CUSTOM, cursor, | 
|  | pp::Point(16, 16)); | 
|  | } else { | 
|  | // Next part gets no cursor. | 
|  | pp::MouseCursor::SetCursor(this, PP_MOUSECURSOR_TYPE_NONE); | 
|  | } | 
|  | } | 
|  |  | 
|  |  | 
|  | private: | 
|  | int width_; | 
|  | int height_; | 
|  | }; | 
|  |  | 
|  | class MyModule : public pp::Module { | 
|  | public: | 
|  | MyModule() : pp::Module() {} | 
|  | virtual ~MyModule() {} | 
|  |  | 
|  | virtual pp::Instance* CreateInstance(PP_Instance instance) { | 
|  | return new MyInstance(instance); | 
|  | } | 
|  | }; | 
|  |  | 
|  | namespace pp { | 
|  |  | 
|  | // Factory function for your specialization of the Module object. | 
|  | Module* CreateModule() { | 
|  | return new MyModule(); | 
|  | } | 
|  |  | 
|  | }  // namespace pp |