Uniscribe文字自動換行

 

轉載:http://blog.csdn.net/jianlizhao66/article/details/1480457數組

咱們得到了每一個字形的寬度數組piAdvances,以及這個RUN所佔用的總寬度abc。函數

piVdvances對應於每一個字符,它取得了每一個字形所佔用寬度。字體

若是咱們以行爲單位來繪製文字,咱們能夠以一個循環來取得每一個RUN的寬度信息,並一直相加,假設咱們己取得了一些run的寬度和,假設這個寬度和爲LineWidth.當咱們再取得鏈表中下一個run的寬度(假設爲lo)與這個寬度相加後超過一個行的寬度。咱們假設這個run的索引爲n即在鏈表中的節點順序由頭節點向後遍歷的順序爲第n個。編碼

咱們能夠中斷這個run即把這個run分爲兩個run,所謂劃分實際上也就是把這個run的字符分爲兩部分。.net

能夠這樣實現:指針

hr = ScriptGetLogicalWidths(&pRun->analysis,htm

                                pRun->iLen,blog

                                cGlyphs,索引

                                piAdvances,ip

                                pClusters,

                                pVisattrs,

                                logwidths);

ScriptGetLogicalWidhts函數轉換一個指定字體的字形向前寬度爲邏輯寬度。

HRESULT WINAPI ScriptGetLogicalWidths(
 const SCRIPT_ANALYSIS *psa,
 int cChars,
 int cGlyphs,
 const int *piGlyphWidth,
 const WORD *pwLogClust,
 const SCRIPT_VISATTR *psva,
 int *piDx,
);

psa

[in]一個 SCRIPT_ANALYSIS 結構指針.

cChars

[in] 在RUN中的邏輯編碼點數量

cGlyphs

[in] 在一個RUN中的字形數量

piGlyphWidth

[in] 字形向前寬度的數組指針

pwLogClust

[in] 邏輯Cluster的數組指針

psva

[in] SCRIPT_VISATTR 結構指針

piDx

[out] 邏輯寬度的數組指針

能夠看出這個函數的最後一個參數爲輸出參數,它表明邏輯寬度的數組。即每一個字形所佔用的寬度數組。

而後咱們能夠以一個循環來判斷具體到哪一個字符時知足不超過窗口寬度的條件。

iChars = 0;

       iWidth = 0;

       while(iChars < pRun->iLen && iWidth + logwidths[iChars] < iMaxWidth)

       {

              iWidth += logwidths[iChars];

              iChars++;

       }

pRun表明咱們當前的run。iWidth表明當前run中某個字符的邏輯寬度,iMaxWidth表明窗口剩餘的寬度即剩餘了iMaxWidth的寬度,但這個寬度不足以顯示這個run.

經過上面這個循環,咱們找到了這個字符的位置。

if(iChars < pRun->iLen )

    {

        pNewRun     = new RUN;

        *pNewRun    = *pRun;

        pRun->pNext = pNewRun;

        pRun->iLen = iChars;

        pNewRun->iLen -= iChars;

    }

咱們已經劃分了這個RUN。

第二步已經完成,總結第二步,主要目的是肯定一行(窗口寬度)要顯示多少個RUN,並進行相應的劃分。

相關文章
相關標籤/搜索