Home > Software > Programming Archive

Programming Archive

java.util.concurrent

マルチスレッドで役に立ちそう。この辺の非同期のパターンとかうまく使いこなしたい。

Serializeの罠

当然といえば当然なのですが、よく変更するクラスはSerializeすることは避けたほうが賢明ですね。クラスが変更されると復元できなくなりますから。でもまぁ、今回はおかげでいいアイデアが浮かんだので良しとします。

Javaで装飾文字

ぜんさんから、文字列をShapeに変換すれば影を付けてもアンチエリアスを効かせた文字を描画できると教えていただいたので、Digital Mapで実装してみた装飾文字(影付け)ですが、結構大変だったのでまとめてみました。

アンチエイリアスを有効にした装飾文字の描画

Javaで、白抜き文字や、影をつけた文字にアンチエイリアスをかけるのはなかなか難しいですが、以下の方法で描画できます。

Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
FontRenderContext render = g2.getFontRenderContext();
Font font = new Font("Serif", Font.BOLD, 20);
String text = "Test";
GlyphVector glyph = font.createGlyphVector(render, text);
g2.setStroke(new BasicStroke(3f));
Shape shape = glyph.getOutline(x, y);
g2.setColor(Color.BLACK);
g2.draw(shape);
g2.setColor(Color.WHITE);
g2.fill(shape);

上記のコードは白抜き文字のものですが、色を変えることで影付け文字も描画できます。装飾の量はストロークの幅で変更できます。

詳しく(?)説明すると、まずGlyphVectorを各文字単位でShapeに変換します。次が問題で、文字のShapeをfillで塗りつぶして縁をdrawで描画すれば、輪郭を描画した文字はかけますが、影を白抜き文字を描画すると、明朝文字などはどうしてもつぶれてしまったりして綺麗に描画できません。そこで、まず太めのStrokeを設定してShapeをdrawして縁を描画します。次に、Shapeで文字を塗りつぶします(塗りつぶしにはStrokeは適用されません)。そうすると、太くした分だけ、描画した縁は塗りつぶした領域からはみだしています。ここが影などの装飾部になり、文字はそのうえに塗りつぶしているので、特に文字をまったく変形させることなく描画できるわけです。ただし、この方法では、アンチエイリアスをオフにした場合には、文字が読めなくなります。

Flex

ぜんさんからきいたAdobeのFlexを試してみました。

これ、理にかなっていていいと思いました。

ちなみにFlex SDKは無償で利用できるようです。
ダウンロードするにはユーザ登録が必要でしたが。
(Debianでは動かないようです。)

とりあえず、SDKだけ使ってみた感想、コンパイルが遅い。(こんなもん?)
まぁ、実行が早ければいいのですけど。

JavaとIntel

Intel CPUでは、メモリに数値データを格納する際にリトル・エンディアン(LITTLE ENDIAN)で記録するが、Javaではシステムによらず、ビッグ・エンディアン(BIG ENDIAN)で記録するらしい。当然、ネイティブのエンディアンで記録した方が速いらしい。ちなみにnioを使えばエンディアンは再設定できる。

ちなみにエンディアンとは、複数バイトのデータ量を持つ数値データを、メモリに格納する時の方式のこと。2バイト以上のデータ量を持つ数値データを記録したり転送するときには1バイトごとに分割するわけで、その際の記録/転送を行なう順番をエンディアンというらしい。メモメモ。

Home > Software > Programming Archive

Feed

feeds

Meta

Return to page top