SVGResource* SVGClipPathElement::canvasResource() { if (!m_clipper) m_clipper = SVGResourceClipper::create(); else m_clipper->resetClipData(); bool bbox = clipPathUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX; RenderStyle* clipPathStyle = styleForRenderer(parent()->renderer()); // FIXME: Manual style resolution is a hack for (Node* n = firstChild(); n; n = n->nextSibling()) { if (n->isSVGElement() && static_cast<SVGElement*>(n)->isStyledTransformable()) { SVGStyledTransformableElement* styled = static_cast<SVGStyledTransformableElement*>(n); RenderStyle* pathStyle = document()->styleSelector()->styleForElement(styled, clipPathStyle); if (pathStyle->display() != NONE) { Path pathData = styled->toClipPath(); // FIXME: How do we know the element has done a layout? pathData.transform(styled->animatedLocalTransform()); if (!pathData.isEmpty()) m_clipper->addClipData(pathData, pathStyle->svgStyle()->clipRule(), bbox); } pathStyle->deref(document()->renderArena()); } } if (m_clipper->clipData().isEmpty()) { Path pathData; pathData.addRect(FloatRect()); m_clipper->addClipData(pathData, RULE_EVENODD, bbox); } clipPathStyle->deref(document()->renderArena()); return m_clipper.get(); }
KCanvasClipper *SVGClipPathElement::canvasResource() { if (!view()) return 0; if (!m_clipper) m_clipper = static_cast<KCanvasClipper *>(renderingDevice()->createResource(RS_CLIPPER)); else m_clipper->resetClipData(); bool bbox = clipPathUnits()->baseVal() == SVG_UNIT_TYPE_OBJECTBOUNDINGBOX; RenderStyle *clipPathStyle = styleForRenderer(parent()->renderer()); // FIXME: Manual style resolution is a hack for (Node *n = firstChild(); n != 0; n = n->nextSibling()) { SVGElement *e = svg_dynamic_cast(n); if (e && e->isStyled()) { SVGStyledElement *styled = static_cast<SVGStyledElement *>(e); RenderStyle *pathStyle = document()->styleSelector()->styleForElement(styled, clipPathStyle); if (KCanvasPath* pathData = styled->toPathData()) m_clipper->addClipData(pathData, (KCWindRule) pathStyle->svgStyle()->clipRule(), bbox); pathStyle->deref(view()->renderArena()); } } clipPathStyle->deref(view()->renderArena()); return m_clipper; }
bool SVGFEFloodElement::build(FilterBuilder* builder) { RenderStyle* parentStyle = this->styleForRenderer(parent()->renderer()); RenderStyle* filterStyle = this->resolveStyle(parentStyle); Color color = filterStyle->svgStyle()->floodColor(); float opacity = filterStyle->svgStyle()->floodOpacity(); parentStyle->deref(document()->renderArena()); filterStyle->deref(document()->renderArena()); builder->add(result(), FEFlood::create(color, opacity)); return true; }
void HTMLIFrameElementImpl::attach() { assert(!attached()); assert(!m_render); assert(parentNode()); updateFrame(); name = getAttribute(ATTR_NAME); if(name.isNull()) name = getAttribute(ATTR_ID); RenderStyle *style = getDocument()->styleSelector()->styleForElement(this); style->ref(); if(getDocument()->isURLAllowed(url.string()) && parentNode()->renderer() && style->display() != NONE) { m_render = new(getDocument()->renderArena()) RenderPartObject(this); m_render->setStyle(style); parentNode()->renderer()->addChild(m_render, nextRenderer()); } style->deref(); NodeBaseImpl::attach(); if(m_render) { // we need a unique name for every frame in the frameset. Hope that's unique enough. KHTMLView *w = getDocument()->view(); if(w && (name.isEmpty() || w->part()->frameExists(name.string()))) name = DOMString(w->part()->requestFrameName()); needWidgetUpdate = false; static_cast< RenderPartObject * >(m_render)->updateWidget(); } }
void HTMLOptGroupElement::attach() { RenderStyle* style = styleForRenderer(0); setRenderStyle(style); style->deref(document()->renderArena()); HTMLGenericFormElement::attach(); }
void HTMLOptGroupElement::setRenderStyle(RenderStyle* newStyle) { RenderStyle* oldStyle = m_style; m_style = newStyle; if (newStyle) newStyle->ref(); if (oldStyle) oldStyle->deref(document()->renderArena()); }
void NodeBaseImpl::setStyle(khtml::RenderStyle *style) { RenderStyle *oldStyle = m_style; m_style = style; if (m_style) m_style->ref(); if (oldStyle) oldStyle->deref(); }
void HTMLOptGroupElement::attach() { if (parentNode()->renderStyle()) { RenderStyle* style = styleForRenderer(0); setRenderStyle(style); style->deref(document()->renderArena()); } HTMLFormControlElement::attach(); }
Vector<SVGGradientStop> SVGGradientElement::buildStops() const { Vector<SVGGradientStop> stops; RenderStyle* gradientStyle = 0; for (Node* n = firstChild(); n; n = n->nextSibling()) { SVGElement* element = n->isSVGElement() ? static_cast<SVGElement*>(n) : 0; if (element && element->isGradientStop()) { SVGStopElement* stop = static_cast<SVGStopElement*>(element); float stopOffset = stop->offset(); Color color; float opacity; if (stop->renderer()) { RenderStyle* stopStyle = stop->renderer()->style(); color = stopStyle->svgStyle()->stopColor(); opacity = stopStyle->svgStyle()->stopOpacity(); } else { // If there is no renderer for this stop element, then a parent element // set display="none" - ie. <g display="none"><linearGradient><stop>.. // Unfortunately we have to manually rebuild the stop style. See pservers-grad-19-b.svg if (!gradientStyle) gradientStyle = const_cast<SVGGradientElement*>(this)->styleForRenderer(parent()->renderer()); RenderStyle* stopStyle = stop->resolveStyle(gradientStyle); color = stopStyle->svgStyle()->stopColor(); opacity = stopStyle->svgStyle()->stopOpacity(); stopStyle->deref(document()->renderArena()); } stops.append(makeGradientStop(stopOffset, makeRGBA(color.red(), color.green(), color.blue(), int(opacity * 255.)))); } } if (gradientStyle) gradientStyle->deref(document()->renderArena()); return stops; }
bool SVGFEDiffuseLightingElement::build(FilterBuilder* builder) { FilterEffect* input1 = builder->getEffectById(in1()); if(!input1) return false; RenderStyle* parentStyle = this->styleForRenderer(parent()->renderer()); RenderStyle* filterStyle = this->resolveStyle(parentStyle); Color color = filterStyle->svgStyle()->lightingColor(); parentStyle->deref(document()->renderArena()); filterStyle->deref(document()->renderArena()); RefPtr<FilterEffect> addedEffect = FEDiffuseLighting::create(input1, color, surfaceScale(), diffuseConstant(), kernelUnitLengthX(), kernelUnitLengthY(), findLights()); builder->add(result(), addedEffect.release()); return true; }
void SVGGradientElement::rebuildStops() const { if (m_resource && !ownerDocument()->parsing()) { Vector<KCGradientStop> stops; // FIXME: Manual style resolution is a hack RenderStyle* gradientStyle = const_cast<SVGGradientElement*>(this)->styleForRenderer(parent()->renderer()); for (Node *n = firstChild(); n; n = n->nextSibling()) { SVGElement *element = svg_dynamic_cast(n); if (element && element->isGradientStop()) { SVGStopElement *stop = static_cast<SVGStopElement *>(element); float stopOffset = stop->offset()->baseVal(); RenderStyle *stopStyle = document()->styleSelector()->styleForElement(stop, gradientStyle); Color c = stopStyle->svgStyle()->stopColor(); float opacity = stopStyle->svgStyle()->stopOpacity(); stops.append(makeGradientStop(stopOffset, makeRGBA(c.red(), c.green(), c.blue(), int(opacity * 255.)))); stopStyle->deref(view()->renderArena()); } } gradientStyle->deref(view()->renderArena()); m_resource->setGradientStops(stops); } }
RenderStyle::~RenderStyle() { RenderStyle *ps = pseudoStyle; RenderStyle *prev = 0; while (ps) { prev = ps; ps = ps->pseudoStyle; // to prevent a double deletion. // this works only because the styles below aren't really shared // Dirk said we need another construct as soon as these are shared prev->pseudoStyle = 0; prev->deref(); } }
void HTMLBodyElementImpl::attach() { assert(!m_render); assert(parentNode()); assert(parentNode()->renderer()); RenderStyle* style = getDocument()->styleSelector()->styleForElement(this); style->ref(); if (style->display() != NONE) { m_render = new RenderBody(this); m_render->setStyle(style); parentNode()->renderer()->addChild(m_render, nextRenderer()); } style->deref(); NodeBaseImpl::attach(); }
void RenderStyle::removePseudoStyle(PseudoId pid) { RenderStyle *ps = pseudoStyle; RenderStyle *prev = this; while (ps) { if (ps->noninherited_flags.f._styleType==pid) { prev->pseudoStyle = ps->pseudoStyle; ps->deref(); return; } prev = ps; ps = ps->pseudoStyle; } setHasPseudoStyle(pid, false); }
void HTMLBRElementImpl::attach() { assert(!attached()); assert(!m_render); assert(parentNode()); if (parentNode()->renderer()) { RenderStyle* style = getDocument()->styleSelector()->styleForElement( this ); style->ref(); if( style->display() != NONE ) { m_render = new (getDocument()->renderArena()) RenderBR(this); m_render->setStyle(style); parentNode()->renderer()->addChild(m_render, nextRenderer()); } style->deref(); } NodeImpl::attach(); }
void RenderStyle::arenaDelete(RenderArena *arena) { RenderStyle *ps = pseudoStyle; RenderStyle *prev = 0; while (ps) { prev = ps; ps = ps->pseudoStyle; // to prevent a double deletion. // this works only because the styles below aren't really shared // Dirk said we need another construct as soon as these are shared prev->pseudoStyle = 0; prev->deref(arena); } delete this; // Recover the size left there for us by operator delete and free the memory. arena->free(*(size_t *)this, this); }
void HTMLBodyElementImpl::attach() { assert(!m_render); assert(parentNode()); RenderStyle* style = getDocument()->styleSelector()->styleForElement(this); style->ref(); if (parentNode()->renderer() && style->display() != NONE) { if (style->display() == BLOCK) // only use the quirky class for block display m_render = new (getDocument()->renderArena()) RenderBody(this); else m_render = RenderObject::createObject(this, style); m_render->setStyle(style); parentNode()->renderer()->addChild(m_render, nextRenderer()); } style->deref(); NodeBaseImpl::attach(); }
void RenderObject::setStyle(RenderStyle *style) { if (m_style == style) return; // reset style flags m_floating = false; m_positioned = false; m_relPositioned = false; m_printSpecial = false; // no support for changing the display type dynamically... object must be // detached and re-attached as a different type //m_inline = true; m_visible = true; RenderStyle *oldStyle = m_style; m_style = style; if (m_style) m_style->ref(); if (oldStyle) oldStyle->deref(); if( m_bgImage != m_style->backgroundImage() ) { if(m_bgImage) m_bgImage->deref(this); m_bgImage = m_style->backgroundImage(); if(m_bgImage) m_bgImage->ref(this); } if( m_style->backgroundColor().isValid() || m_style->hasBorder() || m_bgImage ) setSpecialObjects(true); else setSpecialObjects(false); if( m_style->visiblity() == HIDDEN || m_style->visiblity() == COLLAPSE ) m_visible = false; setMinMaxKnown(false); setLayouted(false); }
void RenderListItem::setStyle(RenderStyle* _style) { RenderBlock::setStyle(_style); if (style()->listStyleType() != LNONE || (style()->listStyleImage() && !style()->listStyleImage()->isErrorImage())) { RenderStyle *newStyle = new (renderArena()) RenderStyle(); newStyle->ref(); // The marker always inherits from the list item, regardless of where it might end // up (e.g., in some deeply nested line box). See CSS3 spec. newStyle->inheritFrom(style()); if (!m_marker) { m_marker = new (renderArena()) RenderListMarker(document()); m_marker->setStyle(newStyle); m_marker->setListItem(this); } else m_marker->setStyle(newStyle); newStyle->deref(renderArena()); } else if (m_marker) { m_marker->destroy(); m_marker = 0; } }
void ElementImpl::recalcStyle(StyleChange change) { // ### should go away and be done in renderobject RenderStyle *_style = m_render ? m_render->style() : 0; bool hasParentRenderer = parent() ? parent()->attached() : false; #if 0 const char* debug; switch(change) { case NoChange: debug = "NoChange"; break; case NoInherit: debug= "NoInherit"; break; case Inherit: debug = "Inherit"; break; case Force: debug = "Force"; break; } qDebug("recalcStyle(%d: %s, changed: %d)[%p: %s]", change, debug, changed(), this, tagName().string().latin1()); #endif if(hasParentRenderer && (change >= Inherit || changed())) { RenderStyle *newStyle = getDocument()->styleSelector()->styleForElement(this); newStyle->ref(); StyleChange ch = diff(_style, newStyle); if(ch == Detach) { if(attached()) detach(); // ### Suboptimal. Style gets calculated again. attach(); // attach recalulates the style for all children. No need to do it twice. setChanged(false); setHasChangedChild(false); newStyle->deref(); return; } else if(ch != NoChange) { if(m_render && newStyle) { m_render->setStyle(newStyle); } } newStyle->deref(); if(change != Force) change = ch; } // If a changed attribute has ancestor dependencies, restyle all children if(changedAscendentAttribute()) { change = Force; setChangedAscendentAttribute(false); } NodeImpl *n; for(n = _first; n; n = n->nextSibling()) { if(change >= Inherit || n->isTextNode() || n->hasChangedChild() || n->changed()) { // qDebug(" (%p) calling recalcStyle on child %p/%s, change=%d", this, n, n->isElementNode() ? ((ElementImpl // *)n)->tagName().string().latin1() : n->isTextNode() ? "text" : "unknown", change ); n->recalcStyle(change); } } setChanged(false); setHasChangedChild(false); }
void ElementImpl::recalcStyle( StyleChange change ) { // ### should go away and be done in renderobject RenderStyle* _style = m_render ? m_render->style() : 0; bool hasParentRenderer = parent() ? parent()->renderer() : false; #if 0 const char* debug; switch(change) { case NoChange: debug = "NoChange"; break; case NoInherit: debug= "NoInherit"; break; case Inherit: debug = "Inherit"; break; case Force: debug = "Force"; break; } qDebug("recalcStyle(%d: %s)[%p: %s]", change, debug, this, tagName().string().latin1()); #endif if ( hasParentRenderer && (change >= Inherit || changed()) ) { RenderStyle *newStyle = getDocument()->styleSelector()->styleForElement(this); newStyle->ref(); StyleChange ch = diff( _style, newStyle ); if (ch == Detach) { if (attached()) detach(); // ### Suboptimal. Style gets calculated again. attach(); // attach recalulates the style for all children. No need to do it twice. setChanged( false ); setHasChangedChild( false ); newStyle->deref(getDocument()->renderArena()); return; } else if (ch != NoChange) { if( m_render && newStyle ) { //qDebug("--> setting style on render element bgcolor=%s", newStyle->backgroundColor().name().latin1()); m_render->setStyle(newStyle); } } else if (changed() && m_render && newStyle && (getDocument()->usesSiblingRules() || getDocument()->usesDescendantRules())) { // Although no change occurred, we use the new style so that the cousin style sharing code won't get // fooled into believing this style is the same. This is only necessary if the document actually uses // sibling/descendant rules, since otherwise it isn't possible for ancestor styles to affect sharing of // descendants. m_render->setStyleInternal(newStyle); } newStyle->deref(getDocument()->renderArena()); if ( change != Force) { if (getDocument()->usesDescendantRules()) change = Force; else change = ch; } } NodeImpl *n; for (n = _first; n; n = n->nextSibling()) { //qDebug(" (%p) calling recalcStyle on child %s/%p, change=%d", this, n, n->isElementNode() ? ((ElementImpl *)n)->tagName().string().latin1() : n->isTextNode() ? "text" : "unknown", change ); if ( change >= Inherit || n->isTextNode() || n->hasChangedChild() || n->changed() ) n->recalcStyle( change ); } setChanged( false ); setHasChangedChild( false ); }