<commit_before>import { Font } from "../../domain/Font";
import { Game } from "../../Game";
import { GlyphLike } from "../../interfaces/GlyphLike";
import { RendererLike } from "../../interfaces/RendererLike";
import { CompositeOperation } from "../../types/CompositeOperation";
import { TextAlign } from "../../types/TextAlign";
import { Util } from "../Util";
import { CacheableE, CacheableEParameterObject } from "./CacheableE";

/**
 * `Label` のコンストラクタに渡すことができるパラメータ。
 * 各メンバの詳細は `Label` の同名メンバの説明を参照すること。
 */
export interface LabelParameterObject extends CacheableEParameterObject {
	/**
	 * 描画する文字列。
	 */
	text: string;

	/**
	 * 描画に利用されるフォント。
	 */
	font: Font;

	/**
	 * フォントサイズ。
	 * 0 以上の数値でなければならない。そうでない場合、動作は不定である。
	 *
	 * これは `LabelParameterObject#font` で
	 * 与えられたフォントを `fontSize` フォントサイズ相当で描画するよう指示する値である。
	 * 歴史的経緯によりフォントサイズと説明されているが、実際には拡大縮小率を求めるため
	 * に用いられている。
	 */
	fontSize: number;

	/**
	 * 文字列の描画位置。
	 * `TextAlign.Left` 以外にする場合、 `widthAutoAdjust` を `false` にすべきである。(`widthAutoAdjust` の項を参照)
	 * @default TextAlign.Left
	 */
	textAlign?: TextAlign;

	/**
	 * このラベルの最大幅。
	 * @default undefined
	 */
	maxWidth?: number;

	/**
	 * `width` プロパティを `this.text` の描画に必要な幅で自動的に更新するかを表す。
	 * `textAlign` を `TextAlign.Left` 以外にする場合、この値は `false` にすべきである。
	 * (`textAlign` は `width` を元に描画位置を調整するため、 `true` の場合左寄せで右寄せでも描画結果が変わらなくなる)
	 * @default true
	 */
	widthAutoAdjust?: boolean;

	/**
	 * 文字列の描画色をCSS Color形式で指定する。
	 * 元の描画色に重ねて表示されるため、アルファ値を指定した場合は元の描画色が透けて表示される。
	 * 省略された場合、この場合描画色の変更を行わない。
	 * @default undefined
	 */
	textColor?: string;
}

/**
 * 単一行のテキストを描画するエンティティ。
 * 本クラスの利用には `BitmapFont` または `DynamicFont` が必要となる。
 */
export class Label extends CacheableE {
	/**
	 * 描画する文字列。
	 * この値を変更した場合、 `this.invalidate()` を呼び出す必要がある。
	 */
	text: string;

	/**
	 * 描画に利用されるフォント。
	 * この値を変更した場合、 `this.invalidate()` を呼び出す必要がある。
	 */
	font: Font;

	/**
	 * 文字列の描画位置。
	 * 初期値は `TextAlign.Left` である。
	 * `TextAlign.Left` 以外にする場合、 `widthAutoAdjust` を `false` にすべきである。(`widthAutoAdjust` の項を参照)
	 * この値を変更した場合、 `this.invalidate()` を呼び出す必要がある。
	 */
	textAlign: TextAlign;

	/**
	 * キャッシュされたグリフ情報。
	 * 通常、ゲーム開発者がこのプロパティを参照する必要はない。
	 */
	glyphs: GlyphLike[];

	/**
	 * フォントサイズ。
	 * 0 以上の数値でなければならない。そうでない場合、動作は不定である。
	 * この値を変更した場合、 `this.invalidate()` を呼び出す必要がある。
	 */
	fontSize: number;

	/**
	 * このラベルの最大幅。
	 * この値を変更した場合、 `this.invalidate()` を呼び出す必要がある。
	 */
	maxWidth: number;

	/**
	 * `width` プロパティを `this.text` の描画に必要な幅で自動的に更新するかを表す。
	 * 初期値は `true` である。
	 * `textAlign` を `TextAlign.Left` 以外にする場合、この値は `false` にすべきである。
	 * (`textAlign` は `width` を元に描画位置を調整するため、 `true` の場合左寄せで右寄せでも描画結果が変わらなくなる)
	 *
	 * この値を変更した場合、 `this.invalidate()` を呼び出す必要がある。
	 */
	widthAutoAdjust: boolean;

	/**
	 * 文字列の描画色をCSS Color形式で指定する。
	 * 元の描画色に重ねて表示されるため、アルファ値を指定した場合は元の描画色が透けて表示される。
	 * 初期値は `undefined` となり、 描画色の変更を行わない。
	 */
	textColor: string;

	/**
	 * @private
	 */
	_textWidth: number;

	/**
	 * @private
	 */
	_game: Game;

	/**
	 * @private
	 * 最初の文字が描画の基準点から左にはみだす量。
	 */
	_overhangLeft: number;

	/**
	 * @private
	 * 最後の文字が glyph.advanceWidth から右にはみだす量。
	 */
	_overhangRight: number;

	/**
	 * 各種パラメータを指定して `Label` のインスタンスを生成する。
	 * @param param このエンティティに指定するパラメータ
	 */
	constructor(param: LabelParameterObject) {
		super(param);
		this.text = param.text;
		this.font = param.font;
		this.textAlign = param.textAlign != null ? param.textAlign : TextAlign.Left;
		this.glyphs = new Array(param.text.length);
		this.fontSize = param.fontSize;
		this.maxWidth = param.maxWidth;
		this.widthAutoAdjust = param.widthAutoAdjust != null ? param.widthAutoAdjust : true;
		this.textColor = param.textColor;
		this._textWidth = 0;
		this._game = undefined;
		this._overhangLeft = 0;
		this._overhangRight = 0;
		this._invalidateSelf();
	}

	/**
	 * `width` と `textAlign` を設定し、 `widthAutoAdjust` を `false` に設定する。
	 *
	 * このメソッドは `this.textAlign` を設定するためのユーティリティである。
	 * `textAlign` を `TextAlign.Left` 以外に設定する場合には、通常 `width` や `widthAutoAdjust` も設定する必要があるため、それらをまとめて行う。
	 * このメソッドの呼び出し後、 `this.invalidate()` を呼び出す必要がある。
	 * @param width 幅
	 * @param textAlign テキストの描画位置
	 */
	aligning(width: number, textAlign: TextAlign): void {
		this.width = width;
		this.widthAutoAdjust = false;
		this.textAlign = textAlign;
	}
<commit_msg>remove unused Game dependency of Label<commit_after>import { Font } from "../../domain/Font";
import { GlyphLike } from "../../interfaces/GlyphLike";
import { RendererLike } from "../../interfaces/RendererLike";
import { CompositeOperation } from "../../types/CompositeOperation";
import { TextAlign } from "../../types/TextAlign";
import { Util } from "../Util";
import { CacheableE, CacheableEParameterObject } from "./CacheableE";

/**
 * `Label` のコンストラクタに渡すことができるパラメータ。
 * 各メンバの詳細は `Label` の同名メンバの説明を参照すること。
 */
export interface LabelParameterObject extends CacheableEParameterObject {
	/**
	 * 描画する文字列。
	 */
	text: string;

	/**
	 * 描画に利用されるフォント。
	 */
	font: Font;

	/**
	 * フォントサイズ。
	 * 0 以上の数値でなければならない。そうでない場合、動作は不定である。
	 *
	 * これは `LabelParameterObject#font` で
	 * 与えられたフォントを `fontSize` フォントサイズ相当で描画するよう指示する値である。
	 * 歴史的経緯によりフォントサイズと説明されているが、実際には拡大縮小率を求めるため
	 * に用いられている。
	 */
	fontSize: number;

	/**
	 * 文字列の描画位置。
	 * `TextAlign.Left` 以外にする場合、 `widthAutoAdjust` を `false` にすべきである。(`widthAutoAdjust` の項を参照)
	 * @default TextAlign.Left
	 */
	textAlign?: TextAlign;

	/**
	 * このラベルの最大幅。
	 * @default undefined
	 */
	maxWidth?: number;

	/**
	 * `width` プロパティを `this.text` の描画に必要な幅で自動的に更新するかを表す。
	 * `textAlign` を `TextAlign.Left` 以外にする場合、この値は `false` にすべきである。
	 * (`textAlign` は `width` を元に描画位置を調整するため、 `true` の場合左寄せで右寄せでも描画結果が変わらなくなる)
	 * @default true
	 */
	widthAutoAdjust?: boolean;

	/**
	 * 文字列の描画色をCSS Color形式で指定する。
	 * 元の描画色に重ねて表示されるため、アルファ値を指定した場合は元の描画色が透けて表示される。
	 * 省略された場合、この場合描画色の変更を行わない。
	 * @default undefined
	 */
	textColor?: string;
}

/**
 * 単一行のテキストを描画するエンティティ。
 * 本クラスの利用には `BitmapFont` または `DynamicFont` が必要となる。
 */
export class Label extends CacheableE {
	/**
	 * 描画する文字列。
	 * この値を変更した場合、 `this.invalidate()` を呼び出す必要がある。
	 */
	text: string;

	/**
	 * 描画に利用されるフォント。
	 * この値を変更した場合、 `this.invalidate()` を呼び出す必要がある。
	 */
	font: Font;

	/**
	 * 文字列の描画位置。
	 * 初期値は `TextAlign.Left` である。
	 * `TextAlign.Left` 以外にする場合、 `widthAutoAdjust` を `false` にすべきである。(`widthAutoAdjust` の項を参照)
	 * この値を変更した場合、 `this.invalidate()` を呼び出す必要がある。
	 */
	textAlign: TextAlign;

	/**
	 * キャッシュされたグリフ情報。
	 * 通常、ゲーム開発者がこのプロパティを参照する必要はない。
	 */
	glyphs: GlyphLike[];

	/**
	 * フォントサイズ。
	 * 0 以上の数値でなければならない。そうでない場合、動作は不定である。
	 * この値を変更した場合、 `this.invalidate()` を呼び出す必要がある。
	 */
	fontSize: number;

	/**
	 * このラベルの最大幅。
	 * この値を変更した場合、 `this.invalidate()` を呼び出す必要がある。
	 */
	maxWidth: number;

	/**
	 * `width` プロパティを `this.text` の描画に必要な幅で自動的に更新するかを表す。
	 * 初期値は `true` である。
	 * `textAlign` を `TextAlign.Left` 以外にする場合、この値は `false` にすべきである。
	 * (`textAlign` は `width` を元に描画位置を調整するため、 `true` の場合左寄せで右寄せでも描画結果が変わらなくなる)
	 *
	 * この値を変更した場合、 `this.invalidate()` を呼び出す必要がある。
	 */
	widthAutoAdjust: boolean;

	/**
	 * 文字列の描画色をCSS Color形式で指定する。
	 * 元の描画色に重ねて表示されるため、アルファ値を指定した場合は元の描画色が透けて表示される。
	 * 初期値は `undefined` となり、 描画色の変更を行わない。
	 */
	textColor: string;

	/**
	 * @private
	 */
	_textWidth: number;

	/**
	 * @private
	 * 最初の文字が描画の基準点から左にはみだす量。
	 */
	_overhangLeft: number;

	/**
	 * @private
	 * 最後の文字が glyph.advanceWidth から右にはみだす量。
	 */
	_overhangRight: number;

	/**
	 * 各種パラメータを指定して `Label` のインスタンスを生成する。
	 * @param param このエンティティに指定するパラメータ
	 */
	constructor(param: LabelParameterObject) {
		super(param);
		this.text = param.text;
		this.font = param.font;
		this.textAlign = param.textAlign != null ? param.textAlign : TextAlign.Left;
		this.glyphs = new Array(param.text.length);
		this.fontSize = param.fontSize;
		this.maxWidth = param.maxWidth;
		this.widthAutoAdjust = param.widthAutoAdjust != null ? param.widthAutoAdjust : true;
		this.textColor = param.textColor;
		this._textWidth = 0;
		this._overhangLeft = 0;
		this._overhangRight = 0;
		this._invalidateSelf();
	}

	/**
	 * `width` と `textAlign` を設定し、 `widthAutoAdjust` を `false` に設定する。
	 *
	 * このメソッドは `this.textAlign` を設定するためのユーティリティである。
	 * `textAlign` を `TextAlign.Left` 以外に設定する場合には、通常 `width` や `widthAutoAdjust` も設定する必要があるため、それらをまとめて行う。
	 * このメソッドの呼び出し後、 `this.invalidate()` を呼び出す必要がある。
	 * @param width 幅
	 * @param textAlign テキストの描画位置
	 */
	aligning(width: number, textAlign: TextAlign): void {
		this.width = width;
		this.widthAutoAdjust = false;
		this.textAlign = textAlign;
	}

{'fraction_non_alphanumeric': 0.14748029615476474, 'fraction_numerical': 0.0011941724385001193, 'mean_word_length': 3.976232917409388, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3075187', 'n_tokens_mistral': 4731, 'n_tokens_neox': 4415, 'n_words': 582}