OLD | NEW |
| (Empty) |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include <stdlib.h> | |
6 | |
7 #include "remoting/client/pepper/fake_browser.h" | |
8 | |
9 // Constant value for browser window. | |
10 static const int kWindowWidth = 100; | |
11 static const int kWindowHeight = 100; | |
12 | |
13 // ---------------------------------------------------------------------------- | |
14 // Browser callback routines | |
15 // These are simple implementations of the routines that the browser provides | |
16 // to the plugin as callbacks. | |
17 // ---------------------------------------------------------------------------- | |
18 | |
19 // Handler for getvalue. | |
20 // Must be of type NPN_GetValueProcPtr. | |
21 NPError Browser_GetValue(NPP instance, NPNVariable variable, void *ret_value) { | |
22 if (variable == NPNVPepperExtensions) { | |
23 NPNExtensions** ret = static_cast<NPNExtensions**>(ret_value); | |
24 *ret = Singleton<FakeBrowser>()->GetExtensions(); | |
25 return NPERR_NO_ERROR; | |
26 } | |
27 return NPERR_GENERIC_ERROR; | |
28 } | |
29 | |
30 // Extension handler for acquireDevice. | |
31 // Must be of type NPAcquireDevicePtr. | |
32 NPDevice* Extension_AcquireDevice(NPP instance, NPDeviceID device) { | |
33 if (device == NPPepper2DDevice) { | |
34 return Singleton<FakeBrowser>()->GetDevice2d(); | |
35 } | |
36 // TODO(garykac): Add support for NPPepper3DDevice. | |
37 return NULL; | |
38 } | |
39 | |
40 // Initialize 2D device context. | |
41 NPError Device_InitializeContext2D(NPP instance, | |
42 NPDeviceContext2D* context, | |
43 int extra_bytes) { | |
44 FakeBrowser* browser = Singleton<FakeBrowser>::get(); | |
45 NPDeviceContext2D* context2d = static_cast<NPDeviceContext2D*>(context); | |
46 int width, height; | |
47 browser->GetWindowInfo(&width, &height); | |
48 int stride = (width * ARGB_PIXEL_SIZE) + extra_bytes; | |
49 context2d->region = browser->AllocPixelBuffer(stride); | |
50 context2d->stride = stride; | |
51 | |
52 return NPERR_NO_ERROR; | |
53 } | |
54 | |
55 // Device handler for initializeContext | |
56 // This initializes a 2D context where the stride == width. | |
57 // Must be of type NPDeviceInitializeContextPtr. | |
58 NPError Device_InitializeContext2D_NoExtraBytes(NPP instance, | |
59 const NPDeviceConfig* config, | |
60 NPDeviceContext* context) { | |
61 return Device_InitializeContext2D(instance, | |
62 static_cast<NPDeviceContext2D*>(context), | |
63 0); | |
64 } | |
65 | |
66 // Device handler for initializeContext | |
67 // This initializes a 2D context where the stride > width. | |
68 // Must be of type NPDeviceInitializeContextPtr. | |
69 NPError Device_InitializeContext2D_ExtraBytes(NPP instance, | |
70 const NPDeviceConfig* config, | |
71 NPDeviceContext* context) { | |
72 return Device_InitializeContext2D(instance, | |
73 static_cast<NPDeviceContext2D*>(context), | |
74 8 /* extra_bytes */); | |
75 } | |
76 | |
77 // Device handler for flushContext | |
78 // Must be of type NPDeviceFlushContextPtr. | |
79 NPError Device_FlushContext(NPP instance, NPDeviceContext* context, | |
80 NPDeviceFlushContextCallbackPtr callback, | |
81 void* userData) { | |
82 return NPERR_NO_ERROR; | |
83 } | |
84 | |
85 // ---------------------------------------------------------------------------- | |
86 // FakeBrowserFuncs | |
87 // Singleton class for creating/managing the NPNetscapeFuncs struct that we | |
88 // need to provide to the Pepper plugin. | |
89 // ---------------------------------------------------------------------------- | |
90 | |
91 FakeBrowser::FakeBrowser() { | |
92 // Setup fake versions of the browser funcs needed by the unit tests. | |
93 // There are dozens of browser funcs that can be set up, but we only worry | |
94 // about the ones needed for our unittests. | |
95 browser_funcs_.reset(new NPNetscapeFuncs()); | |
96 browser_funcs_->getvalue = &Browser_GetValue; | |
97 | |
98 // Setup fake extension funcs structure. | |
99 extensions_.reset(new NPNExtensions()); | |
100 extensions_->acquireDevice = &Extension_AcquireDevice; | |
101 | |
102 // Setup fake device funcs structure. | |
103 device2d_.reset(new NPDevice()); | |
104 device2d_->initializeContext = &Device_InitializeContext2D_NoExtraBytes; | |
105 device2d_->flushContext = &Device_FlushContext; | |
106 | |
107 // Fake browser window. | |
108 window_.reset(new NPWindow()); | |
109 window_->x = 0; | |
110 window_->y = 0; | |
111 window_->width = kWindowWidth; | |
112 window_->height = kWindowHeight; | |
113 | |
114 width_ = kWindowWidth; | |
115 height_ = kWindowHeight; | |
116 | |
117 stride_ = 0; | |
118 pixel_buffer_.reset(); | |
119 } | |
120 | |
121 FakeBrowser::~FakeBrowser() { | |
122 FreePixelBuffer(); | |
123 } | |
124 | |
125 // Normally in our tests, the stride (ie, the number of bytes between the | |
126 // start of a row and the start of the next row) is equal to the number of | |
127 // bytes used to store the pixels for the row. | |
128 // Passing true to this routine sets things up so that there are a few extra | |
129 // padding bytes to the end of each row so that the stride is not the same | |
130 // as the row width. | |
131 void FakeBrowser::ForceStrideInDeviceContext(bool extra_bytes) { | |
132 if (extra_bytes) { | |
133 device2d_->initializeContext = &Device_InitializeContext2D_ExtraBytes; | |
134 } else { | |
135 device2d_->initializeContext = &Device_InitializeContext2D_NoExtraBytes; | |
136 } | |
137 } | |
138 | |
139 // Allocate a pixel buffer for the plugin to use. | |
140 // The height and width of the buffer come from the window size. | |
141 // The stride value is used to force each row to be |stride| bytes in size. | |
142 // This is typically done to add extra padding bytes to the end of each row. | |
143 uint32* FakeBrowser::AllocPixelBuffer(int stride) { | |
144 // Don't allow the stride to be less than the window width. | |
145 if (stride < width_) { | |
146 stride = width_; | |
147 } | |
148 stride_ = stride; | |
149 pixel_buffer_.reset(new uint32[height_ * stride]); | |
150 | |
151 return pixel_buffer_.get(); | |
152 } | |
153 | |
154 void FakeBrowser::FreePixelBuffer() { | |
155 stride_ = 0; | |
156 pixel_buffer_.reset(); | |
157 } | |
OLD | NEW |