
- 2024年10月
- 2021年5月
- 2020年8月
- 2020年6月
- 2020年5月
- 2019年1月
- 2018年8月
- 2018年6月
- 2018年5月
- 2018年3月
- 2018年1月
- 2017年12月
- 2017年11月
- 2017年10月
- 2017年9月
- 2017年8月
- 2017年7月
- 2017年6月
- 2016年11月
- 2013年9月
- 2013年8月
- 2013年6月
- 2013年5月
- 2013年4月
- 2013年3月
- 2013年2月
- 2013年1月
- 2012年12月
- 2012年11月
- 2012年10月
- 2012年9月
- 2012年6月
- 2012年5月
- 2012年4月
- 2012年2月
- 2011年7月
- 2011年5月
- 2011年4月
- 2011年2月
- 2010年12月
- 2010年11月
- 2010年10月
- 2010年9月
- 2010年8月
- 2010年7月
- 2010年6月
- 2010年5月
- 2010年4月
- 2010年3月
- 2010年2月
- 2010年1月
- 2009年12月
- 2008年2月
- 2008年1月
- 2007年12月
- 2007年5月
- 2007年4月
- 2007年3月
- 2007年2月
Undo/RedoできるCanvasを作った / magicien
まーた言ったそばから脇道に逸れているわけ。HTMLCanvasElement (CanvasRenderingContext2D) に undo/redo機能が欲しいな、と思ったので作りました。
undo-canvas(デモページ1/2)
CanvasRenderingContext2Dのプロパティに片っ端からフックをかますという荒技を使い、変更したプロパティ、呼び出したメソッドを全て記録しています。
副産物として、上書きしたメソッドを prototype で定義されているものに戻す reset-object を別モジュールとして作りました。
使ってみたい人は、scriptタグでundo-canvasを読み込んでください。
<script src="https://cdn.rawgit.com/magicien/undo-canvas/v0.1.2/undo-canvas.js"></script>ブラウザ向けnpmモジュールを作っている人は、npmコマンドでインストールできます。
npm install --save undo-canvasjsファイルを読み込むと、グローバル変数として UndoCanvas が定義されるので、
const canvas = document.getElementById('myCanvas') const context = canvas.getContext('2d') UndoCanvas.enableUndo(context)こんな感じで、UndoCanvas.enableUndoにコンテキストを引数として渡してください。contextに undo/redo 関数が追加され、以降、このcanvasに対する操作が記録されていきます。
undo/redoしたくなったら、
context.undo() context.redo()で行ったり来たりできます。
undo/redoが必要なくなったら、disableUndoで無効化できます(記録されていた操作履歴は全て消えます)。
UndoCanvas.disableUndo(context)その他機能はGithubの記載を更新していくので、そちらを参照してください。
undo/redoを実現する仕組みはOracleのようなDBの考え方をぱく参考にしたのですが、思いの外うまくハマったので、気が向いたら解説記事でも書くかもしれません。
さて、今度こそエディタ制作作業に戻ろう...
タグ:
この記事のURL: https://darkhorse2.0spec.jp/234/
2017/09/06(Wed) 04:58:25
canvasでWebフォントを使う / magicien
canvasでWebフォントを使う方法。まず、Webフォントを適当な場所にアップロードして、CSSにWebフォントを定義する。
@font-face { font-family: 'Expressway'; src: url('./font/Expressway.woff') format('woff'); }
次に、JavaScriptでCanvasのコンテキストのfontにCSSで定義したfont-family(例ではExpressway)を指定する。Webフォント未対応の場合のために、代替となるフォントファミリー(例ではsans-serif)も指定しておく。
function drawString(context2D) { context2D.font = "24px bold Expressway,sans-serif"; context2D.textAlign = "left"; context2D.textBaseline = "middle"; context2D.fillStyle = "#000000"; // black context2D.strokeStyle = "#FFFFFF#; // white context2D.fillText( "Hello, WebGL!" , 100, 100 ); }CSSの"format"には、woff(Web Open Font Format)の他に、truetype、svg等が使えるらしい。
この記事のURL: https://darkhorse2.0spec.jp/167/
2012/09/25(Tue) 01:18:37
WebGLでの文字描画 / magicien
WebGLで文字を表示させようとすると、いろいろと面倒なので、そのときに使った方法。2Dの文字や図形を描画する場合、WebGLでまともに実現しようとすると、canvasのオブジェクトをもう一つ作って、字を描いて、テクスチャに貼付けて、それをレンダリングする、というような流れになるかと思います。
が、わざわざそんなことしなくても、作ったcanvasをそのままHTMLの画面上に貼付けた方が手間がかからないし、描画も早かったので、下のようなコードで3Dのcanvasの上に2Dのcanvasを同じサイズ、位置で重ねて使いました。
function create2DContext(canvas3D) { var canvas2D = document.createElement('canvas'); canvas3D.insert( { after: canvas2D } ); Element.setStyle( canvas2D, { position: 'absolute', 'z-index': 10 }); Position.clone( canvas3D, canvas2D ); canvas2D.width = canvas3D.width canvas2D.height = canvas3D.height var context2D = canvas2D.getContext('2d'); return context2D; }prototype.js、scriptaculousを使っているので、ソースはそのまま使えないかもですが...
1つのcanvasで2Dのコンテキストと3Dのコンテキストを両方取得できれば問題無いのですが、一度どちらかのコンテキストを取得してしまうと、もう一方のコンテキストが取得できなくなってしまうため、2D用canvasと3D用canvasの2つが必要になるわけです。
この記事のURL: https://darkhorse2.0spec.jp/166/
2012/09/23(Sun) 18:06:49
コード整理中 / magicien
現在、WebGLアプリの設計見直しとコード整理中。まだ作りかけですが、クラス図を載せてみます。

この記事のURL: https://darkhorse2.0spec.jp/114/
2010/06/13(Sun) 22:55:30
動作テストの動画(2回目) / magicien
とりあえず、WebGLアプリについて、出来ているところまでで動画にしてアップ。今後すべきことをメモしておくと、
1. 何故かMinefieldでまともに動作しなくなったため、それを修正
2. ひざのIKの計算を修正
3. ソースコードの整理
ここまで終わったらソースを公開する予定。
スキンウェイトもうまくいっていない気がするので、余裕があれば修正したいです。
他にもやりたいことはいろいろ...時間が足りない!
この記事のURL: https://darkhorse2.0spec.jp/112/
2010/05/22(Sat) 22:50:12
動作テストの動画をアップしてみた / magicien
某動画共有サイトにWebGLアプリの動作テスト動画をアップしてみました。今まで動画をアップしたことなんてないので、勝手がわからない...
この記事のURL: https://darkhorse2.0spec.jp/103/
2010/04/08(Thu) 23:27:15
div版サムネイル生成ver0.2 / magicien
canvas版サムネイル生成ver0.1を改良。ソースはかなり汚いですが、ver0.3はハイブリット版にする予定なもので、canvas版のソースはそのまま。

この記事のURL: https://darkhorse2.0spec.jp/26/
2007/03/05(Mon) 19:32:03
サムネイル生成ver0.1取説 / magicien
使い方説明。1.サムネイルを生成したい画像のURLを入力、変更ボタンを押す。(扱える画像は、GIF、JPEG、PNG。ちなみに、ネット上にアップされているファイルしか扱えない)
2.上部の画像が変更されるので、生成したいサムネイルのサイズをテキストフィールドに入力するなり、スライダーを動かすなりして変更する。(元の画像よりも大きいサイズのサムネイルは作れない。サムネイルの意味ないしね。)
3.拡大率を変更したり、上部の画像をドラッグすることで、希望する画像になるよう頑張る。
4.逸る気持ちを抑えつつ、出力画像タイプを選ぶ。
5.サムネイル作成ボタンを祈りを込めて押す。
6.下部にできたてのサムネイルが表示されるので、ドラッグアンドドロップやら右クリックやらでお持ち帰り。
といった具合。ようやくAjaxらしいことができた。まだまだ改善すべき点は多いわけで、いずれバージョンが上がってきたらLGPLか修正BSDで配布してみようかな、と思ったり。
この記事のURL: https://darkhorse2.0spec.jp/20/
2007/03/02(Fri) 03:54:33
サムネイル生成ver0.1 / magicien
作ってみた。奥さん、すごいですよ、これ。コード量が多いんで、説明はまた今度。

この記事のURL: https://darkhorse2.0spec.jp/19/
2007/03/02(Fri) 03:04:45
続sliderとcanvasの練習 / magicien
前回はSafariしか動かなかったので、今回は他のブラウザでも動くものに。ついでにBezier曲線を使ってみた。RGBAで色を変更、Tで変形。Bezier曲線はよくわからず。
この記事のURL: https://darkhorse2.0spec.jp/10/
2007/02/21(Wed) 20:17:36