OLD | NEW |
---|---|
1 /* Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 /* Copyright (c) 2012 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 <stdlib.h> | 5 #include <stdlib.h> |
6 #include <string.h> | 6 #include <string.h> |
7 | 7 |
8 #include "ppapi/c/pp_completion_callback.h" | 8 #include "ppapi/c/pp_completion_callback.h" |
9 #include "ppapi/c/pp_errors.h" | 9 #include "ppapi/c/pp_errors.h" |
10 #include "ppapi/c/pp_instance.h" | 10 #include "ppapi/c/pp_instance.h" |
(...skipping 15 matching lines...) Expand all Loading... | |
26 const PPB_Graphics2D* g_graphics_2d_interface; | 26 const PPB_Graphics2D* g_graphics_2d_interface; |
27 const PPB_ImageData* g_image_data_interface; | 27 const PPB_ImageData* g_image_data_interface; |
28 const PPB_Instance* g_instance_interface; | 28 const PPB_Instance* g_instance_interface; |
29 const PPB_View* g_view_interface; | 29 const PPB_View* g_view_interface; |
30 | 30 |
31 /* PPP_Instance implementation -----------------------------------------------*/ | 31 /* PPP_Instance implementation -----------------------------------------------*/ |
32 | 32 |
33 struct InstanceInfo { | 33 struct InstanceInfo { |
34 PP_Instance pp_instance; | 34 PP_Instance pp_instance; |
35 struct PP_Size last_size; | 35 struct PP_Size last_size; |
36 PP_Resource graphics; | |
36 | 37 |
37 struct InstanceInfo* next; | 38 struct InstanceInfo* next; |
38 }; | 39 }; |
39 | 40 |
40 /** Linked list of all live instances. */ | 41 /** Linked list of all live instances. */ |
41 struct InstanceInfo* all_instances = NULL; | 42 struct InstanceInfo* all_instances = NULL; |
42 | 43 |
43 /** Returns a refed resource corresponding to the created graphics 2d. */ | 44 /** Returns a refed resource corresponding to the created graphics 2d. */ |
44 PP_Resource MakeAndBindGraphics2D(PP_Instance instance, | 45 PP_Resource MakeAndBindGraphics2D(PP_Instance instance, |
45 const struct PP_Size* size) { | 46 const struct PP_Size* size) { |
46 PP_Resource graphics; | 47 PP_Resource graphics; |
47 | 48 |
48 graphics = g_graphics_2d_interface->Create(instance, size, PP_FALSE); | 49 graphics = g_graphics_2d_interface->Create(instance, size, PP_FALSE); |
49 if (!graphics) | 50 if (!graphics) |
50 return 0; | 51 return 0; |
51 | 52 |
52 if (!g_instance_interface->BindGraphics(instance, graphics)) { | 53 if (!g_instance_interface->BindGraphics(instance, graphics)) { |
53 g_core_interface->ReleaseResource(graphics); | 54 g_core_interface->ReleaseResource(graphics); |
54 return 0; | 55 return 0; |
55 } | 56 } |
56 return graphics; | 57 return graphics; |
57 } | 58 } |
58 | 59 |
59 void FlushCompletionCallback(void* user_data, int32_t result) { | 60 void FlushCompletionCallback(void* user_data, int32_t result) { |
60 /* Don't need to do anything here. */ | 61 /* Don't need to do anything here. */ |
61 } | 62 } |
62 | 63 |
63 void Repaint(struct InstanceInfo* instance, const struct PP_Size* size) { | 64 void Repaint(struct InstanceInfo* instance, const struct PP_Size* size) { |
64 PP_Resource image, graphics; | 65 PP_Resource image; |
65 struct PP_ImageDataDesc image_desc; | 66 struct PP_ImageDataDesc image_desc; |
66 uint32_t* image_data; | 67 uint32_t* image_data; |
67 int num_words, i; | 68 int num_words, i; |
68 | 69 |
70 /* Ensure the graphics 2d is ready. */ | |
71 if (!instance->graphics) { | |
72 instance->graphics = MakeAndBindGraphics2D(instance->pp_instance, size); | |
73 if (!instance->graphics) | |
74 return; | |
75 } | |
76 | |
69 /* Create image data to paint into. */ | 77 /* Create image data to paint into. */ |
70 image = g_image_data_interface->Create( | 78 image = g_image_data_interface->Create( |
71 instance->pp_instance, PP_IMAGEDATAFORMAT_BGRA_PREMUL, size, PP_TRUE); | 79 instance->pp_instance, PP_IMAGEDATAFORMAT_BGRA_PREMUL, size, PP_TRUE); |
72 if (!image) | 80 if (!image) |
73 return; | 81 return; |
74 g_image_data_interface->Describe(image, &image_desc); | 82 g_image_data_interface->Describe(image, &image_desc); |
75 | 83 |
76 /* Fill the image with blue. */ | 84 /* Fill the image with blue. */ |
77 image_data = (uint32_t*)g_image_data_interface->Map(image); | 85 image_data = (uint32_t*)g_image_data_interface->Map(image); |
78 if (!image_data) { | 86 if (!image_data) { |
79 g_core_interface->ReleaseResource(image); | 87 g_core_interface->ReleaseResource(image); |
80 return; | 88 return; |
81 } | 89 } |
82 num_words = image_desc.stride * size->height / 4; | 90 num_words = image_desc.stride * size->height / 4; |
83 for (i = 0; i < num_words; i++) | 91 for (i = 0; i < num_words; i++) |
84 image_data[i] = 0xFF0000FF; | 92 image_data[i] = 0xFF0000FF; |
85 | 93 |
86 /* Create the graphics 2d and paint the image to it. */ | 94 /* Paint image to graphics 2d. */ |
87 graphics = MakeAndBindGraphics2D(instance->pp_instance, size); | 95 g_graphics_2d_interface->ReplaceContents(instance->graphics, image); |
88 if (!graphics) { | 96 g_graphics_2d_interface->Flush(instance->graphics, |
89 g_core_interface->ReleaseResource(image); | |
90 return; | |
91 } | |
92 | |
93 g_graphics_2d_interface->ReplaceContents(graphics, image); | |
94 g_graphics_2d_interface->Flush(graphics, | |
95 PP_MakeCompletionCallback(&FlushCompletionCallback, NULL)); | 97 PP_MakeCompletionCallback(&FlushCompletionCallback, NULL)); |
dmichael (off chromium)
2015/04/07 15:33:13
Yeah, in the old version there's no guarantee the
| |
96 | 98 |
97 g_core_interface->ReleaseResource(graphics); | |
98 g_core_interface->ReleaseResource(image); | 99 g_core_interface->ReleaseResource(image); |
99 } | 100 } |
100 | 101 |
101 /** Returns the info for the given instance, or NULL if it's not found. */ | 102 /** Returns the info for the given instance, or NULL if it's not found. */ |
102 struct InstanceInfo* FindInstance(PP_Instance instance) { | 103 struct InstanceInfo* FindInstance(PP_Instance instance) { |
103 struct InstanceInfo* cur = all_instances; | 104 struct InstanceInfo* cur = all_instances; |
104 while (cur) { | 105 while (cur) { |
105 if (cur->pp_instance == instance) | 106 if (cur->pp_instance == instance) |
106 return cur; | 107 return cur; |
107 cur = cur->next; | 108 cur = cur->next; |
108 } | 109 } |
109 return NULL; | 110 return NULL; |
110 } | 111 } |
111 | 112 |
112 PP_Bool Instance_DidCreate(PP_Instance instance, | 113 PP_Bool Instance_DidCreate(PP_Instance instance, |
113 uint32_t argc, | 114 uint32_t argc, |
114 const char* argn[], | 115 const char* argn[], |
115 const char* argv[]) { | 116 const char* argv[]) { |
116 struct InstanceInfo* info = | 117 struct InstanceInfo* info = |
117 (struct InstanceInfo*)malloc(sizeof(struct InstanceInfo)); | 118 (struct InstanceInfo*)malloc(sizeof(struct InstanceInfo)); |
118 info->pp_instance = instance; | 119 info->pp_instance = instance; |
119 info->last_size.width = 0; | 120 info->last_size.width = 0; |
120 info->last_size.height = 0; | 121 info->last_size.height = 0; |
122 info->graphics = 0; | |
121 | 123 |
122 /* Insert into linked list of live instances. */ | 124 /* Insert into linked list of live instances. */ |
123 info->next = all_instances; | 125 info->next = all_instances; |
124 all_instances = info; | 126 all_instances = info; |
125 return PP_TRUE; | 127 return PP_TRUE; |
126 } | 128 } |
127 | 129 |
128 void Instance_DidDestroy(PP_Instance instance) { | 130 void Instance_DidDestroy(PP_Instance instance) { |
129 /* Find the matching item in the linked list, delete it, and patch the | 131 /* Find the matching item in the linked list, delete it, and patch the |
130 * links. | 132 * links. |
131 */ | 133 */ |
132 struct InstanceInfo** prev_ptr = &all_instances; | 134 struct InstanceInfo** prev_ptr = &all_instances; |
133 struct InstanceInfo* cur = all_instances; | 135 struct InstanceInfo* cur = all_instances; |
134 while (cur) { | 136 while (cur) { |
135 if (instance == cur->pp_instance) { | 137 if (instance == cur->pp_instance) { |
136 *prev_ptr = cur->next; | 138 *prev_ptr = cur->next; |
139 g_core_interface->ReleaseResource(cur->graphics); | |
137 free(cur); | 140 free(cur); |
138 return; | 141 return; |
139 } | 142 } |
140 prev_ptr = &cur->next; | 143 prev_ptr = &cur->next; |
141 cur = cur->next; | 144 cur = cur->next; |
142 } | 145 } |
143 } | 146 } |
144 | 147 |
145 void Instance_DidChangeView(PP_Instance pp_instance, | 148 void Instance_DidChangeView(PP_Instance pp_instance, |
146 PP_Resource view) { | 149 PP_Resource view) { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
202 } | 205 } |
203 | 206 |
204 PP_EXPORT void PPP_ShutdownModule() { | 207 PP_EXPORT void PPP_ShutdownModule() { |
205 } | 208 } |
206 | 209 |
207 PP_EXPORT const void* PPP_GetInterface(const char* interface_name) { | 210 PP_EXPORT const void* PPP_GetInterface(const char* interface_name) { |
208 if (strcmp(interface_name, PPP_INSTANCE_INTERFACE) == 0) | 211 if (strcmp(interface_name, PPP_INSTANCE_INTERFACE) == 0) |
209 return &instance_interface; | 212 return &instance_interface; |
210 return NULL; | 213 return NULL; |
211 } | 214 } |
OLD | NEW |