2015年4月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
無料ブログはココログ

« 新規 strokes データの正式な追加登録手続きが分からない | トップページ | 白いシールに影を付けて見えるようにするシール »

2014年4月21日 (月)

peperJSON/strokeJSON の罠? 謎? 仕様? バグ?

コピペシールがバージョンアップできません。

結局、この週末もバージョンアップに失敗しました。

コピペシールの ver.2.9.0 になって、動作しなくなった部分は以下のシーケンスなのですが・・・これ、今公開されている API で実現できなかったりするんじゃないだろうか?

  1. backing から、ペンで囲んだ範囲内の strokes 情報を拾い上げる
  2. シール背景の strokes に、拾い上げた strokes を登録する
  3. シールの x, y 座標を、ペンで囲んだ位置に移動する
  4. シール背景の有効な形状を制限する、info.json の clip 属性を変更する
  5. シール背景の範囲を指定する、info.json の width, height 属性を変更する

1~5 まで動作すれば、コピペシールのバージョンアップは終了です。

このうち、1, 3 は実現できています。3 は ver.2.9.0 より前は、システムの不備 ? のようで、実現できなかったのが、ようやく実現できるようになりました。

2 は、実現できるのですが、他の項目を動作させようとすると前後関係で動いたり動かなくなったり、まだ油断できない、よくわかりません。

4, 5 を諦めれば話は簡単なのですが、特に 5  が動作しないと実用に耐えません。

以下、個人の環境と経験でお送りします。

ちまちま書いていきますが、思いっきり勝手に失敗しているだけかもしれません。

2. のストローク操作に関して

まず、既存のシール背景のストロークを消去してみました。

var paperJSON = MOON.getPaperJSON( stickerID );
paperJSON.strokes = [];
MOON.setPaperJSON( stickerID, paperJSON );

或いは

var paperJSON = MOON.getPaperJSON( stickerID );
paperJSON.externalStrokes = [];
MOON.setPaperJSON( stickerID, paperJSON );

更には

MOON.setStrokeJSON( stickerID, [] );

の、どれでもうまくいきそうなのですが、これが、前後のコードとの組み合わせでうまくいったりいかなかったり。

また、既存のストロークを無視して、新たにストロークを登録するには

var paperJSON = MOON.getPaperJSON( stickerID );
paperJSON.strokes = newStrokes;
MOON.setPaperJSON( stickerID, paperJSON );

或いは

MOON.setStrokeJSON( stickerID, [{strokes: newStrokes}] );

のどちらでも動きます。どちらかというと、後者が正解だと思いますが。

3. のシール座標変更

これは、ver.2.9.0 になってから可能になった操作です。peperJSON.x, paperJSON.y に数値を指定すると、その座標にシールが移動します。以前はシールが移動しなかったのは、多分システム側の不備だったと認識しています。

var paperJSON = MOON.getPaperJSON( stickerID );
paperJSON.x = 100;
paperJSON.y = 100;
MOON.setPaperJSON( stickerID, paperJSON );

といった形で操作できるのですが、以前は x, y に数値こそ代入できるのですが、表示に反映されませんでした。

今回はまった罠は、「x, y に代入する値は、整数でなければならない」というものです。リテラルでも、変数経由でも、整数値だと動くのですが、小数点以下のある値を渡すと、システムコールから帰ってきません。

これは、「仕様として整数値しかうけつけない」というのでも構いませんが、そうすべき積極的な理由が思い当りませんので、本来の仕様としては非整数値でも受け付けるべきところを、整数を前提としたコードを書いてしまい、テスト時にも整数値でしかチェックしなかったのではないかと邪推します。

整数値しかうけつけないのは、width, height も同様でした。システムコール内部で Math.floor() でも使っておけばよいのではないかと思います。

4. clip 属性の操作

ver.2.9.0 より前は、

var paperJSON = MOON.getPaperJSON( stickerID );
paperJSON.clip.data = {...}
MOON.setPaperJSON( stickerID, paperJSON );

とすることで、clipping の範囲だけを、strokes.data 形式で指定できました。これにより、不定形だったり、円形だったり、任意の形状で背景を clipping できていたのです。

ver.2.9.0 では、MOON.getPaperJSON() の返り値に clip 属性が含まれていません。 info.json には存在するのに、です。MOON.getPaperJSON() が clip 属性をカットしてしまうようです。

info.json を見ると、clip 属性自体の形式は従来と変わらず、strokes 形式のようですので、強引に、以下のコードで動きます。

paperJSON = MOON.getPaperJSON( stickerID );
var newClip = { width:1.0, color:-1, type:"pen", subtype:"",
      data: [ 0, 0, 0.01, width -1, 0, 0.01,
             width -1, height -1, 0.01, 0, height -1, 0.01, 0, 0, 0.01
      ]
};
paperJSON.clip = newClip;
MOON.setPaperJSON( myStickerID, paperJSON );

この問題は上記の方法で回避できるのですが、ちょっと判然としません。MOON.getPaperJSON() が clip 属性を返すか、別の正式な API が欲しいです。

5. 背景サイズが変えられない

これ、半分以上本気で「バグ」じゃないかと疑っています。

既述のように、paperJSON.width, paperJSON.height は、整数値しか受け付けないというのもあるのですが、そもそも想定の動作をしません。

たとえば、もともとのシール背景サイズが 100×100 で、シール背景のストロークを200×300 の範囲に収まる newStrokes に書き換えようとすれば、

paperJSON = MOON.getPaperJSON( stickerID );
paperJSON.width = 200;
paperJSON.height = 300;
MOON.setPaperJSON( stickerID, paperJSON );
MOON.setStrokeJSON( stickerID, [{strokes:newStrokes}] );

ver.2.8.0 までは、こんな感じでうまくいきました。ところが ver.2.9.0 では不思議な動作をします。

上記のコードで、確かにシール背景のサイズは 200×300 になります。ところが表示内容は、100×100 の範囲のストロークが横に 2 倍、縦に 3 倍されたものになります。ストロークもガタガタとジャギーの激しいものが表示されます。あれこれためしてみましたが、どう頑張っても、もともとのシール背景のサイズからはみ出すストロークデータを表示できません。

ストロークはベクトルデータなので、2 倍や 3 倍に拡大したくらいで、ジャギーを目立たなくさせることが不可能ではないでしょうから、これは何か描画ルーチンに見落としがあるのではないかと感じました。

どうやら、しばらく

コピペシールのバージョンアップはお預けのようです。

前回・今回の記事の内容を、また地道に、Issue Tracker に上げることにします。

« 新規 strokes データの正式な追加登録手続きが分からない | トップページ | 白いシールに影を付けて見えるようにするシール »

enchantMOON」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1527616/55865102

この記事へのトラックバック一覧です: peperJSON/strokeJSON の罠? 謎? 仕様? バグ?:

« 新規 strokes データの正式な追加登録手続きが分からない | トップページ | 白いシールに影を付けて見えるようにするシール »