Turn audio into a shareable video. forked from nypublicradio/audiogram

CanvasPattern.cc 1.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. //
  2. // Pattern.cc
  3. //
  4. // Copyright (c) 2010 LearnBoost <tj@learnboost.com>
  5. //
  6. #include "Canvas.h"
  7. #include "Image.h"
  8. #include "CanvasPattern.h"
  9. Nan::Persistent<FunctionTemplate> Pattern::constructor;
  10. /*
  11. * Initialize CanvasPattern.
  12. */
  13. void
  14. Pattern::Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) {
  15. Nan::HandleScope scope;
  16. // Constructor
  17. Local<FunctionTemplate> ctor = Nan::New<FunctionTemplate>(Pattern::New);
  18. constructor.Reset(ctor);
  19. ctor->InstanceTemplate()->SetInternalFieldCount(1);
  20. ctor->SetClassName(Nan::New("CanvasPattern").ToLocalChecked());
  21. ctor->InstanceTemplate()->SetInternalFieldCount(1);
  22. ctor->SetClassName(Nan::New("CanvasPattern").ToLocalChecked());
  23. // Prototype
  24. Nan::Set(target, Nan::New("CanvasPattern").ToLocalChecked(), ctor->GetFunction());
  25. }
  26. /*
  27. * Initialize a new CanvasPattern.
  28. */
  29. NAN_METHOD(Pattern::New) {
  30. if (!info.IsConstructCall()) {
  31. return Nan::ThrowTypeError("Class constructors cannot be invoked without 'new'");
  32. }
  33. cairo_surface_t *surface;
  34. Local<Object> obj = info[0]->ToObject();
  35. // Image
  36. if (Nan::New(Image::constructor)->HasInstance(obj)) {
  37. Image *img = Nan::ObjectWrap::Unwrap<Image>(obj);
  38. if (!img->isComplete()) {
  39. return Nan::ThrowError("Image given has not completed loading");
  40. }
  41. surface = img->surface();
  42. // Canvas
  43. } else if (Nan::New(Canvas::constructor)->HasInstance(obj)) {
  44. Canvas *canvas = Nan::ObjectWrap::Unwrap<Canvas>(obj);
  45. surface = canvas->surface();
  46. // Invalid
  47. } else {
  48. return Nan::ThrowTypeError("Image or Canvas expected");
  49. }
  50. Pattern *pattern = new Pattern(surface);
  51. pattern->Wrap(info.This());
  52. info.GetReturnValue().Set(info.This());
  53. }
  54. /*
  55. * Initialize linear gradient.
  56. */
  57. Pattern::Pattern(cairo_surface_t *surface) {
  58. _pattern = cairo_pattern_create_for_surface(surface);
  59. }
  60. /*
  61. * Destroy the pattern.
  62. */
  63. Pattern::~Pattern() {
  64. cairo_pattern_destroy(_pattern);
  65. }