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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? text.cpp

?? Separator Print Processor Sample
?? CPP
?? 第 1 頁 / 共 2 頁
字號:

                            bAbortDoc = TRUE;
                            goto Done;
                        }

                        CurrentLine -= LinesPerPage;
                    }

                    if (TextOutA(pData->hDC,
                                 CurrentCol * CharWidth,
                                 CurrentLine * CharHeight,
                                 (const char*)pLineBuffer,
                                 Length) == FALSE) {

                        ODS(("TextOut() failed\n"));

                        bAbortDoc = TRUE;
                        goto Done;
                    }

                    CurrentCol += Length;
                }

                /**
                    Even if the length is zero, increment the line.
                    Should happen when the character is only 0x0D or 0x0A.
                **/

                if (fdwFlags & FLAG_CR) {
                    CurrentCol=0;
                    fdwFlags &= ~FLAG_CR;
                }

                if (fdwFlags & FLAG_LF) {
                    CurrentLine++;
                    fdwFlags &= ~FLAG_LF;
                }

                /**
                    We need a new page.  Set the current line to the
                    end of the page.  We could do a End/StartPage
                    sequence, but this may cause a blank page to get
                    ejected.

                    Note: this code will avoid printing out pages that
                    consist of formfeeds only (if you have a page with a
                    space in it, that counts as text).
                **/

                if (fdwFlags & FLAG_FF) {

                    CurrentLine = LinesPerPage;
                    CurrentCol = 0;
                    fdwFlags &= ~FLAG_FF;
                }

                /**
                    We have done the text out, so these characters have
                    been successfully printed.  Zero out Length
                    so these characters won't be printed again
                **/

                Length = 0;

                /**
                    We only terminate this loop if we run out of chars
                    or we run out of read buffer.
                **/

            } while (pReadBuffer && pReadBuffer != pReadBufferEnd);

            /** Keep going until we get the last line **/

        } while (!ReadAll);

        if (EndPage(pData->hDC) == SP_ERROR) {

            bAbortDoc = TRUE;
            goto Done;
        }

        /**
            Close the printer - we open/close the printer for each
            copy so the data pointer will rewind.
        **/

        ClosePrinter(hPrinter);
        hPrinter = NULL;

    } /* While copies to print */

    /** Let the printer know that we are done printing **/

    EndDoc(pData->hDC);

    ReturnValue = TRUE;

Done:

    if (dwTransparent)
        SetBkMode( pData->hDC, iBkMode  );

    if (hPrinter)
        ClosePrinter(hPrinter);

    if (bAbortDoc)
        AbortDoc(pData->hDC);

    if (pLineBuffer)
        FreeSplMem(pLineBuffer);

    if (hOldFont)
    {
        SelectObject(pData->hDC, hOldFont);
        DeleteObject(hFont);
    }

    if (ReadBufferStart) 
    {
        FreeSplMem(ReadBufferStart);
    }

    return ReturnValue;
}


/*++
*******************************************************************
    G e t T a b b e d L i n e F r o m B u f f e r

    Routine Description:
        This routine, given a buffer of text, will pull out a
        line of tab-expanded text.  This is used for tab
        expansion of text data jobs.

    Arguments:
        pSrcBuffer      => Start of source buffer.
        pSrcBufferEnd   => End of source buffer
        pDestBuffer     => Start of destination buffer
        CharsPerLine    => Number of characters on a line
        TabExpansionSize=> Number of spaces in a tab
        Encoding        => Code page
        pLength         => Length of chars from prev line, rets current
        pTabBase        => New 0 offset for tabbing
        pfdwFlags       => State

    Return Value:
        PBYTE => Place left off in the source buffer.  This should
                 be passed in on the next call.  If we ran out of
                 data in the source, this will be unchanged.
*******************************************************************
--*/

PBYTE
GetTabbedLineFromBuffer(
    IN      PBYTE   pSrcBuffer,
    IN      PBYTE   pSrcBufferEnd,
    IN      PBYTE   pDestBuffer,
    IN      ULONG   CharsPerLine,
    IN      ULONG   TabExpansionSize,
    IN      ULONG   Encoding,
    IN OUT  PULONG  pLength,
    IN OUT  PULONG  pTabBase,
    IN OUT  PDWORD  pfdwFlags
    )
{
    ULONG   current_pos;
    ULONG   expand, i;
    ULONG   TabBase = *pTabBase;
    ULONG   TabBaseLeft = TabExpansionSize-TabBase;
    PBYTE   pDestBufferEnd = pDestBuffer + CharsPerLine;

    /**
        If the tab pushed us past the end of the last line, then we need to
        add it back to the next one.
    **/

    if (TabBase && ( *pfdwFlags & FLAG_TAB_STATE )) {

        current_pos = 0;

        i=TabBase;

        while (i-- && (pDestBuffer < pDestBufferEnd)) {
            *pDestBuffer++ = ' ';
            current_pos++;
        }

        /**
            If we ran out of room again, return.  This means that
            the tab expansion size is greater than we can fit on
            one line.
        **/

        if (pDestBuffer >= pDestBufferEnd) {

            *pLength = current_pos;
            *pTabBase -= CharsPerLine;

            //
            // We need to move to the next line.
            //
            *pfdwFlags |= FLAG_LF | FLAG_CR;

            return pSrcBuffer;
        }
        *pfdwFlags &= ~FLAG_TAB_STATE;

    } else {

        /** We may have some chars from the previous ReadPrinter **/

        current_pos = *pLength;
        pDestBuffer += current_pos;
    }

    while (pSrcBuffer < pSrcBufferEnd) {

        /** Now process other chars **/

        switch (*pSrcBuffer) {

        case 0x0C:

            /** Found a FF.  Quit and indicate we need to start a new page **/

            *pTabBase = 0;
            *pfdwFlags |= FLAG_FF;
            *pfdwFlags &= ~FLAG_CR_STATE;

            pSrcBuffer++;

            break;

        case '\t':

            *pfdwFlags &= ~FLAG_CR_STATE;

            /**
                Handle TAB case.  If we are really out of buffer,
                then defer now so that the tab will be saved for
                the next line.
            **/

            if (pDestBuffer >= pDestBufferEnd) {
                goto ShiftTab;
            }

            pSrcBuffer++;

            /** Figure out how far to expand the tabs **/

            expand = TabExpansionSize -
                     (current_pos + TabBaseLeft) % TabExpansionSize;

            /** Expand the tabs **/

            for (i = 0; (i < expand) && (pDestBuffer < pDestBufferEnd); i++) {
                *pDestBuffer++ = ' ';
            }

            /**
                If we reached the end of our dest buffer,
                return and set the number of spaces we have left.
            **/

            if (pDestBuffer >= pDestBufferEnd) {

                *pfdwFlags |= FLAG_TAB_STATE;
                goto ShiftTab;
            }

            /** Update our position counter **/

            current_pos += expand;

            continue;

        case 0x0A:

            pSrcBuffer++;

            /** If the last char was a CR, ignore this guy **/

            if (*pfdwFlags & FLAG_CR_STATE) {

                *pfdwFlags &= ~FLAG_CR_STATE;

                //
                // We are translating CRLF, so if we saw a CR
                // immediately before this, then don't do anything.
                //
                continue;
            }

            if( *pfdwFlags & FLAG_TRANSLATE_LF ){

                //
                // If we are translating, then treat a LF as a CRLF pair.
                //
                *pfdwFlags |= FLAG_LF | FLAG_CR;

                /** Found a linefeed.  That's it for this line. **/

                *pTabBase = 0;

            } else {

                *pfdwFlags |= FLAG_LF;
            }

            break;

        case 0x0D:

            /** Found a carriage return.  That's it for this line. **/

            *pTabBase = 0;
            pSrcBuffer++;

            if (*pfdwFlags & FLAG_TRANSLATE_CR) {

                //
                // If we are translating CRLF, then make the newline
                // occur now.  This handles the case where we have a
                // CR all by itself.  Also set the CR flag so if there
                // happens to be a LF immediately after this, we don't
                // move down another line.
                //
                *pfdwFlags |= FLAG_CR_STATE | FLAG_LF | FLAG_CR;

            } else {

                *pfdwFlags |= FLAG_CR;
            }

            break;

        default:

            /** Not tab or carriage return, must be simply data **/

            *pfdwFlags &= ~FLAG_CR_STATE;

            //
            // We always check before we are adding a character
            // (instead of after) since we may be at the end of a line,
            // but we can still process chars like 0x0d 0x0a.
            // This happens in MS-DOS printscreen.
            //
            if (pDestBuffer >= pDestBufferEnd ||
                    (pDestBuffer + 1 >= pDestBufferEnd) &&
                    IsDBCSLeadByteEx(Encoding, *pSrcBuffer)) {

ShiftTab:
                //
                // We must shift the tab over since we are on the
                // same line.
                //
                *pTabBase = (*pTabBase + TabExpansionSize -
                            (CharsPerLine % TabExpansionSize))
                                % TabExpansionSize;

                *pfdwFlags |= FLAG_LF | FLAG_CR;

                break;
            }

            if (IsDBCSLeadByteEx(Encoding, *pSrcBuffer)) {

                // Check if we have trail byte also.

                if (pSrcBuffer + 1 >= pSrcBufferEnd) {
                    *pfdwFlags |= FLAG_DBCS_SPLIT;
                    break;
                }

                // Advance source pointer (for lead byte).

                *pDestBuffer++ = *pSrcBuffer++;
                current_pos++;
            }

            *pDestBuffer++ = *pSrcBuffer++;
            current_pos++;
            continue;
        }

        *pLength = current_pos;
        return pSrcBuffer;
    }

    /** We ran out of source buffer before getting to the EOL **/

    *pLength = current_pos;
    return NULL;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91麻豆精品久久久久蜜臀| 国产精品1区2区3区在线观看| 久久免费精品国产久精品久久久久| 成人99免费视频| 国产一区二区久久| 五月婷婷综合网| 亚洲免费观看高清| 欧美激情一区二区三区不卡| 日韩一级视频免费观看在线| 91黄色激情网站| 99精品久久只有精品| 国产不卡视频一区二区三区| 免费不卡在线观看| 日韩精品亚洲一区| 午夜精品影院在线观看| 午夜影院在线观看欧美| 水蜜桃久久夜色精品一区的特点| 亚洲午夜精品久久久久久久久| 中文字幕日韩精品一区| 亚洲精品少妇30p| 一区二区在线观看视频在线观看| 亚洲欧美影音先锋| 一区二区三区电影在线播| 亚洲精品中文在线| 亚洲18色成人| 国产一区二区看久久| 成人伦理片在线| 欧美中文字幕不卡| 日韩一区二区三区免费看| 久久亚洲免费视频| 一区二区三区在线免费| 美女免费视频一区二区| 国产精品亚洲视频| 91成人免费电影| 日韩女同互慰一区二区| 国产精品久久久99| 天堂一区二区在线| 国产精品影视在线| 欧美三级资源在线| 国产视频一区在线观看| 亚洲男人的天堂网| 久88久久88久久久| 91久久精品国产91性色tv| 日韩一级完整毛片| 亚洲小少妇裸体bbw| 久久国产综合精品| 欧美日韩精品一区二区三区| 中文字幕 久热精品 视频在线| 亚洲小说欧美激情另类| av高清不卡在线| 日韩一区二区高清| 一区二区三区四区在线| 国产91色综合久久免费分享| 欧美高清视频一二三区| 久久综合一区二区| 亚洲香蕉伊在人在线观| 成人福利电影精品一区二区在线观看| 欧美精品乱码久久久久久| 欧美国产日产图区| 美女网站色91| 欧美丰满嫩嫩电影| 亚洲电影第三页| 欧洲亚洲精品在线| 亚洲精品成人悠悠色影视| 高清av一区二区| 亚洲精品一区二区三区四区高清| 日日夜夜精品视频免费| 欧美日韩国产另类不卡| 一区二区欧美精品| 91搞黄在线观看| 一区二区三区四区在线播放| 色猫猫国产区一区二在线视频| 日本一区二区三区国色天香| 岛国一区二区三区| 国产精品视频免费| 91理论电影在线观看| 亚洲综合另类小说| 99久久伊人精品| 亚洲欧美日韩中文播放| 一本色道久久综合精品竹菊| 一区二区三区欧美日韩| 91美女蜜桃在线| 亚洲国产一区视频| 91精品欧美一区二区三区综合在 | 成人av综合一区| 亚洲视频香蕉人妖| 一本久久精品一区二区| 日韩精品一二三四| 日韩女优电影在线观看| 成人黄色a**站在线观看| 亚洲综合在线电影| 精品美女一区二区三区| 不卡高清视频专区| 视频一区二区国产| 国产欧美日韩一区二区三区在线观看| 成人动漫av在线| 日日嗨av一区二区三区四区| 久久久国产综合精品女国产盗摄| 99精品桃花视频在线观看| 人人狠狠综合久久亚洲| 亚洲精品日韩综合观看成人91| 欧美肥妇毛茸茸| 91在线国产观看| 极品少妇一区二区| 五月天婷婷综合| 国产精品久久久久永久免费观看 | 国产成人亚洲综合色影视| 亚洲一区二区三区爽爽爽爽爽| 久久综合九色综合97_久久久 | 在线一区二区三区| 99久久精品国产麻豆演员表| 久久99精品国产.久久久久久| 尤物视频一区二区| 国产精品高潮呻吟久久| 欧美mv日韩mv国产网站app| 岛国一区二区在线观看| 欧美乱妇20p| 另类人妖一区二区av| 亚洲国产成人高清精品| 欧美日韩亚洲另类| 国产综合久久久久久久久久久久| 日韩影院精彩在线| 国产三级精品视频| 久久一区二区视频| 欧美精品色一区二区三区| 国产91精品免费| 国产91精品在线观看| 亚洲视频电影在线| aaa欧美大片| 毛片av一区二区| 久久99精品一区二区三区| 激情综合网天天干| 成人激情免费视频| 99久久久久免费精品国产| 成人一区二区三区| 99精品视频一区| 欧美日韩国产经典色站一区二区三区| 欧美亚洲动漫制服丝袜| 高清不卡一二三区| 美女视频第一区二区三区免费观看网站| 麻豆国产一区二区| 国产精品自拍三区| 不卡的电视剧免费网站有什么| 色诱亚洲精品久久久久久| 欧美男男青年gay1069videost| 欧美裸体bbwbbwbbw| 国产精品久久久久毛片软件| 亚洲一区二区三区激情| 激情文学综合网| 欧美性生活久久| 国产网站一区二区三区| 日韩成人一级片| 94-欧美-setu| 亚洲精品一区二区三区精华液 | 亚洲免费电影在线| 国产成人av网站| 欧美日韩午夜精品| 专区另类欧美日韩| 高清成人在线观看| 久久一区二区三区四区| 日本不卡在线视频| 欧美日韩亚洲不卡| 亚洲伊人伊色伊影伊综合网 | 国产成a人亚洲| 精品国产电影一区二区| 天堂蜜桃一区二区三区| 91视频免费播放| 中文字幕中文字幕在线一区| 国产不卡视频一区二区三区| 精品国产不卡一区二区三区| 亚洲精品欧美专区| 欧美性色黄大片手机版| 亚洲综合无码一区二区| 欧美亚洲一区三区| 午夜激情一区二区| 欧美卡1卡2卡| 美女一区二区视频| 久久这里只有精品视频网| 国产在线日韩欧美| 久久久久久免费网| 国产高清不卡一区二区| 国产夜色精品一区二区av| 国产很黄免费观看久久| 国产精品女人毛片| 在线一区二区三区四区| 亚洲丶国产丶欧美一区二区三区| 欧美日韩一区二区三区四区 | 亚洲欧美欧美一区二区三区| 色婷婷激情久久| 蜜臀av一区二区三区| 国产亚洲一区二区三区在线观看 | 一区二区三区久久久| 这里是久久伊人| 成人黄色在线网站| 成人免费在线播放视频| 日韩三区在线观看| 94-欧美-setu| 激情六月婷婷久久| 一区二区三区影院| 精品成人免费观看|