ã“ã®ãƒšãƒ¼ã‚¸ã¯éŽåŽ»ã«æŽ²è¼‰ã—ã¦ã„ãŸã‚‚ã®ã‚’ãã®ã¾ã¾ä½¿ç”¨ã—ã¦ã„ã¾ã™ã€‚
EPS出力ã§ã¯æ—¥æœ¬èªžã¨è‹±èªžã®æ–‡å—別ã«å‡ºåŠ›ã‚’å¤‰æ›´ã™ã‚‹ å¿…è¦ãŒã‚りã¾ã™ã€‚ãã®ä»•掛ã‘ã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚
テã‚ストã®ä¸ã«è‹±èªžã¨æ—¥æœ¬èªžãŒæ··åœ¨ã—ã¦ã„ã‚‹ãªã©ã—ãŸæ™‚ã«
ã¡ã‚ƒã‚“ã¨è¡¨ç¤ºã§ããªã‹ã£ãŸã®ã§ã€epsを生æˆã™ã‚‹ã€app/render_eps.c
ã€
ã«ä»•掛をã¤ãりã¾ã—ãŸã€‚
ã“ã®ã¡ã‚ƒã‚“ã¨è¡¨ç¤ºã§ããªã„ã¨ã„ã†ã®ã¯EPSã®ãƒ‡ãƒ¼ã‚¿æ§‹é€ ã«å•題ãŒã‚りã¾ã™ã€‚ tgifを使ã£ã¦ãƒ†ã‚ストã§ã€Œãƒ†ã‚¹ãƒˆtestã€ã‚’書ãã€EPSã«å‡ºåŠ›ã—ã¾ã—ãŸã€‚
/* asciiæ–‡å—ã¨2byteæ–‡å—ã‚’å«ã‚€ä¸€ç¶šãã®æ–‡å—列 (『テストtestã€ã®å ´åˆ)*/ 0 SG /Ryumin-Light-EUC-H FF dup /WMode known {dup /WMode get 1 eq {[0 1 -1 0 0 0.3] makefont} if} if [14 0 0 -14 0 0] MS (\244\306\244\271\244\310) SH 0 SG /Helvetica FF [14 0 0 -14 0 0] MS (test) SH
ã“ã®æ–œå—体ã«ãªã£ã¦ã„ã‚‹ã¨ã“ã‚ã®ã‚ˆã†ã«ã€2byteæ–‡å—ã§ã¯ã€Œ/Ryumin-Light-EUC-Hã€ã‚’ asciiæ–‡å—ã§ã¯ã€Œ/Helveticaã€ã¨ã„ã†ã‚ˆã†ã«ã€ãƒ•ã‚©ãƒ³ãƒˆã®æŒ‡å®šã‚’切りæ›ãˆã‚‹å¿…è¦ãŒ ã‚りã¾ã™ã€‚
ã“ã®ã‚ˆã†ãªå‡¦ç†ã‚’è¿½åŠ ã™ã‚‹ãŸã‚ã«ã¯ã€ã„ãã¤ã‹ã®æ–¹æ³•ãŒã‚ã£ãŸã®ã§ã™ãŒ 2byteæ–‡å—用ã®PSフォントåã‚’è¿½åŠ ã™ã‚‹äº‹ã«ã—ã¾ã—ãŸã€‚
/* å¤ã„定義 */ typedef struct _FontData { char *fontname; char *fontname_ps; char *fontname_x11[NUM_X11_FONTS]; /* First choice */ } FontData;
ã„ã¾ã¾ã§ã¯ä¸Šã®ã‚ˆã†ãªæ§‹é€ 体を使ã£ã¦ã„ãŸãŒã€è¤‡æ•°ã®PS用フォントåを指定ã§ãã‚‹ よã†ã«æ”¹é€ ã—ãŸã€‚
#define NUM_PS_FONTS 2 /* æ–°ã—ã„定義 */ typedef struct _FontData { char *fontname; char *fontname_ps[NUM_PS_FONTS]; char *fontname_x11[NUM_X11_FONTS]; /* First choice */ } FontData;
ã“れã«åˆã›ã‚‹ãŸã‚ã«lib/font.cを書æ›ãˆãŸã€‚
{ "Helvetica", { "Helvetica", "Ryumin-Light" }, /* ↠変更点 */ { "-adobe-helvetica-medium-r-normal-*-%d-*-*-*-*-*-*-*,-*-mincho-medium-r-normal-*-%d-*-*-*-*-*-*-*", "-adobe-helvetica-medium-r-normal-*-%d-*-*-*-*-*-*-*,-*-fixed-medium-r-normal-*-%d-*-*-*-*-*-*-*" } }, { "Helvetica-Bold", { "Helvetica-Bold", "GothicBBB-Medium" }, /* ↠変更点 */ { "-adobe-helvetica-bold-r-normal-*-%d-*-*-*-*-*-*-*,-*-mincho-bold-r-normal-*-%d-*-*-*-*-*-*-*", "-adobe-helvetica-bold-r-normal-*-%d-*-*-*-*-*-*-*,-*-fixed-bold-r-normal-*-%d-*-*-*-*-*-*-*" } },
ã“ã®ã‚ˆã†ã«æ§‹é€ を変更ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ã€EPS出力時ã«ãŠã‘ã‚‹ãƒ•ã‚©ãƒ³ãƒˆã®æŒ‡å®šã‚’ 複数æŒãŸã›ã¾ã—ãŸã€‚ã“れを利用ã—ã¦å®Ÿéš›ã«æ—¥æœ¬èªžãƒ•ォントã¨asciiæ–‡å—フォントを 切りæ›ãˆã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯æ¬¡ã«è¿°ã¹ã‚‹ã€‚
EPS出力ã«ã¤ã„ã¦ã®å‡¦ç†ã®å…¨ã¦ã¯ã€app/render_eps.c
ã®ä¸ã«
書ã‹ã‚Œã¦ã„る。ã“ã®set_font関数
ã«æ¬¡ã®ã‚ˆã†ãªä»•掛をã„れる。
str = font_get_psfontname(font)[0]; if(strcmp(str, "Ryumin-Light")==0||strcmp(str, "GothicBBB-Medium")==0) /* when using the EUC-JP Charset, */ fprintf(renderer->file, "/%s-EUC-H ff %f scf sf\n", str, (double)height); else fprintf(renderer->file, "/%s-latin1 ff %f scf sf\n", str, (double)height); }
ã•らã«äºŒã¤ç›®ã®PSフォントåã«å¯¾å¿œã™ã‚‹set_mbfont関数
を作る。
ã»ã¨ã‚“ã©set_font関数
ã§ä¸€ç®‡æ‰€ã ã‘é•ã†ã€‚
str = font_get_psfontname(font)[1]; if(strcmp(str, "Ryumin-Light")==0||strcmp(str, "GothicBBB-Medium")==0) /* when using the EUC-JP Charset, */ fprintf(renderer->file, "/%s-EUC-H ff %f scf sf\n", str, (double)height); else fprintf(renderer->file, "/%s-latin1 ff %f scf sf\n", str, (double)height); }
ã“れã ã‘ã®æ©Ÿèƒ½è¿½åŠ ã§ã€æ—¥æœ¬èªžã‚’表示ã™ã‚‹ã®ã«ã¯å分ã«ãªã‚‹ã€‚ã‚ã¨ã¯ é©åˆ‡ã«ã“ã®é–¢æ•°ã‚’呼ã¶ã ã‘。
ãŸã¨ãˆã°ã€Œãƒ†ã‚¹ãƒˆtestã€ã¨ã„ã†æ–‡å—列ãŒã‚ã£ãŸå ´åˆã«ã€ã€Œãƒˆtã€ã®äºŒã¤ã®æ–‡å—ã® é–“ãŒå¢ƒç•Œã«ãªã‚‹ã€‚ã“ã“ã§æ–‡å—を分割ã—ã¦å‡¦ç†ã‚’分ã‘ãªã‘れã°ãªã‚‰ãªã„。 ã“ã®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã¯ä½•も考ãˆãšã«ã€æ£æ•°ã§ãªã‘れã°EUCã ã¨èªè˜ã—ã¦ã„る。
以å‰ã¯ä½•も考ãˆãªã•ã™ãŽã¦ã€æ–‡å—ã®å¢ƒç•Œã‚’次ã®ã‚ˆã†ã«èªè˜ã—ã¦ã„ãŸã€‚
ã—ã‹ã—ã“ã‚Œã¯æ¬¡ã®ã‚ˆã†ãªã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã§ç½®ãæ›ãˆã‚‹äº‹ãŒã§ãる。
ãªã‚“ã‹é ãŒæ‚ªãã¦å«Œã«ãªã‚Šã¾ã™ãã€ä½•ã‚„ã£ã¦ã‚“ã ã‹ã€‚
ã„ã¥ã‚Œã«ã—ã¦ã‚‚ã€å¢ƒç•Œãªã‚‰é©åˆ‡ãªset_font関数
ã‹
set_mbfont関数
を呼んã§ã‚ã’ã¾ã™ã€‚ãれã‹ã‚‰ã€æ™®é€šã«
draw_string関数
を呼んã§ã‚ã’ã¾ã—ょã†ã€‚
ã“ã®äºŒã¤ã®é–¢æ•°ã¯ä¸»ã«app/render_eps.cã®äº‹ã‚’指ã—ã¦ã„ã¾ã™ãŒã€ ãŠãŠã‚‚ã¨ã¯ã€lib/render.hã§ãƒ—ãƒãƒˆã‚¿ã‚¤ãƒ—ãŒå®£è¨€ã•れã¦ã„ã¾ã™ã€‚ C言語をC++風ã«ä½¿ã£ã¦ã„ã‚‹ã®ã§ã€ã‚ã‹ã‚Šã¥ã‚‰ã„ã‹ã‚‚ã—れã¾ã›ã‚“ã。
ã“ã®äºŒã¤ã®é–¢æ•°ã¯å¤§æŠµä¸€ç·’ã«ä½¿ã‚れã¦ã„ã¾ã™ã€‚ãれãªã‚‰ã€é¢å€’ãªå‡¦ç†ã‚’
全部ã®draw_string関数
を呼ã³ã ã—ã¦ã„る所ã«è¿½åŠ ã—ãªãã¦ã‚‚ã€
app/render_eps.cã®draw_string関数
を変更ã—ã¦
set_font関数
をdraw_string関数
ã®ä¸ã«éš ã—ã¦
ã—ã¾ãˆã°ã„ã„ã‚“ã˜ã‚ƒãªã„ã®ã‹ãªã¨æ€ã„ã¾ã—ãŸã€‚
後ã«ãªã£ã¦draw_string関数以外ã§ã‚‚set_font関数を実行ã™ã‚‹å¿…è¦ã®ã‚ã‚‹ 関数ãŒã‚ã‚‹ã“ã¨ãŒç™ºè¦šã—ã¦ãƒã‚°ã‚’潜ã¾ã›ã‚‹çµæžœã«ãªã‚Šã¾ã—ãŸã€‚
lib/text.c
ãªã©ã§ã¯ä¸€ã€…テã‚ストを出力ã™ã‚‹ã®ã«æ¬¡ã®ã‚ˆã†ãª
手法をå–ã£ã¦ã„ã¾ã—ãŸã€‚
void text_draw(Text *text, Renderer *renderer) { ...çœç•¥ renderer->ops->set_font(renderer, text->font, text->height); pos = text->position; for (i=0;i<text->numlines;i++) { renderer->ops->draw_string(renderer, text->line[i], &pos, text->alignment, &text->color); pos.y += text->height; } ...çœç•¥ }
日本語化ã®ãŸã‚ã«ä½œã£ãŸãƒ‘ッãƒã¯ã€EPSã®æ™‚ã«ãƒ•ォントã®è¨å®šã‚’切り替ãˆã‚‹
å¿…è¦ãŒã‚ã‚‹ãŸã‚ã«set_mbfont()
ã‚’æ–°ãŸã«ä½œã‚Šã¾ã—ãŸãŒã€ãã†ã„ã†å‡¦ç†ã¯
draw_string()
ã®ä¸ã«é–‰ã˜è¾¼ã‚ã¦ã—ã¾ãˆã°ã‚ˆã„ã®ã§ã¯ãªã„ã§ã—ょã†ã‹ã€‚
ãªãœã€ã“ã‚“ãªäº‹ã‚’ã™ã‚‹ã®ã‹ã¨ã„ãˆã°ã€UMLã®ãƒ€ã‚¤ã‚¢ã‚°ãƒ©ãƒ 全部ã«
ASCIIã¨EUCã®å¢ƒç•Œã‚’判æ–ã•ã›ã¦ã€ãƒ•ォントを切り替ãˆã•ã›ã‚‹ã®ãŒé¢å€’ã ã‹ã‚‰ã€‚
lib/text.c
ã ã‘ã§ã‚‚嫌ã«ãªã£ã¦ãる作æ¥ã‚’ã€ã“れ以外ã®
独自ã«ãƒ†ã‚ã‚¹ãƒˆé ˜åŸŸã‚’æç”»ã•ã›ã¦ã„る部分ã€å…¨éƒ¨ã«ã™ã‚‹ãªã‚“ã¦å†—談ã§ã¯ãªã„。
ãã†ã„ã†ã‚ã‘ã§ã€å¾Œã‹ã‚‰ã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆãŒè¿½åŠ ã•れãŸå ´åˆã®äº‹ã‚’ 考ãˆã¦å¤‰æ›´ã®ã»ã¨ã‚“ã©ã¯ã€renderオブジェクトå´ã§ã™ã‚‹äº‹ã«ã—ã¾ã—ãŸã€‚ 変更ã™ã‚‹ã¨ä¸Šè¨˜ã®ãƒ—ãƒã‚°ãƒ©ãƒ ã¯æ¬¡ã®ã‚ˆã†ãªå½¢ã«ãªã‚Šã¾ã™ã€‚
void text_draw(Text *text, Renderer *renderer) { ...çœç•¥ pos = text->position; /* modified only this loop */ for (i=0;i<text->numlines;i++) { renderer->ops->draw_mbstring(renderer, text->line[i], &pos, text->alignment, &text->color, text->font, text->height); pos.y += text->height; } ...çœç•¥ }
æ–°ãŸã«draw_mbstring関数を作りã¾ã—ãŸãŒã€å®Ÿéš›ã¯draw_string関数 を変更ã—ã¦ã‚‚良ã„ã‚ã‘ã§ã™ã€‚ãŸã ã—ä»–ã®äººãŒä½œã£ãŸæ–°ã—ã„コンãƒãƒ¼ãƒãƒ³ãƒˆã§ ã“ã®ãƒ—ãƒãƒˆã‚¿ã‚¤ãƒ—ã«å¾“ã£ã¦ä½¿ã‚ãªã„ã¨ã©ã†ã—よã†ã‚‚ãªã„ã®ã§ã€æ–°ã—ã„関数ã«å¤‰æ›´ã™ã‚‹ æ‰‹é–“ã®æ–¹ã‚’é¸ã³ã¾ã—ãŸã€‚
ã‚‚ã¨ã‚‚ã¨diaã®å†…部ã¯1byteç’°å¢ƒã‚’å‰æã«ã—ãŸã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ãªã®ã§ã€ ã“ã“ã¾ã§ã‚„ã£ã¦æ—¥æœ¬èªžåŒ–(ã‚ã‚よãã°i18n)ã¸ã®å¯¾å¿œã‚’å–ã‚‹ãŸã‚㮠土å°ãŒã§ããŸã¨ã„ã£ãŸæ„Ÿã˜ã§ã™ã€‚
rubyãªã©ã§ä½¿ã‚れã¦ã„る手法を使ã£ã¦2byteãªæ–‡å—ã‹ã©ã†ã‹åˆ¤å®šã™ã‚‹æ–¹æ³•ã® æ–¹ãŒã‚ã‹ã‚Šã‚„ã™ã„ã®ã§ã¯ãªã„ã‹ãªã¨æ€ã†ã€‚時間ãŒå–れãŸã‚‰ã‚ªãƒªã‚¸ãƒŠãƒ«ã®ã‚½ãƒ¼ã‚¹ã« å¤‰æ›´ã‚’åŠ ãˆã¦ã¿ã¾ã—ょã†ã€‚