stone_engineは、日本語の文字組版を実現する、テキストレンダリングエンジンである。
stone_engineは、iOS上で動作するテキストレンダリングエンジンである。 その第一義の目的は、日本語の高度な組版を実現することである。具体的には、縦書き、禁足処理、約物処理、文字種ごとのスケーリングが挙げられる。 また従来の紙媒体によるページ分割を前提とした組版とは違い、電子媒体による大きさに制約のない画面上での組版を模索するものである。
副次的な目的として、プログラマにとって直接内部構造を触ることのできるレンダリングエジンがほしい、という欲求がある。 あらゆるOSやプラットフォームにとって、テキストのレンダリングとは極めて基本的な機能の一つであり、十分な機能のものがすでに与えられている。 iOSであれば、UIKitのUILabelやUITextView、Swift UIのTextなどがそれにあたる。 それらは使い勝手は問題ないものであるが、その一方で高度にブラックボックス化されており、内部情報に十分にアクセスすることはできない。 たとえば、UILabelで、文字ごとにそれがframeのどこにレイアウトされているか、という情報を得ることはできない。 プログラマであるならば、それらの情報にアクセスできることで、どれだけの可能性が広がるか想像できるだろう。
そのような、ある種トイボックスとして使えるようなレンダリングエンジンを提供することが、隠された目的である。
上述の目的のために、以下の方針を定める。
電子媒体、中でもアプリに特化した日本語文字組版のあるべき姿を模索する。 紙媒体と比較して、アプリで使われる画面には、以下の特徴がある。
- 画面サイズが不定
- 実行中にサイズが変更される
- スクロールにより極端に広くなる
- ページングの不在
これらの条件下で、あるべき組版のありかたとその実装を実現する。
テキストレンダリングエンジンは、low levelの機能である。 あらゆるアプリの基底として使われるものであり、そこには高い実行速度が求められる。 stone_engineは、実行速度を最優先として、そのアーキテクチャ、データ構成、使用言語などを決めていく。
たとえば、現状ではフォントのGSUBテーブルを辿るために、C言語を用いている。 これはそれが実行速度を高めるよりよい方法と考えているからである。
stone_engineは、STLabel
とSTTextView
というクラスを提供する。これは、UIKitにおけるUILabelとUITextViewを置き換えることを意図している。
STLabelは、画面にテキストを表示するためのビュークラスである。編集はできない。次のような特徴を有する。
文字を描画する方向として、LrTb
またはTbRl
を指定できる。TbRlは、いわゆる縦書き表示である。
![]() |
---|
LrTb (横書き表示) |
![]() |
---|
TbRl (縦書き表示) |
縦書き表示では、フォントを描画するときに適切なグリフが選択される。たとえば、句読点、括弧などに適用される。
数字を表示するときは、いわゆる縦中横が反映される。数字が2桁以下のときは、正体で表示される。2桁より大きいとは、90度回転して表示される。
アルファベットは、90度回転して表示される。
![]() |
---|
数字の縦中横表示と、アルファベットの90度回転表示 |
禁則処理は、行頭禁則および行禁則が行われる。禁則の対象となる文字種を指定可能である。
禁則処理の、オン/オフを指定することが可能である。
約物(句読点や括弧類)を、半角で表示させることができる。約物の取り扱い方を、以下のモードで指定することができる。
- 常に全角
- 常に半角
- 前後の文字種や行中の位置で、適切に判断する(stoneモード)
![]() |
---|
常に全角 |
![]() |
---|
常に半角 |
![]() |
---|
stoneモード |
STLabelでは、文字種ごとにフォントを指定することが可能である。
![]() |
---|
日本語フォント:游明朝 ラテン文字フォント:Times New Roman |
![]() |
---|
日本語フォント:游ゴシック ラテン文字フォント:Helvetica |
指定可能な文字種は、Unicodeカテゴリとして定義される。
STLabelでは、文字種ごとに表示するスケールを指定することが可能である。たとえば、日本語フォントとして1.0、ラテン文字フォントとして0.9を指定すると、次のような描画になる。
![]() |
---|
日本語フォントスケール:1.0 ラテン文字フォントスケール:0.9 |
文字寄せとして、以下が指定可能である。
- 行頭
- 中央
- 行末
- 均等
日本語単語分割のオン/オフを指定することができる。これは、改行を行うときに単語を分割するか、しないかを決定するものである。
STTextViewは、テキストの編集を行うためのビュークラスである。STLabelが持つ特徴をすべて有する。