-
Notifications
You must be signed in to change notification settings - Fork 4
/
986.txt
498 lines (406 loc) · 18.2 KB
/
986.txt
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
[1]
[[文字]]や[[文字列]] (を表す[[グリフ]]や[[グリフ]]の列)
の[[座標空間]]は複雑です。
* 基線
[SEE[ [[基線]] ]]
* OpenType の座標
[4] [[フォント単位]]
[REFS[
- [3] [CITE@ja-jp[[[GPOS]] — Glyph Positioning Table (OpenType 1.9) - Typography | Microsoft Docs]], [[PeterCon]], [TIME[2022-09-06T11:34:46.000Z]] <https://docs.microsoft.com/ja-jp/typography/opentype/spec/gpos>
]REFS]
[42]
[CODE[hdmx]] [[表][OpenType表]]は[[グリフ]]の [[advance width]]
を各[[フォントサイズ]]における[[画素]]単位の[[整数]]に変換した値を格納しています。
[SRC[>>41]]
[REFS[
- [41]
[CITE@ja-jp[[[hdmx]] - Horizontal Device Metrics (OpenType 1.9) - Typography | Microsoft Docs]], [[PeterCon]], [TIME[2022-09-08T06:01:54.000Z]] <https://docs.microsoft.com/ja-jp/typography/opentype/spec/hdmx>
]REFS]
[53]
[CODE[haed][head (OpenType)]] [[表][OpenType表]]は、
[DFN[[F[[CODE[xMin]]]]]],
[DFN[[F[[CODE[yMin]]]]]],
[DFN[[F[[CODE[xMax]]]]]],
[DFN[[F[[CODE[yMax]]]]]]
の4つの [CODE[int16]] 値を持ちます。
[SRC[>>52]]
[45]
[CODE[glyf]] [[表][OpenType表]]の [[TrueType outline]] [[グリフ]]データは、
[DFN[[F[[CODE[xMin]]]]]],
[DFN[[F[[CODE[yMin]]]]]],
[DFN[[F[[CODE[xMax]]]]]],
[DFN[[F[[CODE[yMax]]]]]]
の4つの [CODE[int16]] 値を持ちます。
[SRC[>>44]]
[54]
[[グリフ]]の[DFN[[RUBYB[[RUBY[外][がい]][RUBY[接][せつ]][RUBY[箱][ばこ]]][bounding box]]]]は、
[[グリフ]]のすべての[[制御点]]を含む最小の[[矩形]]です。
[SRC[>>52]]
[55]
[CODE[haed][head (OpenType)]] [[表][OpenType表]]のこの4値は、
[[フォント]]中のすべての[[グリフ]]を含む[[外接箱]]を表します。
[[contour]] なき[[グリフ]]は無視します。
[SRC[>>52]]
[47]
[[TrueType outline]] [[グリフ]]のこの4値は[[グリフ]]の点
[WEAK[([[on-curve point]] も [[off-curve point]] も)]]
の[[座標]]データから直接得ます。
[[rasterrizer]] が計算した [[phantom point]] は算入しません。
[SRC[>>44]]
[46]
[[TrueType outline]] [[グリフ]]の[DFN[[RUBYB[[RUBY[外][がい]][RUBY[接][せつ]][RUBY[矩][く]][RUBY[形][けい]]][bounding rectangle]]]]は、
左下 ([F[[CODE[xMin]]]], [F[[CODE[yMin]]]])、
右上 ([F[[CODE[xMax]]]], [F[[CODE[yMax]]]])
の[[方形]]です。
[SRC[>>44]]
;; [48]
[[制御点]]により定義される[[外接箱]]は[[outline]]を含むことが保証されます。
[[outline]] に接するとは限りません。
[SRC[>>44]]
;; [56] [[外接箱]]、[[外接矩形]]の2種類の語が使われていますが、表記揺れで同じ概念と思われます。
[58]
[CODE[CFF ]] ([[CFF]] 1) [[outline]] は [[advance width]] を持ちます。
[[PostScript]] processor はこれを使います。
[[OpenType]] はこれを使いません。
[SRC[>>43]]
[59]
[CODE[CFF2]] [[outline]] は [[advance width]] を持ちません。
[SRC[>>43]]
[60]
[CODE[CFF]] や [CODE[CFF2]] の[[グリフ]]データには
[CODE[xMin]] = [[lsb]], [CODE[xMax]] を明示的には含みません。
[[side bearing]] は [CODE[CharString]] データに暗示的に含まれていて、
[CODE[CFF ]] / [CODE[CFF2]] [[rasterizer]] から得られます。
[SRC[>>43]]
[51]
[[variable font]] の場合は記述された[[外接箱]]が得られた[[グリフ]]のものを表すとは限りません
[SRC[>>44, >>52]]。
必要なら得られた[[グリフ]]の[[制御点]]等から計算する必要があります。
[[side bearing]] は
[[phantom point]]
を使って、あるいは [CODE[HVAR]] のデータから計算できます
[SRC[>>43]]。
[CODE[CFF2]] [[outline]] の [[variable font]] の
[[left side bearing]] と [[advance width]]
は
[[non-default instance]]
では
[CODE[hmtx]] と [CODE[HVAR]]
を総合して得る[RUBYB[べきです][should]]。
[SRC[>>43]]
[49]
[F[[CODE[xMin]]]] が [[lsb]] と等しくなるように[[グリフ座標]]を取ると
[[scaler]] には都合がいいです。
[SRC[>>44]]
すべての[[フォント]]がそうである場合には
[CODE[head][head (OpenType)]] [[表]]のその旨のフラグを設定できます
[SRC[>>52]]。
[[TrueType outline]] を持つ [[variable font]] ではこのフラグを設定しなければ[RUBYB[なりません][must]]し、
[[グリフ]]をそのように設計しなければ[RUBYB[なりません][must]]。
[SRC[>>52]]
[61]
[[フォント]]生成ツールは、
[[layout engine]] によっては [CODE[hmtx]] の [[left side bearing]]
を使うかも知れませんから、
[[left side bearing]]
と
[CODE[CFF ]] / [CODE[CFF2]] [[outline]] の
[CODE[CharString]] が暗示する [CODE[xMin]] が一致するようにする[RUBYB[べきです][should]]。
[SRC[>>43]]
[57]
[[グリフ]]の [[left side bearing]] と [[advance width]] は
[CODE[hmtx]] [[表][OpenType表]]に格納できます。
[SRC[>>43]]
[50]
[[right side bearing]] は [[left side bearing]] と [[advance width]] から求められます。
[[bottom side bearing]] は [[top side bearing]] と [[advance height]] から求められます。
[SRC[>>44]]
[62]
[[TrueType outline]] の[[グリフ]]の [CODE[xMin]] と [CODE[xMax]] は、
[CODE[glyf]] [[表][OpenType表]]の[[グリフ]]データによります。
[SRC[>>43]]
[63]
[[TrueType outline]] の[[グリフ]]の
[[advance width]] ([DFN[[VAR[aw]]]])
と
[[left side bearing ([DFN[[VAR[lsb]]]])
は、
[[TrueType rasterizer]]
の計算する[[グリフ]]の
[[phantom point]]
から得られます。
[CODE[hmtx]] [[表][OpenType表]]からも得られます。
[SRC[>>43]]
[64]
[[right side bearing]] ([DFN[[VAR[rsb]]]]) は、次の式によります。
[SRC[>>43]]
[FIG(math)[
[VAR[rsb]] = [VAR[aw]] - ([VAR[lsb]] + [F[[CODE[xMax]]]] - [F[[CODE[xMin]]]])
]FIG]
[65]
[VAR[pp1]], [VAR[pp2]] を [VAR[lsb]], [VAR[rsb]] を制御する
[[TrueType]] [[phantom point]]
とするとき、
その [[X軸]]方向の初期位置は、次の式によります。
[SRC[>>43]]
[FIG(math)[
[VAR[pp1]] = [F[[CODE[xMin]]]] - [VAR[lsb]]
[VAR[pp2]] = [VAR[pp1]] + [VAR[aw]]
]FIG]
[66]
[[グリフ]]が [[contour]] を持たないとき、 [F[[CODE[xMin]]]], [F[[CODE[xMax]]]]
は定義されません。
[CODE[hmtx]] の [[left side bearing]] は [N[0]] とする[RUBYB[べきです][should]]。
[SRC[>>43]]
[REFS[
-
[44]
[CITE@ja-jp[[[glyf]] - Glyf data table (OpenType 1.9) - Typography | Microsoft Docs]], [[PeterCon]], [TIME[2022-09-08T06:52:01.000Z]] <https://docs.microsoft.com/ja-jp/typography/opentype/spec/glyf>
-
[52]
[CITE@ja-jp[[[head]] - Font header table (OpenType 1.9) - Typography | Microsoft Docs]], [[PeterCon]], [TIME[2022-09-08T07:10:10.000Z]] <https://docs.microsoft.com/ja-jp/typography/opentype/spec/head>
- [43]
[CITE@ja-jp[[[hmtx]] - Horizontal metrix table (OpenType 1.9) - Typography | Microsoft Docs]], [[PeterCon]], [TIME[2022-09-08T06:51:33.000Z]] <https://docs.microsoft.com/ja-jp/typography/opentype/spec/hmtx>
]REFS]
** グリフ位置決定
[5]
[[TrueType]]
では、
[[グリフ]]の位置は基準となる
[[pen point]]
([[pen position]])
からの[RUBYB[[[配置]]][placement]]と[RUBYB[[[前進]]][advance]]の2値で決まります。
すなわち、
現在の [[pen point]] から[RUBYB[[[テキスト]]][text]]の線に対して、
[[配置]]量だけ移動したところに[[グリフ]]を置きます。
そして次の[[グリフ]]の [[pen point]]
を[[前進]]量だけ移動したところに置きます。
[SRC[>>3]]
[8]
[[TrueType]]
における[[配置]]と[[前進]]は、
[[横書き]]では[[X軸]], [[縦書き]]では[[Y軸]]の1次元値です。
[SRC[>>3]]
- [7]
[[左横書き]]では[[配置]]量は [[left side bearing]] ([CODE[horiBearingX]])
となります。
[[前進]]量は [[advance width]] ([CODE[horiAdvance]])
となります。
[SRC[>>3]]
[[グリフ]]は最初の [[pen point]] から右へ右へと並べられていきます。
-
[9]
[[上縦書き]]では[[配置]]量は [CODE[vertBearingY]]
となります。
[[前進]]量は [CODE[vertAdvance]]
となります。
[SRC[>>3]]
[[グリフ]]は最初の [[pen point]] から下へ下へと並べられていきます。
[10]
[[TrueType]] では、
[CODE[kern]] [[表][OpenType表]]を使って2つの[[グリフ]]の間の空間の増減を指定できます。
[SRC[>>3]]
前の[[グリフ]]の[[前進]]量に [CODE[kern]] による調整量を足し合わせることで適切なスペースに調整できます。
[11]
[[OpenType]] では、
[CODE[GPOS]] [[表][OpenType表]]を使って[[配置]]と[[前進]]を
[[X軸]],
[[Y軸]]の2次元で指定できます。
値は[[フォント単位]]によります。
[SRC[>>3]]
- [13]
[[配置]]は一般的な[RUBYB[[[直交座標系]]][Cartesian coordinate system]]によります。
[[書字方向]]に関わらず、
[[原点]]は[[左]]側の[[基線]]となります。
[SRC[>>3]]
- [14]
[[前進]]は[[左横書き]]では[[X軸]]方向に [[advance width]] 分[[加算]] ([[右]]移動) し、
[[右横書き]]では[[X軸]]方向に [[advance width]] 分[[減算]] ([[左]]移動) します。
[SRC[>>3]]
[[上縦書き]]では[[Y軸]]方向に [[advance height]] 分[[加算]] ([[下]]移動) します。
[12]
[CODE[GPOS]] [[表][OpenType表]]では更に[[装置]]依存の調整もできます。
[SRC[>>3]]
[17]
[CODE[GPOS]] による位置調整は、 [[lookup]] によって一致条件と一致した場合の挙動が記述されますが
[SEE[ [[lookup]] ]]、
同じ[[グリフ]]に対する複数の [[lookup]] による指定は、蓄積されていきます。 [SRC[>>3]]
[EG[
[18]
[[機能][フォント機能]]1により [[X軸]]方向に3前進し、
[[機能][フォント機能]]2により [[Y軸]]方向に6前進し、
[[機能][フォント機能]]3により [[X軸]]方向に-2前進すると、
[[X軸]]方向には1前進し、
[[Y軸]]方向には6前進することになります。
]EG]
- [19] [CODE[GPOS]] [CODE[lookupType]] [N[1]] では、
単一の[[グリフ]]に対して、
[[X軸]]と[[Y軸]]の[[配置]]と[[前進]] (のそれぞれの[[加算]]量)
を指定できます。
[SRC[>>3]]
- [20] [CODE[GPOS]] [CODE[lookupType]] [N[2]] では、
2つの[[グリフ]]の[[組]]におけるそれぞれの[[グリフ]]に対して、
[[X軸]]と[[Y軸]]の[[配置]]と[[前進]] (のそれぞれの[[加算]]量)
を指定できます。
[SRC[>>3]]
** 添付点
[6]
[[OpenType]] では、
[CODE[GPOS]] [[表][OpenType表]]を使って[RUBYB[[[グリフ添付点]]][glyph attachment point]]による[[グリフ]]間の位置調整も可能です。
[SRC[>>3]]
[16]
[[添付点]]は[[基底グリフ]]と[[ダイアクリティカルマーク]]の位置調整のために、
あるいは[RUBYB[[[続け字]]][cursive]]における前後の[[グリフ]]の位置調整のために使えます。
[SRC[>>3]]
[15]
[[OpenType]]
では[[グリフ]]は0個以上の[RUBYB[添付点][attachment point]]を持つことが出来ます。
[SRC[>>3]]
それぞれ上の[[ダイアクリティカルマーク]]位置、
下の[[ダイアクリティカルマーク]]位置といったように使います。
[21] [CODE[GPOS]] [CODE[lookupType]] [N[3]]
(cursive attachment positioning)
では、
[[グリフ]]の
[[entry point]] [[anchor]]
と
[[exit point]] [[anchor]]
を設定できます。
両
point [[anchor]]
は、
位置
[WEAK[([[X軸]]座標と [[Y軸]]座標の組)]]
を指定します。
[SRC[>>3]]
[24]
2つの[[グリフ]]を並べるとき、1つ目の[[グリフ]]の [[exit point]] から
2つ目の[[グリフ]]の [[entry point]] へと続くようにします。
[23]
[[line-layout direction]] の調整については、
[[論理順]]で1つ目の[[グリフ]]の[[前進]]を調整します。
結果的に2つ目の[[グリフ]]が移動されて anchor 位置を揃えます。
[SRC[>>3]]
[25]
[[cross-stream direction]] の調整については、
一方の[[グリフ]]の[[配置]]を調整して他方の[[グリフ]]と anchor 位置を揃えます。
[F[[CODE[RIGHT_TO_LEFT]]]] が [N[0]] の場合、
2つ目の[[グリフ]]を調整します。
[F[[CODE[RIGHT_TO_LEFT]]]] が [N[1]] の場合、
1つ目の[[グリフ]]を調整します。
[SRC[>>3]]
[26]
[[entry point]] / [[exit point]] の指定された[[グリフ]]が続く場合、
その[[グリフ]]列全体の配置が連続的に影響されていきます。
[F[[CODE[RIGHT_TO_LEFT]]]] が [N[0]] なら、
最初の[[グリフ]]が[[基線]]基準で配置され、
以後どんどんずれていく形になります。
[F[[CODE[RIGHT_TO_LEFT]]]] が [N[1]] なら、
最後の[[グリフ]]が[[基線]]基準で配置され、
それに向けてどんどんずれが解消してく形になります。
[27]
[DFN[[F[[CODE[RIGHT_TO_LEFT]]]]]]
[[フラグ]]は
[[lookup]] の [F[[CODE[lookupFlag]]]] [[ビット欄]]の第0ビットです。
[SRC[>>28]]
[[lookup]] の条件を記述する他の[[フラグ]]と違って
[F[[CODE[RIGHT_TO_LEFT]]]]
[[フラグ]]は
[F[[CODE[lookupType]]]] [N[3]]
の[[グリフ]]位置調整にだけ作用します。
;; [29] 名前に反して[[右横書き]]にはあまり関係ありません。
が巷の[[フォント]]では
[F[[CODE[lookupType]]]]
と無関係に[[右横書き]]向けの[[グリフ]]が収容された
[[lookup]]
にこのフラグが設定されていたりするようです。
([F[[CODE[lookupType]]]] [N[3]] 以外では指定されていてもいなくても動作は変わりません。)
;; [30]
[[entry point]] と [[exit point]]
は、[[書字方向]]によって違う位置にしなければならないのが普通です。
1つの [[lookup]] で同じ[[グリフ]]に対して複数の[[書字方向]]用の
anchor は記述できませんから、
[[書字方向]]ごとの [[lookup]] を用意しなければなりません。
([[続け字]]で同じ[[グリフ]]で違う[[書字方向]]にそのまま適用できる例の方が稀かもしれませんが。)
[31]
[CODE[GPOS]] [F[[CODE[lookupType]]]] [N[4]]
(Mark-to-Base Attachment Positioning, MarkBasePos)
は、
[[基底グリフ]]と[[マークグリフ]]の組み合わせについて、
両[[グリフ]]にそれぞれの [[anchor point]] を指定するものです。
[SRC[>>3]]
[34]
[CODE[GPOS]] [F[[CODE[lookupType]]]] [N[5]]
(Mark-to-Ligature Attachment Positioning, MarkLigPos)
は、
[[合字グリフ]]と[[マークグリフ]]の組み合わせについて、
両[[グリフ]]にそれぞれの [[anchor point]] を指定するものです。
[SRC[>>3]]
[37]
[CODE[GPOS]] [F[[CODE[lookupType]]]] [N[6]]
(Mark-to-Mark Attachment Positioning, MarkMarkPos)
は、
基底となる[[マークグリフ]] mark2 とそれに付加する[[マークグリフ]] mark1
の組み合わせについて、
両[[グリフ]]にそれぞれの [[anchor point]] を指定するものです。
[SRC[>>3]]
[35]
[[基底グリフ]]の場合は [[anchor point]] は1組だけ指定できます。
[[合字グリフ]]は見かけ上複数の[RUBYB[構成部品][component]]があるかもしれないので、
[[anchor point]] をそれに合わせて複数組設定できます。
[SRC[>>3]]
[32] [[マークグリフ]]は、[[基底グリフ]]と互いの [[anchor point]]
が揃うように[[配置]]を調整します。
[[マークグリフ]]の位置決定は、
[[基底グリフ]]の[[前進]]後の [[pen point]] を基準とします。
[[基底グリフ]]の[[配置]]は変更しません。
両[[グリフ]]の[[前進]]は変更しません。
[SRC[>>3]]
[36]
[[合字グリフ]]の場合も[[基底グリフ]]と同じようにします。
[SRC[>>3]]
ただし[[合字グリフ]]のときは複数組ある(かもしれない) [[anchor point]]
のいずれを選ぶかが問題となります。
[SEE[ [[文字のレンダリング]] ]]
[38]
[[マークグリフ]]同士の場合も基底となる[[マークグリフ]] mark2
に対して同じようにします。
[SRC[>>3]]
;; [33]
[[lookup]] の機能的に求められる[[基底グリフ]]、
[[合字グリフ]]、
[[マークグリフ]]といった[[グリフ級]]と、
実際に [[lookup]] に記述された[[グリフ]]に割り当てられた[[グリフ級]]は、
一致しないことも[[データ構造]]上はあり得ます。
そのような場合にどうするべきかは言及もされていません。
素直に考えると、これらの [[lookup]] は[[グリフ級]]によって使う、
使わないがまず判断されるのですから、
[[グリフ級]]が一致しないデータが混じっていても単に無視されるだけなのが好ましい実装でしょうか。
[22]
複数の [[lookup]] の指定は蓄積されることになっていますが [SRC[>>3]]、
適用されるべき
[[entry point]] anchor, [[exit point]] anchor,
[[マークグリフ]]用の [[anchor point]]
が重複するときどう処理するべきかは不明です。
そのような指定は意味を持ちませんから、
[[フォント]]はそのような [[lookup]] を持つべきではないのでしょう。
[39]
[[基底グリフ]]または[[合字グリフ]]と[[マークグリフ]]との関係による
[[anchor point]]
と[[マークグリフ]]と[[マークグリフ]]との関係による
[[anchor point]]
の両方が適用可能なときは、
[[マークグリフ]]と[[マークグリフ]]の
[[anchor point]]
が優先されることを意図していると考えるのが自然です。
;; [40] こちらの場合は[[基底グリフ]]と[[マークグリフ]]の単体の組み合わせも意味があるのですから、
[[マークグリフ]]と[[マークグリフ]]の [[anchor]]
との衝突は [[lookup]] の設計の誤りではなく、
優先度が仕様上明確でないことの問題です。
[REFS[
- [28]
[CITE@ja-jp[OpenType layout common table formats (OpenType 1.9) - Typography | [[Microsoft]] Docs]], [[PeterCon]], [TIME[2022-09-07T09:25:47.000Z]] <https://docs.microsoft.com/ja-jp/typography/opentype/spec/chapter2#lookupTable>
]REFS]
* ヲコト点
[2] [[ヲコト点座標]]
* メモ