| 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/point.h" | |
| 15 #include "ppapi/cpp/rect.h" | |
| 16 #include "ppapi/cpp/var.h" | |
| 17 | |
| 18 #include "SkBitmap.h" | |
| 19 #include "SkCanvas.h" | |
| 20 #include "SkColor.h" | |
| 21 #include "SkGraphics.h" | |
| 22 #include "SkStream.h" | |
| 23 #include "SkString.h" | |
| 24 | |
| 25 class SkiaInstance; | |
| 26 | |
| 27 // Used by SkDebugf | |
| 28 SkiaInstance* gPluginInstance; | |
| 29 | |
| 30 void FlushCallback(void* data, int32_t result); | |
| 31 | |
| 32 static void doDraw(SkCanvas* canvas, const SkPaint& paint, const char text[]) { | |
| 33 canvas->drawColor(SK_ColorWHITE); | |
| 34 SkPaint red; | |
| 35 red.setColor(SK_ColorRED); | |
| 36 canvas->drawCircle(150.0, 150.0, 100.0, red); | |
| 37 SkRect bounds; | |
| 38 canvas->getClipBounds(&bounds); | |
| 39 canvas->drawText(text, strlen(text), | |
| 40 bounds.centerX(), bounds.centerY(), | |
| 41 paint); | |
| 42 } | |
| 43 | |
| 44 // Skia's subclass of pp::Instance, our interface with the browser. | |
| 45 class SkiaInstance : public pp::Instance { | |
| 46 public: | |
| 47 explicit SkiaInstance(PP_Instance instance) | |
| 48 : pp::Instance(instance) | |
| 49 , fCanvas(NULL) | |
| 50 , fFlushLoopRunning(false) | |
| 51 , fFlushPending(false) | |
| 52 { | |
| 53 gPluginInstance = this; | |
| 54 SkGraphics::Init(); | |
| 55 } | |
| 56 | |
| 57 virtual ~SkiaInstance() { | |
| 58 SkGraphics::Term(); | |
| 59 gPluginInstance = NULL; | |
| 60 } | |
| 61 | |
| 62 virtual void HandleMessage(const pp::Var& var_message) { | |
| 63 // Receive a message from javascript. | |
| 64 } | |
| 65 | |
| 66 void Paint() { | |
| 67 if (!fImage.is_null()) { | |
| 68 SkPaint paint; | |
| 69 paint.setAntiAlias(true); | |
| 70 paint.setTextSize(SkIntToScalar(30)); | |
| 71 paint.setTextAlign(SkPaint::kCenter_Align); | |
| 72 doDraw(fCanvas, paint, "Hello"); | |
| 73 | |
| 74 fDeviceContext.PaintImageData(fImage, pp::Point(0, 0)); | |
| 75 if (!fFlushPending) { | |
| 76 fFlushPending = true; | |
| 77 fDeviceContext.Flush(pp::CompletionCallback(&FlushCallback, this
)); | |
| 78 } else { | |
| 79 SkDebugf("A flush is pending... Skipping flush.\n"); | |
| 80 } | |
| 81 } else { | |
| 82 SkDebugf("No pixels to write to!\n"); | |
| 83 } | |
| 84 } | |
| 85 | |
| 86 virtual void DidChangeView(const pp::Rect& position, const pp::Rect& clip) { | |
| 87 if (position.size().width() == fWidth && | |
| 88 position.size().height() == fHeight) { | |
| 89 return; // We don't care about the position, only the size. | |
| 90 } | |
| 91 fWidth = position.size().width(); | |
| 92 fHeight = position.size().height(); | |
| 93 fDeviceContext = pp::Graphics2D(this, pp::Size(fWidth, fHeight), false); | |
| 94 if (!BindGraphics(fDeviceContext)) { | |
| 95 SkDebugf("Couldn't bind the device context\n"); | |
| 96 return; | |
| 97 } | |
| 98 fImage = pp::ImageData(this, | |
| 99 PP_IMAGEDATAFORMAT_BGRA_PREMUL, | |
| 100 pp::Size(fWidth, fHeight), false); | |
| 101 fBitmap.setConfig(SkBitmap::kARGB_8888_Config, fWidth, fHeight); | |
| 102 fBitmap.setPixels(fImage.data()); | |
| 103 if (fCanvas) { | |
| 104 delete fCanvas; | |
| 105 } | |
| 106 fCanvas = new SkCanvas(fBitmap); | |
| 107 fCanvas->clear(SK_ColorWHITE); | |
| 108 if (!fFlushLoopRunning) { | |
| 109 Paint(); | |
| 110 } | |
| 111 } | |
| 112 | |
| 113 void OnFlush() { | |
| 114 fFlushLoopRunning = true; | |
| 115 fFlushPending = false; | |
| 116 Paint(); | |
| 117 } | |
| 118 | |
| 119 private: | |
| 120 pp::Graphics2D fDeviceContext; | |
| 121 pp::ImageData fImage; | |
| 122 int fWidth; | |
| 123 int fHeight; | |
| 124 | |
| 125 SkBitmap fBitmap; | |
| 126 SkCanvas* fCanvas; | |
| 127 | |
| 128 bool fFlushLoopRunning; | |
| 129 bool fFlushPending; | |
| 130 }; | |
| 131 | |
| 132 void FlushCallback(void* data, int32_t result) { | |
| 133 static_cast<SkiaInstance*>(data)->OnFlush(); | |
| 134 } | |
| 135 | |
| 136 class SkiaModule : public pp::Module { | |
| 137 public: | |
| 138 SkiaModule() : pp::Module() {} | |
| 139 virtual ~SkiaModule() {} | |
| 140 | |
| 141 virtual pp::Instance* CreateInstance(PP_Instance instance) { | |
| 142 return new SkiaInstance(instance); | |
| 143 } | |
| 144 }; | |
| 145 | |
| 146 namespace pp { | |
| 147 Module* CreateModule() { | |
| 148 return new SkiaModule(); | |
| 149 } | |
| 150 } // namespace pp | |
| OLD | NEW |