• R/O
  • SSH
  • HTTPS

qrobosdk: コミット


コミットメタ情報

リビジョン1822 (tree)
日時2010-05-12 01:16:40
作者satofumi

ログメッセージ

TextRubiFadeSurface.cpp is implemented.

変更サマリ

差分

--- trunk/libs/lua/Makefile (revision 1821)
+++ trunk/libs/lua/Makefile (revision 1822)
@@ -85,11 +85,11 @@
8585 luabindGui.o: ../gui/EventUtils.h ../gui/LayerManager.h
8686 luabindGui.o: ../gui/LayerInterface.h ../gui/Layer.h ../gui/Font.h
8787 luabindGui.o: ../common/Color.h ../gui/TextSurface.h ../gui/Surface.h
88-luabindGui.o: ../gui/TextFadeSurface.h ../gui/ColorSurface.h
89-luabindGui.o: ../gui/FillSurface.h ../gui/ImageSurface.h
90-luabindGui.o: ../gui/MultiSurface.h ../gui/Label.h ../gui/Component.h
91-luabindGui.o: ../gui/Button.h ../gui/Menu.h ../gui/ChatMessage.h
92-luabindGui.o: ../gui/CallbackEvent.h ../gui/AlignUtils.h
88+luabindGui.o: ../gui/TextFadeSurface.h ../gui/TextRubiFadeSurface.h
89+luabindGui.o: ../gui/ColorSurface.h ../gui/FillSurface.h
90+luabindGui.o: ../gui/ImageSurface.h ../gui/MultiSurface.h ../gui/Label.h
91+luabindGui.o: ../gui/Component.h ../gui/Button.h ../gui/Menu.h
92+luabindGui.o: ../gui/ChatMessage.h ../gui/CallbackEvent.h ../gui/AlignUtils.h
9393 luabindInit.o: luabindInit.h LuaHandler.h ../system/log_printf.h
9494 luabindInput.o: luabindInput.h ../input/convertToRoman.h
9595 luabindInput.o: ../input/convertToJp.h ../input/Utf8.h ../input/utf8_string.h
--- trunk/libs/gui/TextRubiFadeSurface.cpp (revision 1821)
+++ trunk/libs/gui/TextRubiFadeSurface.cpp (revision 1822)
@@ -5,32 +5,145 @@
55 \author Satofumi KAMIMURA
66
77 $Id$
8+
9+ \todo ルビの指定を任意にして、TextFadeSurface を置き換える
10+ \todo プロポーショナル・フォント以外でも動作するようにする
811 */
912
1013 #include "TextRubiFadeSurface.h"
1114 #include "TextSurface.h"
15+#include "TextFadeSurface.h"
1216 #include "Font.h"
17+#include "Utf8.h"
18+#include "rubi_parse.h"
19+#include <vector>
1320
1421 using namespace qrk;
22+using namespace std;
1523
1624
25+namespace
26+{
27+ enum {
28+ FadeWidthPixel = 200,
29+ };
30+
31+
32+ typedef vector<TextSurface*> Surfaces;
33+}
34+
35+
1736 struct TextRubiFadeSurface::pImpl
1837 {
38+ TextFadeSurface text_;
39+ Surfaces rubi_text_;
40+ vector<int> rubi_x_;
1941 Rect<long> rect_;
42+ int rubi_pixel_size_;
43+ float base_alpha_;
44+ size_t percent_;
2045
2146
2247 pImpl(const Font& font, const char* text,
2348 const Font& rubi_font, const char* kana_only_text)
49+ : text_(font, text),
50+ rect_(0, 0, text_.rect().w, text_.rect().h + rubi_font.pixelSize()),
51+ rubi_pixel_size_(rubi_font.pixelSize()), base_alpha_(1.0),
52+ percent_(100)
2453 {
25- (void)font;
26- (void)text;
27- (void)rubi_font;
28- (void)kana_only_text;
54+ vector<rubi_t> rubi_positions;
55+ rubi_parse(rubi_positions, text, kana_only_text);
2956
30- // !!!
57+ // ルビの文字サーフェスを作成
58+ int kanji_pixel_size = font.pixelSize();
59+ Utf8 kana_only(kana_only_text);
60+ for (vector<rubi_t>::const_iterator it = rubi_positions.begin();
61+ it != rubi_positions.end(); ++it) {
3162
32- // !!! rect_ の初期化
63+ int kanji_size = kanji_pixel_size * it->kanji_size;
64+ int rubi_size = rubi_pixel_size_ * it->rubi_size;
65+ int rubi_space = max(kanji_size - rubi_size, 0);
66+ int rubi_space_each =
67+ (it->rubi_size > 1) ? rubi_space / it->rubi_size : 0;
68+ rubi_size += it->rubi_size * rubi_space_each;
69+ int x_offset = (kanji_size - rubi_size) / 2;
70+ int kanji_base_x =
71+ kanji_pixel_size * it->kanji_first;
72+
73+ for (size_t i = 0; i < it->rubi_size; ++i) {
74+ const string rubi_ch =
75+ kana_only.substr(it->rubi_first + i, 1).toStdString();
76+ TextSurface* surface =
77+ new TextSurface(rubi_font, rubi_ch.c_str());
78+ rubi_text_.push_back(surface);
79+
80+ // 漢字の位置の対応する位置に、ルビの文字を配置する
81+ int x = kanji_base_x + x_offset
82+ + ((rubi_pixel_size_ + rubi_space_each) * i);
83+ rubi_x_.push_back(x);
84+ }
85+ }
3386 }
87+
88+
89+ ~pImpl(void)
90+ {
91+ for (Surfaces::iterator it = rubi_text_.begin();
92+ it != rubi_text_.end(); ++it) {
93+ delete *it;
94+ }
95+ }
96+
97+
98+ void setAlpha(void)
99+ {
100+ text_.setFadePercent(percent_);
101+
102+ int moved_width =
103+ static_cast<int>((rect_.w + FadeWidthPixel) * percent_ / 100.0);
104+ int first = -FadeWidthPixel + moved_width;
105+ int last = 0 + moved_width;
106+
107+ size_t index = 0;
108+ for (Surfaces::iterator it = rubi_text_.begin();
109+ it != rubi_text_.end(); ++it, ++index) {
110+ Surface* surface = *it;
111+
112+ float alpha = 1.0;
113+ int x = rubi_x_[index];
114+ if (x > last) {
115+ alpha = 0.0;
116+ } else if (x <= first) {
117+ alpha = 1.0;
118+ } else {
119+ alpha = (last - x) / static_cast<float>(FadeWidthPixel);
120+ }
121+ surface->setAlpha(alpha * base_alpha_);
122+ x += surface->rect().w;
123+ }
124+ }
125+
126+
127+ void draw(const Rect<long>* src, const Rect<long>* dest)
128+ {
129+ if (! text_.isValid()) {
130+ return;
131+ }
132+ Rect<long> sub_dest(*dest);
133+ sub_dest.y += rubi_pixel_size_;
134+ text_.draw(src, &sub_dest);
135+
136+ sub_dest.y -= rubi_pixel_size_;
137+ int index = 0;
138+ for (Surfaces::iterator it = rubi_text_.begin();
139+ it != rubi_text_.end(); ++it, ++index) {
140+ Surface* surface = *it;
141+ sub_dest.w = surface->rect().w;
142+ sub_dest.h = surface->rect().h;
143+ sub_dest.x = dest->x + rubi_x_[index];
144+ surface->draw(src, &sub_dest);
145+ }
146+ }
34147 };
35148
36149
@@ -49,9 +162,8 @@
49162
50163 bool TextRubiFadeSurface::isValid(void) const
51164 {
52- // !!! フォントがなければ、false になるはず
53- // !!! 最初の surfaces_ の状態で判断してもよい
54- return true;
165+ // ルビは表示されなくても valid だとみなす
166+ return pimpl->text_.isValid();
55167 }
56168
57169
@@ -63,16 +175,14 @@
63175
64176 void TextRubiFadeSurface::setAlpha(float alpha)
65177 {
66- (void)alpha;
67- // !!!
178+ pimpl->base_alpha_ = alpha;
179+ pimpl->setAlpha();
68180 }
69181
70182
71183 float TextRubiFadeSurface::alpha(void) const
72184 {
73- //pimpl->alpha_;
74- // !!!
75- return 1.0;
185+ return pimpl->base_alpha_;
76186 }
77187
78188
@@ -85,14 +195,12 @@
85195
86196 void TextRubiFadeSurface::draw(const Rect<long>* src, const Rect<long>* dest)
87197 {
88- (void)src;
89- (void)dest;
90- // !!!
198+ pimpl->draw(src, dest);
91199 }
92200
93201
94202 void TextRubiFadeSurface::setFadePercent(size_t percent)
95203 {
96- (void)percent;
97- // !!!
204+ pimpl->percent_ = min(percent, static_cast<size_t>(100));
205+ pimpl->setAlpha();
98206 }
--- trunk/libs/gui/Makefile (revision 1821)
+++ trunk/libs/gui/Makefile (revision 1822)
@@ -120,6 +120,8 @@
120120 TextInput.o: TextInput.h Event.h ../geometry/Point.h LayerManager.h
121121 TextInput.o: LayerInterface.h CallbackEvent.h ../geometry/Rect.h
122122 TextRubiFadeSurface.o: TextRubiFadeSurface.h Surface.h ../geometry/Rect.h
123-TextRubiFadeSurface.o: TextSurface.h Font.h ../common/Color.h
123+TextRubiFadeSurface.o: TextSurface.h TextFadeSurface.h Font.h
124+TextRubiFadeSurface.o: ../common/Color.h ../input/Utf8.h
125+TextRubiFadeSurface.o: ../input/rubi_parse.h
124126 TextSurface.o: TextSurface.h Surface.h ../geometry/Rect.h Font.h
125127 TextSurface.o: ../common/Color.h SDL_GL_Texture.h
--- trunk/libs/gui/samples/rubiDraw.cpp (nonexistent)
+++ trunk/libs/gui/samples/rubiDraw.cpp (revision 1822)
@@ -0,0 +1,45 @@
1+/*!
2+ \example rubiDraw.cpp
3+
4+ \author Satofumi KAMIMURA
5+
6+ $Id$
7+*/
8+
9+#include "Screen.h"
10+#include "Font.h"
11+#include "TextRubiFadeSurface.h"
12+
13+using namespace qrk;
14+
15+
16+int main(int argc, char *argv[])
17+{
18+ Screen screen;
19+ screen.show(SDL_OPENGL);
20+
21+ // フォントの読み出し
22+ const char* font_file = (argc <= 1) ? "font.ttf" : argv[1];
23+ Font font(font_file, 32);
24+ Font rubi_font(font_file, 16);
25+
26+ // ルビを含む文字列の描画
27+ TextRubiFadeSurface surface(font, "今日は、卵を食べました。",
28+ rubi_font, "きょうは、たまごをたべました。");
29+ Rect<long> dest_rect = surface.rect();
30+ dest_rect.x += 100;
31+
32+ // 描画した文字列のをフェードさせる
33+ for (size_t j = 0; j < 1; ++j) {
34+ for (size_t i = 0; i <= 100; ++i) {
35+ screen.clear();
36+ surface.setFadePercent(i);
37+ surface.draw(NULL, &dest_rect);
38+ SDL_GL_SwapBuffers();
39+ SDL_Delay(10);
40+ }
41+ }
42+ SDL_Delay(100);
43+
44+ return 0;
45+}
Added: svn:keywords
## -0,0 +1 ##
+Id
\ No newline at end of property
--- trunk/libs/gui/samples/Makefile (revision 1821)
+++ trunk/libs/gui/samples/Makefile (revision 1822)
@@ -12,6 +12,7 @@
1212
1313 # Target
1414 TARGET = \
15+ rubiDraw \
1516 canvasDraw \
1617 fadeText \
1718 simpleScreen \
@@ -43,7 +44,7 @@
4344 $(REQUIRE_LIBS) :
4445 cd $(@D)/ && $(MAKE) $(@F)
4546
46-PROGRAMS = drawText handleEvent inputDraw chatMessageSample rectMove buttonSample menuSample drawColorSurface fadeText canvasDraw
47+PROGRAMS = drawText handleEvent inputDraw chatMessageSample rectMove buttonSample menuSample drawColorSurface fadeText canvasDraw rubiDraw
4748 $(PROGRAMS) : $(REQUIRE_LIBS)
4849
4950 # DO NOT DELETE
@@ -86,3 +87,5 @@
8687 rectMove.o: ../../geometry/Point.h ../LayerManager.h ../LayerInterface.h
8788 rectMove.o: ../Layer.h ../CallbackEvent.h ../Event.h ../EventUtils.h
8889 rectMove.o: ../../system/delay.h
90+rubiDraw.o: ../Screen.h ../../geometry/Rect.h ../Font.h ../../common/Color.h
91+rubiDraw.o: ../TextRubiFadeSurface.h ../Surface.h
--- trunk/libs/input/rubi_parse.h (revision 1821)
+++ trunk/libs/input/rubi_parse.h (revision 1822)
@@ -25,7 +25,7 @@
2525 } rubi_t;
2626
2727
28- extern bool parse_rubi(std::vector<rubi_t>& rubi_positions,
28+ extern bool rubi_parse(std::vector<rubi_t>& rubi_positions,
2929 const char* text, const char* kana_only);
3030 }
3131
--- trunk/libs/input/rubi_parse.cpp (revision 1821)
+++ trunk/libs/input/rubi_parse.cpp (revision 1822)
@@ -12,6 +12,8 @@
1212 #include "rubi_parse.h"
1313 #include "Utf8.h"
1414
15+#include <cstdio>
16+
1517 using namespace qrk;
1618 using namespace std;
1719
@@ -116,8 +118,8 @@
116118 kana_offset + same_size,
117119 rubi_size));
118120
119- size_t next_kanji_offset = kanji_offset + kana_index + 1;
120- size_t next_kana_offset = kana_offset + same_size + rubi_size + 1;
121+ size_t next_kanji_offset = kana_index + 1;
122+ size_t next_kana_offset = same_size + rubi_size + 1;
121123 const string next_kanji =
122124 kanji.substr(next_kanji_offset,
123125 kanji.size() - next_kanji_offset).toStdString();
@@ -125,13 +127,13 @@
125127 kana.substr(next_kana_offset,
126128 kana.size() - next_kana_offset).toStdString();
127129 return parse(rubi_positions,
128- next_kanji.c_str(), next_kanji_offset,
129- next_kana.c_str(), next_kana_offset);
130+ next_kanji.c_str(), kanji_offset + next_kanji_offset,
131+ next_kana.c_str(), kana_offset + next_kana_offset);
130132 }
131133 }
132134
133135
134-bool qrk::parse_rubi(std::vector<rubi_t>& rubi_positions,
136+bool qrk::rubi_parse(std::vector<rubi_t>& rubi_positions,
135137 const char* text, const char* kana_only)
136138 {
137139 return parse(rubi_positions, text, 0, kana_only, 0);
--- trunk/libs/input/TestRubiParse.cpp (revision 1821)
+++ trunk/libs/input/TestRubiParse.cpp (revision 1822)
@@ -22,11 +22,11 @@
2222 vector<rubi_t> rubi;
2323
2424 rubi.clear();
25- parse_rubi(rubi, "む", "む");
25+ rubi_parse(rubi, "む", "む");
2626 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), rubi.size());
2727
2828 rubi.clear();
29- parse_rubi(rubi, "無", "む");
29+ rubi_parse(rubi, "無", "む");
3030 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rubi.size());
3131 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), rubi[0].kanji_first);
3232 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rubi[0].kanji_size);
@@ -34,7 +34,7 @@
3434 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rubi[0].rubi_size);
3535
3636 rubi.clear();
37- parse_rubi(rubi, "無し", "なし");
37+ rubi_parse(rubi, "無し", "なし");
3838 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rubi.size());
3939 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), rubi[0].kanji_first);
4040 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rubi[0].kanji_size);
@@ -42,7 +42,7 @@
4242 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rubi[0].rubi_size);
4343
4444 rubi.clear();
45- parse_rubi(rubi, "よい水", "よいみず");
45+ rubi_parse(rubi, "よい水", "よいみず");
4646 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rubi.size());
4747 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), rubi[0].kanji_first);
4848 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rubi[0].kanji_size);
@@ -50,7 +50,7 @@
5050 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), rubi[0].rubi_size);
5151
5252 rubi.clear();
53- parse_rubi(rubi, "よい水だ", "よいみずだ");
53+ rubi_parse(rubi, "よい水だ", "よいみずだ");
5454 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rubi.size());
5555 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), rubi[0].kanji_first);
5656 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rubi[0].kanji_size);
@@ -58,7 +58,7 @@
5858 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), rubi[0].rubi_size);
5959
6060 rubi.clear();
61- parse_rubi(rubi, "秋の田の", "あきのたの");
61+ rubi_parse(rubi, "秋の田の", "あきのたの");
6262 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), rubi.size());
6363 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), rubi[0].kanji_first);
6464 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rubi[0].kanji_size);
@@ -70,7 +70,7 @@
7070 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rubi[1].rubi_size);
7171
7272 rubi.clear();
73- parse_rubi(rubi, "あふ坂の関", "あふさかのせき");
73+ rubi_parse(rubi, "あふ坂の関", "あふさかのせき");
7474 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), rubi.size());
7575 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), rubi[0].kanji_first);
7676 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rubi[0].kanji_size);
@@ -80,4 +80,23 @@
8080 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rubi[1].kanji_size);
8181 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(5), rubi[1].rubi_first);
8282 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), rubi[1].rubi_size);
83+
84+ rubi.clear();
85+ rubi_parse(rubi, "今日は卵を食べました。", "きょうはたまごをたべました。");
86+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), rubi.size());
87+
88+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), rubi[0].kanji_first);
89+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), rubi[0].kanji_size);
90+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), rubi[0].rubi_first);
91+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), rubi[0].rubi_size);
92+
93+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), rubi[1].kanji_first);
94+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rubi[1].kanji_size);
95+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(4), rubi[1].rubi_first);
96+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), rubi[1].rubi_size);
97+
98+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(5), rubi[2].kanji_first);
99+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rubi[2].kanji_size);
100+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(8), rubi[2].rubi_first);
101+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rubi[2].rubi_size);
83102 }
--- trunk/libs/input/Makefile (revision 1821)
+++ trunk/libs/input/Makefile (revision 1822)
@@ -30,6 +30,7 @@
3030 $(INPUT_LIB)(utf8_string.o) \
3131 $(INPUT_LIB)(convertToJp.o) \
3232 $(INPUT_LIB)(convertToRoman.o) \
33+ $(INPUT_LIB)(rubi_parse.o) \
3334
3435 convertToJp.o : roman_table.h kana_table.h
3536 convertToRoman.o : roman_table.h
旧リポジトリブラウザで表示