モノトーンの伝説日記

Apex Legends, Splatoon, Programming, and so on...

Universal Graphics [alpha] リリースしました。

 様々な 2D Graphics API を 1 つのコードで扱えるように API を共通化するためのライブラリー。

github.com

f:id:mntone:20180706123636p:plain

f:id:mntone:20180706123651p:plain

Universal Graphics とは

f:id:mntone:20180706123818p:plain

 まだまだ機能不足ですし,破壊的変更も加えると思います。

 UG の売りは C# で高度な 2D Graphics を共通化できる部分が売りです。

 2D Graphics は UI にとっては欠かせないものです。グラフ 1 つにしろ,既存のものを使うとデザインや機能が制限されていることが多く,結局グラフの描画は自前で行う,みたいなケースが多いでしょう。そのとき,Xamarin を利用しているのであれば,iOS/Android で Universal Graphics を使うことが可能です。

 SkiaSharp や CairoSharp を使えばいいという考えもできますが,native code のファイルサイズが結構バカにならないぐらいのでかさをしているので,もし,マイクロな実装でよければ UG を採用する価値はあると思います。また,Core Graphics の C API を直接使うより,C# っぽい記述が可能で,例外を使っても安全にレイヤーを抜けたりできるのも特徴ですね。

パス,アフィン変換,プリミティブ図形の使用が可能。

 初期のα版では,「パス (Geometry)」,「アフィン変換」,「プリミティブ図形」と言った基本的な要素を,

  • GDI+ (WinForms),
  • WPF,
  • Win2D (WinRT),
  • CoreGraphics (UIKit/AppKit),
  • android.graphics.Canvas (Android)

の 5 つの環境で実行することができます。現時点で若干,線の描画に違いがあります。今後のアップデートで完全一致を目指したアップデートをしていきたいと考えています。

プラットフォーム差異吸収例

例) android.graphics.Canvas の DrawLine

 点線といった線は DrawLine 関数では適切に描画されないので,Path を使って実装しています。

例) GDI+ の RadialGradientBrush がない

 内部では PathGradientBrush による実装を行なっています。GDI+ はより汎用性のあるグラデーションの実装が可能で,四角形状のグラデーションなども作成することが可能です。Win2D や WPF,CoreGraphics,Android といった実装でそういったグラデーションの互換性をとるのにおそらくかなりの工数が必要と考えるため実装自体はしておりません。

今後の Universal Graphics の展望

 SkiaSharp や CairoSharp と言った UG Driver の開発も可能ですが,現在のところ開発予定はありません。

 次のアップデートの項目として,

  • IUGBrush を Draw (線の描画) に使えるようにする,
  • テキスト関連の API を整備する, (2018/7/8 実装済)
    Comparing 5af91832d3079a68b8cabdef6267359fd10ef41b...e862e2e04ba1cc25f8834e06457fbf92311d0166 · mntone/UniversalGraphics · GitHub
  • UGPath の機能を追加する,
  • Delegate 側でタッチ・マウス・スタイラス(ペン)・キーボードのイベントを受け取れるようにする (project "Universal Interaction")
  • GDI+ の内部ダブルバッファリングの実装, (2018/7/7 実装済)
    github.com
  • Windows 8.1, Windows Phone 8.1 の対応(ある程度は想定して作っていますが,System.Numerics.* ではなく Microsoft.Graphics.Canvas.Numerics.* を使用しており,共通の .NET Standard 1.0 の定義が使えないため,別途アセンブリーをコンパイルする必要がある) (2018/7/11 実装済)
    github.com

 その他,低コストで対応できる部分は全て対応する方針であります。

追記

 Windows 8.1, Phone 8.1 でも動作することを確認しました。まあ自分は使うことないですが……

 作る意味あったんですかね,もうちょっと作りやすい環境なら意味あった気はしますけど,VS2015 で作っているのでだるい……

f:id:mntone:20180711214227p:plain

f:id:mntone:20180711214239p:plain