Exemple #1
0
        //文字のX座標を計算(自動改行処理も行う)
        float ClacXPosition(List <UguiNovelTextCharacter> characterDataList, bool autoLineBreak, bool applyX, float maxWidth)
        {
            float maxX       = 0;
            float indentSize = 0;
            int   index      = 0;

            foreach (var item in characterDataList)
            {
                item.ResetXPosition();
            }

            //infoListがテキストの文字数ぶんになるまでループ
            while (index < characterDataList.Count)
            {
                //行の開始インデックス
                int   beginIndex         = index;
                float currentLetterSpace = 0;   //文字間のサイズ
                float x = 0;                    //現在のX位置
                //一行ぶん(改行までの)の処理をループ内で処理
                while (index < characterDataList.Count)
                {
                    UguiNovelTextCharacter currentData = characterDataList[index];
                    bool isAutoLineBreak = false;                       //自動改行をするか

                    //行の先頭で、先頭の文字スペースが必要場合があるので加算する
                    if (x == 0)
                    {
                        currentLetterSpace = Additional.GetTopLetterSpace(currentData, Generator);
                        x += indentSize;
                        if (index == 0 && IsAutoIndentation(currentData.Char))
                        {
                            indentSize = currentData.Width + Generator.LetterSpaceSize;
                        }
                    }

                    //文字間の適用
                    if (currentData.CustomInfo.IsRuby)
                    {
                        currentLetterSpace += currentData.RubySpaceSize;
                    }
                    x += currentLetterSpace;

                    if (currentData.IsBlank)
                    {
                        //改行文字かスペース
                    }
                    else if (autoLineBreak)
                    {
                        //いったん改行データをクリア
                        currentData.isAutoLineBreak = false;
                        //横幅を越えるなら自動改行
                        isAutoLineBreak = IsOverMaxWidth(x, Additional.GetMaxWidth(currentData), maxWidth);
                        if (isAutoLineBreak)
                        {
                            //自動改行処理
                            //改行すべき文字の位置まで戻る
                            index       = GetAutoLineBreakIndex(characterDataList, beginIndex, index);
                            currentData = characterDataList[index];
                            currentData.isAutoLineBreak = true;
                        }
                    }
                    //1文字進める
                    ++index;

                    bool br = (autoLineBreak && currentData.IsBrOrAutoBr) || currentData.IsBr;
                    //改行処理
                    if (br)
                    {
                        //改行なので行処理のループ終了
                        break;
                    }
                    else
                    {
                        if (applyX)
                        {
                            currentData.InitPositionX(x);
                        }
                        //X位置を進める
                        x += currentData.Width;
                        if (currentData.RubySpaceSize != 0)
                        {
                            currentLetterSpace = currentData.RubySpaceSize;
                        }
                        else
                        {
                            currentLetterSpace = Generator.LetterSpaceSize;

                            //文字間を無視する場合のチェック
                            if (Generator.TextSettings)
                            {
                                if (index < characterDataList.Count)
                                {
                                    if (Generator.TextSettings.IsIgonreLetterSpace(currentData, characterDataList[index]))
                                    {
                                        currentLetterSpace = 0;
                                    }
                                }
                            }
                        }
                    }
                }
                maxX = Mathf.Max(x, maxX);
            }
            return(maxX);
        }
Exemple #2
0
        //自動改行処理を行う
        void AutoLineBreak(List <UguiNovelTextCharacter> characterDataList)
        {
            float indentSize = 0;
            int   index      = 0;

            //infoListがテキストの文字数ぶんになるまでループ
            while (index < characterDataList.Count)
            {
                //行の開始インデックス
                int   beginIndex         = index;
                float currentLetterSpace = 0;   //文字間のサイズ
                float x = 0;                    //現在のX位置
                //一行ぶん(改行までの)の処理をループ内で処理
                while (index < characterDataList.Count)
                {
                    UguiNovelTextCharacter currentData = characterDataList[index];
                    bool isAutoLineBreak = false;                       //自動改行をするか

                    //行の先頭で、先頭の文字スペースが必要場合があるので加算する
                    if (x == 0)
                    {
                        currentLetterSpace = Additional.GetTopLetterSpace(currentData, this);
                        x += indentSize;
                        if (index == 0 && IsAutoIndentation(currentData.Char))
                        {
                            indentSize = currentData.Width + LetterSpaceSize;
                        }
                    }

                    //文字間の適用
                    if (currentData.CustomInfo.IsRuby)
                    {
                        currentLetterSpace += currentData.RubySpaceSize;
                    }
                    x += currentLetterSpace;

                    if (currentData.IsBlank)
                    {
                        //改行文字かスペース
                    }
                    else
                    {
                        //横幅を越えるなら自動改行
                        isAutoLineBreak = IsOverMaxWidth(x, Additional.GetMaxWidth(currentData));
                        if (isAutoLineBreak)
                        {
                            //自動改行処理
                            //改行すべき文字の位置まで戻る
                            index       = GetAutoLineBreakIndex(characterDataList, beginIndex, index);
                            currentData = characterDataList[index];
                            currentData.isAutoLineBreak = true;
                        }
                    }
                    //1文字進める
                    ++index;
                    //改行処理
                    if (currentData.IsBrOrAutoBr)
                    {
                        //改行なので行処理のループ終了
                        break;
                    }
                    else
                    {
                        currentData.InitPositionX(x, currentLetterSpace);
                        //X位置を進める
                        x += currentData.Width;
                        if (currentData.RubySpaceSize != 0)
                        {
                            currentLetterSpace = currentData.RubySpaceSize;
                        }
                        else
                        {
                            currentLetterSpace = LetterSpaceSize;

                            //文字間を無視する場合のチェック
                            if (TextSettings)
                            {
                                if (index < characterDataList.Count)
                                {
                                    if (TextSettings.IsIgonreLetterSpace(currentData, characterDataList[index]))
                                    {
                                        currentLetterSpace = 0;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }