|
(function (window) { |
|
'use strict'; |
|
|
|
try { |
|
var pixelRatio = window.devicePixelRatio || 1; |
|
var offset = 12 * pixelRatio; |
|
var node = document.createElement('canvas'); |
|
var ctx1; |
|
var ctx2; |
|
var imageData; |
|
var data1; |
|
var isEqual; |
|
var getImageData = function(ctx){ |
|
return ctx.getImageData(0, 0, node.width, node.height); |
|
}; |
|
|
|
node.width = 100; |
|
node.height = 100; |
|
|
|
/** |
|
* @see https://github.com/Modernizr/Modernizr/blob/master/feature-detects/canvas.js |
|
*/ |
|
if (!(node.getContext && (ctx1 = node.getContext('2d')))) { |
|
throw new Error('canvas要素に対応していません'); |
|
} |
|
|
|
/** |
|
* @link https://github.com/Modernizr/Modernizr/blob/master/feature-detects/canvastext.js |
|
*/ |
|
if (typeof ctx1.fillText !== 'function') { |
|
throw new Error('canvas fillTextに対応していません'); |
|
} |
|
|
|
ctx1.fillStyle = '#f00'; |
|
ctx1.textBaseline = 'top'; |
|
ctx1.font = '32px Arial'; |
|
ctx1.fillText('\ud83d\udc28', 0, 0); |
|
|
|
if (typeof ctx1.getImageData !== 'function') { |
|
throw new Error('canvas getImageDataに対応していません'); |
|
} |
|
|
|
if (!( |
|
(imageData = getImageData(ctx1)) && |
|
(data1 = imageData.data) |
|
)) { |
|
throw new Error('canvas getImageDataから正しい結果を取得できませんでした'); |
|
} |
|
|
|
ctx2 = node.cloneNode(false).getContext('2d'); |
|
ctx2.drawImage(node, 0, 0); |
|
ctx2.fillStyle = '#00f'; |
|
ctx2.fillRect(70, 70, 2, 2); |
|
|
|
document.body.appendChild(ctx1.canvas); |
|
document.body.appendChild(ctx2.canvas); |
|
|
|
|
|
|
|
/** |
|
* TypedArray.prototype.toStringで文字列変換し、 |
|
* 比較する |
|
*/ |
|
if (data1.toString) { |
|
/* 同一のデータ */ |
|
JSLitmus.test('toString [TRUE]', function(count) { |
|
var data; |
|
while (count--) { |
|
data = getImageData(ctx1).data; |
|
isEqual = data1.toString() === data.toString(); |
|
} |
|
}); |
|
/* 異なるデータ */ |
|
JSLitmus.test('toString [FALSE]', function(count) { |
|
var data; |
|
while (count--) { |
|
data = getImageData(ctx2).data; |
|
isEqual = data1.toString() === data.toString(); |
|
} |
|
}); |
|
} |
|
|
|
/** |
|
* for文で地道に全ての要素が同じ値か比較する |
|
*/ |
|
/* 同一のデータ */ |
|
JSLitmus.test('for [TRUE]', function(count) { |
|
var data; |
|
while (count--) { |
|
data = getImageData(ctx1).data; |
|
isEqual = true; |
|
for (var i = data1.length; i--; ) { |
|
if (data1[i] !== data[i]) { |
|
isEqual = false; |
|
break; |
|
} |
|
} |
|
} |
|
}); |
|
/* 異なるデータ */ |
|
JSLitmus.test('for [FALSE]', function(count) { |
|
var data; |
|
while (count--) { |
|
data = getImageData(ctx2).data; |
|
isEqual = true; |
|
for (var i = data1.length; i--; ) { |
|
if (data1[i] !== data[i]) { |
|
isEqual = false; |
|
break; |
|
} |
|
} |
|
} |
|
}); |
|
|
|
/** |
|
* TypedArray.prototype.everyで |
|
* 全ての要素が同じ値か比較する |
|
*/ |
|
if (data1.every) { |
|
/* 同一のデータ、コールバック関数を事前に定義、第一引数を使用 */ |
|
JSLitmus.test('every1 [TRUE]', function(count) { |
|
var data = getImageData(ctx1).data; |
|
var every_callback1_t = function(elem, index) { |
|
return elem === data[index]; |
|
}; |
|
while (count--) { |
|
isEqual = data1.every(every_callback1_t); |
|
} |
|
}); |
|
/* 異なるデータ、コールバック関数を事前に定義、第一引数を使用 */ |
|
JSLitmus.test('every1 [FALSE]', function(count) { |
|
var data = getImageData(ctx2).data; |
|
var every_callback1_f = function(elem, index) { |
|
return elem === data[index]; |
|
}; |
|
while (count--) { |
|
isEqual = data1.every(every_callback1_f); |
|
} |
|
}); |
|
|
|
/* 同一のデータ、コールバック関数を事前に定義、外部変数を使用 */ |
|
JSLitmus.test('every2 [TRUE]', function(count) { |
|
var data = getImageData(ctx1).data; |
|
var every_callback2_t = function(_, index) { |
|
return data1[index] === data[index]; |
|
}; |
|
while (count--) { |
|
isEqual = data1.every(every_callback2_t); |
|
} |
|
}); |
|
/* 異なるデータ、コールバック関数を事前に定義、外部変数を使用 */ |
|
JSLitmus.test('every2 [FALSE]', function(count) { |
|
var data = getImageData(ctx2).data; |
|
var every_callback2_f = function(_, index) { |
|
return data1[index] === data[index]; |
|
}; |
|
while (count--) { |
|
isEqual = data1.every(every_callback2_f); |
|
} |
|
}); |
|
|
|
/* 同一のデータ、コールバック関数をインラインで定義、第一引数を使用 */ |
|
JSLitmus.test('every3 [TRUE]', function(count) { |
|
var data; |
|
while (count--) { |
|
data = getImageData(ctx1).data; |
|
isEqual = data1.every(function(elem, index) { |
|
return elem === data[index]; |
|
}); |
|
} |
|
}); |
|
/* 異なるデータ、コールバック関数をインラインで定義、第一引数を使用 */ |
|
JSLitmus.test('every3 [FALSE]', function(count) { |
|
var data; |
|
while (count--) { |
|
data = getImageData(ctx2).data; |
|
isEqual = data1.every(function(elem, index) { |
|
return elem === data[index]; |
|
}); |
|
} |
|
}); |
|
|
|
/* 同一のデータ、コールバック関数をインラインで定義、外部変数を使用 */ |
|
JSLitmus.test('every4 [TRUE]', function(count) { |
|
var data; |
|
while (count--) { |
|
data = getImageData(ctx1).data; |
|
isEqual = data1.every(function(_, index) { |
|
return data1[index] === data[index]; |
|
}); |
|
} |
|
}); |
|
/* 異なるデータ、コールバック関数をインラインで定義、外部変数を使用 */ |
|
JSLitmus.test('every4 [FALSE]', function(count) { |
|
var data; |
|
while (count--) { |
|
data = getImageData(ctx2).data; |
|
isEqual = data1.every(function(_, index) { |
|
return data1[index] === data[index]; |
|
}); |
|
} |
|
}); |
|
} |
|
} catch (e) { |
|
console.error(e); |
|
alert(e.message); |
|
} |
|
}(window)); |