/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "ppapi/cpp/completion_callback.h" #include "ppapi/cpp/graphics_2d.h" #include "ppapi/cpp/image_data.h" #include "ppapi/cpp/instance.h" #include "ppapi/cpp/module.h" #include "ppapi/cpp/var.h" #include "SkCanvas.h" #include "SkBitmap.h" #include "SkString.h" #include "SkThreadUtils.h" class SkiaInstance; // Used by SkDebugf SkiaInstance* gPluginInstance; // Main entry point for the app we're linked into extern int tool_main(int, char**); // Tokenize a command line and store it in argc and argv. void SkStringToProgramArgs(const SkString commandLine, int* argc, char*** argv) { int numBreaks = 0; const char* commandChars = commandLine.c_str(); for (size_t i = 0; i < strlen(commandChars); i++) { if (isspace(commandChars[i])) { numBreaks++; } } int numArgs; if (strlen(commandChars) > 0) { numArgs = numBreaks + 1; } else { numArgs = 0; } *argc = numArgs; *argv = new char*[numArgs + 1]; (*argv)[numArgs] = NULL; char* start = (char*) commandChars; int length = 0; int argIndex = 0; for (size_t i = 0; i < strlen(commandChars) + 1; i++) { if (isspace(commandChars[i]) || '\0' == commandChars[i]) { if (length > 0) { char* argument = new char[length + 1]; memcpy(argument, start, length); argument[length] = '\0'; (*argv)[argIndex++] = argument; } start = (char*) commandChars + i + 1; length = 0; } else { length++; } } } // Run the program with the given command line. void RunProgram(const SkString& commandLine) { int argc; char** argv; SkStringToProgramArgs(commandLine, &argc, &argv); tool_main(argc, argv); } // Skia's subclass of pp::Instance, our interface with the browser. class SkiaInstance : public pp::Instance { public: explicit SkiaInstance(PP_Instance instance) : pp::Instance(instance) { gPluginInstance = this; } virtual ~SkiaInstance() { gPluginInstance = NULL; } virtual void HandleMessage(const pp::Var& var_message) { // Receive a message from javascript. if (var_message.is_string()) { SkString msg(var_message.AsString().c_str()); if (msg.startsWith("init")) { RunProgram(msg); } } } }; class SkiaModule : public pp::Module { public: SkiaModule() : pp::Module() {} virtual ~SkiaModule() {} virtual pp::Instance* CreateInstance(PP_Instance instance) { return new SkiaInstance(instance); } }; namespace pp { Module* CreateModule() { return new SkiaModule(); } } // namespace pp