typeset 0.1.0
縦書き・横書きの日本語組版ライブラリ(JLReq 水準、ラスタ / PDF / SVG)
読み取り中…
検索中…
一致する文字列を見つけられません
style.hpp
[詳解]
1#ifndef TYPESET_STYLE_HPP
2#define TYPESET_STYLE_HPP
3
4#include <map>
5#include <optional>
6#include <string>
7#include <vector>
8
10
11#include "typeset/geom.hpp"
13
19namespace typeset {
20
24struct FontSpec {
26 std::vector<std::string> family;
27 int weight = 400;
28 bool italic = false;
31 std::map<std::string, float> variations;
32};
33
40struct TextLayer {
41 std::optional<Paint> fill;
42 std::optional<Stroke> stroke;
46 Pt blur = 0.0f;
47
48 static TextLayer filled(Paint c) { TextLayer l; l.fill = std::move(c); return l; }
49 static TextLayer outlined(Stroke s) { TextLayer l; l.stroke = s; return l; }
50};
51
55struct TextShadow {
56 Color color{0, 0, 0, 128};
57 Point offset{1.0f, 1.0f};
58 Pt blur = 0.0f;
59};
60
69 std::optional<Paint> color;
70 Pt thickness = 0.0f;
72 float offset = 0.0f;
73};
74
81enum class EmojiPresentation : uint8_t { Auto, Text, Emoji };
82
86struct TextStyle {
88 Pt size = 10.0f;
89 Paint fill{Color{0, 0, 0, 255}};
90 std::optional<Stroke> stroke;
91
93 std::optional<TextShadow> shadow;
96 std::vector<TextLayer> layers;
97
98 std::optional<TextDecoration> underline;
99 std::optional<TextDecoration> strikethrough;
100
102 float letterSpacing = 0.0f;
103
105 std::optional<TextOrientation> orientation;
106
108 float scaleX = 1.0f;
109 float scaleY = 1.0f;
110
112 bool fakeBold = false;
113 bool fakeItalic = false;
114
116 float baselineShift = 0.0f;
117
119 std::string language = "ja";
120
123
127 std::vector<std::string> features;
128
131 for (const std::string& f : features) {
132 std::string tag = f;
133 bool on = true;
134 if (!tag.empty() && (tag[0] == '+' || tag[0] == '-')) { on = tag[0] == '+'; tag = tag.substr(1); }
135 const size_t eq = tag.find('=');
136 if (eq != std::string::npos) { on = tag.substr(eq + 1) != "0"; tag = tag.substr(0, eq); }
137 const size_t br = tag.find('[');
138 if (br != std::string::npos) tag = tag.substr(0, br);
139 if (!on) continue;
140 if (tag == "palt" || tag == "halt" || tag == "pwid" || tag == "hwid" || tag == "vpal" ||
141 tag == "vhal" || tag == "twid" || tag == "qwid") return true;
142 }
143 return false;
144 }
145
147 std::vector<TextLayer> resolvedLayers() const {
148 std::vector<TextLayer> out;
149 if (shadow) {
150 TextLayer l;
151 l.fill = shadow->color;
152 l.offset = shadow->offset;
153 l.blur = shadow->blur;
154 out.push_back(l);
155 }
156 if (layers.empty()) {
157 TextLayer l;
158 l.fill = fill;
159 l.stroke = stroke;
160 out.push_back(l);
161 } else {
162 out.insert(out.end(), layers.begin(), layers.end());
163 }
164 return out;
165 }
166};
167
177enum class KinsokuLevel : uint8_t { Strict, Normal, Loose };
178
185 float weakKinsokuPenalty = 500.0f;
187 std::u16string lineStartProhibited;
188 std::u16string lineStartAllowed;
189 std::u16string lineEndProhibited;
190 std::u16string lineEndAllowed;
192 bool hangingPunctuation = false;
194 bool latinGap = true;
197 float kanjiSkipStretch = 0.125f;
199 float kanjiSkipShrink = 0.0f;
200};
201
202enum class LineBreakStrategy : uint8_t {
203 Greedy,
204 KnuthPlass,
205};
206
214enum class WrapMode : uint8_t { Mixed, Char, Word, None };
215
238
239enum class Align : uint8_t { Start, End, Center, Justify };
240
242enum class BlockAlign : uint8_t { Start, Center, End };
243
245enum class TabAlign : uint8_t { Left, Center, Right, Decimal };
246struct TabStop {
247 Pt position = 0.0f;
249 char32_t decimalChar = U'.';
250};
251
253enum class Direction : uint8_t { Auto, Ltr, Rtl };
254
260
264
266 float firstLineIndent = 0.0f;
268 float hangingIndent = 0.0f;
269
271 std::u16string ellipsis;
272
274 std::vector<TabStop> tabStops;
275
277 Pt linePitch = 0.0f;
278 float lineHeight = 1.7f;
279
282
285
287 bool preserveSpaces = false;
289 int tabWidth = 4;
290
292 float rotation = 0.0f;
293
295 Pt resolvedLinePitch(Pt fontSize) const {
296 return linePitch > 0.0f ? linePitch : fontSize * lineHeight;
297 }
298};
299
300} // namespace typeset
301
302#endif // TYPESET_STYLE_HPP
言語ごとのパターン。TextStyle::language(BCP47)で引く。 完全一致 → 主言語("en-GB" なら "en")→ 既定の言語(setDefaultLanguage)の順に探す。
text/char_class — JLReq の文字クラス
Definition style.hpp:9
geom — 単位と幾何
TabAlign
タブストップの揃え
Definition style.hpp:245
Direction
段落の基底方向(UAX #9)。Auto は最初の強い文字で決める(和文・欧文は LTR)
Definition style.hpp:253
BlockAlign
行送り方向の揃え(箱の中での段落の位置。inl::originInBox)
Definition style.hpp:242
WrapMode
折返しの方式
Definition style.hpp:214
float Pt
Definition geom.hpp:17
TextOrientation
縦組み中の文字の正立/横倒し(CSS text-orientation 相当)
@ Mixed
和文は正立、欧文は横倒し(既定)
KinsokuLevel
約物の詰め・和欧間・ぶら下げ
Definition style.hpp:177
EmojiPresentation
絵文字の表示形式
Definition style.hpp:81
LineBreakStrategy
Definition style.hpp:202
@ KnuthPlass
段落全体でデメリットを最小化。組版品質が要る用途向け
@ Greedy
各ブレーク候補で即断。画面のリアルタイム描画向け
bool justify
行末を揃える(グルーを伸縮させる)。false なら自然幅のまま
Definition style.hpp:232
int hyphenMinLeft
行末に残す最小の文字数 / 次の行へ送る最小の文字数
Definition style.hpp:229
const text::HyphenationDictionary * hyphenation
欧文のハイフネーション辞書(言語ごとのパターン。TextStyle::language で引く)。 nullptr なら単語内では切らない(テキスト中のソフトハイフン U+00AD は辞書が無くても常に...
Definition style.hpp:225
LineBreakStrategy strategy
Definition style.hpp:217
float linePenalty
Knuth–Plass の行あたりのペナルティ(行数を増やしにくくする)
Definition style.hpp:236
float hyphenPenalty
単語内で切るときのペナルティ(Knuth–Plass の demerits に効く)
Definition style.hpp:227
float tolerance
Knuth–Plass が許容するグルーの伸び率上限
Definition style.hpp:234
色(非前乗算 RGBA)
Definition geom.hpp:117
フォントの論理指定
Definition style.hpp:24
std::vector< std::string > family
フォールバック順の family(FontSet に登録したキー、または family 名)
Definition style.hpp:26
std::map< std::string, float > variations
バリアブルフォントの軸の値("wght" → 700、"wdth" → 75 など、デザイン座標)。 wght を書かなくても、face に wght 軸があれば weight が入る。軸の無い fac...
Definition style.hpp:31
塗り — 単色または線形/放射グラデーション
Definition geom.hpp:158
段落スタイル
Definition style.hpp:258
float firstLineIndent
一字下げ(em 単位。日本語段落の既定は 1)
Definition style.hpp:266
SpacingOptions spacing
Definition style.hpp:283
float hangingIndent
ぶら下げインデント: 2 行目以降の字下げ(em)。途中からの字下げは Annotation::indent
Definition style.hpp:268
int tabWidth
preserveSpaces のとき、タブを何桁ごとのタブ位置で空白に展開するか
Definition style.hpp:289
BreakOptions lineBreak
Definition style.hpp:284
std::vector< TabStop > tabStops
タブストップ(行頭からの位置、pt)。空なら tabWidth × em ごとの左揃えタブ。preserveSpaces のときは使わず空白に展開する
Definition style.hpp:274
std::u16string ellipsis
行数上限(ParagraphLayouter::layout の maxLines)で切れたとき、最後の行の末尾に置く省略記号(空なら置かない)
Definition style.hpp:271
bool preserveSpaces
欧文間隔を伸縮しない固定幅の箱にする(コードブロック等。行頭の空白も残る)
Definition style.hpp:287
float rotation
段落全体の回転(度。時計回りが正。行頭(emitParagraph の origin)を中心に回す)
Definition style.hpp:292
Direction direction
基底方向。RTL の段落では Start / End が入れ替わり、一字下げは行の終端側(右)に付く。 行の中の双方向テキスト(アラビア文字・ヘブライ文字の混在)は方向に関わらず UAX #9 で並べ替...
Definition style.hpp:263
Pt resolvedLinePitch(Pt fontSize) const
実効の行送り
Definition style.hpp:295
TextOrientation orientation
縦組み中の文字の向き(既定: 和文正立・欧文横倒し)
Definition style.hpp:281
Pt linePitch
行送り(pt)。0 なら size × lineHeight
Definition style.hpp:277
float kanjiSkipStretch
和字同士の字間に許す伸び(em)。JLReq の追い出し(字間を空けて行末を揃える)に 使う。pTeX の kanjiskip の stretch に相当。0 でベタ組み固定
Definition style.hpp:197
float kanjiSkipShrink
和字同士の字間に許す縮み(em)。通常 0(詰めるのは約物のアキだけ)
Definition style.hpp:199
bool latinGap
和欧間のアキを入れる
Definition style.hpp:194
std::u16string lineEndProhibited
行末に置かない文字を足す
Definition style.hpp:189
bool punctuationSpacing
約物の詰め(JLReq のアキ量表を適用する)。false ならベタ組み
Definition style.hpp:181
float weakKinsokuPenalty
弱い禁則のペナルティ(Knuth–Plass の demerits に効く。Greedy では「切れる」扱い)
Definition style.hpp:185
KinsokuLevel kinsoku
禁則の強さ
Definition style.hpp:183
std::u16string lineStartAllowed
行頭禁則から外す文字
Definition style.hpp:188
bool hangingPunctuation
行末に来た句読点を版面外へ出す
Definition style.hpp:192
std::u16string lineStartProhibited
禁則の追加・除外(KAG3 の wwFollowing / wwLeading 相当)。文字クラスより優先する
Definition style.hpp:187
std::u16string lineEndAllowed
行末禁則から外す文字
Definition style.hpp:190
線の描き方
Definition geom.hpp:237
Pt position
行頭からの位置(pt。一字下げは含まない)
Definition style.hpp:247
char32_t decimalChar
Decimal のときに揃える文字
Definition style.hpp:249
TabAlign align
Definition style.hpp:248
下線・打消し線(TextStyle::underline / strikethrough)
Definition style.hpp:68
std::optional< Paint > color
無ければ TextStyle::fill
Definition style.hpp:69
Pt thickness
0 でフォントのメトリクス
Definition style.hpp:70
float offset
位置の補正(em)。文字から離れる向きが正(横組み: 下、縦組み: 右)
Definition style.hpp:72
文字の外観の 1 層(塗り・縁取り・影)
Definition style.hpp:40
static TextLayer outlined(Stroke s)
Definition style.hpp:49
Pt blur
ぼかし半径(pt)。ラスタと SVG はガウスぼかし、PDF はぼかさずに置く
Definition style.hpp:46
Point offset
ずらし(pt、物理座標。右・下が正。縦組みでも同じ向き)
Definition style.hpp:44
std::optional< Stroke > stroke
Definition style.hpp:42
static TextLayer filled(Paint c)
Definition style.hpp:48
std::optional< Paint > fill
Definition style.hpp:41
影(TextStyle::shadow)。層の一番下に「塗り = color、offset、blur」の 1 層として置く糖衣
Definition style.hpp:55
文字スタイル
Definition style.hpp:86
bool hasProportionalFeature() const
features に字幅を変える feature(palt / halt / pwid / hwid / vpal / vhal / twid / qwid)が有効に入っているか
Definition style.hpp:130
float baselineShift
ベースラインのずらし(このスタイルの em 単位)。注記側が正(横組み: 上、縦組み: 右)。上付き文字・脚注記号用
Definition style.hpp:116
Paint fill
塗り(単色またはグラデーション)
Definition style.hpp:89
std::optional< TextShadow > shadow
影。layers の下に 1 層足す
Definition style.hpp:93
std::optional< TextDecoration > underline
Definition style.hpp:98
std::string language
BCP47(シェイピングの言語タグ。"ja" で日本語字形が選ばれる)
Definition style.hpp:119
EmojiPresentation emojiPresentation
絵文字の表示形式(既定は異体字セレクタに従う)
Definition style.hpp:122
std::vector< std::string > features
OpenType feature(HarfBuzz の書式: "palt" "+liga" "-kern" "liga=0" "ss01")。そのまま HarfBuzz へ渡す。 palt / halt...
Definition style.hpp:127
bool fakeBold
合成ボールド/斜体(フォントに該当ウェイト・斜体が無い場合に明示指定する)
Definition style.hpp:112
std::optional< Stroke > stroke
縁取り
Definition style.hpp:90
std::optional< TextDecoration > strikethrough
Definition style.hpp:99
std::optional< TextOrientation > orientation
縦組み中の向きの部分指定(段落の指定を上書き)
Definition style.hpp:105
std::vector< TextLayer > layers
外観の層(下から上)。空なら fill / stroke の 1 層。指定すると fill / stroke は描画に使わない (下線の既定色としては fill が使われる)
Definition style.hpp:96
float letterSpacing
字間(em 単位)。組版層ではクラスタ間の Glue として扱う
Definition style.hpp:102
std::vector< TextLayer > resolvedLayers() const
実際に描く層(下から上): shadow → layers(空なら fill / stroke の 1 層)
Definition style.hpp:147
float scaleX
平体・長体
Definition style.hpp:108
FontSpec font
Definition style.hpp:87