docs: function() {
  			var c = this.canvas;
  
  			var radius = this.r;
  			var x = this.size / 2;
  
  			var stopIndex = 0; // The index of the current color
  			var stop = this.stops[stopIndex], prevStop;
  
  			var diff, t, sameColor;
  
  			c.rotate(-90, this.size / 2, this.size / 2);
  
  			for (var i = 0; i < 360; i += 0.5) {
  				if (i / 360 + ε >= stop.pos) {
  					// Switch color stop
  					do {
  						prevStop = stop;
  
  						stopIndex++;
  						stop = this.stops[stopIndex];
  					} while (
  						stop && stop !== prevStop && stop.pos === prevStop.pos
  					);
  
  					if (!stop) {
  						break;
  					}
  
  					sameColor =
  						prevStop.color + '' === stop.color + '' &&
  						prevStop !== stop;
  
  					diff = prevStop.color.map(function(c, i){
  						return stop.color[i] - c;
  					});
  				}
  
  				t = (i / 360 - prevStop.pos) / (stop.pos - prevStop.pos);
  
  				var interpolated = sameColor ?
  					stop.color :
  					diff.map(function (d, i){
  						var ret = d * t + prevStop.color[i];
  
  						return i < 3 ? ret & 255 : ret;
  					});
  
  				var path = new _.CanvasKit.SkPath();
  
  				path.moveTo(x, x);
  
  				var angle = Math.min(360 * deg, i * deg);
  				var θ;
  
  				if (sameColor) {
  					θ = 360 * (stop.pos - prevStop.pos);
  
  					i += θ - 0.5;
  				}
  				else {
  					θ = 0.5;
  				}
  
  				var endAngle = angle + θ * deg;
  
  				endAngle = Math.min(360 * deg, endAngle);
  
  				// 0.02: To prevent moire
  
  				var arc = endAngle - angle;
  
  				path.arc(
  					x, x,
  					radius,
  					arc >= 2 * deg ? angle : angle - 0.02, endAngle
  				);
  
  				var paint = new _.CanvasKit.SkPaint();
  				paint.setStyle(_.CanvasKit.PaintStyle.Fill);
  				paint.setColor(_.CanvasKit.Color(...interpolated, 1.0));
  
  				c.drawPath(path, paint);
  				
  				this.surface.flush();
  
  				path.delete();
  				paint.delete();
  			}
  		}