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