jscam.jsのソースコード「ユーティリティ」
説明
「crocro.jscam」は、クロノス・クラウンの柳井政和が開発しているJavaScirptのライブラリです。「crocro.jscam」を使うと、JavaScriptからWebカメラを扱うことができます。また、簡単な図形認識などを行えます。
このページでは、この「crocro.jscam」のコアになる「jscam.js」(ver 1.1.0)のソースコードのうち、「ユーティリティ」に相当する部分を掲載します。
ソースコード
以下、ソースコードです。
//== ユーティリティ crocro.jscam.util = function() {}; /** * @variable crocro.jscam.util.swapXY(w, h, arg) * @title 配列のXY交換 * @description * * 配列の縦横を入れ替えます。プログラムを見やすく書くために利用します。 * * @param w 配列の横幅。 * @param h 配列の高さ。 * @param arg 二次元配列。 * @return 縦横を入れ替えた配列。 */ //== 配列のXY交換 crocro.jscam.util.swapXY = function(w, h, arg) { var x, y; var xArr = new Array(w); for (x = 0; x < w; x ++) { var yArr = new Array(y); for (y = 0; y < h; y ++) yArr[y] = arg[y][x]; xArr[x] = yArr; } return xArr; }; /** * @variable crocro.jscam.util.makeMarker(id, arr, pxSz, isEdit, evtOnClick) * @title マーカーの作成 * @description * * 配列を指定して、「table」タグでできたマーカーを作成します。 * isEditにtrueを指定することで、クリックで編集可能になります。 * また、evtOnClickを指定することで、クリック時のコールバック処理を指定できます。 * * @param id マーカーを作成するDOM要素のID。 * @param arr マーカーを表現する01の二次元配列。 * @param pxSz 1セルあたりのドット数。 * @param isEdit trueなら編集可能、falseなら編集不能。 * @param evtOnClick isEditがtrueの場合に動作。クリック時のコールバック処理をfunctionオブジェクトで指定する。 * このfunctionオブジェクトは「function(x, y, prm)」としてXY座標と変更後の値を受け取れる。 */ //== マーカーの作成 crocro.jscam.util.makeMarker = function(id, arr, pxSz, isEdit, evtOnClick) { var sz = arr.length; var tbl = document.createElement("table"); tbl.id = id + 'Tbl'; tbl.setAttribute("border", 0); tbl.setAttribute("cellspacing", 0); tbl.setAttribute("cellpadding", 0); for (var y = 0; y < sz; y ++) { var tr = document.createElement("tr"); for (var x = 0; x < sz; x ++) { var col = arr[x][y] == 1 ? 'black' : 'white'; var celId = id + 'Tbl_' + x + '_' + y; var td = document.createElement("td"); tr.appendChild(td); var div = document.createElement("div"); td.appendChild(div); div.style.width = pxSz + 'px'; div.style.height = pxSz + 'px'; div.style.background = col; div.style.overflow = 'hidden'; div.style.color = col; div.id = celId; if (isEdit) { div.addEventListener("click", (function(x, y){ return function() { var prm = 1 - this.innerHTML * 1; this.innerHTML = prm; this.style.background = this.style.color = prm ? 'black' : 'white'; if (typeof evtOnClick == 'function') evtOnClick(x, y, prm); }; })(x, y)); } div.innerHTML = arr[x][y]; } tbl.appendChild(tr); } document.getElementById(id).appendChild(tbl); }; /** * @variable crocro.jscam.util.makeDots(id, arr, pxSz, isEdit, evtOnClick) * @title ドット・パターンの作成 * @description * * 配列を指定して、「table」タグでできたドット・パターンを作成します。 * isEditにtrueを指定することで、クリックで編集可能になります。 * また、evtOnClickを指定することで、クリック時のコールバック処理を指定できます。 * * @param id ドット・パターンを作成するDOM要素のID。 * @param arr ドット・パターンを表現する01の二次元配列。 * @param pxSz 1セルあたりのドット数。 * @param isEdit trueなら編集可能、falseなら編集不能。 * @param evtOnClick isEditがtrueの場合に動作。クリック時のコールバック処理をfunctionオブジェクトで指定する。 * このfunctionオブジェクトは「function(x, y, prm)」としてXY座標と変更後の値を受け取れる。 */ //== ドット・パターンの作成 crocro.jscam.util.makeDots = function(id, arr, cellSz, isEdit, evtOnClick) { var sz = arr.length; var tbl = document.createElement("table"); tbl.id = id + 'Tbl'; tbl.setAttribute("border", 0); tbl.setAttribute("cellspacing", 0); tbl.setAttribute("cellpadding", 0); var cellSzBig = parseInt(cellSz * 0.8); var cellSzSml = parseInt(cellSz * 0.35); for (var y = 0; y < sz; y ++) { var tr = document.createElement("tr"); for (var x = 0; x < sz; x ++) { var thisCellSz = arr[x][y] == 1 ? cellSzBig : cellSzSml; var celId = id + 'Tbl_' + x + '_' + y; var td = document.createElement("td"); td.setAttribute("align", "center"); td.setAttribute("valign", "middle"); td.style.background = "white"; td.style.width = cellSz + 'px'; td.style.height = cellSz + 'px'; tr.appendChild(td); var div = document.createElement("div"); td.appendChild(div); div.style.width = thisCellSz + 'px'; div.style.height = thisCellSz + 'px'; div.style.background = "black"; div.style.overflow = 'hidden'; div.style.color = "black"; div.id = celId; if (isEdit) { div.addEventListener("click", (function(x, y){ return function() { var prm = 1 - this.innerHTML * 1; this.innerHTML = prm; var thisCellSz = prm == 1 ? cellSzBig : cellSzSml; this.style.width = thisCellSz + 'px'; this.style.height = thisCellSz + 'px'; if (typeof evtOnClick == 'function') evtOnClick(x, y, prm); }; })(x, y)); } div.innerHTML = arr[x][y]; } tbl.appendChild(tr); } document.getElementById(id).appendChild(tbl); };