Qtopia Shell Bridge Dialog その18 リッチテキスト


 さて、と言うことで 0.6.2で追加(復活)した新(?)機能 リッチテキストについて試してみました。

 そもそも、リッチテキストってなんじゃ?って話もありますが、 QTに於けるリッチテキストとは、XMLのタグ表現で修飾されたテキスト文書のことを指します。某MS-WORDな文書とは関係(最近は無いこともないか)ありません。

 つーか、要は HTMLビューワと言った方が早いかもしれない(笑)。

 ま、百聞は一見に然かず、とりあえずサンプルを作ってみましょう。

# richtxt.sh
#!/bin/bash

# Define argument
export QSHDLG_APP=richtxt
INPUT=/var/spool/qshdlg/input_${QSHDLG_APP}
OUTPUT=/var/spool/qshdlg/output_${QSHDLG_APP}
CONTROL=/var/spool/qshdlg/control_${QSHDLG_APP}

####################################

# Init qshdlg
qshdlg -t "RichText" -c eucJP -N -n -M -s custom -C &
while [ ! -p ${CONTROL} ]
do
	:
done

# echo 'direction(QString,QString)' ViewButton LeftToRight > ${CONTROL}
# echo 'direction(QString,QString)' ViewButton RightToLeft > ${CONTROL}
# echo 'direction(QString,QString)' ViewButton TopToBottom > ${CONTROL}
 echo 'direction(QString,QString)' ViewButton BottomToTop > ${CONTROL}
 echo 'update()' > ${CONTROL}

 echo 'showRich()' > $CONTROL

# echo richtext
 echo 'richtext(QString)' "'<h1 align="center">RichText</h1>'" > $CONTROL
 echo 'richtext(QString)' "'<center>'" > $CONTROL
 echo 'richtext(QString)' "'<hr>'" > $CONTROL
 echo 'richtext(QString)' "'<font color="#ff0000" size="1"> R </font>'" > $CONTROL
 echo 'richtext(QString)' "'<font color="#00ff00" size="3"> G </font>'" > $CONTROL
 echo 'richtext(QString)' "'<font color="#0000ff" size="5"> B </font>'" > $CONTROL
 echo 'richtext(QString)' "'<font color="#ff0000" size="7"> r </font>'" > $CONTROL
 echo 'richtext(QString)' "'<hr>'" > $CONTROL
 echo 'richtext(QString)' "'<img src="/home/zaurus/work/rich.jpg">'" > $CONTROL
 echo 'richtext(QString)' "'<hr>'" > $CONTROL
 echo 'richtext(QString)' "'</center>'" > $CONTROL

# echo OUTPUT PIPE
 echo 'texttype(QString)' "rich" > $CONTROL
 sleep 1

 echo "<h1 align="center">RichText [OUTPUT]</h1>" > $OUTPUT
 echo "<center>" > $OUTPUT
 echo "<hr>" > $OUTPUT
 echo "<font color="#ff0000" size="1"> R </font>" > $OUTPUT
 echo "<font color="#00ff00" size="3"> G </font>" > $OUTPUT
 echo "<font color="#0000ff" size="5"> B </font>" > $OUTPUT
 echo "<font color="#ff0000" size="7"> r </font>" > $OUTPUT
 echo "<hr>" > $OUTPUT
 echo "<img src="/home/zaurus/work/rich.jpg">" > $OUTPUT
 echo "<hr>" > $OUTPUT
 echo "</center>" > $OUTPUT

 echo 'show()' > $CONTROL

 exit 0

リッチテキスト表示


 見ての通り、罫線を引いたり、 IMGタグを用いることで画像の表示も可能です(^^)。

 ざっと試してみた限り、以下のタグが使用出来ることを確認しています。

  • h=見出し文字[ 1〜3 まで]
  • br=改行
  • hr=罫線
  • UL=箇条書き
  • OL=順序付き箇条書き(type指定は算用数字、アルファベットのみ)
  • UL=定義リスト
  • IMG=画像貼付[ JPG,PNG,BMP,GIF(動画GIFは不可) ]
  • BIG=大文字
  • SMALL=小文字
  • FONT=フォント指定 [ color,size(1〜7,+-) ]
  • CENTER=中央揃え
  • BLOCKQUOTE=引用文(字下げ)


 逆に試してみて使えなかったタグは以下の通りです。

  • B=太字[ボールド]
  • S=打ち消し線
  • U=アンダーライン
  • I=イタリック
  • EM=強調
  • STRONG=強調
  • TABLE=テーブル

 使えないタグを記述した場合、単に無効なタグとして処理されるだけで、表示が化けたり、ゴミが出たりはしません。


 また、リッチビューは、通常のメッセージビューでの表示と異なり、ウィンドウの端までテキストが伸びた場合でも、自動的に折り返しは行われません。
 ウィンドウの枠外に文章が伸びた場合は、ウィンドウ下にスクロールバーが現れ、それをスライドさせることで文章を表示させることになります。

 さらに当然と言えば当然なのですが、リッチビューはタグを解釈する処理が加わる分、必然的に通常のメッセージビューよりも処理速度は劣ります。

 実際、どれくらい速度が変わるのか、以下のようなスクリプトで調べてみます。

# mrcmp.sh
#!/bin/bash

# Define argument
export QSHDLG_APP=mrcmp
INPUT=/var/spool/qshdlg/input_${QSHDLG_APP}
OUTPUT=/var/spool/qshdlg/output_${QSHDLG_APP}
CONTROL=/var/spool/qshdlg/control_${QSHDLG_APP}

####################################
window_rich(){

 echo 'hideInput()' > ${CONTROL}
 echo 'hideSelect()' > ${CONTROL}
 echo 'hideReply()' > ${CONTROL}
 echo 'hideRich()' > ${CONTROL}
 echo 'hideMessage()' > ${CONTROL}
 echo 'hideDefault()' > ${CONTROL}

# echo 'direction(QString,QString)' ViewButton LeftToRight > ${CONTROL}
# echo 'direction(QString,QString)' ViewButton RightToLeft > ${CONTROL}
# echo 'direction(QString,QString)' ViewButton TopToBottom > ${CONTROL}
echo 'direction(QString,QString)' ViewButton BottomToTop > ${CONTROL}
echo 'update()' > ${CONTROL}

 echo 'showRich()' > $CONTROL

 count=0
 while [ ! $count -eq 1000 ]
 do
	echo 'richtext(QString)' "a<br>" > $CONTROL
	count=`expr $count + 1`
 done

 echo 'show()' > $CONTROL
}

window_message(){

 echo 'hideInput()' > ${CONTROL}
 echo 'hideSelect()' > ${CONTROL}
 echo 'hideReply()' > ${CONTROL}
 echo 'hideRich()' > ${CONTROL}
 echo 'hideMessage()' > ${CONTROL}
 echo 'hideDefault()' > ${CONTROL}

# echo 'direction(QString,QString)' ViewButton LeftToRight > ${CONTROL}
# echo 'direction(QString,QString)' ViewButton RightToLeft > ${CONTROL}
# echo 'direction(QString,QString)' ViewButton TopToBottom > ${CONTROL}
echo 'direction(QString,QString)' ViewButton BottomToTop > ${CONTROL}
echo 'update()' > ${CONTROL}

 echo 'showMessage()' > $CONTROL

 count=0
 while [ ! $count -eq 1000 ]
 do
	echo 'description(QString)' "a" > $CONTROL
	count=`expr $count + 1`
 done

 echo 'show()' > $CONTROL
}

####################################
# Init qshdlg
qshdlg -t "mrcmp" -c eucJP -N -n -M -s custom -C &
while [ ! -p ${CONTROL} ]
do
	:
done

echo "MRCMP_RESULT" > /home/zaurus/work/result.txt


# test 1

echo 'clearRich()' > $CONTROL
echo 'clear()' > $CONTROL

PTIME_RA1=`date +%s`
window_rich
PTIME_RB1=`date +%s`
PASTTIME_R1=`expr $PTIME_RB1 - $PTIME_RA1`
echo "RTIME1=$PASTTIME_R1" >> /home/zaurus/work/result.txt

echo 'clearRich()' > $CONTROL
echo 'clear()' > $CONTROL

PTIME_MA1=`date +%s`
window_message
PTIME_MB1=`date +%s`
PASTTIME_M1=`expr $PTIME_MB1 - $PTIME_MA1`
echo "MTIME1=$PASTTIME_M1" >> /home/zaurus/work/result.txt


# test 2
echo 'clearRich()' > $CONTROL
echo 'clear()' > $CONTROL
PTIME_MA2=`date +%s`
window_message
PTIME_MB2=`date +%s`
PASTTIME_M2=`expr $PTIME_MB2 - $PTIME_MA2`
echo "MTIME2=$PASTTIME_M2" >> /home/zaurus/work/result.txt

echo 'clearRich()' > $CONTROL
echo 'clear()' > $CONTROL

PTIME_RA2=`date +%s`
window_rich
PTIME_RB2=`date +%s`
PASTTIME_R2=`expr $PTIME_RB2 - $PTIME_RA2`
echo "RTIME2=$PASTTIME_R2" >> /home/zaurus/work/result.txt


# test 3

echo 'clearRich()' > $CONTROL
echo 'clear()' > $CONTROL

PTIME_RA3=`date +%s`
window_rich
PTIME_RB3=`date +%s`
PASTTIME_R3=`expr $PTIME_RB3 - $PTIME_RA3`
echo "RTIME3=$PASTTIME_R3" >> /home/zaurus/work/result.txt

echo 'clearRich()' > $CONTROL
echo 'clear()' > $CONTROL

PTIME_MA3=`date +%s`
window_message
PTIME_MB3=`date +%s`
PASTTIME_M3=`expr $PTIME_MB3 - $PTIME_MA3`
echo "MTIME3=$PASTTIME_M3" >> /home/zaurus/work/result.txt

# test 4
echo 'clearRich()' > $CONTROL
echo 'clear()' > $CONTROL
PTIME_MA4=`date +%s`
window_message
PTIME_MB4=`date +%s`
PASTTIME_M4=`expr $PTIME_MB4 - $PTIME_MA4`
echo "MTIME4=$PASTTIME_M4" >> /home/zaurus/work/result.txt

echo 'clearRich()' > $CONTROL
echo 'clear()' > $CONTROL

PTIME_RA4=`date +%s`
window_rich
PTIME_RB4=`date +%s`
PASTTIME_R4=`expr $PTIME_RB4 - $PTIME_RA4`
echo "RTIME4=$PASTTIME_R4" >> /home/zaurus/work/result.txt


echo 'clearRich()' > $CONTROL
echo 'clear()' > $CONTROL
echo 'reject()' > $CONTROL

exit 0

 単純に同じ文字をそれぞれのビューで1000回描画し、秒単位で時間を計測しています。

 ただ、リッチテキストの場合は、改行コードが付加されないので、br(改行)タグも付加してます。
 バイト換算すれば、この時点でリッチテキストの方が5倍のデータ量となる訳ですが、その前に付加されるqcopメッセージ descripitonと richtextの3文字の差もあります。ですんで、最終的に echoされる文字列全体で見れば 21文字と22文字の差でしかありません。実質、一割も差は無いワケで、統計的には大体同程度のデータ量とみなして良いでしょう。

 さらに、外的要因の影響も考慮し、それぞれについて順番を入れ替え、合計四回の計測を行っています。

 で、結果はこの通り。


MRCMP_RESULT
RTIME1=107
MTIME1=74
MTIME2=40
RTIME2=151
RTIME3=204
MTIME3=92
MTIME4=39
RTIME4=151

 ・・・えーと、何かあんま統計取れてないよーな(^^;)。

 ま、逆に言えば、描画処理に関しては、システムの状態等、外的要因によって大きく左右されるものだと言うことでしょう。
 恐らくは、使用するタグの種類によっても、このへんは大きく結果に差異が出てくるのではないか?と思われます。

 とは言え、回毎の対比でも、最大値と最小値をとった結果でも、総じてメッセージビューの方が一応高速な結果は出てますし、実際、体感的にも描画速度の差異は感じられます。

 折り返しの問題と合わせて、どちらのビューを使うかは、文字通り適材適所ってことになるんじゃないかと思います。