⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 render_object.cpp

📁 khtml在gtk上的移植版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    if (!parentLayer)        return;        RenderObject* object = newObject;    RenderLayer* beforeChild = 0;    ::addLayers(this, parentLayer, object, beforeChild);}void RenderObject::removeLayers(RenderLayer* parentLayer){    if (!parentLayer)        return;        if (layer()) {        parentLayer->removeChild(layer());        return;    }    for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling())        curr->removeLayers(parentLayer);}void RenderObject::moveLayers(RenderLayer* oldParent, RenderLayer* newParent){    if (!newParent)        return;        if (layer()) {        if (oldParent)            oldParent->removeChild(layer());        newParent->addChild(layer());        return;    }    for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling())        curr->moveLayers(oldParent, newParent);}RenderLayer* RenderObject::findNextLayer(RenderLayer* parentLayer, RenderObject* startPoint,                                         bool checkParent){    // Error check the parent layer passed in.  If it's null, we can't find anything.    if (!parentLayer)        return 0;            // Step 1: Descend into our siblings trying to find the next layer.  If we do find    // a layer, and if its parent layer matches our desired parent layer, then we have    // a match.    for (RenderObject* curr = startPoint ? startPoint->nextSibling() : firstChild();         curr; curr = curr->nextSibling()) {        RenderLayer* nextLayer = curr->findNextLayer(parentLayer, 0, false);        if (nextLayer) {            if (nextLayer->parent() == parentLayer)                return nextLayer;            return 0;        }    }        // Step 2: If our layer is the desired parent layer, then we're finished.  We didn't    // find anything.    RenderLayer* ourLayer = layer();    if (parentLayer == ourLayer)        return 0;        // Step 3: If we have a layer, then return that layer.  It will be checked against    // the desired parent layer in the for loop above.    if (ourLayer)        return ourLayer;        // Step 4: If |checkParent| is set, climb up to our parent and check its siblings that    // follow us to see if we can locate a layer.    if (checkParent && parent())        return parent()->findNextLayer(parentLayer, this, true);        return 0;}    RenderLayer* RenderObject::enclosingLayer(){    RenderObject* curr = this;    while (curr) {        RenderLayer *layer = curr->layer();        if (layer)            return layer;        curr = curr->parent();    }    return 0;}bool RenderObject::requiresLayer(){    return isRoot() || isPositioned() || isRelPositioned() || style()->opacity() < 1.0f ||           m_hasOverflowClip;}RenderBlock* RenderObject::firstLineBlock() const{    return 0;}void RenderObject::updateFirstLetter(){}int RenderObject::offsetLeft() const{    int x = xPos();    if (!isPositioned()) {        if (isRelPositioned()) {            int y = 0;            ((RenderBox*)this)->relativePositionOffset(x, y);        }                RenderObject* offsetPar = offsetParent();        RenderObject* curr = parent();        while (curr && curr != offsetPar) {            x += curr->xPos();            curr = curr->parent();        }    }    return x;}int RenderObject::offsetTop() const{    int y = yPos();    if (!isPositioned()) {        if (isRelPositioned()) {            int x = 0;            ((RenderBox*)this)->relativePositionOffset(x, y);        }        RenderObject* offsetPar = offsetParent();        RenderObject* curr = parent();        while (curr && curr != offsetPar) {            y += curr->yPos();            curr = curr->parent();        }    }    return y;}    RenderObject* RenderObject::offsetParent() const{    bool skipTables = isPositioned() || isRelPositioned();    RenderObject* curr = parent();    while (curr && !curr->isPositioned() && !curr->isRelPositioned() &&           !curr->isBody()) {        if (!skipTables && (curr->isTableCell() || curr->isTable()))            break;        curr = curr->parent();    }    return curr;}// More IE extensions.  clientWidth and clientHeight represent the interior of an object// excluding border and scrollbar.intRenderObject::clientWidth() const{    return width() - borderLeft() - borderRight() -        (includeScrollbarSize() ? layer()->verticalScrollbarWidth() : 0);}intRenderObject::clientHeight() const{    return height() - borderTop() - borderBottom() -      (includeScrollbarSize() ? layer()->horizontalScrollbarHeight() : 0);}// scrollWidth/scrollHeight will be the same as clientWidth/clientHeight unless the// object has overflow:hidden/scroll/auto specified and also has overflow.intRenderObject::scrollWidth() const{    return hasOverflowClip() ? layer()->scrollWidth() : overflowWidth();}intRenderObject::scrollHeight() const{    return hasOverflowClip() ? layer()->scrollHeight() : overflowHeight();}boolRenderObject::hasStaticX() const{    return (style()->left().isVariable() && style()->right().isVariable()) ||            style()->left().isStatic() ||            style()->right().isStatic();}boolRenderObject::hasStaticY() const{    return (style()->top().isVariable() && style()->bottom().isVariable()) || style()->top().isStatic();}void RenderObject::markAllDescendantsWithFloatsForLayout(RenderObject*){}void RenderObject::setNeedsLayout(bool b, bool markParents) {    bool alreadyNeededLayout = m_needsLayout;    m_needsLayout = b;    if (b) {        if (!alreadyNeededLayout && markParents)            markContainingBlocksForLayout();    }    else {        m_posChildNeedsLayout = false;        m_normalChildNeedsLayout = false;    }}void RenderObject::setChildNeedsLayout(bool b, bool markParents){    bool alreadyNeededLayout = m_normalChildNeedsLayout;    m_normalChildNeedsLayout = b;    if (b) {        if (!alreadyNeededLayout && markParents)            markContainingBlocksForLayout();    }    else {        m_posChildNeedsLayout = false;        m_normalChildNeedsLayout = false;    }}void RenderObject::markContainingBlocksForLayout(){    RenderObject *o = container();    RenderObject *last = this;    while (o) {        if (!last->isText() && (last->style()->position() == FIXED || last->style()->position() == ABSOLUTE)) {            if (o->m_posChildNeedsLayout)                return;            o->m_posChildNeedsLayout = true;        }        else {            if (o->m_normalChildNeedsLayout)                return;            o->m_normalChildNeedsLayout = true;        }        last = o;        o = o->container();    }    last->scheduleRelayout();}RenderBlock* RenderObject::containingBlock() const{    if(isTableCell())        return static_cast<const RenderTableCell *>(this)->table();    if (isCanvas())        return (RenderBlock*)this;    RenderObject *o = parent();    if (!isText() && m_style->position() == FIXED) {        while ( o && !o->isCanvas() )            o = o->parent();    }    else if (!isText() && m_style->position() == ABSOLUTE) {        while (o && (o->style()->position() == STATIC || (o->isInline() && !o->isReplaced()))               && !o->isRoot() && !o->isCanvas()) {            // For relpositioned inlines, we return the nearest enclosing block.  We don't try            // to return the inline itself.  This allows us to avoid having a positioned objects            // list in all RenderInlines and lets us return a strongly-typed RenderBlock* result            // from this method.  The container() method can actually be used to obtain the            // inline directly.            if (o->style()->position() == RELATIVE && o->isInline() && !o->isReplaced())                return o->containingBlock();            o = o->parent();        }    } else {        while (o && ((o->isInline() && !o->isReplaced()) || o->isTableRow() || o->isTableSection()                     || o->isTableCol()))            o = o->parent();    }    if (!o || !o->isRenderBlock())        return 0; // Probably doesn't happen any more, but leave just in case. -dwh        return static_cast<RenderBlock*>(o);}int RenderObject::containingBlockWidth() const{    // ###    return containingBlock()->contentWidth();}int RenderObject::containingBlockHeight() const{    // ###    return containingBlock()->contentHeight();}bool RenderObject::sizesToMaxWidth() const{    // Marquees in WinIE are like a mixture of blocks and inline-blocks.  They size as though they're blocks,    // but they allow text to sit on the same line as the marquee.    if (isFloating() || isCompact() ||         (isInlineBlockOrInlineTable() && !isHTMLMarquee()) ||        (element() && (element()->id() == ID_BUTTON || element()->id() == ID_LEGEND)))        return true;        // Children of a horizontal marquee do not fill the container by default.    // FIXME: Need to deal with MAUTO value properly.  It could be vertical.    if (parent()->style()->overflow() == OMARQUEE) {        EMarqueeDirection dir = parent()->style()->marqueeDirection();        if (dir == MAUTO || dir == MFORWARD || dir == MBACKWARD || dir == MLEFT || dir == MRIGHT)            return true;    }        // Flexible horizontal boxes lay out children at their maxwidths.  Also vertical boxes    // that don't stretch their kids lay out their children at their maxwidths.    if (parent()->isFlexibleBox() &&        (parent()->style()->boxOrient() == HORIZONTAL || parent()->style()->boxAlign() != BSTRETCH))        return true;    return false;}void RenderObject::drawBorder(QPainter *p, int x1, int y1, int x2, int y2,                              BorderSide s, QColor c, const QColor& textcolor, EBorderStyle style,                              int adjbw1, int adjbw2, bool invalidisInvert){    int width = (s==BSTop||s==BSBottom?y2-y1:x2-x1);    if(style == DOUBLE && width < 3)        style = SOLID;    if(!c.isValid()) {        if(invalidisInvert)        {            p->setRasterOp(Qt::XorROP);            c = Qt::white;        }        else {            if(style == INSET || style == OUTSET || style == RIDGE || style ==	    GROOVE)                c.setRgb(238, 238, 238);            else                c = textcolor;        }    }    switch(style)    {    case BNONE:    case BHIDDEN:        // should not happen        if(invalidisInvert && p->rasterOp() == Qt::XorROP)            p->setRasterOp(Qt::CopyROP);        return;    case DOTTED:        p->setPen(QPen(c, width == 1 ? 0 : width, Qt::DotLine));        /* nobreak; */    case DASHED:        if(style == DASHED)            p->setPen(QPen(c, width == 1 ? 0 : width, Qt::DashLine));        if (width > 0)            switch(s)            {            case BSBottom:            case BSTop:                p->drawLine(x1, (y1+y2)/2, x2, (y1+y2)/2);                break;            case BSRight:            case BSLeft:                p->drawLine((x1+x2)/2, y1, (x1+x2)/2, y2);                break;            }                        break;    case DOUBLE:    {        int third = (width+1)/3;	if (adjbw1 == 0 && adjbw2 == 0)	{	    p->setPen(Qt::NoPen);	    p->setBrush(c);	    switch(s)	    {	    case BSTop:	    case BSBottom:	        p->drawRect(x1, y1      , x2-x1, third);		p->drawRect(x1, y2-third, x2-x1, third);		break;	    case BSLeft:	        p->drawRect(x1      , y1+1, third, y2-y1-1);		p->drawRect(x2-third, y1+1, third, y2-y1-1);		break;	    case BSRight:	        p->drawRect(x1      , y1+1, third, y2-y1-1);		p->drawRect(x2-third, y1+1, third, y2-y1-1);		break;	    }	}	else	{	    int adjbw1bigthird;	    if (adjbw1>0) adjbw1bigthird = adjbw1+1;	    else adjbw1bigthird = adjbw1 - 1;	    adjbw1bigthird /= 3;	    int adjbw2bigthird;	    if (adjbw2>0) adjbw2bigthird = adjbw2 + 1;	    else adjbw2bigthird = adjbw2 - 1;	    adjbw2bigthird /= 3;	  switch(s)	    {	    case BSTop:	      drawBorder(p, x1+QMAX((-adjbw1*2+1)/3,0), y1        , x2-QMAX((-adjbw2*2+1)/3,0), y1 + third, s, c, textcolor, SOLID, adjbw1bigthird, adjbw2bigthird);	      drawBorder(p, x1+QMAX(( adjbw1*2+1)/3,0), y2 - third, x2-QMAX(( adjbw2*2+1)/3,0), y2        , s, c, textcolor, SOLID, adjbw1bigthird, adjbw2bigthird);	      break;	    case BSLeft:	      drawBorder(p, x1        , y1+QMAX((-adjbw1*2+1)/3,0), x1+third, y2-QMAX((-adjbw2*2+1)/3,0), s, c, textcolor, SOLID, adjbw1bigthird, adjbw2bigthird);	      drawBorder(p, x2 - third, y1+QMAX(( adjbw1*2+1)/3,0), x2      , y2-QMAX(( adjbw2*2+1)/3,0), s, c, textcolor, SOLID, adjbw1bigthird, adjbw2bigthird);	      break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -