12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2013 Google Inc. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * found in the LICENSE file. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/completion_callback.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/graphics_2d.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/image_data.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/instance.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/module.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/var.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkCanvas.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkBitmap.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkString.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkThreadUtils.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SkiaInstance; 22bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Used by SkDebugf 24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)SkiaInstance* gPluginInstance; 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Main entry point for the app we're linked into 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int tool_main(int, char**); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Tokenize a command line and store it in argc and argv. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SkStringToProgramArgs(const SkString commandLine, int* argc, char*** argv) { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int numBreaks = 0; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* commandChars = commandLine.c_str(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < strlen(commandChars); i++) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (isspace(commandChars[i])) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) numBreaks++; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int numArgs; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strlen(commandChars) > 0) { 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch numArgs = numBreaks + 1; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) numArgs = 0; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *argc = numArgs; 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *argv = new char*[numArgs + 1]; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*argv)[numArgs] = NULL; 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) char* start = (char*) commandChars; 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int length = 0; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int argIndex = 0; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < strlen(commandChars) + 1; i++) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (isspace(commandChars[i]) || '\0' == commandChars[i]) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (length > 0) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* argument = new char[length + 1]; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(argument, start, length); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argument[length] = '\0'; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*argv)[argIndex++] = argument; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start = (char*) commandChars + i + 1; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) length = 0; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) length++; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Run the program with the given command line. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RunProgram(const SkString& commandLine) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argc; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char** argv; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkStringToProgramArgs(commandLine, &argc, &argv); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tool_main(argc, argv); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Skia's subclass of pp::Instance, our interface with the browser. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkiaInstance : public pp::Instance { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit SkiaInstance(PP_Instance instance) : pp::Instance(instance) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gPluginInstance = this; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SkiaInstance() { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gPluginInstance = NULL; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HandleMessage(const pp::Var& var_message) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Receive a message from javascript. 881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (var_message.is_string()) { 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkString msg(var_message.AsString().c_str()); 9058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (msg.startsWith("init")) { 91ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RunProgram(msg); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class SkiaModule : public pp::Module { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkiaModule() : pp::Module() {} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SkiaModule() {} 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual pp::Instance* CreateInstance(PP_Instance instance) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new SkiaInstance(instance); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Module* CreateModule() { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new SkiaModule(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace pp 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch