[Delphi] Skia おさらい

# はじめに
Delphi 12 Athens から Skia が使える様になりました(FMX / VCL どちらでも使えます)。

この記事は[デベロッパーＴＶ](https://www.youtube.com/watch?v=IDE5fzc2css)で解説した Skia サポートのおさらい記事です。

# Skia の使い方
Skia を使う方法は、ProjectManager でプロジェクトのコンテキストメニューから「Skia の有効化」をクリックするだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/736515a9-ac9d-da33-3279-d8f8f749a19b.png)

Skia を有効にするとプロジェクトファイルが以下のように変更されます。

**VCL**
sk4d.dll が自動生成され実行時にリンクされます。

**FMX**
プラットフォーム毎に Skia モジュールが組み込まれます。
|OS|Skiaのモジュール|
|---|---|
|Windows|sk4d.dll|
|macOS|libsk4d.dylib|
|Android|libsk4d.so|
|iOS|Skia の静的リンク|

# Skia コントロール
Skia を導入するにあたって、Skia の機能をラッピングし Delphi で扱いやすくした Skia コントロールが搭載されました。
今回は、その Skia コントロールの中で以下の３つを紹介します。
* TSkLabel
* TSkAnimatedImage
* TSkSVG

# TSkLabel
TSkLabel は Skia の文字列描画をコントロール化したものです。

従来の TLabel のように単一行のコントロールというわけではなく自動的に改行される複数行表示可能なコントロールです。

追加する文字列ごとにデコレーション（フォントの色等の属性）を設定できます。

TSkLabel は Skia カテゴリにあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/f87d1066-f379-e7e2-8e60-54fd65ea83c9.png)

TSkLabel はその性質上（複数行表示可能なため）高さが決められません。
そのため、置いた直後は縦の長さが極端に長くなっています。
これでは使い勝手が悪いため、AutoSize を False にしてサイズを調整します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/b5785c76-6bae-cdbe-ff9d-40d2d2b38352.png)

## 使い方
TSkLabel の Words プロパティに示される TWordsItem を選択して文字列を指定します。
TWordsItem クラスの文字列や属性を適切に指定してデコレーションします。
ちなみに TSkLabel.Text プロパティは Words[0].Text プロパティを表わしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/05ddd4ff-1d03-4f74-9d9d-850d3cab2f3d.png)

WordsItem 毎に文字列や Decoration 背景色などを設定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/4f51ba6b-4d48-8488-c102-24ba78c2cfdf.png)

WordsItem を追加する場合は右クリック「項目を追加」や「コレクションエディタ」で編集できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/b389b96e-14b1-22ae-b7be-5f4cdb7de8b5.png)

WordsItem を増やして、Item 毎に色を付けてみたサンプルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/b380123c-37ad-59b3-b479-0ef58838b455.png)

WordsItem 毎にクリックを受け取れます。
WordsItem の OnClick にイベントハンドラを追加するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/1fd5333f-2b13-0666-dbd5-4d3fa84b03d8.png)

```delphi:イベントハンドラ
procedure TForm1.SkLabel1Words2Click(Sender: TObject);
begin
  // WordsItem がクリックされると実行される
  ShowMessage((Sender as TSkLabel.TWordsItem).Text);
end;
```

Words.Add メソッドを使えばコードで WordsItem を追加できます。
Words プロパティは TCollection を継承しているので Clear メソッドや Items プロパティなども利用できます

```delphi
procedure TForm1.FormCreate(Sender: TObject);
begin
  var Item :=
    SkLabel1.Words.Add(
      sLineBreak + 'Hello, SkLabel!',
      TAlphaColors.Red,
      32,
      TFontWeight.UltraBold,
      TFontSlant.Italic);

  Item.OnClick := SkLabel1Words2Click;
end;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/8035fcc5-6e92-2b1c-425e-c0173045e618.png)

# TSkAnimatedImage
TSkAnimatedImage はアニメーション GIF に代表されるアニメーション画像を表示できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/0d735519-356d-a5c1-cc0f-c803b53f45d9.png)

## 使い方
Source プロパティで画像を指定するだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/e8d8ae23-da0c-2a5d-d190-1dfb29ac4a42.png)

表示できる種類は以下の通り

* Animated GIF (*.gif)
* Animated WebP (*.webp)
* Lottie (*.json)
* Telegram Sticker (*.tgs)

残念ながら APNG / JPEG XL には対応していません
Animation の詳細は Animation プロパティで設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/8cc2b12e-1cfd-0899-d12d-0db75ab7e719.png)

# TSkSVG
TSkSVG は SVG を表示するコントロールです。
従来の TPath と比べて高機能になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/dfc0d8fd-607d-a920-788f-93a42200d254.png)

## 使い方
Svg プロパティの Source に SVG を指定するだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/bdca1ac7-7bf2-eb84-2c3d-99f5130330f8.png)

# 最後に
サンプルアプリが非常に判りやすいのでおすすめです。
デフォルトのサンプル格納場所は以下です。
```console
C:\Users\Public\Documents\Embarcadero\Studio\23.0\Samples\Object Pascal\Multi-Device Samples\Skia4Delphi
```

これでまた Delphi の表現の幅が広がりましたね。