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 |