Source: func/DisplayControl.js

// DisplayControlクラス
/**
 * 色指定文字列
 * @typedef {string} Color 色指定文字列
 * @example
 * "blue","red","green" etc
 * @see https://developer.mozilla.org/ja/docs/Web/CSS/color_value
 */

/**
 * CanvasRenderingContext2D
 * @typedef {CanvasRenderingContext2D} DeviceContext
 * @see https://developer.mozilla.org/ja/docs/Web/API/CanvasRenderingContext2D
*/

/**
 * ImageData
 * @typedef {HTMLImageElement} Img Texture画像情報
 * @see https://developer.mozilla.org/ja/docs/Web/API/HTMLImageElement
 */

/**
 * 画面表示コントロール(CanvasLayerControl)クラス
 * @class
 * @param {DeviceContext} ctx mainCanvasCtx
 * @param {number} c_w pixel width
 * @param {number} c_h pixel height
 * @param {number} ix display offset x
 * @param {number} iy display offset y
 * @description
 * 実際の画面表示サイズはCSSのSTYLEで <br>\
 * 指定してあるのでここでは、操作する解像度を指定する。 <br>\
 * <br>\
 * HTML Canvas要素への画面表示を制御するクラスです。 <br>\
 * オフスクリーンバッファを使用し、指定された解像度で描画を行い、<br>\
 * 実際のCanvas要素に最終的な描画結果を反映させます。
 * @todo FontFace
 */
class DisplayControl {

    /**
     * OffscreenbufferController 
     * @member
     * @type {offScreenTypeC} 
     */
    buffer;
    /**
     * canvas.width
     * @member
     * @type {number}
     */
    cw;
    /**
     * canvas.height
     * @member
     * @type {number}
     */
    ch;
    /**
     * 加算合成を使用する
     * @member
     * @type {boolean}
     * @todo 現在は効果なし/削除予定
     * @deprecaed
     */
    lighter_enable;

    /**
     * 背景色(fillcolor)
     * @member
     * @type {Color}
     */
    backgroundcolor;

    device; //privete
    intervalTime; //private access->get/set

    /**
     * @param {DeviceContext} ctx canvas2Dcontext
     * @param {number} c_w width
     * @param {number} c_h height
     * @param {number} ix offset x
     * @param {number} iy offset y
     * @description
     * DisplayControlクラスのインスタンスを初期化します。 <br>\
     * 描画コンテキスト、幅、高さ、オフセットなどのパラメータを設定し <br>\
     * オフスクリーンバッファと表示デバイスを準備します
     */
    constructor(ctx, c_w, c_h, ix, iy) {

        const buffer_ = new offScreenTypeC(c_w, c_h, ix, iy); //offScreenCanvas版(2023/03-)

        this.buffer = buffer_;

        const dev = ctx; //canvas.getContext("2d");
        this.device = dev;

        this.cw = c_w; //canvas.width;
        this.ch = c_h; //canvas.height;

        dev.font = "16px 'Arial'";

        this.lighter_enable = true; //現在無効

        this.view = buffer_.view;
        this.flip = buffer_.flip;

        let intv = 1;
        this.intervalTime = intv;
        let bgcolor = "";
        this.backgroundcolor = bgcolor;
    }

    /**
     * 表示間隔設定(フレーム)
     * @param {number} num 更新間隔
     * 0指定で自動更新(clear)抑止
     * @description
     * 画面の更新間隔(フレーム数)を設定します。 <br>\
     * 0を指定すると自動更新(画面クリア)が抑止され、 <br>\
     * 手動での更新制御が可能になります。
     */
    setInterval =(num)=>{
 
        if (num == 0) {
            this.buffer.flip(false);
        } else {
            this.buffer.flip(true);
        }
        this.intervalTime = num;
    };
    /**
     * 背景色設定
     * @param {Color} str 表示色
     * null,""指定で透過色でクリア
     * @description
     * 画面の背景色を設定します。<br>\
     * `null`または空文字列を指定すると、背景は透過色でクリアされ、<br>\
     * 重ねて表示する際に前の描画が残ります。
     */
    setBackgroundcolor =(str)=>{ this.backgroundcolor = str;};
    /**
     * 表示間隔設定値取得
     * @returns {number} 更新間隔(フレーム)
     * @description
     * 現在設定されている画面の更新間隔(フレーム数)を取得します。
     */
    getInterval =()=>{ return this.intervalTime;};
    /**
     * 背景色設定値取得
     * @returns {Color} 表示色
     * @description
     * 現在設定されている画面の背景色を取得します。<br>\
     * 設定された色指定文字列を返します。
     */
    getBackgroundcolor =()=>{ return this.backgroundcolor;};

    //-------------------------------------------------------------
    /**
     * マップチップ用パターン描画
     * @param {Img} gr Image
     * @param {object} ptn パターン番号(またはx,y,w,hの入ったオブジェクト)
     * @param {number} x 表示位置
     * @param {number} y 表示位置
     * @param {number} w 表示幅
     * @param {number} h 表示高さ
     * @description
     * マップチップなどのパターン画像を画面に描画します。<br>\
     * 元画像からの切り出し位置、サイズ、表示位置、表示幅、高さを指定し、<br>\
     * オフスクリーンバッファに描画します。
     */
    putPattern =(gr, ptn, x, y, w, h)=>{

        this.buffer.drawImgXYWHXYWH(
            gr,
            ptn.x, ptn.y, ptn.w, ptn.h,
            x, y, w, h
        );
    };
    //-------------------------------------------------------------
    /**
     * マップチップ用パターン切り取り配列の登録
     * @param {Img} gr Image
     * @param {object} bgpth パターン配列(x,y,w,hの入ったオブジェクト)
     * @todo 用途不明
     */
    setBgPattern =(bgptn)=>{

        bgPtn = bgptn;
    };
    //-------------------------------------------------------------
    /**
     * 文字列の表示(fillText)
     * @param {string} str MessageText
     * @param {number} x position
     * @param {number} y position
     * @param {Color} c color
     * @description
     * 指定された文字列を画面に表示します。<br>\
     * 文字列、X座標、Y座標、表示色(省略時は"limegreen")を指定し、<br>\
     * オフスクリーンバッファにテキストを描画します。<br>\
     * フォント展開やベクター表示であることを考えると<br>\
     * 毎フレーム書き換える用途での使用は限定して<br>\
     * あまり更新しない画面での使用を推奨します
     */
    print =(str, x, y, c)=>{

        if (!Boolean(c)) { c = "limegreen"; }

        this.buffer.fillText(str, x, y, c);
    };

    /**
     * @typedef {string} FontTextStyle テキストスタイル
     * @example
     * "bold 48px serif"
     * @description
     *  CSS の font の記述子と同じ構文
     * @see https://developer.mozilla.org/ja/docs/Web/CSS/font
     */
    /**
     * フォントの指定
     * @param {FontTextStyle} [str="16px 'Arial'"] フォントスタイル
     * @description
     * print methodで使用するフォントを変更します
     * @todo 指定した効果が発生しない2025/08/20 
     */
    assignFont =(str="16px 'Arial'")=>{

        this.device.font = str;
    }
    //------------------------------------------------------------
    /**
     * 画像イメージを直接取得して表示させる。
     * @param {Img} gr 画像(イメージデータ)
     * @param {number} x 表示位置座標
     * @param {number} y 表示位置座標
     * @description 
     * 元画像のサイズそのままに、オフスクリーンバッファへ描画します。
     */
    putImage =(gr, x, y)=>{

        this.buffer.drawImgXY(gr, x, y);
    };
    //------------------------------------------------------------
    /**
     * 画像イメージを直接取得して表示させる。(ほぼテスト用)
     * @param {Img} gr 画像(イメージデータ)
     * @param {number} x 表示位置座標
     * @param {number} y 表示位置座標
     * @param {number} w 表示幅
     * @param {number} h 表示高さ
     * @description
     * 画像イメージを指定されたサイズで<br>\
     * オフスクリーンバッファへ描画します。
    */
    putImage2 =(gr, x, y, w, h)=>{
 
        this.buffer.drawImgXYWH(gr, x, y, w, h);
    };
    //------------------------------------------------------------
    /**
     * 画像イメージを直接取得して表示させる。(Transform付き)
     * @param {Img} gr 画像(イメージデータ)
     * @param {number} x 表示位置座標
     * @param {number} y 表示位置座標
     * @param {number} m11 変換座標
     * @param {number} m12 変換座標
     * @param {number} m21 変換座標
     * @param {number} m22 変換座標
     * @description
     * 画像イメージを変形行列(Transform)を適用して表示します。<br>\
     * 画像データと変換座標(m11, m12, m21, m22)を指定し、<br>\
     * 画像を自由に拡大・縮小・回転・せん断して描画できます。
    */
    putImageTransform =(gr, x, y, m11, m12, m21, m22)=>{

        this.buffer.putImageTransform(gr, x, y, m11, m12, m21, m22);
    };
    //---------------------------------------------------------
    /**
     * Transform(OffscreenBuffer全体の変形)
     * @param {number} m11 変換座標
     * @param {number} m12 変換座標
     * @param {number} m21 変換座標
     * @param {number} m22 変換座標
    */
    transform =(m11, m12, m21, m22)=>{

        this.buffer.Transform(m11, m12, m21, m22, 0, 0);
    };
    //------------------------------------------------------------
    /**
     * 表示機能有り(draw)objectで表示コマンドを登録して表示
     * @param {PutFuncCustomDraw} cl 表示機能有り(draw)object
     * @description
     * `draw(device)`関数を持つカスタム描画オブジェクトを登録し、実行します。
    */
    putFunc =(cl)=>{
        //ここで登録するクラスには表示の為に"draw( device )" functionを必ず登録
        this.buffer.putFunc(cl);
    };
    //---------------------------------------------------------
    /**
     * 画面消去(クリア)
     * @param {Color} c_str クリア背景色
     * @description
     * 画面全体を消去(クリア)します。<br>\
     * オプションで背景色を指定して塗りつぶすことも可能で、<br>\
     * `setInterval(0)`設定時以外は、毎フレーム自動的に呼び出されます。
    */
    clear =(c_str)=>{

        if (this.flip()) {

            this.buffer.allClear(0, 0, this.cw, this.ch);

            if (c_str === void 0) { c_str = this.backgroundcolor; }
            if (Boolean(c_str)) {
                this.buffer.fillRect(0, 0, this.cw, this.ch, c_str);
            }
        }
    };
    //-----------------------------------------------------
    /**
     * 部分クリア(色指定で部分塗りつぶし)
     * @param {number} x 表示位置座標
     * @param {number} y 表示位置座標
     * @param {number} w 表示幅
     * @param {number} h 表示高さ
     * @param {Color} c_str 塗り潰し色
     * @description
     * 画面の指定された範囲を色で塗りつぶします。<br>\
     * X座標、Y座標、幅、高さ、塗りつぶし色を指定し、<br>\
     * RGBA形式で半透明色も指定可能です。
    */
    fill =(x, y, w, h, c_str)=>{

        this.buffer.fillRect(x, y, w, h, c_str);
    };
    //----------------------------------------------------------
    /**
     * offScreenのクリア
     * @description
     * オフスクリーンバッファをクリアします。<br>\
     * `enable_reset_flag`が`true`の場合に実行され、<br>\
     * バッファの内容を消去して初期状態に戻します。
    */
    reset =()=>{

        this.buffer.reset();
    };
    //----------------------------------------------------------
    /**
     * (flameloopで実行用)offScreenのクリア
     * @description
     * フレームループ内で実行されることを想定したオフスクリーンバッファのクリア関数です。<br>\
     * `enable_reset_flag`が`true`の場合、`reset`メソッドを呼び出して<br>\
     * バッファをクリアします。
    */
    reflash =()=>{ 

        this.buffer.reflash(); 
    };
    //----------------------------------------------------------
    /**
     * 描画
     * @description
     * オフスクリーンバッファの内容をメインのCanvasに反映させます。<br>\
     * この処理により、オフスクリーンで描画された全ての要素が<br>\
     * ユーザーに見える形で画面に表示されます。
    */
    draw =()=>{

        this.buffer.draw(this.device);
    };
    //----------------------------------------------------------
    /**
     * 書き込み処理回数の取得
     * @returns {number} draw実行毎の回数
     * @description
     * 前回の`draw`メソッド呼び出し以降に実行された描画関数の回数を返します。<br>\
     * これにより、1フレームあたりの描画負荷の目安を把握できます。
    */
    count =()=>{

        return this.buffer.count();
    };
    //----------------------------------------------------------
    /**
     * 書き込み処理回数最大値の取得
     * @returns {number} 最大値
     * @description
     * 記録された描画関数呼び出し回数の最大値を返します。<br>\
     * これは、各フレームにおける描画負荷のピーク値を示し、<br>\
     * パフォーマンス最適化の参考にできます。
    */
    max =()=>{

        return this.buffer.max();
    };
}