| OLD | NEW |
| (Empty) |
| 1 | |
| 2 /* | |
| 3 * Copyright 2013 Google Inc. | |
| 4 * | |
| 5 * Use of this source code is governed by a BSD-style license that can be | |
| 6 * found in the LICENSE file. | |
| 7 */ | |
| 8 | |
| 9 #include "ppapi/cpp/completion_callback.h" | |
| 10 #include "ppapi/cpp/graphics_2d.h" | |
| 11 #include "ppapi/cpp/image_data.h" | |
| 12 #include "ppapi/cpp/instance.h" | |
| 13 #include "ppapi/cpp/module.h" | |
| 14 #include "ppapi/cpp/var.h" | |
| 15 | |
| 16 #include "SkCanvas.h" | |
| 17 #include "SkBitmap.h" | |
| 18 #include "SkString.h" | |
| 19 #include "SkThreadUtils.h" | |
| 20 | |
| 21 class SkiaInstance; | |
| 22 | |
| 23 // Used by SkDebugf | |
| 24 SkiaInstance* gPluginInstance; | |
| 25 | |
| 26 // Main entry point for the app we're linked into | |
| 27 extern int test_main(); | |
| 28 | |
| 29 // Tokenize a command line and store it in argc and argv. | |
| 30 void SkStringToProgramArgs(const SkString commandLine, int* argc, char*** argv)
{ | |
| 31 int numBreaks = 0; | |
| 32 const char* commandChars = commandLine.c_str(); | |
| 33 for (size_t i = 0; i < strlen(commandChars); i++) { | |
| 34 if (isspace(commandChars[i])) { | |
| 35 numBreaks++; | |
| 36 } | |
| 37 } | |
| 38 int numArgs; | |
| 39 if (strlen(commandChars) > 0) { | |
| 40 numArgs = numBreaks + 1; | |
| 41 } else { | |
| 42 numArgs = 0; | |
| 43 } | |
| 44 *argc = numArgs; | |
| 45 *argv = new char*[numArgs + 1]; | |
| 46 (*argv)[numArgs] = NULL; | |
| 47 char* start = (char*) commandChars; | |
| 48 int length = 0; | |
| 49 int argIndex = 0; | |
| 50 for (size_t i = 0; i < strlen(commandChars) + 1; i++) { | |
| 51 if (isspace(commandChars[i]) || '\0' == commandChars[i]) { | |
| 52 if (length > 0) { | |
| 53 char* argument = new char[length + 1]; | |
| 54 memcpy(argument, start, length); | |
| 55 argument[length] = '\0'; | |
| 56 (*argv)[argIndex++] = argument; | |
| 57 } | |
| 58 start = (char*) commandChars + i + 1; | |
| 59 length = 0; | |
| 60 } else { | |
| 61 length++; | |
| 62 } | |
| 63 } | |
| 64 } | |
| 65 | |
| 66 // Run the program with the given command line. | |
| 67 void RunProgram(const SkString& commandLine) { | |
| 68 int argc; | |
| 69 char** argv; | |
| 70 SkStringToProgramArgs(commandLine, &argc, &argv); | |
| 71 test_main(); | |
| 72 } | |
| 73 | |
| 74 | |
| 75 // Skia's subclass of pp::Instance, our interface with the browser. | |
| 76 class SkiaInstance : public pp::Instance { | |
| 77 public: | |
| 78 explicit SkiaInstance(PP_Instance instance) : pp::Instance(instance) { | |
| 79 gPluginInstance = this; | |
| 80 } | |
| 81 | |
| 82 virtual ~SkiaInstance() { | |
| 83 gPluginInstance = NULL; | |
| 84 } | |
| 85 | |
| 86 virtual void HandleMessage(const pp::Var& var_message) { | |
| 87 // Receive a message from javascript. | |
| 88 if (var_message.is_string()) { | |
| 89 SkString msg(var_message.AsString().c_str()); | |
| 90 if (msg.startsWith("init")) { | |
| 91 RunProgram(msg); | |
| 92 } | |
| 93 } | |
| 94 } | |
| 95 }; | |
| 96 | |
| 97 class SkiaModule : public pp::Module { | |
| 98 public: | |
| 99 SkiaModule() : pp::Module() {} | |
| 100 virtual ~SkiaModule() {} | |
| 101 | |
| 102 virtual pp::Instance* CreateInstance(PP_Instance instance) { | |
| 103 return new SkiaInstance(instance); | |
| 104 } | |
| 105 }; | |
| 106 | |
| 107 namespace pp { | |
| 108 Module* CreateModule() { | |
| 109 return new SkiaModule(); | |
| 110 } | |
| 111 } // namespace pp | |
| OLD | NEW |