フォントサイズ20 送り48 べた組
...
@author ...
package
{
[SWF(width="465", height="465", backgroundColor="0xffffff", frameRate="0")]
import flash.display.Shape;
import flash.display.Sprite;
import flash.geom.Rectangle;
import flash.text.engine.EastAsianJustifier;
import flash.text.engine.ElementFormat;
import flash.text.engine.FontDescription;
import flash.text.engine.FontMetrics;
import flash.text.engine.TextBlock;
import flash.text.engine.TextBaseline;
import flash.text.engine.LineJustification;
import flash.text.engine.TextElement;
import flash.text.engine.TextLine;
import flash.text.engine.TextRotation;
import flash.text.engine.RenderingMode;
import flash.system.Capabilities;
/**
* ...
* @author ...
*/
public class TextEngineSample003 extends Sprite
{
private var grid:Shape;
private var screen:Sprite;
public function TextEngineSample003()
{
grid = new Shape();
grid.graphics.lineStyle(1, 0xA0EBF3);
GraphicsUtils.drawGrid(grid.graphics, new Rectangle(0, 0, 451, 451), 12, Vector.<Number>([2.5,2.5]));
GraphicsUtils.drawGrid(grid.graphics, new Rectangle(0, 0, 451, 451), 24);
addChild(grid);
addChild(screen = new Sprite());
grid.x = screen.x = 5;
grid.y = screen.y = 5;
var japanese:String =
"私(わたくし)はその人を常に先生と呼んでいた。だからここでもただ先生と書くだけで本名は打ち明けない。" +
"これは世間を憚(はば)かる遠慮というよりも、その方が私にとって自然だからである。私はその人の記憶を" +
"呼び起すごとに、すぐ「先生」といいたくなる。筆を執(と)っても心持は同じ事である。よそよそしい頭文字" +
"(かしらもじ)などはとても使う気にならない。\n" +
"私が先生と知り合いになったのは鎌倉(かまくら)である。その時私はまだ若々しい書生であった。暑中休暇" +
"を利用して海水浴に行った友達からぜひ来いという端書(はがき)を受け取ったので、私は多少の金を工面" +
"(くめん)して、出掛ける事にした。私は金の工面に二(に)、三日(さんち)を費やした。ところが私が鎌倉に着" +
"いて三日と経(た)たないうちに、私を呼び寄せた友達は、急に国元から帰れという電報を受け取った。電報に" +
"は母が病気だからと断ってあったけれども友達はそれを信じなかった。友達はかねてから国元にいる親たちに勧" +
"(すす)まない結婚を強(し)いられていた。彼は現代の習慣からいうと結婚するにはあまり年が若過ぎた。それ" +
"に肝心(かんじん)の当人が気に入らなかった。それで夏休みに当然帰るべきところを、わざと避けて東京の近く" +
"で遊んでいたのである。彼は電報を私に見せてどうしようと相談をした。私にはどうしていいか分らなかった。け" +
"れども実際彼の母が病気であるとすれば彼は固(もと)より帰るべきはずであった。それで彼はとうとう帰る事に" +
"なった。せっかく来た私は一人取り残された。\n" +
"学校の授業が始まるにはまだ大分(だいぶ)日数(ひかず)があるので鎌倉におってもよし、帰ってもよいという境" +
"遇にいた私は、当分元の宿に留(と)まる覚悟をした。友達は中国のある資産家の息子(むすこ)で金に不自由" +
"のない男であったけれども、学校が学校なのと年が年なので、生活の程度は私とそう変りもしなかった。したがって" +
"一人(ひとり)ぼっちになった私は別に恰好(かっこう)な宿を探す面倒ももたなかったのである。\n" +
"宿は鎌倉でも辺鄙(へんぴ)な方角にあった。玉突(たまつ)きだのアイスクリームだのというハイカラなものには長い" +
"畷(なわて)を一つ越さなければ手が届かなかった。車で行っても二十銭は取られた。けれども個人の別荘はそここ" +
"こにいくつでも建てられていた。それに海へはごく近いので海水浴をやるには至極便利な地位を占めていた。\n" +
"私は毎日海へはいりに出掛けた。古い燻(くす)ぶり返った藁葺(わらぶき)の間(あいだ)を通り抜けて磯(いそ)" +
"へ下りると、この辺(へん)にこれほどの都会人種が住んでいるかと思うほど、避暑に来た男や女で砂の上が動い" +
"ていた。ある時は海の中が銭湯(せんとう)のように黒い頭でごちゃごちゃしている事もあった。その中に知った人を一" +
"人ももたない私も、こういう賑(にぎ)やかな景色の中に裹(つつ)まれて、砂の上に寝(ね)そべってみたり、膝頭(ひ" +
"ざがしら)を波に打たしてそこいらを跳(は)ね廻(まわ)るのは愉快であった。\n" +
"私は実に先生をこの雑沓(ざっとう)の間(あいだ)に見付け出したのである。その時海岸には掛茶屋(かけぢゃや)" +
"が二軒あった。私はふとした機会(はずみ)からその一軒の方に行き慣(な)れていた。長谷辺(はせへん)に大きな" +
"別荘を構えている人と違って、各自(めいめい)に専有の着換場(きがえば)を拵(こしら)えていないここいらの避暑" +
"客には、ぜひともこうした共同着換所といった風(ふう)なものが必要なのであった。彼らはここで茶を飲み、ここで休" +
"息する外(ほか)に、ここで海水着を洗濯させたり、ここで鹹(しお)はゆい身体(からだ)を清めたり、ここへ帽子や傘" +
"(かさ)を預けたりするのである。海水着を持たない私にも持物を盗まれる恐れはあったので、私は海へはいるたびに" +
"その茶屋へ一切(いっさい)を脱(ぬ)ぎ棄(す)てる事にしていた。";
var textBlock:TextBlock = new TextBlock();
var font:FontDescription = new FontDescription();
//font.renderingMode = RenderingMode.CFF;
//コンマ区切りで複数のフォントをしていできる。
//ビットマップフォントやオープンタイプのフォントは使用できないらしい
//最初に一致したものを採用する。
font.fontName = "恋文ペン字,みかちゃん,小塚ゴシック Pro M,HG教科書体";
var format:ElementFormat = new ElementFormat(font);
format.fontSize = 20;
format.locale = "ja"; //どんな効果があるかは不明
format.trackingLeft = 2;//文字間隔左 トラッキング
format.trackingRight = 2;//文字間隔右 トラッキング
format.color = 0x222222;
var fmat:FontMetrics = format.getFontMetrics();
textBlock.baselineZero = TextBaseline.DESCENT;
textBlock.content = new TextElement(japanese, format);
var previousLine:TextLine = null;
var textLine:TextLine;
screen.graphics.lineStyle(1, 0xff0000);
var linePosition:Number = 24;
while (true) {
textLine = textBlock.createTextLine(previousLine, 450);
if (textLine == null)
break;
textLine.y = linePosition;
textLine.x = 0;
linePosition += 48;
screen.addChild(textLine);
previousLine = textLine;
}
}
}
}
import flash.display.Graphics;
import flash.geom.Point;
import flash.geom.Rectangle;
class GraphicsUtils {
public function GraphicsUtils() {
;
}
public static function drawGrid(g:Graphics, rect:Rectangle, size:Number, pattern:Vector.<Number> = null):void {
var i:Number;
var limitW:Number;
var limitH:Number;
limitW = rect.x + rect.width;
limitH = rect.y + rect.height;
if (pattern == null) {
i = rect.y;
while (i < limitH) {
g.moveTo(rect.x, i);
g.lineTo(limitW, i);
i += size;
}
i = rect.x;
while ( i < limitW) {
g.moveTo(i, rect.y);
g.lineTo(i, limitH);
i += size;
}
}else {
i = rect.y;
while (i < limitH) {
drawDotLine(g, rect.x, i, limitW, i, pattern);
i += size;
}
i = rect.x;
while (i < limitW) {
drawDotLine(g, i, rect.y, i, limitH, pattern);
i += size;
}
}
}
public static function drawDotLine(g:Graphics, fromX:Number, fromY:Number, toX:Number, toY:Number, pattern:Vector.<Number>):void {
var i:int;
var n:Number;
var v:Point = new Point(toX - fromX, toY - fromY);
var tmp:Point;
var l:Number = v.length;
var sl:SimpleList = new SimpleList();
var s:Boolean = true;
v.normalize(1);
for (i = 0; i < pattern.length; i++) {
n = pattern[i];
tmp = v.clone();
tmp.normalize(n);
sl.append({v:tmp, length:n});
}
var pos:Point = new Point(fromX, fromY);
var obj:Object;
n = 0;
g.moveTo(pos.x, pos.y);
while (true) {
obj = sl.next();
n += obj.length;
if (n > l) {
pos.x = toX;
pos.y = toY;
s = step(g, pos, s);
break;
}else {
pos.offset(obj.v.x, obj.v.y);
s = step(g, pos, s);
}
}
}
private static function step(g:Graphics, p:Point, s:Boolean):Boolean {
if (s) {
g.lineTo(p.x, p.y);
}else {
g.moveTo(p.x, p.y);
}
return !s;
}
}
class SimpleList {
private var currentElement:ListElement;
private var appendFunc:Function;
public function SimpleList(data:* = null) {
if (data != null) {
_initialize(data);
}else{
appendFunc = _initialize;
}
}
public function append(data:*):void {
appendFunc.call(null, data);
}
public function _initialize(data:*):void {
currentElement = new ListElement(data);
currentElement.next = currentElement;
currentElement.prev = currentElement;
appendFunc = _append;
}
public function _append(data:*):void {
var elem:ListElement = new ListElement(data);
var tmp:ListElement;
tmp = currentElement.next;
currentElement.next = elem;
elem.prev = currentElement;
elem.next = tmp;
tmp.prev = elem;
currentElement = elem;
}
public function current():*{
return currentElement.data;
}
public function next():* {
currentElement = currentElement.next;
return currentElement.data;
}
public function prev():*{
currentElement = currentElement.prev;
return currentElement.data;
}
}
class ListElement {
public var next:ListElement;
public var prev:ListElement;
public var data:*;
public function ListElement(data:*) {
this.data = data;
}
}