OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 <assert.h> | 5 #include <assert.h> |
6 #include <math.h> | 6 #include <math.h> |
7 #include <ppapi/c/ppb_input_event.h> | 7 #include <ppapi/c/ppb_input_event.h> |
8 #include <ppapi/cpp/input_event.h> | 8 #include <ppapi/cpp/input_event.h> |
9 #include <ppapi/cpp/var.h> | 9 #include <ppapi/cpp/var.h> |
10 #include <ppapi/cpp/var_array.h> | 10 #include <ppapi/cpp/var_array.h> |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 } | 66 } |
67 | 67 |
68 inline double getseconds() { | 68 inline double getseconds() { |
69 const double usec_to_sec = 0.000001; | 69 const double usec_to_sec = 0.000001; |
70 timeval tv; | 70 timeval tv; |
71 if (0 == gettimeofday(&tv, NULL)) | 71 if (0 == gettimeofday(&tv, NULL)) |
72 return tv.tv_sec + tv.tv_usec * usec_to_sec; | 72 return tv.tv_sec + tv.tv_usec * usec_to_sec; |
73 return 0.0; | 73 return 0.0; |
74 } | 74 } |
75 | 75 |
76 inline uint32_t MakeRGBA(uint32_t r, uint32_t g, uint32_t b, uint32_t a) { | 76 // BGRA helper function, for constructing a pixel for a BGRA buffer. |
| 77 inline uint32_t MakeBGRA(uint32_t b, uint32_t g, uint32_t r, uint32_t a) { |
77 return (((a) << 24) | ((r) << 16) | ((g) << 8) | (b)); | 78 return (((a) << 24) | ((r) << 16) | ((g) << 8) | (b)); |
78 } | 79 } |
79 } // namespace | 80 } // namespace |
80 | 81 |
81 // Vec2, simple 2D vector | 82 // Vec2, simple 2D vector |
82 struct Vec2 { | 83 struct Vec2 { |
83 float x, y; | 84 float x, y; |
84 Vec2() {} | 85 Vec2() {} |
85 Vec2(float px, float py) { | 86 Vec2(float px, float py) { |
86 x = px; | 87 x = px; |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 // random initial start position | 156 // random initial start position |
156 const float x = frand(); | 157 const float x = frand(); |
157 const float y = frand(); | 158 const float y = frand(); |
158 positions_[i].Set(x, y); | 159 positions_[i].Set(x, y); |
159 // random directional velocity ( -1..1, -1..1 ) | 160 // random directional velocity ( -1..1, -1..1 ) |
160 const float speed = 0.0005f; | 161 const float speed = 0.0005f; |
161 const float u = (frand() * 2.0f - 1.0f) * speed; | 162 const float u = (frand() * 2.0f - 1.0f) * speed; |
162 const float v = (frand() * 2.0f - 1.0f) * speed; | 163 const float v = (frand() * 2.0f - 1.0f) * speed; |
163 velocities_[i].Set(u, v); | 164 velocities_[i].Set(u, v); |
164 // 'unique' color (well... unique enough for our purposes) | 165 // 'unique' color (well... unique enough for our purposes) |
165 colors_[i] = MakeRGBA(rand255(), rand255(), rand255(), 255); | 166 colors_[i] = MakeBGRA(rand255(), rand255(), rand255(), 255); |
166 } | 167 } |
167 } | 168 } |
168 | 169 |
169 Voronoi::Voronoi() : num_regions_(kDefaultNumRegions), num_threads_(0), | 170 Voronoi::Voronoi() : num_regions_(kDefaultNumRegions), num_threads_(0), |
170 point_count_(kStartPointCount), draw_points_(true), draw_interiors_(true), | 171 point_count_(kStartPointCount), draw_points_(true), draw_interiors_(true), |
171 benchmark_frame_counter_(0), benchmarking_(false) { | 172 benchmark_frame_counter_(0), benchmarking_(false) { |
172 Reset(); | 173 Reset(); |
173 // By default, render from the dispatch thread. | 174 // By default, render from the dispatch thread. |
174 workers_ = new ThreadPool(num_threads_); | 175 workers_ = new ThreadPool(num_threads_); |
175 PSEventSetFilter(PSE_ALL); | 176 PSEventSetFilter(PSE_ALL); |
176 ps_context_ = PSContext2DAllocate(); | 177 ps_context_ = PSContext2DAllocate(PP_IMAGEDATAFORMAT_BGRA_PREMUL); |
177 } | 178 } |
178 | 179 |
179 Voronoi::~Voronoi() { | 180 Voronoi::~Voronoi() { |
180 delete workers_; | 181 delete workers_; |
181 PSContext2DFree(ps_context_); | 182 PSContext2DFree(ps_context_); |
182 } | 183 } |
183 | 184 |
184 inline uint32_t* Voronoi::wGetAddr(int x, int y) { | 185 inline uint32_t* Voronoi::wGetAddr(int x, int y) { |
185 return ps_context_->data + x + y * ps_context_->stride / sizeof(uint32_t); | 186 return ps_context_->data + x + y * ps_context_->stride / sizeof(uint32_t); |
186 } | 187 } |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
236 // all 4 corners belong to the same cell | 237 // all 4 corners belong to the same cell |
237 *m = m0; | 238 *m = m0; |
238 return true; | 239 return true; |
239 } | 240 } |
240 | 241 |
241 // Quickly fill a span of pixels with a solid color. Assumes | 242 // Quickly fill a span of pixels with a solid color. Assumes |
242 // span width is divisible by 4. | 243 // span width is divisible by 4. |
243 // If multithreading, this function is only called by the worker threads. | 244 // If multithreading, this function is only called by the worker threads. |
244 inline void Voronoi::wFillSpan(uint32_t* pixels, uint32_t color, int width) { | 245 inline void Voronoi::wFillSpan(uint32_t* pixels, uint32_t color, int width) { |
245 if (!draw_interiors_) { | 246 if (!draw_interiors_) { |
246 const uint32_t gray = MakeRGBA(128, 128, 128, 255); | 247 const uint32_t gray = MakeBGRA(128, 128, 128, 255); |
247 color = gray; | 248 color = gray; |
248 } | 249 } |
249 for (int i = 0; i < width; i += 4) { | 250 for (int i = 0; i < width; i += 4) { |
250 *pixels++ = color; | 251 *pixels++ = color; |
251 *pixels++ = color; | 252 *pixels++ = color; |
252 *pixels++ = color; | 253 *pixels++ = color; |
253 *pixels++ = color; | 254 *pixels++ = color; |
254 } | 255 } |
255 } | 256 } |
256 | 257 |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 // render dot as a small diamond | 388 // render dot as a small diamond |
388 *pixel = color1; | 389 *pixel = color1; |
389 *(pixel - 1) = color2; | 390 *(pixel - 1) = color2; |
390 *(pixel + 1) = color2; | 391 *(pixel + 1) = color2; |
391 *(pixel - stride_in_pixels) = color2; | 392 *(pixel - stride_in_pixels) = color2; |
392 *(pixel + stride_in_pixels) = color2; | 393 *(pixel + stride_in_pixels) = color2; |
393 } | 394 } |
394 | 395 |
395 // Superimposes dots on the positions. | 396 // Superimposes dots on the positions. |
396 void Voronoi::SuperimposePositions() { | 397 void Voronoi::SuperimposePositions() { |
397 const uint32_t white = MakeRGBA(255, 255, 255, 255); | 398 const uint32_t white = MakeBGRA(255, 255, 255, 255); |
398 const uint32_t gray = MakeRGBA(192, 192, 192, 255); | 399 const uint32_t gray = MakeBGRA(192, 192, 192, 255); |
399 for (int i = 0; i < point_count_; i++) { | 400 for (int i = 0; i < point_count_; i++) { |
400 RenderDot( | 401 RenderDot( |
401 screen_positions_[i].x, screen_positions_[i].y, white, gray); | 402 screen_positions_[i].x, screen_positions_[i].y, white, gray); |
402 } | 403 } |
403 } | 404 } |
404 | 405 |
405 // Renders the Voronoi diagram, dispatching the work to multiple threads. | 406 // Renders the Voronoi diagram, dispatching the work to multiple threads. |
406 void Voronoi::Render() { | 407 void Voronoi::Render() { |
407 workers_->Dispatch(num_regions_, wRenderRegionEntry, this); | 408 workers_->Dispatch(num_regions_, wRenderRegionEntry, this); |
408 if (draw_points_) | 409 if (draw_points_) |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
515 // Do simulation, render and present. | 516 // Do simulation, render and present. |
516 voronoi.Update(); | 517 voronoi.Update(); |
517 } | 518 } |
518 | 519 |
519 return 0; | 520 return 0; |
520 } | 521 } |
521 | 522 |
522 // Register the function to call once the Instance Object is initialized. | 523 // Register the function to call once the Instance Object is initialized. |
523 // see: pappi_simple/ps_main.h | 524 // see: pappi_simple/ps_main.h |
524 PPAPI_SIMPLE_REGISTER_MAIN(example_main); | 525 PPAPI_SIMPLE_REGISTER_MAIN(example_main); |
OLD | NEW |