OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2011 The Chromium Authors. All rights reserved. | 2 * Copyright (c) 2011 The Chromium Authors. All rights reserved. |
3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
5 */ | 5 */ |
6 | 6 |
7 /* NaCl Earth demo */ | 7 /* NaCl Earth demo */ |
8 /* Pepper code in C */ | 8 /* Pepper code in C */ |
9 | 9 |
10 #include "native_client/tests/earth/earth.h" | 10 #include "native_client/tests/earth/earth.h" |
11 | 11 |
12 #include <assert.h> | 12 #include <assert.h> |
13 #include <stdbool.h> | 13 #include <stdbool.h> |
14 #include <stdio.h> | 14 #include <stdio.h> |
15 | 15 |
16 /* Pepper includes */ | 16 /* Pepper includes */ |
17 #include "ppapi/c/pp_completion_callback.h" | 17 #include "ppapi/c/pp_completion_callback.h" |
18 #include "ppapi/c/pp_errors.h" | 18 #include "ppapi/c/pp_errors.h" |
19 #include "ppapi/c/pp_instance.h" | 19 #include "ppapi/c/pp_instance.h" |
20 #include "ppapi/c/pp_module.h" | 20 #include "ppapi/c/pp_module.h" |
21 #include "ppapi/c/pp_point.h" | 21 #include "ppapi/c/pp_point.h" |
22 #include "ppapi/c/pp_rect.h" | 22 #include "ppapi/c/pp_rect.h" |
23 #include "ppapi/c/pp_size.h" | 23 #include "ppapi/c/pp_size.h" |
24 #include "ppapi/c/ppb_core.h" | 24 #include "ppapi/c/ppb_core.h" |
25 #include "ppapi/c/ppb_graphics_2d.h" | 25 #include "ppapi/c/ppb_graphics_2d.h" |
26 #include "ppapi/c/ppb_image_data.h" | 26 #include "ppapi/c/ppb_image_data.h" |
27 #include "ppapi/c/ppb_instance.h" | 27 #include "ppapi/c/ppb_instance.h" |
| 28 #include "ppapi/c/ppb_view.h" |
28 #include "ppapi/c/ppp.h" | 29 #include "ppapi/c/ppp.h" |
29 #include "ppapi/c/ppp_instance.h" | 30 #include "ppapi/c/ppp_instance.h" |
30 | 31 |
31 #define NUMBER_OF_IMAGES 2 | 32 #define NUMBER_OF_IMAGES 2 |
32 | 33 |
33 PPB_GetInterface g_get_browser_interface = NULL; | 34 PPB_GetInterface g_get_browser_interface = NULL; |
34 | 35 |
35 /* NOTE on PP_Instance: In general Pepper is designed such that a | 36 /* NOTE on PP_Instance: In general Pepper is designed such that a |
36 * single plugin process can implement multiple plugin instances. | 37 * single plugin process can implement multiple plugin instances. |
37 * This might occur, for example, if a plugin were instantiated by | 38 * This might occur, for example, if a plugin were instantiated by |
38 * multiple <embed ...> tags in a single page. | 39 * multiple <embed ...> tags in a single page. |
39 * | 40 * |
40 * This implementation assumes at most one instance per plugin, | 41 * This implementation assumes at most one instance per plugin, |
41 * consistent with limitations of the current implementation of | 42 * consistent with limitations of the current implementation of |
42 * Native Client. | 43 * Native Client. |
43 */ | 44 */ |
44 struct PepperState { | 45 struct PepperState { |
45 const struct PPB_Core* core_interface; | 46 const struct PPB_Core* core_interface; |
46 const struct PPB_Graphics2D* graphics_2d_interface; | 47 const struct PPB_Graphics2D* graphics_2d_interface; |
47 const struct PPB_ImageData* image_data_interface; | 48 const struct PPB_ImageData* image_data_interface; |
48 const struct PPB_Instance* instance_interface; | 49 const struct PPB_Instance* instance_interface; |
| 50 const struct PPB_View* view_interface; |
49 PP_Resource device_context; | 51 PP_Resource device_context; |
50 int32_t which_image; | 52 int32_t which_image; |
51 PP_Resource image[NUMBER_OF_IMAGES]; | 53 PP_Resource image[NUMBER_OF_IMAGES]; |
52 uint32_t* image_data[NUMBER_OF_IMAGES]; | 54 uint32_t* image_data[NUMBER_OF_IMAGES]; |
53 PP_Instance instance; | 55 PP_Instance instance; |
54 struct PP_Rect position; | 56 struct PP_Rect position; |
55 bool ready; | 57 bool ready; |
56 }; | 58 }; |
57 struct PepperState g_MyState; | 59 struct PepperState g_MyState; |
58 bool g_MyStateIsValid = false; | 60 bool g_MyStateIsValid = false; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 if (!device_context) return 0; | 124 if (!device_context) return 0; |
123 | 125 |
124 if (!g_MyState.instance_interface->BindGraphics(instance, device_context)) { | 126 if (!g_MyState.instance_interface->BindGraphics(instance, device_context)) { |
125 g_MyState.core_interface->ReleaseResource(device_context); | 127 g_MyState.core_interface->ReleaseResource(device_context); |
126 return 0; | 128 return 0; |
127 } | 129 } |
128 return device_context; | 130 return device_context; |
129 } | 131 } |
130 | 132 |
131 static void Instance_DidChangeView(PP_Instance pp_instance, | 133 static void Instance_DidChangeView(PP_Instance pp_instance, |
132 const struct PP_Rect* position, | 134 PP_Resource pp_view) { |
133 const struct PP_Rect* clip) { | |
134 DebugPrintf("DidChangeView(%x)\n", pp_instance); | 135 DebugPrintf("DidChangeView(%x)\n", pp_instance); |
135 assert(g_MyStateIsValid == true); | 136 assert(g_MyStateIsValid == true); |
136 assert(g_MyState.instance == pp_instance); | 137 assert(g_MyState.instance == pp_instance); |
137 | 138 |
138 g_MyState.position = *position; | 139 g_MyState.view_interface->GetRect(pp_view, &g_MyState.position); |
139 if (g_MyState.ready == false) { | 140 if (g_MyState.ready == false) { |
140 g_MyState.device_context = | 141 g_MyState.device_context = |
141 MakeAndBindDeviceContext(pp_instance, &position->size); | 142 MakeAndBindDeviceContext(pp_instance, &g_MyState.position.size); |
142 /* create device context */ | 143 /* create device context */ |
143 if (!g_MyState.device_context) { | 144 if (!g_MyState.device_context) { |
144 DebugPrintf("device_context is null!\n"); | 145 DebugPrintf("device_context is null!\n"); |
145 return; | 146 return; |
146 } | 147 } |
147 /* | 148 /* |
148 * Create double-buffered image data. | 149 * Create double-buffered image data. |
149 * Note: This example does not use transparent pixels. All pixels are | 150 * Note: This example does not use transparent pixels. All pixels are |
150 * written into the framebuffer with alpha set to 255 (opaque) | 151 * written into the framebuffer with alpha set to 255 (opaque) |
151 * Note: Pepper uses premultiplied alpha. | 152 * Note: Pepper uses premultiplied alpha. |
152 */ | 153 */ |
153 g_MyState.which_image = 0; | 154 g_MyState.which_image = 0; |
154 for (int i = 0; i < NUMBER_OF_IMAGES; ++i) { | 155 for (int i = 0; i < NUMBER_OF_IMAGES; ++i) { |
155 g_MyState.image[i] = | 156 g_MyState.image[i] = |
156 g_MyState.image_data_interface->Create(pp_instance, | 157 g_MyState.image_data_interface->Create(pp_instance, |
157 PP_IMAGEDATAFORMAT_BGRA_PREMUL, &position->size, PP_TRUE); | 158 PP_IMAGEDATAFORMAT_BGRA_PREMUL, &g_MyState.position.size, PP_TRUE); |
158 if (!g_MyState.image[i]) { | 159 if (!g_MyState.image[i]) { |
159 DebugPrintf("image resource is invalid!\n"); | 160 DebugPrintf("image resource is invalid!\n"); |
160 return; | 161 return; |
161 } | 162 } |
162 g_MyState.image_data[i] = | 163 g_MyState.image_data[i] = |
163 (uint32_t*)g_MyState.image_data_interface->Map(g_MyState.image[i]); | 164 (uint32_t*)g_MyState.image_data_interface->Map(g_MyState.image[i]); |
164 if (!g_MyState.image_data[i]) { | 165 if (!g_MyState.image_data[i]) { |
165 DebugPrintf("could not allocate image_data\n"); | 166 DebugPrintf("could not allocate image_data\n"); |
166 return; | 167 return; |
167 } | 168 } |
168 size_t size_in_bytes = position->size.width * position->size.height * | 169 size_t size_in_bytes = g_MyState.position.size.width * |
169 sizeof(uint32_t); | 170 g_MyState.position.size.height * sizeof(uint32_t); |
170 memset(g_MyState.image_data[i], 0, size_in_bytes); | 171 memset(g_MyState.image_data[i], 0, size_in_bytes); |
171 } | 172 } |
172 g_MyState.ready = true; | 173 g_MyState.ready = true; |
173 Repaint(&g_MyState); | 174 Repaint(&g_MyState); |
174 } | 175 } |
175 } | 176 } |
176 | 177 |
177 static void Instance_DidChangeFocus(PP_Instance pp_instance, | 178 static void Instance_DidChangeFocus(PP_Instance pp_instance, |
178 PP_Bool has_focus) { | 179 PP_Bool has_focus) { |
179 } | 180 } |
(...skipping 19 matching lines...) Expand all Loading... |
199 g_get_browser_interface = get_browser_interface; | 200 g_get_browser_interface = get_browser_interface; |
200 | 201 |
201 g_MyState.core_interface = (const struct PPB_Core*) | 202 g_MyState.core_interface = (const struct PPB_Core*) |
202 get_browser_interface(PPB_CORE_INTERFACE); | 203 get_browser_interface(PPB_CORE_INTERFACE); |
203 g_MyState.instance_interface = (const struct PPB_Instance*) | 204 g_MyState.instance_interface = (const struct PPB_Instance*) |
204 get_browser_interface(PPB_INSTANCE_INTERFACE); | 205 get_browser_interface(PPB_INSTANCE_INTERFACE); |
205 g_MyState.image_data_interface = (const struct PPB_ImageData*) | 206 g_MyState.image_data_interface = (const struct PPB_ImageData*) |
206 get_browser_interface(PPB_IMAGEDATA_INTERFACE); | 207 get_browser_interface(PPB_IMAGEDATA_INTERFACE); |
207 g_MyState.graphics_2d_interface = (const struct PPB_Graphics2D*) | 208 g_MyState.graphics_2d_interface = (const struct PPB_Graphics2D*) |
208 get_browser_interface(PPB_GRAPHICS_2D_INTERFACE); | 209 get_browser_interface(PPB_GRAPHICS_2D_INTERFACE); |
| 210 g_MyState.view_interface = (const struct PPB_View*) |
| 211 get_browser_interface(PPB_VIEW_INTERFACE); |
209 if (!g_MyState.core_interface || | 212 if (!g_MyState.core_interface || |
210 !g_MyState.instance_interface || | 213 !g_MyState.instance_interface || |
211 !g_MyState.image_data_interface || | 214 !g_MyState.image_data_interface || |
212 !g_MyState.graphics_2d_interface) | 215 !g_MyState.graphics_2d_interface || |
| 216 !g_MyState.view_interface) |
213 return -1; | 217 return -1; |
214 | 218 |
215 return PP_OK; | 219 return PP_OK; |
216 } | 220 } |
217 | 221 |
218 PP_EXPORT void PPP_ShutdownModule() { | 222 PP_EXPORT void PPP_ShutdownModule() { |
219 } | 223 } |
220 | 224 |
221 PP_EXPORT const void* PPP_GetInterface(const char* interface_name) { | 225 PP_EXPORT const void* PPP_GetInterface(const char* interface_name) { |
222 if (strcmp(interface_name, PPP_INSTANCE_INTERFACE) == 0) | 226 if (strcmp(interface_name, PPP_INSTANCE_INTERFACE) == 0) |
223 return &instance_interface; | 227 return &instance_interface; |
224 return NULL; | 228 return NULL; |
225 } | 229 } |
OLD | NEW |