Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Unified Diff: native_client_sdk/src/examples/api/var_array_buffer/file_histogram.cc

Issue 14607005: [NaCl SDK] Cleanup examples. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: feedback Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: native_client_sdk/src/examples/api/var_array_buffer/file_histogram.cc
diff --git a/native_client_sdk/src/examples/api/var_array_buffer/file_histogram.cc b/native_client_sdk/src/examples/api/var_array_buffer/file_histogram.cc
deleted file mode 100644
index ce293e9294fbf2bf0842d7c4e8396c96c8a98dce..0000000000000000000000000000000000000000
--- a/native_client_sdk/src/examples/api/var_array_buffer/file_histogram.cc
+++ /dev/null
@@ -1,230 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/// @file file_histogram.cc
-/// This example demonstrates loading, running and scripting a very simple NaCl
-/// module. To load the NaCl module, the browser first looks for the
-/// CreateModule() factory method (at the end of this file). It calls
-/// CreateModule() once to load the module code from your .nexe. After the
-/// .nexe code is loaded, CreateModule() is not called again.
-///
-/// Once the .nexe code is loaded, the browser than calls the CreateInstance()
-/// method on the object returned by CreateModule(). It calls CreateInstance()
-/// each time it encounters an <embed> tag that references your NaCl module.
-///
-/// The browser can talk to your NaCl module via the postMessage() Javascript
-/// function. When you call postMessage() on your NaCl module from the browser,
-/// this becomes a call to the HandleMessage() method of your pp::Instance
-/// subclass. You can send messages back to the browser by calling the
-/// PostMessage() method on your pp::Instance. Note that these two methods
-/// (postMessage() in Javascript and PostMessage() in C++) are asynchronous.
-/// This means they return immediately - there is no waiting for the message
-/// to be handled. This has implications in your program design, particularly
-/// when mutating property values that are exposed to both the browser and the
-/// NaCl module.
-
-#include <algorithm>
-#include <deque>
-#include <string>
-
-#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 "ppapi/cpp/var_array_buffer.h"
-#include "ppapi/utility/completion_callback_factory.h"
-
-#ifdef WIN32
-#undef min
-#undef max
-#undef PostMessage
-
-// Allow 'this' in initializer list
-#pragma warning(disable : 4355)
-// Disable warning about behaviour of array initialization.
-#pragma warning(disable : 4351)
-#endif
-
-namespace {
-
-const uint32_t kBlue = 0xff4040ffu;
-const uint32_t kBlack = 0xff000000u;
-const size_t kHistogramSize = 256u;
-
-} // namespace
-
-/// The Instance class. One of these exists for each instance of your NaCl
-/// module on the web page. The browser will ask the Module object to create
-/// a new Instance for each occurrence of the <embed> tag that has these
-/// attributes:
-/// type="application/x-nacl"
-/// src="file_histogram.nmf"
-class FileHistogramInstance : public pp::Instance {
- public:
- /// The constructor creates the plugin-side instance.
- /// @param[in] instance the handle to the browser-side plugin instance.
- explicit FileHistogramInstance(PP_Instance instance)
- : pp::Instance(instance),
- callback_factory_(this),
- flushing_(false),
- histogram_() {}
- virtual ~FileHistogramInstance() {}
-
- private:
- /// Handler for messages coming in from the browser via postMessage(). The
- /// @a var_message can contain anything: a JSON string; a string that encodes
- /// method names and arguments; etc.
- ///
- /// In this case, we only handle <code>pp::VarArrayBuffer</code>s. When we
- /// receive one, we compute and display a histogram based on its contents.
- ///
- /// @param[in] var_message The message posted by the browser.
- virtual void HandleMessage(const pp::Var& var_message) {
- if (var_message.is_array_buffer()) {
- pp::VarArrayBuffer buffer(var_message);
- ComputeHistogram(buffer);
- DrawHistogram();
- }
- }
-
- /// Create and return a blank (all-black) <code>pp::ImageData</code> of the
- /// given <code>size</code>.
- pp::ImageData MakeBlankImageData(const pp::Size& size) {
- const bool init_to_zero = false;
- pp::ImageData image_data =
- pp::ImageData(this, PP_IMAGEDATAFORMAT_BGRA_PREMUL, size, init_to_zero);
- uint32_t* image_buffer = static_cast<uint32_t*>(image_data.data());
- for (int i = 0; i < size.GetArea(); ++i)
- image_buffer[i] = kBlack;
- return image_data;
- }
-
- /// Draw a bar of the appropriate height based on <code>value</code> at
- /// <code>column</code> in <code>image_data</code>. <code>value</code> must be
- /// in the range [0, 1].
- void DrawBar(uint32_t column, double value, pp::ImageData* image_data) {
- assert((value >= 0.0) && (value <= 1.0));
- uint32_t* image_buffer = static_cast<uint32_t*>(image_data->data());
- const uint32_t image_height = image_data->size().height();
- const uint32_t image_width = image_data->size().width();
- assert(column < image_width);
- int bar_height = static_cast<int>(value * image_height);
- for (int i = 0; i < bar_height; ++i) {
- uint32_t row = image_height - 1 - i;
- image_buffer[row * image_width + column] = kBlue;
- }
- }
-
- void PaintAndFlush(pp::ImageData* image_data) {
- assert(!flushing_);
- graphics_2d_context_.ReplaceContents(image_data);
- graphics_2d_context_.Flush(
- callback_factory_.NewCallback(&FileHistogramInstance::DidFlush));
- flushing_ = true;
- }
-
- /// The callback that gets invoked when a flush completes. This is bound to a
- /// <code>CompletionCallback</code> and passed as a parameter to
- /// <code>Flush</code>.
- void DidFlush(int32_t error_code) {
- flushing_ = false;
- // If there are no images in the queue, we're done for now.
- if (paint_queue_.empty())
- return;
- // Otherwise, pop the next image off the queue and draw it.
- pp::ImageData image_data = paint_queue_.front();
- paint_queue_.pop_front();
- PaintAndFlush(&image_data);
- }
-
- virtual void DidChangeView(const pp::View& view) {
- if (size_ != view.GetRect().size()) {
- size_ = view.GetRect().size();
- const bool is_always_opaque = true;
- graphics_2d_context_ =
- pp::Graphics2D(this, view.GetRect().size(), is_always_opaque);
- BindGraphics(graphics_2d_context_);
- // The images in our queue are the wrong size, so we won't paint them.
- // We'll only draw the most recently computed histogram.
- paint_queue_.clear();
- DrawHistogram();
- }
- }
-
- /// Compute and normalize a histogram based on the given VarArrayBuffer.
- void ComputeHistogram(pp::VarArrayBuffer& buffer) {
- std::fill_n(histogram_, kHistogramSize, 0.0);
- uint32_t buffer_size = buffer.ByteLength();
- if (buffer_size == 0)
- return;
- uint8_t* buffer_data = static_cast<uint8_t*>(buffer.Map());
- for (uint32_t i = 0; i < buffer_size; ++i)
- histogram_[buffer_data[i]] += 1.0;
- // Normalize.
- double max = *std::max_element(histogram_, histogram_ + kHistogramSize);
- for (uint32_t i = 0; i < kHistogramSize; ++i)
- histogram_[i] /= max;
- }
-
- /// Draw the current histogram_ in to an pp::ImageData, then paint and flush
- /// that image. If we're already waiting on a flush, push it on to
- /// <code>paint_queue_</code> to paint later.
- void DrawHistogram() {
- pp::ImageData image_data = MakeBlankImageData(size_);
- for (int i = 0; i < std::min(static_cast<int>(kHistogramSize),
- image_data.size().width());
- ++i) {
- DrawBar(i, histogram_[i], &image_data);
- }
-
- if (!flushing_)
- PaintAndFlush(&image_data);
- else
- paint_queue_.push_back(image_data);
- }
-
- pp::Graphics2D graphics_2d_context_;
- pp::CompletionCallbackFactory<FileHistogramInstance> callback_factory_;
-
- /// A queue of images to paint. We must maintain a queue because we can not
- /// call pp::Graphics2D::Flush while a Flush is already pending.
- std::deque<pp::ImageData> paint_queue_;
-
- /// The size of our rectangle in the DOM, as of the last time DidChangeView
- /// was called.
- pp::Size size_;
-
- /// true iff we are flushing.
- bool flushing_;
-
- /// Stores the most recent histogram so that we can re-draw it if we get
- /// resized.
- double histogram_[kHistogramSize];
-};
-
-/// The Module class. The browser calls the CreateInstance() method to create
-/// an instance of your NaCl module on the web page. The browser creates a new
-/// instance for each <embed> tag with type="application/x-nacl".
-class FileHistogramModule : public pp::Module {
- public:
- FileHistogramModule() : pp::Module() {}
- virtual ~FileHistogramModule() {}
-
- /// Create and return a FileHistogramInstance object.
- /// @param[in] instance The browser-side instance.
- /// @return the plugin-side instance.
- virtual pp::Instance* CreateInstance(PP_Instance instance) {
- return new FileHistogramInstance(instance);
- }
-};
-
-namespace pp {
-/// Factory function called by the browser when the module is first loaded.
-/// The browser keeps a singleton of this module. It calls the
-/// CreateInstance() method on the object you return to make instances. There
-/// is one instance per <embed> tag on the page. This is the main binding
-/// point for your NaCl module with the browser.
-Module* CreateModule() { return new FileHistogramModule(); }
-} // namespace pp

Powered by Google App Engine
This is Rietveld 408576698