Mac OS Xでは、濁音(半濁音)を清音 + U+3099(U+309A)で表している。
IPAフォントで、そのようなテキスト「がぎぐげごザジズゼゾか゚き゚く゚け゚こ゚パピプペポ」を開いたら、こう表示される。
「かきくけこ」に半濁点は、合字の設定がされているから表示されている。ということは、他の文字も設定すれば、きちんと表示される。

次のスクリプトを使う。UTF-8で保存。
#!/usr/bin/env fontforge
if ($argc > 2)
OutputFile = $2;
else
OutputFile = "new."+$1:t;
endif
Open($1);
Reencode("original");
plain = [0x304B, 0x304D, 0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x309D];
Select(0u3099);
v_mark = GlyphInfo("Name");
i = 0;
while (i < SizeOf(plain))
Select(UCodePoint(plain[i]));
p = GlyphInfo("Name");
Select(UCodePoint(plain[i]+1));
AddPosSub("'ccmp' グリフ合成/分解 lookup 1 subtable", p+" "+v_mark);
Select(UCodePoint(plain[i]+0x60));
p = GlyphInfo("Name");
Select(UCodePoint(plain[i]+0x60+1));
AddPosSub("'ccmp' グリフ合成/分解 lookup 1 subtable", p+" "+v_mark);
i++;
endloop
plain = [0x3046, 0x30A6, 0x30EF, 0x30F0, 0x30F1, 0x30F2];
voiced = [0x3094, 0x30F4, 0x30F7, 0x30F8, 0x30F9, 0x30FA];
i = 0;
while (i < SizeOf(plain))
Select(UCodePoint(plain[i]));
p = GlyphInfo("Name");
Select(UCodePoint(voiced[i]));
AddPosSub("'ccmp' グリフ合成/分解 lookup 1 subtable", p+" "+v_mark);
i++;
endloop
plain = [0x306F, 0x3072, 0x3075, 0x3078, 0x307B];
Select(0u309A);
v_mark = GlyphInfo("Name");
i = 0;
while (i < SizeOf(plain))
Select(UCodePoint(plain[i]));
p = GlyphInfo("Name");
Select(UCodePoint(plain[i]+2));
AddPosSub("'ccmp' グリフ合成/分解 lookup 1 subtable", p+" "+v_mark);
Select(UCodePoint(plain[i]+0x60));
p = GlyphInfo("Name");
Select(UCodePoint(plain[i]+0x60+2));
AddPosSub("'ccmp' グリフ合成/分解 lookup 1 subtable", p+" "+v_mark);
i++;
endloop
Generate(OutputFile, "otf");
Quit(0);