• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1function CanvasPattern(image, repetition) {
2  this._shader = null;
3  // image should be an SkImage returned from HTMLCanvas.decodeImage()
4  this._image = image;
5  this._transform = CanvasKit.SkMatrix.identity();
6
7  if (repetition === '') {
8    repetition = 'repeat';
9  }
10  switch(repetition) {
11    case 'repeat-x':
12      this._tileX = CanvasKit.TileMode.Repeat;
13      // Skia's 'clamp' mode repeats the last row/column
14      // which looks very very strange.
15      // Decal mode does just transparent copying, which
16      // is exactly what the spec wants.
17      this._tileY = CanvasKit.TileMode.Decal;
18      break;
19    case 'repeat-y':
20      this._tileX = CanvasKit.TileMode.Decal;
21      this._tileY = CanvasKit.TileMode.Repeat;
22      break;
23    case 'repeat':
24      this._tileX = CanvasKit.TileMode.Repeat;
25      this._tileY = CanvasKit.TileMode.Repeat;
26      break;
27    case 'no-repeat':
28      this._tileX = CanvasKit.TileMode.Decal;
29      this._tileY = CanvasKit.TileMode.Decal;
30      break;
31    default:
32      throw 'invalid repetition mode ' + repetition;
33  }
34
35  // Takes a DOMMatrix like object. e.g. the identity would be:
36  // {a:1, b: 0, c: 0, d: 1, e: 0, f: 0}
37  // @param {DOMMatrix} m
38  this.setTransform = function(m) {
39    var t = [m.a, m.c, m.e,
40             m.b, m.d, m.f,
41               0,   0,   1];
42    if (allAreFinite(t)) {
43      this._transform = t;
44    }
45  }
46
47  this._copy = function() {
48    var cp = new CanvasPattern()
49    cp._tileX = this._tileX;
50    cp._tileY = this._tileY;
51    return cp;
52  }
53
54  this._dispose = function() {
55    if (this._shader) {
56      this._shader.delete();
57      this._shader = null;
58    }
59  }
60
61  this._getShader = function(currentTransform) {
62    // Ignore currentTransform since it will be applied later
63    this._dispose();
64    this._shader = this._image.makeShader(this._tileX, this._tileY, this._transform);
65    return this._shader;
66  }
67
68}