15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include <math.h> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 7b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi_simple/ps.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi_simple/ps_context_2d.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi_simple/ps_event.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi_simple/ps_interface.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi_simple/ps_main.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#ifdef WIN32 15a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#undef PostMessage 16a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#endif 17a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMaxPointCount = 1000000000; // The total number of points to draw. 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst double kSecsPerFrame = 0.005; // How long to draw points before swapping. 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32_t kOpaqueColorMask = 0xff000000; // Opaque pixels. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32_t kRedMask = 0xff0000; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32_t kBlueMask = 0xff; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32_t kRedShift = 16; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32_t kBlueShift = 0; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint g_points_in_circle = 0; 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint g_total_points = 0; 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochdouble g_pi = 0; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool Render(PSContext2D_t* ctx) { 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PSContext2DGetBuffer(ctx); 36b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (NULL == ctx->data) 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PP_TimeTicks start_time = PSInterfaceCore()->GetTimeTicks(); 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch while (PSInterfaceCore()->GetTimeTicks() - start_time < kSecsPerFrame) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double x = static_cast<double>(rand()) / RAND_MAX; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double y = static_cast<double>(rand()) / RAND_MAX; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double distance = sqrt(x * x + y * y); 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int px = x * ctx->width; 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int py = (1.0 - y) * ctx->height; 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch uint32_t color = ctx->data[ctx->width * py + px]; 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ++g_total_points; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (distance < 1.0) { 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ++g_points_in_circle; 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch g_pi = 4.0 * g_points_in_circle / g_total_points; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set color to blue. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color += 4 << kBlueShift; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color &= kBlueMask; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set color to red. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color += 4 << kRedShift; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color &= kRedMask; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ctx->data[ctx->width * py + px] = color | kOpaqueColorMask; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PSContext2DSwapBuffer(ctx); 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return g_total_points != kMaxPointCount; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/* 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Starting point for the module. We do not use main since it would 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * collide with main in libppapi_cpp. 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint example_main(int argc, char* argv[]) { 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch unsigned int seed = 1; 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch srand(seed); 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PSEventSetFilter(PSE_ALL); 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PSContext2D_t* ctx = PSContext2DAllocate(PP_IMAGEDATAFORMAT_BGRA_PREMUL); 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool running = true; 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch while (running) { 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PSEvent* event; 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Consume all available events 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch while ((event = PSEventTryAcquire()) != NULL) { 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PSContext2DHandleEvent(ctx, event); 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PSEventRelease(event); 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (ctx->bound) { 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch running = Render(ctx); 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 92b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Send the current PI value to JavaScript. 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PP_Var var = PP_MakeDouble(g_pi); 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PSInterfaceMessaging()->PostMessage(PSGetInstanceId(), var); 96b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 97b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return 0; 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/* 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Register the function to call once the Instance Object is initialized. 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * see: pappi_simple/ps_main.h 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPPAPI_SIMPLE_REGISTER_MAIN(example_main); 106