亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? text.c

?? 這是針對 Linux (i386)平臺的 minigui 3.6.2 開發包(MiniGUI-Processes 運行模式)。
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*** $Id: text.c,v 1.51 2005/01/04 07:11:16 limei Exp $**** The Text Support of GDI.**** Copyright (C) 2000 ~ 2002 Wei Yongming.** Copyright (C) 2003 Feynman Software.**** Current maintainer: Wei Yongming.**** Create date: 2000.4.19*//*** This program is free software; you can redistribute it and/or modify** it under the terms of the GNU General Public License as published by** the Free Software Foundation; either version 2 of the License, or** (at your option) any later version.**** This program is distributed in the hope that it will be useful,** but WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the** GNU General Public License for more details.**** You should have received a copy of the GNU General Public License** along with this program; if not, write to the Free Software** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*//*** TODO:*/ #include <stdio.h>#include <stdlib.h>#include <string.h>#include "common.h"#include "minigui.h"#include "gdi.h"#include "window.h"#include "cliprect.h"#include "gal.h"#include "internals.h"#include "ctrlclass.h"#include "dc.h"#include "drawtext.h"#include "cursor.h"#include "gdidecl.h"int GUIAPI GetFontHeight (HDC hdc){    PDC pdc = dc_HDC2PDC(hdc);    return pdc->pLogFont->size;}int GUIAPI GetMaxFontWidth (HDC hdc){    PDC pdc = dc_HDC2PDC(hdc);    DEVFONT* sbc_devfont = pdc->pLogFont->sbc_devfont;    DEVFONT* mbc_devfont = pdc->pLogFont->mbc_devfont;    int sbc_max_width = (*sbc_devfont->font_ops->get_max_width) (pdc->pLogFont, sbc_devfont);    int mbc_max_width = 0;    if (mbc_devfont)        mbc_max_width = (*mbc_devfont->font_ops->get_max_width) (pdc->pLogFont, mbc_devfont);        return (sbc_max_width > mbc_max_width) ? sbc_max_width : mbc_max_width;}void GUIAPI GetTextExtent (HDC hdc, const char* spText, int len, SIZE* pSize){    PDC pdc;    pdc = dc_HDC2PDC(hdc);    if (len < 0) len = strlen (spText);    gdi_get_TextOut_extent (pdc, pdc->pLogFont, spText, len, pSize);}void GUIAPI GetTabbedTextExtent (HDC hdc, const char* spText, int len, SIZE* pSize){    PDC pdc;    pdc = dc_HDC2PDC(hdc);    if (len < 0) len = strlen (spText);    gdi_get_TabbedTextOut_extent (pdc, pdc->pLogFont, pdc->tabstop,                 spText, len, pSize, NULL);}void GUIAPI GetLastTextOutPos (HDC hdc, POINT* pt){    PDC pdc;    pdc = dc_HDC2PDC(hdc);    *pt = pdc->CurTextPos;}int GUIAPI TextOutLen (HDC hdc, int x, int y, const char* spText, int len){    PCLIPRECT pClipRect;    PDC pdc;    RECT rcOutput;    SIZE size;    if (!spText || len == 0) return 0;    if (len < 0) len = strlen (spText);    pdc = dc_HDC2PDC(hdc);    gdi_get_TextOut_extent (pdc, pdc->pLogFont, spText, len, &size);    {        // update text out position        int width = size.cx;        extent_x_SP2LP (pdc, &width);        pdc->CurTextPos.x = x + width;        pdc->CurTextPos.y = y;    }    LOCK_ECRGN(return size.cx);    // Transfer logical to device to screen here.    coor_LP2SP(pdc, &x, &y);    rcOutput.left = x;    rcOutput.top  = y;    rcOutput.right = x + size.cx + 1;    rcOutput.bottom = y + size.cy + 1;    NormalizeRect(&rcOutput);    LOCK_GDI();    IntersectRect (&rcOutput, &rcOutput, &pdc->ecrgn.rcBound);    if( !dc_IsMemHDC(hdc) ) ShowCursorForGDI(FALSE, &rcOutput);    // set graphics context.    GAL_SetGC(pdc->gc);    // set text out mode.    pClipRect = pdc->ecrgn.head;    while(pClipRect)    {        if (DoesIntersect (&rcOutput, &pClipRect->rc)) {            GAL_SetClipping(pdc->gc, pClipRect->rc.left, pClipRect->rc.top,                    pClipRect->rc.right - 1, pClipRect->rc.bottom - 1);            gdi_strnwrite (pdc, x, y, spText, len);        }                    pClipRect = pClipRect->next;    }    if( !dc_IsMemHDC(hdc) ) ShowCursorForGDI(TRUE, &rcOutput);    UNLOCK_GDI();    UNLOCK_ECRGN();    return size.cx;}int GUIAPI TabbedTextOutLen (HDC hdc, int x, int y, const char* spText, int len) {    PCLIPRECT pClipRect;    PDC pdc;    SIZE size;    RECT rcOutput;    if (len == 0) return 0;    if (len < 0) len = strlen (spText);    pdc = dc_HDC2PDC(hdc);    coor_LP2SP (pdc, &pdc->CurTextPos.x, &pdc->CurTextPos.y);    gdi_get_TabbedTextOut_extent (pdc, pdc->pLogFont, pdc->tabstop, spText, len,                 &size, &pdc->CurTextPos);    coor_SP2LP (pdc, &pdc->CurTextPos.x, &pdc->CurTextPos.y);    LOCK_ECRGN(return size.cx);    // Transfer logical to device to screen here.    coor_LP2SP(pdc, &x, &y);        rcOutput.left = x;    rcOutput.top  = y;    rcOutput.right = x + size.cx + 1;    rcOutput.bottom = y + size.cy + 1;    NormalizeRect(&rcOutput);    LOCK_GDI();    IntersectRect (&rcOutput, &rcOutput, &pdc->ecrgn.rcBound);    if( !dc_IsMemHDC(hdc) ) ShowCursorForGDI(FALSE, &rcOutput);    // set graphics context.    GAL_SetGC(pdc->gc);    pClipRect = pdc->ecrgn.head;    while(pClipRect)    {        if (DoesIntersect (&rcOutput, &pClipRect->rc)) {            GAL_SetClipping(pdc->gc, pClipRect->rc.left, pClipRect->rc.top,                    pClipRect->rc.right - 1, pClipRect->rc.bottom - 1);            gdi_tabbedtextout (pdc, x, y, spText, len);        }                    pClipRect = pClipRect->next;    }    if( !dc_IsMemHDC(hdc) ) ShowCursorForGDI(TRUE, &rcOutput);    UNLOCK_GDI();    UNLOCK_ECRGN();    return size.cx;}int GUIAPI TabbedTextOutEx (HDC hdc, int x, int y, const char* spText,		int nCount, int nTabs, int *pTabPos, int nTabOrig){    PDC pdc;    int line_len, sub_len;    int nr_tab = 0, tab_pos, def_tab;    int x_orig = x, max_x = x;    int line_height;    int nr_delim_newline, nr_delim_tab;    if (nCount == 0) return 0;    if (nCount < 0) nCount = strlen (spText);    pdc = dc_HDC2PDC(hdc);    line_height = pdc->pLogFont->size + pdc->alExtra + pdc->blExtra;    y += pdc->alExtra;    if (nTabs == 0 || pTabPos == NULL) {        int ave_width = (*pdc->pLogFont->sbc_devfont->font_ops->get_ave_width)                        (pdc->pLogFont, pdc->pLogFont->sbc_devfont);        def_tab = ave_width * pdc->tabstop;    }    else        def_tab = pTabPos [nTabs - 1];    while (nCount) {        line_len = substrlen (spText, nCount, '\n', &nr_delim_newline);        nCount -= line_len + nr_delim_newline;        nr_tab = 0;        x = x_orig;        tab_pos = nTabOrig;        while (line_len) {            int i, width;            sub_len = substrlen (spText, line_len, '\t', &nr_delim_tab);            width = TextOutLen (hdc, x, y, spText, sub_len);            x += width;             if (x >= tab_pos) {                while (x >= tab_pos)                    tab_pos += (nr_tab >= nTabs) ? def_tab : pTabPos [nr_tab++];                for (i = 0; i < nr_delim_tab - 1; i ++)                    tab_pos += (nr_tab >= nTabs) ? def_tab : pTabPos [nr_tab++];            }            else {                for (i = 0; i < nr_delim_tab; i ++)                    tab_pos += (nr_tab >= nTabs) ? def_tab : pTabPos [nr_tab++];            }            x = tab_pos;            line_len -= sub_len + nr_delim_tab;            spText += sub_len + nr_delim_tab;        }        if (max_x < x) max_x = x;        spText += nr_delim_newline;        y += line_height * nr_delim_newline;    }    return max_x - x_orig;}static void txtDrawOneLine (PDC pdc, const char* pText, int nLen, int x, int y,                    const RECT* prcOutput, UINT nFormat, int nTabWidth){    RECT rcInter;    PCLIPRECT pClipRect;    pClipRect = pdc->ecrgn.head;    while(pClipRect)    {        if (IntersectRect (&rcInter, prcOutput, &pClipRect->rc)) {            GAL_SetClipping(pdc->gc, rcInter.left, rcInter.top,                    rcInter.right - 1, rcInter.bottom - 1);            if (nFormat & DT_EXPANDTABS) {                const char* sub = pText;                const char* left;                int nSubLen = nLen;                int nOutputLen;                                while ((left = strnchr (sub, nSubLen, '\t'))) {                                        nOutputLen = left - sub;                    x += gdi_strnwrite (pdc, x, y, sub, nOutputLen);                                        nSubLen -= (nOutputLen + 1);                    sub = left + 1;                    x += nTabWidth;                }                if (nSubLen != 0)                    gdi_strnwrite (pdc, x, y, sub, nSubLen);            }            else                gdi_strnwrite (pdc, x, y, pText, nLen);        }                    pClipRect = pClipRect->next;    }}static int txtGetWidthOfNextWord (PDC pdc, const char* pText, int nCount, int* nChars){    int width, extra;    DEVFONT* sbc_devfont = pdc->pLogFont->sbc_devfont;    DEVFONT* mbc_devfont = pdc->pLogFont->mbc_devfont;    WORDINFO word_info;     *nChars = 0;    if (nCount == 0) return 0;    extra = pdc->cExtra;    if (mbc_devfont) {        int mbc_pos, sub_len;        mbc_pos = (*mbc_devfont->charset_ops->pos_first_char) (pText, nCount);        if (mbc_pos == 0) {            sub_len = (*mbc_devfont->charset_ops->len_first_substr) (pText, nCount);            (*mbc_devfont->charset_ops->get_next_word) (pText, sub_len, &word_info);            if (pdc->pLogFont->style & FS_WEIGHT_BOLD                     && !(mbc_devfont->style & FS_WEIGHT_BOLD))                extra ++;            width = (*mbc_devfont->font_ops->get_str_width)                         (pdc->pLogFont, mbc_devfont, pText, word_info.len, extra);            *nChars = word_info.len;            return width;        }        else if (mbc_pos > 0)            nCount = mbc_pos;    }    (*sbc_devfont->charset_ops->get_next_word) (pText, nCount, &word_info);    if (pdc->pLogFont->style & FS_WEIGHT_BOLD             && !(sbc_devfont->style & FS_WEIGHT_BOLD))        extra ++;    width = (*sbc_devfont->font_ops->get_str_width)                     (pdc->pLogFont, sbc_devfont, pText, word_info.len, extra);    *nChars = word_info.len;    return width;}/*** This function return the normal characters' number (refrence)** and output width of the line (return value).*/static int txtGetOneLine (PDC pdc, const char* pText, int nCount, int nTabWidth,                 int maxwidth, UINT uFormat, int* nChar){    int x = 0, y = 0;    int wordLen;    int wordWidth;    int lineWidth;    if (uFormat & DT_SINGLELINE) {        SIZE size;        if (uFormat & DT_EXPANDTABS)            gdi_get_TabbedTextOut_extent (pdc, pdc->pLogFont, pdc->tabstop,                 pText, nCount, &size, NULL);        else            gdi_get_TextOut_extent (pdc, pdc->pLogFont, pText, nCount, &size);        *nChar = nCount;        return size.cx;    }    *nChar = 0;    lineWidth = 0;    while (TRUE) {        int word_w = 0;        if (uFormat & DT_WORDBREAK) {            wordWidth = txtGetWidthOfNextWord (pdc, pText, nCount, &wordLen);            word_w = wordWidth;            if (wordWidth > maxwidth) {                SIZE size;                wordLen = GetTextExtentPoint ((HDC)pdc, pText, nCount,                             maxwidth - lineWidth, NULL, NULL, NULL, &size);                if (wordLen == 0) {                    wordLen = GetFirstMCharLen (GetCurFont ((HDC)pdc), pText, nCount);                    gdi_get_TextOut_extent (pdc, pdc->pLogFont, pText, wordLen, &size);                }                wordWidth = size.cx;                *nChar += wordLen;                lineWidth += wordWidth;                break;            }            else if (lineWidth + wordWidth > maxwidth)                break;        }        else {            SIZE size;            wordLen = GetTextExtentPoint ((HDC)pdc, pText, nCount,                            maxwidth - lineWidth, NULL, NULL, NULL, &size);            wordWidth = size.cx;            if (wordWidth > maxwidth && wordLen == 0) {                wordLen = GetFirstMCharLen (GetCurFont ((HDC)pdc), pText, nCount);                gdi_get_TextOut_extent (pdc, pdc->pLogFont, pText, wordLen, &size);                wordWidth = size.cx;            }        }        pText += wordLen;        nCount -= wordLen;        lineWidth += wordWidth;        *nChar += wordLen;        if ( !(uFormat & DT_WORDBREAK) || (lineWidth + word_w - wordWidth > maxwidth) ) {            break;        }        if (nCount == 0)            break;        if (*pText == '\t') {            (*nChar)++;            if (uFormat & DT_EXPANDTABS) {                lineWidth += nTabWidth;                gdi_start_new_line (pdc->pLogFont);            }            else                lineWidth += gdi_width_one_char                         (pdc->pLogFont, pdc->pLogFont->sbc_devfont, pText, 1, &x, &y);            pText ++;            nCount --;        }        else if (*pText == '\n' || *pText == '\r') {            (*nChar) ++;            break;        }        else if (*pText == ' ') {            lineWidth += gdi_width_one_char                        (pdc->pLogFont, pdc->pLogFont->sbc_devfont, pText, 1, &x, &y);            (*nChar) ++;            pText ++;            nCount --;        }    }        return lineWidth;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一本一道久久a久久精品综合蜜臀| 久久久亚洲国产美女国产盗摄| 日韩天堂在线观看| 中文字幕一区二| 精品在线观看免费| 欧美日韩午夜影院| 亚洲精品福利视频网站| 狠狠色综合播放一区二区| 欧美视频在线不卡| 亚洲欧美偷拍三级| 成人av先锋影音| ww亚洲ww在线观看国产| 免费在线看一区| 欧美日韩你懂得| 亚洲曰韩产成在线| 91蜜桃网址入口| 国产精品色呦呦| 国产99久久精品| 久久亚洲影视婷婷| 久久电影国产免费久久电影| 欧美精品日韩一区| 青草av.久久免费一区| 欧美在线观看视频一区二区 | 成人美女在线视频| 精品国产一区二区三区久久久蜜月 | 亚洲一区二区在线播放相泽| 丁香啪啪综合成人亚洲小说| 欧美成人a在线| 狠狠v欧美v日韩v亚洲ⅴ| 日韩一区二区三区电影 | 丁香啪啪综合成人亚洲小说 | 欧美日韩在线播| 污片在线观看一区二区| 欧美日韩国产系列| 丝袜亚洲另类丝袜在线| 欧美精品在线观看播放| 天堂影院一区二区| 日韩欧美一级片| 国产综合色视频| 国产欧美精品在线观看| av中文一区二区三区| 亚洲人成人一区二区在线观看| 99精品视频一区二区| 亚洲免费成人av| 在线电影院国产精品| 六月丁香综合在线视频| 国产日韩在线不卡| 色婷婷久久久综合中文字幕 | 欧美日韩激情在线| 乱一区二区av| 国产女人水真多18毛片18精品视频| 丁香一区二区三区| 亚洲线精品一区二区三区八戒| 欧美一区二区三区婷婷月色| 麻豆专区一区二区三区四区五区| 久久综合久久鬼色中文字| 成人夜色视频网站在线观看| 亚洲天堂成人在线观看| 欧美日韩精品一区二区三区四区| 蜜桃视频在线观看一区| 国产精品免费丝袜| 在线不卡a资源高清| 国产成人在线视频网址| 亚洲精选一二三| 日韩免费一区二区| 99久久国产综合色|国产精品| 亚洲高清久久久| 久久久久成人黄色影片| 欧美视频在线观看一区二区| 韩国理伦片一区二区三区在线播放| 国产精品超碰97尤物18| 日韩一区二区免费电影| 一本一道久久a久久精品 | 美日韩黄色大片| 亚洲黄色尤物视频| 精品国产百合女同互慰| 色老头久久综合| 国产精品影视在线观看| 日韩中文字幕麻豆| 亚洲欧美偷拍卡通变态| 久久九九全国免费| 91麻豆精品国产无毒不卡在线观看| 国产久卡久卡久卡久卡视频精品| 亚洲电影第三页| 亚洲色图另类专区| 久久蜜桃一区二区| 日韩三级视频中文字幕| 欧美亚洲精品一区| 97久久久精品综合88久久| 国产一区免费电影| 理论电影国产精品| 五月天视频一区| 美女国产一区二区| 亚洲国产成人91porn| 中文字幕一区二区三区在线播放| 精品电影一区二区| 日韩欧美一二三| 制服.丝袜.亚洲.中文.综合| 欧洲亚洲精品在线| 91丨porny丨户外露出| 国产成人在线免费观看| 久久aⅴ国产欧美74aaa| 蜜桃精品视频在线| 日韩精品五月天| 日韩国产高清在线| 亚洲国产精品一区二区www在线 | 精品国产电影一区二区| 6080yy午夜一二三区久久| 欧美三级日本三级少妇99| 欧美中文字幕亚洲一区二区va在线| 波多野结衣中文一区| youjizz国产精品| 99久久国产综合精品色伊| 成人av网在线| 91女厕偷拍女厕偷拍高清| 91美女视频网站| 欧美在线观看视频一区二区三区| 欧美中文字幕一区| 欧美日韩免费观看一区二区三区| 色婷婷精品久久二区二区蜜臀av| 色94色欧美sute亚洲线路一久 | 一区二区三区小说| 一个色在线综合| 五月天视频一区| 极品美女销魂一区二区三区免费| 九九九久久久精品| 国产精品亚洲成人| 99久久久国产精品| 欧美午夜不卡在线观看免费| 欧美日韩亚洲高清一区二区| 91精品久久久久久久91蜜桃| 日韩午夜在线观看| 国产欧美一区二区三区沐欲| 最新国产成人在线观看| 亚洲图片欧美色图| 久久精品国产亚洲高清剧情介绍| 国产在线不卡一卡二卡三卡四卡| 国产91精品免费| 日本丰满少妇一区二区三区| 在线不卡欧美精品一区二区三区| 精品三级在线看| 最新久久zyz资源站| 午夜精品视频在线观看| 国产成人综合视频| 欧美午夜理伦三级在线观看| 精品国内二区三区| 亚洲人吸女人奶水| 精久久久久久久久久久| 色婷婷av一区二区三区软件 | 一区二区欧美精品| 紧缚捆绑精品一区二区| 一本高清dvd不卡在线观看| 日韩欧美区一区二| 中文字幕欧美一| 久久精品国产秦先生| 色综合天天视频在线观看| 精品成人一区二区三区| 亚洲高清在线视频| 国产高清精品久久久久| 欧美日韩国产电影| 亚洲欧洲精品一区二区精品久久久| 午夜精品久久久久久久久| 成人午夜免费电影| 精品美女被调教视频大全网站| 亚洲激情图片qvod| 粉嫩高潮美女一区二区三区| 日韩三级精品电影久久久| 亚洲综合精品自拍| av电影在线观看一区| 久久夜色精品一区| 日本v片在线高清不卡在线观看| 97精品久久久久中文字幕| 久久久精品人体av艺术| 精品制服美女久久| 91精品国产欧美一区二区18| 亚洲乱码国产乱码精品精小说| 国产精品一区二区你懂的| 91精品国产手机| 亚洲午夜久久久久久久久电影网| 成人免费毛片app| 国产亚洲成aⅴ人片在线观看| 日韩精品亚洲专区| 欧美精品一二三| 亚洲国产综合91精品麻豆| 成人av网站在线观看免费| 国产人伦精品一区二区| 狠狠色丁香婷婷综合久久片| 91精品在线免费观看| 日韩一区欧美二区| 欧美精品一级二级三级| 亚洲成人免费看| 欧美日韩精品欧美日韩精品| 一区二区三区小说| 日本国产一区二区| 亚洲免费高清视频在线| 91原创在线视频| 国产精品福利在线播放| 成人午夜视频网站| 中文字幕在线不卡一区二区三区| 福利视频网站一区二区三区|