| 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 |