1*c8dee2aaSAndroid Build Coastguard Worker 2*c8dee2aaSAndroid Build Coastguard Workerfunction LinearCanvasGradient(x1, y1, x2, y2) { 3*c8dee2aaSAndroid Build Coastguard Worker this._shader = null; 4*c8dee2aaSAndroid Build Coastguard Worker this._colors = []; 5*c8dee2aaSAndroid Build Coastguard Worker this._pos = []; 6*c8dee2aaSAndroid Build Coastguard Worker 7*c8dee2aaSAndroid Build Coastguard Worker this.addColorStop = function(offset, color) { 8*c8dee2aaSAndroid Build Coastguard Worker if (offset < 0 || offset > 1 || !isFinite(offset)) { 9*c8dee2aaSAndroid Build Coastguard Worker throw 'offset must be between 0 and 1 inclusively'; 10*c8dee2aaSAndroid Build Coastguard Worker } 11*c8dee2aaSAndroid Build Coastguard Worker 12*c8dee2aaSAndroid Build Coastguard Worker color = parseColor(color); 13*c8dee2aaSAndroid Build Coastguard Worker // From the spec: If multiple stops are added at the same offset on a 14*c8dee2aaSAndroid Build Coastguard Worker // gradient, then they must be placed in the order added, with the first 15*c8dee2aaSAndroid Build Coastguard Worker // one closest to the start of the gradient, and each subsequent one 16*c8dee2aaSAndroid Build Coastguard Worker // infinitesimally further along towards the end point (in effect 17*c8dee2aaSAndroid Build Coastguard Worker // causing all but the first and last stop added at each point to be 18*c8dee2aaSAndroid Build Coastguard Worker // ignored). 19*c8dee2aaSAndroid Build Coastguard Worker // To implement that, if an offset is already in the list, 20*c8dee2aaSAndroid Build Coastguard Worker // we just overwrite its color (since the user can't remove Color stops 21*c8dee2aaSAndroid Build Coastguard Worker // after the fact). 22*c8dee2aaSAndroid Build Coastguard Worker var idx = this._pos.indexOf(offset); 23*c8dee2aaSAndroid Build Coastguard Worker if (idx !== -1) { 24*c8dee2aaSAndroid Build Coastguard Worker this._colors[idx] = color; 25*c8dee2aaSAndroid Build Coastguard Worker } else { 26*c8dee2aaSAndroid Build Coastguard Worker // insert it in sorted order 27*c8dee2aaSAndroid Build Coastguard Worker for (idx = 0; idx < this._pos.length; idx++) { 28*c8dee2aaSAndroid Build Coastguard Worker if (this._pos[idx] > offset) { 29*c8dee2aaSAndroid Build Coastguard Worker break; 30*c8dee2aaSAndroid Build Coastguard Worker } 31*c8dee2aaSAndroid Build Coastguard Worker } 32*c8dee2aaSAndroid Build Coastguard Worker this._pos .splice(idx, 0, offset); 33*c8dee2aaSAndroid Build Coastguard Worker this._colors.splice(idx, 0, color); 34*c8dee2aaSAndroid Build Coastguard Worker } 35*c8dee2aaSAndroid Build Coastguard Worker } 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker this._copy = function() { 38*c8dee2aaSAndroid Build Coastguard Worker var lcg = new LinearCanvasGradient(x1, y1, x2, y2); 39*c8dee2aaSAndroid Build Coastguard Worker lcg._colors = this._colors.slice(); 40*c8dee2aaSAndroid Build Coastguard Worker lcg._pos = this._pos.slice(); 41*c8dee2aaSAndroid Build Coastguard Worker return lcg; 42*c8dee2aaSAndroid Build Coastguard Worker } 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker this._dispose = function() { 45*c8dee2aaSAndroid Build Coastguard Worker if (this._shader) { 46*c8dee2aaSAndroid Build Coastguard Worker this._shader.delete(); 47*c8dee2aaSAndroid Build Coastguard Worker this._shader = null; 48*c8dee2aaSAndroid Build Coastguard Worker } 49*c8dee2aaSAndroid Build Coastguard Worker } 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker this._getShader = function(currentTransform) { 52*c8dee2aaSAndroid Build Coastguard Worker // From the spec: "The points in the linear gradient must be transformed 53*c8dee2aaSAndroid Build Coastguard Worker // as described by the current transformation matrix when rendering." 54*c8dee2aaSAndroid Build Coastguard Worker var pts = [x1, y1, x2, y2]; 55*c8dee2aaSAndroid Build Coastguard Worker CanvasKit.Matrix.mapPoints(currentTransform, pts); 56*c8dee2aaSAndroid Build Coastguard Worker var sx1 = pts[0]; 57*c8dee2aaSAndroid Build Coastguard Worker var sy1 = pts[1]; 58*c8dee2aaSAndroid Build Coastguard Worker var sx2 = pts[2]; 59*c8dee2aaSAndroid Build Coastguard Worker var sy2 = pts[3]; 60*c8dee2aaSAndroid Build Coastguard Worker 61*c8dee2aaSAndroid Build Coastguard Worker this._dispose(); 62*c8dee2aaSAndroid Build Coastguard Worker this._shader = CanvasKit.Shader.MakeLinearGradient([sx1, sy1], [sx2, sy2], 63*c8dee2aaSAndroid Build Coastguard Worker this._colors, this._pos, CanvasKit.TileMode.Clamp); 64*c8dee2aaSAndroid Build Coastguard Worker return this._shader; 65*c8dee2aaSAndroid Build Coastguard Worker } 66*c8dee2aaSAndroid Build Coastguard Worker} 67