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

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

?? bidi.cpp

?? It is WEB browser core module with source code. Very good!
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
/**
 * This file is part of the html renderer for KDE.
 *
 * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
 * Copyright (C) 2004 Apple Computer, Inc.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library 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
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 *
 */
#include "bidi.h"
#include "break_lines.h"
#include "render_block.h"
#include "render_text.h"
#include "render_arena.h"
#include "render_canvas.h"
#include "khtmlview.h"
#include "xml/dom_docimpl.h"

#include "kdebug.h"
#include "qdatetime.h"
#include "qfontmetrics.h"

#define BIDI_DEBUG 0
//#define DEBUG_LINEBREAKS

using DOM::AtomicString;

namespace khtml {


// an iterator which goes through a BidiParagraph
struct BidiIterator
OOM_MODIFIED
{
    BidiIterator() : par(0), obj(0), pos(0) {}
    BidiIterator(RenderBlock *_par, RenderObject *_obj, unsigned int _pos) : par(_par), obj(_obj), pos(_pos) {}

    void increment( BidiState &bidi );

    bool atEnd() const;

    const QChar &current() const;
    QChar::Direction direction() const;

    RenderBlock *par;
    RenderObject *obj;
    unsigned int pos;
};

struct BidiStatus {
    BidiStatus() : eor(QChar::DirON), lastStrong(QChar::DirON), last(QChar::DirON) {}

    QChar::Direction eor;
    QChar::Direction lastStrong;
    QChar::Direction last;
};

struct BidiState {
    BidiState() : context(0) {}

    BidiIterator sor;
    BidiIterator eor;
    BidiIterator last;
    BidiIterator current;
    BidiContext *context;
    BidiStatus status;
};

// Used to track a list of chained bidi runs.
static BidiRun* sFirstBidiRun;
static BidiRun* sLastBidiRun;
static int sBidiRunCount;
static BidiRun* sCompactFirstBidiRun;
static BidiRun* sCompactLastBidiRun;
static int sCompactBidiRunCount;
static bool sBuildingCompactRuns;

// Midpoint globals.  The goal is not to do any allocation when dealing with
// these midpoints, so we just keep an array around and never clear it.  We track
// the number of items and position using the two other variables.
static QMemArray<BidiIterator> *smidpoints;
static uint sNumMidpoints;
static uint sCurrMidpoint;
static bool betweenMidpoints;

static bool isLineEmpty = true;
static bool previousLineBrokeCleanly = true;
static QChar::Direction dir;
static bool adjustEmbedding;
static bool emptyRun = true;
static int numSpaces;

static void embed( QChar::Direction d, BidiState &bidi );
static void appendRun( BidiState &bidi );

static int getBPMWidth(int childValue, Length cssUnit)
{
    if (cssUnit.type != Variable)
        return (cssUnit.type == Fixed ? cssUnit.value : childValue);
    return 0;
}

static int getBorderPaddingMargin(RenderObject* child, bool endOfInline)
{
    RenderStyle* cstyle = child->style();
    int result = 0;
    bool leftSide = (cstyle->direction() == LTR) ? !endOfInline : endOfInline;
    result += getBPMWidth((leftSide ? child->marginLeft() : child->marginRight()),
                          (leftSide ? cstyle->marginLeft() :
                           cstyle->marginRight()));
    result += getBPMWidth((leftSide ? child->paddingLeft() : child->paddingRight()),
                          (leftSide ? cstyle->paddingLeft() :
                           cstyle->paddingRight()));
    result += leftSide ? child->borderLeft() : child->borderRight();
    return result;
}

static int inlineWidth(RenderObject* child, bool start = true, bool end = true)
{
    int extraWidth = 0;
    RenderObject* parent = child->parent();
    while (parent->isInline() && !parent->isInlineBlockOrInlineTable()) {
        if (start && parent->firstChild() == child)
            extraWidth += getBorderPaddingMargin(parent, false);
        if (end && parent->lastChild() == child)
            extraWidth += getBorderPaddingMargin(parent, true);
        child = parent;
        parent = child->parent();
    }
    return extraWidth;
}

#ifndef NDEBUG
static bool inBidiRunDetach;
#endif

void BidiRun::detach(RenderArena* renderArena)
{
#ifndef NDEBUG
    inBidiRunDetach = true;
#endif
    delete this;
#ifndef NDEBUG
    inBidiRunDetach = false;
#endif

    // Recover the size left there for us by operator delete and free the memory.
    renderArena->free(*(size_t *)this, this);
}

void* BidiRun::operator new(size_t sz, RenderArena* renderArena) throw()
{
    return renderArena->allocate(sz);
}

void BidiRun::operator delete(void* ptr, size_t sz)
{
    assert(inBidiRunDetach);

    // Stash size where detach can find it.
    *(size_t*)ptr = sz;
}

static void deleteBidiRuns(RenderArena* arena)
{
    if (!sFirstBidiRun)
        return;

    BidiRun* curr = sFirstBidiRun;
    while (curr) {
        BidiRun* s = curr->nextRun;
        curr->detach(arena);
        curr = s;
    }

    sFirstBidiRun = 0;
    sLastBidiRun = 0;
    sBidiRunCount = 0;
}

// ---------------------------------------------------------------------

/* a small helper class used internally to resolve Bidi embedding levels.
   Each line of text caches the embedding level at the start of the line for faster
   relayouting
*/
BidiContext::BidiContext(unsigned char l, QChar::Direction e, BidiContext *p, bool o)
    : level(l) , override(o), dir(e)
{
    parent = p;
    if(p) {
        p->ref();
        basicDir = p->basicDir;
    } else
        basicDir = e;
    count = 0;
}

BidiContext::~BidiContext()
{
    if(parent) parent->deref();
}

void BidiContext::ref() const
{
    count++;
}

void BidiContext::deref() const
{
    count--;
    if(count <= 0) delete this;
}

// ---------------------------------------------------------------------

inline bool operator==( const BidiIterator &it1, const BidiIterator &it2 )
{
    if(it1.pos != it2.pos) return false;
    if(it1.obj != it2.obj) return false;
    return true;
}

inline bool operator!=( const BidiIterator &it1, const BidiIterator &it2 )
{
    if(it1.pos != it2.pos) return true;
    if(it1.obj != it2.obj) return true;
    return false;
}

static inline RenderObject *Bidinext(RenderObject *par, RenderObject *current, BidiState &bidi,
                                     bool skipInlines = true, bool* endOfInline = 0)
{
    RenderObject *next = 0;
    bool oldEndOfInline = endOfInline ? *endOfInline : false;
    if (endOfInline)
        *endOfInline = false;

    while(current != 0)
    {
        //kdDebug( 6040 ) << "current = " << current << endl;
        if (!oldEndOfInline && !current->isFloating() && !current->isReplaced() && !current->isPositioned()) {
            next = current->firstChild();
            if ( next && adjustEmbedding ) {
                EUnicodeBidi ub = next->style()->unicodeBidi();
                if ( ub != UBNormal && !emptyRun ) {
                    EDirection dir = next->style()->direction();
QChar::Direction d = ( ub == Embed ? ( dir == RTL ? QChar::DirRLE : QChar::DirLRE )
                                   : ( dir == RTL ? QChar::DirRLO : QChar::DirLRO ) );
                    embed( d, bidi );
                }
            }
        }
        if (!next) {
            if (!skipInlines && !oldEndOfInline && current->isInlineFlow())
            {
                next = current;
                if (endOfInline)
                    *endOfInline = true;
                break;
            }

            while (current && current != par) {
                next = current->nextSibling();
                if (next) break;
                if ( adjustEmbedding && current->style()->unicodeBidi() != UBNormal && !emptyRun ) {
                    embed( QChar::DirPDF, bidi );
                }
                current = current->parent();
                if (!skipInlines && current && current != par && current->isInlineFlow()) {
                    next = current;
                    if (endOfInline)
                        *endOfInline = true;
                    break;
                }
            }
        }

        if (!next) break;

        if (next->isText() || next->isBR() || next->isFloating() || next->isReplaced() || next->isPositioned()
            || ((!skipInlines || !next->firstChild()) // Always return EMPTY inlines.
                && next->isInlineFlow()))
            break;
        current = next;
    }
    return next;
}

static RenderObject *first( RenderObject *par, BidiState &bidi, bool skipInlines = true )
{
    if(!par->firstChild()) return 0;
    RenderObject *o = par->firstChild();

    if (o->isInlineFlow()) {
        if (skipInlines && o->firstChild())
            o = Bidinext( par, o, bidi, skipInlines );
        else
            return o; // Never skip empty inlines.
    }

    if (o && !o->isText() && !o->isBR() && !o->isReplaced() && !o->isFloating() && !o->isPositioned())
        o = Bidinext( par, o, bidi, skipInlines );
    return o;
}

inline void BidiIterator::increment (BidiState &bidi)
{
    if(!obj) return;
    if(obj->isText()) {
        pos++;
        if(pos >= static_cast<RenderText *>(obj)->stringLength()) {
            obj = Bidinext( par, obj, bidi );
            pos = 0;
        }
    } else {
        obj = Bidinext( par, obj, bidi );
        pos = 0;
    }
}

inline bool BidiIterator::atEnd() const
{
    if(!obj) return true;
    return false;
}

const QChar &BidiIterator::current() const
{
    static QChar nullCharacter;

    if (!obj || !obj->isText())
      return nullCharacter;

    RenderText* text = static_cast<RenderText*>(obj);
    if (!text->text())
        return nullCharacter;

    return text->text()[pos];
}

inline QChar::Direction BidiIterator::direction() const
{
    if (!obj)
        return QChar::DirON;
    if (obj->isListMarker())
        return obj->style()->direction() == LTR ? QChar::DirL : QChar::DirR;
    if (!obj->isText())

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美做爰猛烈大尺度电影无法无天| 亚洲欧洲综合另类在线| 亚洲国产一区二区三区青草影视| 亚洲一区二区三区免费视频| 九一九一国产精品| 色婷婷国产精品久久包臀| 日韩三级视频在线观看| 综合在线观看色| 日韩不卡手机在线v区| 91网站黄www| 久久一区二区三区国产精品| 午夜精品久久久| 一本一道久久a久久精品综合蜜臀| 欧美成人vps| 午夜久久电影网| 91视频观看免费| 国产欧美日韩在线视频| 天堂成人免费av电影一区| 色综合天天综合在线视频| 中文字幕电影一区| 国产伦精品一区二区三区免费迷 | 蜜臀久久99精品久久久画质超高清 | 精品日韩一区二区三区| 五月激情综合色| 欧美日韩在线观看一区二区| 亚洲精品一二三| 91猫先生在线| 中文字幕一区三区| bt7086福利一区国产| 久久一夜天堂av一区二区三区| 秋霞成人午夜伦在线观看| 丁香激情综合国产| 亚洲国产精品t66y| av电影一区二区| 国产精品视频免费| a美女胸又www黄视频久久| 国产亚洲人成网站| 国产黄人亚洲片| 久久奇米777| 成人一区二区三区在线观看| 久久久www成人免费无遮挡大片| 激情国产一区二区 | 91丨九色丨蝌蚪丨老版| 国产精品国产三级国产普通话三级 | 在线一区二区三区四区| 亚洲夂夂婷婷色拍ww47| 欧美最猛性xxxxx直播| 伊人性伊人情综合网| 欧美视频日韩视频| 奇米精品一区二区三区在线观看| 欧美一级国产精品| 美女尤物国产一区| 中文字幕国产精品一区二区| 一本一本久久a久久精品综合麻豆| 夜夜精品浪潮av一区二区三区| 欧美性生活大片视频| 蜜桃视频第一区免费观看| xvideos.蜜桃一区二区| av在线综合网| 日日骚欧美日韩| 久久久久久久国产精品影院| 色婷婷久久久综合中文字幕| 全国精品久久少妇| 国产精品拍天天在线| 欧美性感一区二区三区| 精品系列免费在线观看| 亚洲日本一区二区三区| 91麻豆精品国产91久久久 | 日本韩国精品在线| 青青草成人在线观看| 亚洲国产高清在线观看视频| 欧美日韩一区二区三区不卡| 国产剧情在线观看一区二区| 一区二区三区在线视频观看| 精品欧美久久久| 日本福利一区二区| 国产尤物一区二区在线| 亚洲一区免费观看| 国产亚洲精品免费| 欧美久久久久中文字幕| 懂色一区二区三区免费观看 | 六月丁香婷婷色狠狠久久| 中文字幕在线一区免费| 日韩欧美中文一区| 91成人免费在线视频| 国产成人精品三级麻豆| 天天av天天翘天天综合网| 国产午夜精品一区二区三区四区| 欧美女孩性生活视频| 91麻豆swag| 国产成人a级片| 日韩国产一区二| 一区二区三区中文字幕| 中文字幕一区二区三区色视频| 日韩一区二区三区视频在线| 欧美亚洲自拍偷拍| 96av麻豆蜜桃一区二区| eeuss影院一区二区三区| 久久99精品国产.久久久久久 | 日韩一区在线播放| 亚洲欧洲美洲综合色网| 国产精品无圣光一区二区| 日韩精品自拍偷拍| 日韩一区二区影院| 91麻豆精品91久久久久久清纯| 日本久久一区二区| 日本道在线观看一区二区| 成人性生交大合| 粉嫩绯色av一区二区在线观看| 国产一区不卡视频| 国产精品综合二区| 国产激情视频一区二区三区欧美 | 色综合久久中文综合久久牛| av爱爱亚洲一区| 99久久综合99久久综合网站| 99精品久久只有精品| 92国产精品观看| 91在线播放网址| 欧洲av一区二区嗯嗯嗯啊| 在线影视一区二区三区| 欧美手机在线视频| 69堂亚洲精品首页| 欧美成人r级一区二区三区| 欧美不卡123| 久久精品日韩一区二区三区| 国产欧美一区二区精品性色 | 久久久久久免费毛片精品| 精品播放一区二区| 国产日韩精品一区二区三区 | 欧美视频自拍偷拍| 91精品国产色综合久久| 日韩欧美精品在线| 日本一区二区三区久久久久久久久不 | 午夜激情一区二区| 麻豆成人久久精品二区三区小说| 国产原创一区二区| 99免费精品在线观看| 欧美三级乱人伦电影| 在线不卡一区二区| 精品免费国产二区三区| 国产情人综合久久777777| 亚洲色图欧洲色图婷婷| 午夜不卡在线视频| 国产精品一色哟哟哟| 一本久久综合亚洲鲁鲁五月天| 制服丝袜成人动漫| 国产亚洲欧美色| 亚洲国产视频在线| 国产精品亚洲午夜一区二区三区| 色婷婷激情综合| 国产欧美日产一区| 亚洲午夜精品在线| 丁香网亚洲国际| 5566中文字幕一区二区电影| 国产日韩欧美a| 日本不卡视频一二三区| 成人av手机在线观看| 在线播放中文字幕一区| 中文字幕永久在线不卡| 韩国精品久久久| 777午夜精品免费视频| 国产精品每日更新在线播放网址| 日韩中文字幕亚洲一区二区va在线| 国产91清纯白嫩初高中在线观看| 欧美巨大另类极品videosbest | 成人国产精品免费| 欧美日韩视频不卡| 久久久午夜精品| 青青草国产成人99久久| 成人精品视频一区二区三区| 在线观看亚洲a| 国产精品不卡在线观看| 三级欧美在线一区| 成人午夜视频在线观看| 久久综合久久综合亚洲| 亚洲毛片av在线| 精品一区二区三区蜜桃| 在线电影一区二区三区| 国产精品国产三级国产有无不卡 | 国产精品久久夜| 亚洲www啪成人一区二区麻豆| 国产成人精品影院| 精品福利在线导航| 亚洲国产你懂的| 粉嫩av一区二区三区| 国产婷婷色一区二区三区四区| 亚洲成人动漫在线免费观看| 高清日韩电视剧大全免费| 久久久久久久综合色一本| 日本麻豆一区二区三区视频| 成a人片国产精品| 中文字幕在线观看一区| 国内精品免费在线观看| 色婷婷av一区二区三区gif| 亚洲婷婷在线视频| 国内精品在线播放| 欧美久久久一区| 亚洲一区二区四区蜜桃| av爱爱亚洲一区| 亚洲欧美另类图片小说|