1cb93a386Sopenharmony_ciCanvasKit.MakeCanvas = function(width, height) {
2cb93a386Sopenharmony_ci  var surf = CanvasKit.MakeSurface(width, height);
3cb93a386Sopenharmony_ci  if (surf) {
4cb93a386Sopenharmony_ci    return new HTMLCanvas(surf);
5cb93a386Sopenharmony_ci  }
6cb93a386Sopenharmony_ci  return null;
7cb93a386Sopenharmony_ci};
8cb93a386Sopenharmony_ci
9cb93a386Sopenharmony_cifunction HTMLCanvas(skSurface) {
10cb93a386Sopenharmony_ci  this._surface = skSurface;
11cb93a386Sopenharmony_ci  this._context = new CanvasRenderingContext2D(skSurface.getCanvas());
12cb93a386Sopenharmony_ci  this._toCleanup = [];
13cb93a386Sopenharmony_ci
14cb93a386Sopenharmony_ci  // Data is either an ArrayBuffer, a TypedArray, or a Node Buffer
15cb93a386Sopenharmony_ci  this.decodeImage = function(data) {
16cb93a386Sopenharmony_ci    var img = CanvasKit.MakeImageFromEncoded(data);
17cb93a386Sopenharmony_ci    if (!img) {
18cb93a386Sopenharmony_ci      throw 'Invalid input';
19cb93a386Sopenharmony_ci    }
20cb93a386Sopenharmony_ci    this._toCleanup.push(img);
21cb93a386Sopenharmony_ci    return img;
22cb93a386Sopenharmony_ci  };
23cb93a386Sopenharmony_ci
24cb93a386Sopenharmony_ci  this.loadFont = function(buffer, descriptors) {
25cb93a386Sopenharmony_ci    var newFont = CanvasKit.Typeface.MakeFreeTypeFaceFromData(buffer);
26cb93a386Sopenharmony_ci    if (!newFont) {
27cb93a386Sopenharmony_ci      Debug('font could not be processed', descriptors);
28cb93a386Sopenharmony_ci      return null;
29cb93a386Sopenharmony_ci    }
30cb93a386Sopenharmony_ci    this._toCleanup.push(newFont);
31cb93a386Sopenharmony_ci    addToFontCache(newFont, descriptors);
32cb93a386Sopenharmony_ci  };
33cb93a386Sopenharmony_ci
34cb93a386Sopenharmony_ci  this.makePath2D = function(path) {
35cb93a386Sopenharmony_ci    var p2d = new Path2D(path);
36cb93a386Sopenharmony_ci    this._toCleanup.push(p2d._getPath());
37cb93a386Sopenharmony_ci    return p2d;
38cb93a386Sopenharmony_ci  };
39cb93a386Sopenharmony_ci
40cb93a386Sopenharmony_ci  // A normal <canvas> requires that clients call getContext
41cb93a386Sopenharmony_ci  this.getContext = function(type) {
42cb93a386Sopenharmony_ci    if (type === '2d') {
43cb93a386Sopenharmony_ci      return this._context;
44cb93a386Sopenharmony_ci    }
45cb93a386Sopenharmony_ci    return null;
46cb93a386Sopenharmony_ci  };
47cb93a386Sopenharmony_ci
48cb93a386Sopenharmony_ci  this.toDataURL = function(codec, quality) {
49cb93a386Sopenharmony_ci    // TODO(kjlubick): maybe support other codecs (webp?)
50cb93a386Sopenharmony_ci    // For now, just to png and jpeg
51cb93a386Sopenharmony_ci    this._surface.flush();
52cb93a386Sopenharmony_ci
53cb93a386Sopenharmony_ci    var img = this._surface.makeImageSnapshot();
54cb93a386Sopenharmony_ci    if (!img) {
55cb93a386Sopenharmony_ci      Debug('no snapshot');
56cb93a386Sopenharmony_ci      return;
57cb93a386Sopenharmony_ci    }
58cb93a386Sopenharmony_ci    codec = codec || 'image/png';
59cb93a386Sopenharmony_ci    var format = CanvasKit.ImageFormat.PNG;
60cb93a386Sopenharmony_ci    if (codec === 'image/jpeg') {
61cb93a386Sopenharmony_ci      format = CanvasKit.ImageFormat.JPEG;
62cb93a386Sopenharmony_ci    }
63cb93a386Sopenharmony_ci    quality = quality || 0.92;
64cb93a386Sopenharmony_ci    var imgBytes = img.encodeToBytes(format, quality);
65cb93a386Sopenharmony_ci    if (!imgBytes) {
66cb93a386Sopenharmony_ci      Debug('encoding failure');
67cb93a386Sopenharmony_ci      return
68cb93a386Sopenharmony_ci    }
69cb93a386Sopenharmony_ci    img.delete();
70cb93a386Sopenharmony_ci    return 'data:' + codec + ';base64,' + toBase64String(imgBytes);
71cb93a386Sopenharmony_ci  };
72cb93a386Sopenharmony_ci
73cb93a386Sopenharmony_ci  this.dispose = function() {
74cb93a386Sopenharmony_ci    this._context._dispose();
75cb93a386Sopenharmony_ci    this._toCleanup.forEach(function(i) {
76cb93a386Sopenharmony_ci      i.delete();
77cb93a386Sopenharmony_ci    });
78cb93a386Sopenharmony_ci    this._surface.dispose();
79cb93a386Sopenharmony_ci  }
80cb93a386Sopenharmony_ci}
81