冲洗pp :: Graphics2D时,“NativeClient:NaCl模块崩溃”

时间:2015-11-14 23:02:08

标签: c++ 2d google-nativeclient

我正在尝试熟悉Graphics2D for NaCl,但是当我尝试绘制并刷新Graphics2D实例时,我收到错误“NativeClient:NaCl模块崩溃”。

以下是我对console.log的调用输出:

View did change
Making graphics context
Drawing
Making blank image data
PaintAndFlush
Flush
I am on main thread
NativeClient: NaCl module crashed

这是我的index.html:https://jsfiddle.net/3c1y4wp9/

这是我的c ++代码:

#include <deque>

#include "ppapi/cpp/instance.h"
#include "ppapi/cpp/module.h"
#include "ppapi/cpp/var.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 "ppapi/cpp/var_array.h"
#include "ppapi/utility/completion_callback_factory.h"

namespace {
  const uint32_t kBlue = 0xff4040ffu;
  const uint32_t kBlack = 0xff000000u;
}

class GravitySimInstance : public pp::Instance {
 public:
  explicit GravitySimInstance(PP_Instance instance) : pp::Instance(instance)
  {}
  virtual ~GravitySimInstance() {}

 private:
  virtual void HandleMessage(const pp::Var& var_message) {
  }

  void PaintAndFlush(pp::ImageData* image_data) {
    PostMessage("PaintAndFlush");
    assert(!flushing_);
    graphics_2d_context_.ReplaceContents(image_data);
    PostMessage("Flush");
    if (pp::Module::Get()->core()->IsMainThread()) {
      PostMessage("I am on main thread");
    } else {
      PostMessage("I am NOT on main thread");
    }
    graphics_2d_context_.Flush(
        callback_factory_.NewCallback(&GravitySimInstance::DidFlush));
    flushing_ = true;
  }

  void DidFlush(int32_t error_code) {
    PostMessage("DidFlush");
    flushing_ = false;
  }

  virtual void DidChangeView(const pp::View& view) {
    PostMessage("View did change");
    if (size_ != view.GetRect().size()) {
      size_ = view.GetRect().size();
      const bool is_always_opaque = true;
      PostMessage("Making graphics context");
      graphics_2d_context_ = pp::Graphics2D(this, view.GetRect().size(),
                                            is_always_opaque);
      BindGraphics(graphics_2d_context_);
      Draw();
    }
  }
  void Draw() {
    PostMessage("Drawing");
    pp::ImageData image_data = MakeBlankImageData(size_);
    PaintAndFlush(&image_data);
  }

  pp::ImageData MakeBlankImageData(const pp::Size& size) {
    PostMessage("Making blank image data");
    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;
  }

  pp::Graphics2D graphics_2d_context_;
  pp::CompletionCallbackFactory<GravitySimInstance> callback_factory_;

  /// 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_[10];
};

class GravitySimModule : public pp::Module {
 public:
  GravitySimModule() : pp::Module() {}
  virtual ~GravitySimModule() {}

  virtual pp::Instance* CreateInstance(PP_Instance instance) {
    return new GravitySimInstance(instance);
  }
};

namespace pp {
Module* CreateModule() {
  return new GravitySimModule();
}
}  // namespace pp

2 个答案:

答案 0 :(得分:0)

除了初始化图像缓冲区之外,没有什么看起来很明显错误。在处理图像数据时,您需要考虑步幅。但是,它看起来并不像是在写出界限。您是否尝试将init_to_zero设为true并按原样使用ImageData来查看它是否仍然崩溃?

答案 1 :(得分:0)

尝试仅在主线程中调用Flush函数。如果你想从工作线程中调用这些函数(应该在主线程中调用),请通过pp::Core::CallOnMainThread函数调用它们。