void InlineTextBox::paint(RenderObject::PaintInfo& i, int tx, int ty) { if (object()->isBR() || object()->style()->visibility() != VISIBLE || m_truncation == cFullTruncation || i.phase == PaintActionOutline) return; if (i.phase == PaintActionSelection && object()->selectionState() == RenderObject::SelectionNone) // When only painting the selection, don't bother to paint if there is none. return; int xPos = tx + m_x; int w = width(); if ((xPos >= i.r.x() + i.r.width()) || (xPos + w <= i.r.x())) return; // Set our font. RenderStyle* styleToUse = object()->style(m_firstLine); int d = styleToUse->textDecorationsInEffect(); if (styleToUse->font() != i.p->font()) i.p->setFont(styleToUse->font()); const Font *font = &styleToUse->htmlFont(); bool haveSelection = selectionState() != RenderObject::SelectionNone; // Now calculate startPos and endPos, for painting selection. // We paint selection while endPos > 0 int ePos = 0, sPos = 0; if (haveSelection && !object()->canvas()->staticMode()) { selectionStartEnd(sPos, ePos); } if (styleToUse->color() != i.p->pen().color()) i.p->setPen(styleToUse->color()); if (m_len > 0 && i.phase != PaintActionSelection) { int endPoint = m_len; if (m_truncation != cNoTruncation) endPoint = m_truncation - m_start; if (styleToUse->textShadow()) paintShadow(i.p, font, tx, ty, styleToUse->textShadow()); if (!haveSelection || sPos != 0 || ePos != m_len) { font->drawText(i.p, m_x + tx, m_y + ty + m_baseline, renderText()->string()->s, renderText()->string()->l, m_start, endPoint, m_toAdd, m_reversed ? QPainter::RTL : QPainter::LTR); } } if (d != TDNONE && i.phase != PaintActionSelection && styleToUse->htmlHacks()) { i.p->setPen(styleToUse->color()); paintDecoration(i.p, font, tx, ty, d); } if (haveSelection && i.phase == PaintActionSelection) { //kdDebug(6040) << this << " paintSelection with startPos=" << sPos << " endPos=" << ePos << endl; if ( sPos < ePos ) paintSelection(font, renderText(), i.p, styleToUse, tx, ty, sPos, ePos, d); } }
void EllipsisBox::paint(RenderObject::PaintInfo& paintInfo, int tx, int ty) { GraphicsContext* context = paintInfo.context; RenderStyle* style = m_object->style(m_firstLine); if (style->font() != context->font()) context->setFont(style->font()); Color textColor = style->color(); if (textColor != context->fillColor()) context->setFillColor(textColor); bool setShadow = false; if (style->textShadow()) { context->setShadow(IntSize(style->textShadow()->x, style->textShadow()->y), style->textShadow()->blur, style->textShadow()->color); setShadow = true; } const String& str = m_str; TextStyle textStyle(0, 0, 0, false, style->visuallyOrdered()); context->drawText(TextRun(str.impl()), IntPoint(m_x + tx, m_y + ty + m_baseline), textStyle); if (setShadow) context->clearShadow(); if (m_markupBox) { // Paint the markup box tx += m_x + m_width - m_markupBox->xPos(); ty += m_y + m_baseline - (m_markupBox->yPos() + m_markupBox->baseline()); m_markupBox->paint(paintInfo, tx, ty); } }
PassRefPtrWillBeRawPtr<SVGPaint> CSSComputedStyleDeclaration::adjustSVGPaintForCurrentColor(PassRefPtrWillBeRawPtr<SVGPaint> newPaint, RenderStyle& style) const { RefPtrWillBeRawPtr<SVGPaint> paint = newPaint; if (paint->paintType() == SVGPaint::SVG_PAINTTYPE_CURRENTCOLOR || paint->paintType() == SVGPaint::SVG_PAINTTYPE_URI_CURRENTCOLOR) paint->setColor(style.color()); return paint.release(); }
PopupMenuStyle RenderMenuList::itemStyle(unsigned listIndex) const { HTMLSelectElement* select = static_cast<HTMLSelectElement*>(node()); HTMLElement* element = select->listItems()[listIndex]; RenderStyle* style = element->renderStyle() ? element->renderStyle() : element->computedStyle(); return style ? PopupMenuStyle(style->color(), itemBackgroundColor(listIndex), style->font(), style->visibility() == VISIBLE, style->textIndent(), style->direction()) : menuStyle(); }
TQString RenderStyle::createDiff( const RenderStyle &parent ) const { TQString res; if ( color().isValid() && parent.color() != color() ) res += " [color=" + color().name() + "]"; if ( backgroundColor().isValid() && parent.backgroundColor() != backgroundColor() ) res += " [bgcolor=" + backgroundColor().name() + "]"; if ( parent.font() != font() ) res += " [font=" + describeFont( font() ) + "]"; return res; }
PassRefPtr<AnimatableValue> CSSAnimatableValueFactory::createFromColor(CSSPropertyID property, const RenderStyle& style) { Color color = style.colorIncludingFallback(property, false); Color visitedLinkColor = style.colorIncludingFallback(property, true); Color fallbackColor = style.color(); Color fallbackVisitedLinkColor = style.visitedLinkColor(); Color resolvedColor; if (color.isValid()) resolvedColor = color; else resolvedColor = fallbackColor; Color resolvedVisitedLinkColor; if (visitedLinkColor.isValid()) resolvedVisitedLinkColor = visitedLinkColor; else resolvedVisitedLinkColor = fallbackVisitedLinkColor; return AnimatableColor::create(resolvedColor, resolvedVisitedLinkColor); }
void InlineFlowBox::paintDecorations(RenderObject::PaintInfo& pI, int _tx, int _ty, bool paintedChildren) { // Now paint our text decorations. We only do this if we aren't in quirks mode (i.e., in // almost-strict mode or strict mode). if (object()->style()->htmlHacks() || object()->style()->visibility() != VISIBLE) return; _tx += m_x; _ty += m_y; RenderStyle* styleToUse = object()->style(m_firstLine); int deco = parent() ? styleToUse->textDecoration() : styleToUse->textDecorationsInEffect(); if (deco != TDNONE && ((!paintedChildren && ((deco & UNDERLINE) || (deco & OVERLINE))) || (paintedChildren && (deco & LINE_THROUGH))) && shouldDrawDecoration(object())) { // We must have child boxes and have decorations defined. _tx += borderLeft() + paddingLeft(); int w = m_width - (borderLeft() + paddingLeft() + borderRight() + paddingRight()); if ( !w ) return; const QFontMetrics &fm = object()->fontMetrics( m_firstLine ); // thick lines on small fonts look ugly int thickness = fm.height() > 20 ? fm.lineWidth() : 1; QColor underline, overline, linethrough; underline = overline = linethrough = styleToUse->color(); if (!parent()) object()->getTextDecorationColors(deco, underline, overline, linethrough); if (styleToUse->font() != pI.p->font()) pI.p->setFont(styleToUse->font()); if (deco & UNDERLINE && !paintedChildren) { int underlineOffset = ( fm.height() + m_baseline ) / 2; if (underlineOffset <= m_baseline) underlineOffset = m_baseline+1; pI.p->fillRect(_tx, _ty + underlineOffset, w, thickness, underline ); } if (deco & OVERLINE && !paintedChildren) { pI.p->fillRect(_tx, _ty, w, thickness, overline ); } if (deco & LINE_THROUGH && paintedChildren) { pI.p->fillRect(_tx, _ty + 2*m_baseline/3, w, thickness, linethrough ); } } }
inline void RenderSVGResource::adjustColorForPseudoRules(const RenderStyle* style, bool useFillPaint, Color& color) { if (style->insideLink() != InsideVisitedLink) return; RenderStyle* visitedStyle = style->getCachedPseudoStyle(VISITED_LINK); SVGPaint* visitedPaint = useFillPaint ? visitedStyle->svgStyle()->fillPaint() : visitedStyle->svgStyle()->strokePaint(); if (visitedPaint->paintType() == SVGPaint::SVG_PAINTTYPE_URI) return; Color visitedColor; if (visitedPaint->paintType() == SVGPaint::SVG_PAINTTYPE_CURRENTCOLOR) visitedColor = visitedStyle->color(); else visitedColor = visitedPaint->color(); if (visitedColor.isValid()) color = Color(visitedColor.red(), visitedColor.green(), visitedColor.blue(), color.alpha()); }
void EllipsisBox::paint(RenderObject::PaintInfo& paintInfo, int tx, int ty) { GraphicsContext* context = paintInfo.context; RenderStyle* style = m_renderer->style(m_firstLine); Color textColor = style->color(); if (textColor != context->fillColor()) context->setFillColor(textColor, style->colorSpace()); bool setShadow = false; if (style->textShadow()) { context->setShadow(IntSize(style->textShadow()->x, style->textShadow()->y), style->textShadow()->blur, style->textShadow()->color, style->colorSpace()); setShadow = true; } if (selectionState() != RenderObject::SelectionNone) { paintSelection(context, tx, ty, style, style->font()); // Select the correct color for painting the text. Color foreground = paintInfo.forceBlackText ? Color::black : renderer()->selectionForegroundColor(); if (foreground.isValid() && foreground != textColor) context->setFillColor(foreground, style->colorSpace()); } const String& str = m_str; context->drawText(style->font(), TextRun(str.characters(), str.length(), false, 0, 0, false, style->visuallyOrdered()), IntPoint(m_x + tx, m_y + ty + style->font().ascent())); // Restore the regular fill color. if (textColor != context->fillColor()) context->setFillColor(textColor, style->colorSpace()); if (setShadow) context->clearShadow(); if (m_markupBox) { // Paint the markup box tx += m_x + m_width - m_markupBox->x(); ty += m_y + style->font().ascent() - (m_markupBox->y() + m_markupBox->renderer()->style(m_firstLine)->font().ascent()); m_markupBox->paint(paintInfo, tx, ty); } }
bool CSSPropertyEquality::propertiesEqual(CSSPropertyID prop, const RenderStyle& a, const RenderStyle& b) { switch (prop) { case CSSPropertyBackgroundColor: return a.backgroundColor().resolve(a.color()) == b.backgroundColor().resolve(b.color()) && a.visitedLinkBackgroundColor().resolve(a.color()) == b.visitedLinkBackgroundColor().resolve(b.color()); case CSSPropertyBackgroundImage: return fillLayersEqual<CSSPropertyBackgroundImage>(a.backgroundLayers(), b.backgroundLayers()); case CSSPropertyBackgroundPositionX: return fillLayersEqual<CSSPropertyBackgroundPositionX>(a.backgroundLayers(), b.backgroundLayers()); case CSSPropertyBackgroundPositionY: return fillLayersEqual<CSSPropertyBackgroundPositionY>(a.backgroundLayers(), b.backgroundLayers()); case CSSPropertyBackgroundSize: return fillLayersEqual<CSSPropertyBackgroundSize>(a.backgroundLayers(), b.backgroundLayers()); case CSSPropertyBaselineShift: return dataEquivalent(a.baselineShiftValue(), b.baselineShiftValue()); case CSSPropertyBorderBottomColor: return a.borderBottomColor().resolve(a.color()) == b.borderBottomColor().resolve(b.color()) && a.visitedLinkBorderBottomColor().resolve(a.color()) == b.visitedLinkBorderBottomColor().resolve(b.color()); case CSSPropertyBorderBottomLeftRadius: return a.borderBottomLeftRadius() == b.borderBottomLeftRadius(); case CSSPropertyBorderBottomRightRadius: return a.borderBottomRightRadius() == b.borderBottomRightRadius(); case CSSPropertyBorderBottomWidth: return a.borderBottomWidth() == b.borderBottomWidth(); case CSSPropertyBorderImageOutset: return a.borderImageOutset() == b.borderImageOutset(); case CSSPropertyBorderImageSlice: return a.borderImageSlices() == b.borderImageSlices(); case CSSPropertyBorderImageSource: return dataEquivalent(a.borderImageSource(), b.borderImageSource()); case CSSPropertyBorderImageWidth: return a.borderImageWidth() == b.borderImageWidth(); case CSSPropertyBorderLeftColor: return a.borderLeftColor().resolve(a.color()) == b.borderLeftColor().resolve(b.color()) && a.visitedLinkBorderLeftColor().resolve(a.color()) == b.visitedLinkBorderLeftColor().resolve(b.color()); case CSSPropertyBorderLeftWidth: return a.borderLeftWidth() == b.borderLeftWidth(); case CSSPropertyBorderRightColor: return a.borderRightColor().resolve(a.color()) == b.borderRightColor().resolve(b.color()) && a.visitedLinkBorderRightColor().resolve(a.color()) == b.visitedLinkBorderRightColor().resolve(b.color()); case CSSPropertyBorderRightWidth: return a.borderRightWidth() == b.borderRightWidth(); case CSSPropertyBorderTopColor: return a.borderTopColor().resolve(a.color()) == b.borderTopColor().resolve(b.color()) && a.visitedLinkBorderTopColor().resolve(a.color()) == b.visitedLinkBorderTopColor().resolve(b.color()); case CSSPropertyBorderTopLeftRadius: return a.borderTopLeftRadius() == b.borderTopLeftRadius(); case CSSPropertyBorderTopRightRadius: return a.borderTopRightRadius() == b.borderTopRightRadius(); case CSSPropertyBorderTopWidth: return a.borderTopWidth() == b.borderTopWidth(); case CSSPropertyBottom: return a.bottom() == b.bottom(); case CSSPropertyBoxShadow: return dataEquivalent(a.boxShadow(), b.boxShadow()); case CSSPropertyClip: return a.clip() == b.clip(); case CSSPropertyColor: return a.color() == b.color() && a.visitedLinkColor() == b.visitedLinkColor(); case CSSPropertyFill: return a.fillPaintType() == b.fillPaintType() && (a.fillPaintType() != SVGPaint::SVG_PAINTTYPE_RGBCOLOR || a.fillPaintColor() == b.fillPaintColor()); case CSSPropertyFillOpacity: return a.fillOpacity() == b.fillOpacity(); case CSSPropertyFlexBasis: return a.flexBasis() == b.flexBasis(); case CSSPropertyFlexGrow: return a.flexGrow() == b.flexGrow(); case CSSPropertyFlexShrink: return a.flexShrink() == b.flexShrink(); case CSSPropertyFloodColor: return a.floodColor() == b.floodColor(); case CSSPropertyFloodOpacity: return a.floodOpacity() == b.floodOpacity(); case CSSPropertyFontSize: // CSSPropertyFontSize: Must pass a specified size to setFontSize if Text Autosizing is enabled, but a computed size // if text zoom is enabled (if neither is enabled it's irrelevant as they're probably the same). // FIXME: Should we introduce an option to pass the computed font size here, allowing consumers to // enable text zoom rather than Text Autosizing? See http://crbug.com/227545. return a.specifiedFontSize() == b.specifiedFontSize(); case CSSPropertyFontWeight: return a.fontWeight() == b.fontWeight(); case CSSPropertyHeight: return a.height() == b.height(); case CSSPropertyLeft: return a.left() == b.left(); case CSSPropertyLetterSpacing: return a.letterSpacing() == b.letterSpacing(); case CSSPropertyLightingColor: return a.lightingColor() == b.lightingColor(); case CSSPropertyLineHeight: return a.specifiedLineHeight() == b.specifiedLineHeight(); case CSSPropertyListStyleImage: return dataEquivalent(a.listStyleImage(), b.listStyleImage()); case CSSPropertyMarginBottom: return a.marginBottom() == b.marginBottom(); case CSSPropertyMarginLeft: return a.marginLeft() == b.marginLeft(); case CSSPropertyMarginRight: return a.marginRight() == b.marginRight(); case CSSPropertyMarginTop: return a.marginTop() == b.marginTop(); case CSSPropertyMaxHeight: return a.maxHeight() == b.maxHeight(); case CSSPropertyMaxWidth: return a.maxWidth() == b.maxWidth(); case CSSPropertyMinHeight: return a.minHeight() == b.minHeight(); case CSSPropertyMinWidth: return a.minWidth() == b.minWidth(); case CSSPropertyObjectPosition: return a.objectPosition() == b.objectPosition(); case CSSPropertyOpacity: return a.opacity() == b.opacity(); case CSSPropertyOrphans: return a.orphans() == b.orphans(); case CSSPropertyOutlineColor: return a.outlineColor().resolve(a.color()) == b.outlineColor().resolve(b.color()) && a.visitedLinkOutlineColor().resolve(a.color()) == b.visitedLinkOutlineColor().resolve(b.color()); case CSSPropertyOutlineOffset: return a.outlineOffset() == b.outlineOffset(); case CSSPropertyOutlineWidth: return a.outlineWidth() == b.outlineWidth(); case CSSPropertyPaddingBottom: return a.paddingBottom() == b.paddingBottom(); case CSSPropertyPaddingLeft: return a.paddingLeft() == b.paddingLeft(); case CSSPropertyPaddingRight: return a.paddingRight() == b.paddingRight(); case CSSPropertyPaddingTop: return a.paddingTop() == b.paddingTop(); case CSSPropertyRight: return a.right() == b.right(); case CSSPropertyShapeImageThreshold: return a.shapeImageThreshold() == b.shapeImageThreshold(); case CSSPropertyShapeMargin: return a.shapeMargin() == b.shapeMargin(); case CSSPropertyShapeOutside: return dataEquivalent(a.shapeOutside(), b.shapeOutside()); case CSSPropertyStopColor: return a.stopColor() == b.stopColor(); case CSSPropertyStopOpacity: return a.stopOpacity() == b.stopOpacity(); case CSSPropertyStroke: return a.strokePaintType() == b.strokePaintType() && (a.strokePaintType() != SVGPaint::SVG_PAINTTYPE_RGBCOLOR || a.strokePaintColor() == b.strokePaintColor()); case CSSPropertyStrokeDasharray: return dataEquivalent(a.strokeDashArray(), b.strokeDashArray()); case CSSPropertyStrokeDashoffset: return dataEquivalent(a.strokeDashOffset(), b.strokeDashOffset()); case CSSPropertyStrokeMiterlimit: return a.strokeMiterLimit() == b.strokeMiterLimit(); case CSSPropertyStrokeOpacity: return a.strokeOpacity() == b.strokeOpacity(); case CSSPropertyStrokeWidth: return dataEquivalent(a.strokeWidth(), b.strokeWidth()); case CSSPropertyTextDecorationColor: return a.textDecorationColor().resolve(a.color()) == b.textDecorationColor().resolve(b.color()) && a.visitedLinkTextDecorationColor().resolve(a.color()) == b.visitedLinkTextDecorationColor().resolve(b.color()); case CSSPropertyTextIndent: return a.textIndent() == b.textIndent(); case CSSPropertyTextShadow: return dataEquivalent(a.textShadow(), b.textShadow()); case CSSPropertyTop: return a.top() == b.top(); case CSSPropertyVisibility: return a.visibility() == b.visibility(); case CSSPropertyWebkitBackgroundSize: return fillLayersEqual<CSSPropertyWebkitBackgroundSize>(a.backgroundLayers(), b.backgroundLayers()); case CSSPropertyWebkitBorderHorizontalSpacing: return a.horizontalBorderSpacing() == b.horizontalBorderSpacing(); case CSSPropertyWebkitBorderVerticalSpacing: return a.verticalBorderSpacing() == b.verticalBorderSpacing(); case CSSPropertyWebkitBoxShadow: return dataEquivalent(a.boxShadow(), b.boxShadow()); case CSSPropertyWebkitClipPath: return dataEquivalent(a.clipPath(), b.clipPath()); case CSSPropertyWebkitColumnCount: return a.columnCount() == b.columnCount(); case CSSPropertyWebkitColumnGap: return a.columnGap() == b.columnGap(); case CSSPropertyWebkitColumnRuleColor: return a.columnRuleColor().resolve(a.color()) == b.columnRuleColor().resolve(b.color()) && a.visitedLinkColumnRuleColor().resolve(a.color()) == b.visitedLinkColumnRuleColor().resolve(b.color()); case CSSPropertyWebkitColumnRuleWidth: return a.columnRuleWidth() == b.columnRuleWidth(); case CSSPropertyWebkitColumnWidth: return a.columnWidth() == b.columnWidth(); case CSSPropertyWebkitFilter: return a.filter() == b.filter(); case CSSPropertyWebkitMaskBoxImageOutset: return a.maskBoxImageOutset() == b.maskBoxImageOutset(); case CSSPropertyWebkitMaskBoxImageSlice: return a.maskBoxImageSlices() == b.maskBoxImageSlices(); case CSSPropertyWebkitMaskBoxImageSource: return dataEquivalent(a.maskBoxImageSource(), b.maskBoxImageSource()); case CSSPropertyWebkitMaskBoxImageWidth: return a.maskBoxImageWidth() == b.maskBoxImageWidth(); case CSSPropertyWebkitMaskImage: return dataEquivalent(a.maskImage(), b.maskImage()); case CSSPropertyWebkitMaskPositionX: return fillLayersEqual<CSSPropertyWebkitMaskPositionX>(a.maskLayers(), b.maskLayers()); case CSSPropertyWebkitMaskPositionY: return fillLayersEqual<CSSPropertyWebkitMaskPositionY>(a.maskLayers(), b.maskLayers()); case CSSPropertyWebkitMaskSize: return fillLayersEqual<CSSPropertyWebkitMaskSize>(a.maskLayers(), b.maskLayers()); case CSSPropertyPerspective: return a.perspective() == b.perspective(); case CSSPropertyPerspectiveOrigin: return a.perspectiveOriginX() == b.perspectiveOriginX() && a.perspectiveOriginY() == b.perspectiveOriginY(); case CSSPropertyWebkitPerspectiveOriginX: return a.perspectiveOriginX() == b.perspectiveOriginX(); case CSSPropertyWebkitPerspectiveOriginY: return a.perspectiveOriginY() == b.perspectiveOriginY(); case CSSPropertyWebkitTextStrokeColor: return a.textStrokeColor().resolve(a.color()) == b.textStrokeColor().resolve(b.color()) && a.visitedLinkTextStrokeColor().resolve(a.color()) == b.visitedLinkTextStrokeColor().resolve(b.color()); case CSSPropertyTransform: return a.transform() == b.transform(); case CSSPropertyTransformOrigin: return a.transformOriginX() == b.transformOriginX() && a.transformOriginY() == b.transformOriginY() && a.transformOriginZ() == b.transformOriginZ(); case CSSPropertyWebkitTransformOriginX: return a.transformOriginX() == b.transformOriginX(); case CSSPropertyWebkitTransformOriginY: return a.transformOriginY() == b.transformOriginY(); case CSSPropertyWebkitTransformOriginZ: return a.transformOriginZ() == b.transformOriginZ(); case CSSPropertyWidows: return a.widows() == b.widows(); case CSSPropertyWidth: return a.width() == b.width(); case CSSPropertyWordSpacing: return a.wordSpacing() == b.wordSpacing(); case CSSPropertyZIndex: return a.zIndex() == b.zIndex(); case CSSPropertyZoom: return a.zoom() == b.zoom(); default: ASSERT_NOT_REACHED(); return true; } }
void InlineTextBox::paint(RenderObject::PaintInfo& paintInfo, int tx, int ty) { if (isLineBreak() || !object()->shouldPaintWithinRoot(paintInfo) || object()->style()->visibility() != VISIBLE || m_truncation == cFullTruncation || paintInfo.phase == PaintPhaseOutline) return; ASSERT(paintInfo.phase != PaintPhaseSelfOutline && paintInfo.phase != PaintPhaseChildOutlines); int xPos = tx + m_x - parent()->maxHorizontalVisualOverflow(); int w = width() + 2 * parent()->maxHorizontalVisualOverflow(); if (xPos >= paintInfo.rect.right() || xPos + w <= paintInfo.rect.x()) return; bool isPrinting = textObject()->document()->printing(); // Determine whether or not we're selected. bool haveSelection = !isPrinting && paintInfo.phase != PaintPhaseTextClip && selectionState() != RenderObject::SelectionNone; if (!haveSelection && paintInfo.phase == PaintPhaseSelection) // When only painting the selection, don't bother to paint if there is none. return; GraphicsContext* context = paintInfo.context; // Determine whether or not we have composition underlines to draw. bool containsComposition = object()->document()->frame()->editor()->compositionNode() == object()->node(); bool useCustomUnderlines = containsComposition && object()->document()->frame()->editor()->compositionUsesCustomUnderlines(); // Set our font. RenderStyle* styleToUse = object()->style(m_firstLine); int d = styleToUse->textDecorationsInEffect(); const Font* font = &styleToUse->font(); if (*font != context->font()) context->setFont(*font); // 1. Paint backgrounds behind text if needed. Examples of such backgrounds include selection // and composition underlines. if (paintInfo.phase != PaintPhaseSelection && paintInfo.phase != PaintPhaseTextClip && !isPrinting) { #if PLATFORM(MAC) // Custom highlighters go behind everything else. if (styleToUse->highlight() != nullAtom && !context->paintingDisabled()) paintCustomHighlight(tx, ty, styleToUse->highlight()); #endif if (containsComposition && !useCustomUnderlines) paintCompositionBackground(context, tx, ty, styleToUse, font, object()->document()->frame()->editor()->compositionStart(), object()->document()->frame()->editor()->compositionEnd()); paintDocumentMarkers(context, tx, ty, styleToUse, font, true); if (haveSelection && !useCustomUnderlines) paintSelection(context, tx, ty, styleToUse, font); } // 2. Now paint the foreground, including text and decorations like underline/overline (in quirks mode only). if (m_len <= 0) return; Color textFillColor; Color textStrokeColor; float textStrokeWidth = styleToUse->textStrokeWidth(); ShadowData* textShadow = paintInfo.forceBlackText ? 0 : styleToUse->textShadow(); if (paintInfo.forceBlackText) { textFillColor = Color::black; textStrokeColor = Color::black; } else { textFillColor = styleToUse->textFillColor(); if (!textFillColor.isValid()) textFillColor = styleToUse->color(); // Make the text fill color legible against a white background if (styleToUse->forceBackgroundsToWhite()) textFillColor = correctedTextColor(textFillColor, Color::white); textStrokeColor = styleToUse->textStrokeColor(); if (!textStrokeColor.isValid()) textStrokeColor = styleToUse->color(); // Make the text stroke color legible against a white background if (styleToUse->forceBackgroundsToWhite()) textStrokeColor = correctedTextColor(textStrokeColor, Color::white); } bool paintSelectedTextOnly = (paintInfo.phase == PaintPhaseSelection); bool paintSelectedTextSeparately = false; Color selectionFillColor = textFillColor; Color selectionStrokeColor = textStrokeColor; float selectionStrokeWidth = textStrokeWidth; ShadowData* selectionShadow = textShadow; if (haveSelection) { // Check foreground color first. Color foreground = paintInfo.forceBlackText ? Color::black : object()->selectionForegroundColor(); if (foreground.isValid() && foreground != selectionFillColor) { if (!paintSelectedTextOnly) paintSelectedTextSeparately = true; selectionFillColor = foreground; } if (RenderStyle* pseudoStyle = object()->getCachedPseudoStyle(RenderStyle::SELECTION)) { ShadowData* shadow = paintInfo.forceBlackText ? 0 : pseudoStyle->textShadow(); if (shadow != selectionShadow) { if (!paintSelectedTextOnly) paintSelectedTextSeparately = true; selectionShadow = shadow; } float strokeWidth = pseudoStyle->textStrokeWidth(); if (strokeWidth != selectionStrokeWidth) { if (!paintSelectedTextOnly) paintSelectedTextSeparately = true; selectionStrokeWidth = strokeWidth; } Color stroke = paintInfo.forceBlackText ? Color::black : pseudoStyle->textStrokeColor(); if (!stroke.isValid()) stroke = pseudoStyle->color(); if (stroke != selectionStrokeColor) { if (!paintSelectedTextOnly) paintSelectedTextSeparately = true; selectionStrokeColor = stroke; } } } IntPoint textOrigin(m_x + tx, m_y + ty + m_baseline); TextRun textRun(textObject()->text()->characters() + m_start, m_len, textObject()->allowTabs(), textPos(), m_toAdd, direction() == RTL, m_dirOverride || styleToUse->visuallyOrdered()); int sPos = 0; int ePos = 0; if (paintSelectedTextOnly || paintSelectedTextSeparately) selectionStartEnd(sPos, ePos); if (!paintSelectedTextOnly) { // For stroked painting, we have to change the text drawing mode. It's probably dangerous to leave that mutated as a side // effect, so only when we know we're stroking, do a save/restore. if (textStrokeWidth > 0) context->save(); updateGraphicsContext(context, textFillColor, textStrokeColor, textStrokeWidth); if (!paintSelectedTextSeparately || ePos <= sPos) { // FIXME: Truncate right-to-left text correctly. paintTextWithShadows(context, textRun, 0, m_truncation == cNoTruncation ? m_len : m_truncation, textOrigin, m_x + tx, m_y + ty, width(), height(), textShadow, textStrokeWidth > 0); } else paintTextWithShadows(context, textRun, ePos, sPos, textOrigin, m_x + tx, m_y + ty, width(), height(), textShadow, textStrokeWidth > 0); if (textStrokeWidth > 0) context->restore(); } if ((paintSelectedTextOnly || paintSelectedTextSeparately) && sPos < ePos) { // paint only the text that is selected if (selectionStrokeWidth > 0) context->save(); updateGraphicsContext(context, selectionFillColor, selectionStrokeColor, selectionStrokeWidth); paintTextWithShadows(context, textRun, sPos, ePos, textOrigin, m_x + tx, m_y + ty, width(), height(), selectionShadow, selectionStrokeWidth > 0); if (selectionStrokeWidth > 0) context->restore(); } // Paint decorations if (d != TDNONE && paintInfo.phase != PaintPhaseSelection && styleToUse->htmlHacks()) { context->setStrokeColor(styleToUse->color()); paintDecoration(context, tx, ty, d, textShadow); } if (paintInfo.phase == PaintPhaseForeground) { paintDocumentMarkers(context, tx, ty, styleToUse, font, false); if (useCustomUnderlines) { const Vector<CompositionUnderline>& underlines = object()->document()->frame()->editor()->customCompositionUnderlines(); size_t numUnderlines = underlines.size(); for (size_t index = 0; index < numUnderlines; ++index) { const CompositionUnderline& underline = underlines[index]; if (underline.endOffset <= start()) // underline is completely before this run. This might be an underline that sits // before the first run we draw, or underlines that were within runs we skipped // due to truncation. continue; if (underline.startOffset <= end()) { // underline intersects this run. Paint it. paintCompositionUnderline(context, tx, ty, underline); if (underline.endOffset > end() + 1) // underline also runs into the next run. Bail now, no more marker advancement. break; } else // underline is completely after this run, bail. A later run will paint it. break; } } } }
// FIXME: Generate this function. PassRefPtr<AnimatableValue> CSSAnimatableValueFactory::create(CSSPropertyID property, const RenderStyle& style) { ASSERT(CSSPropertyMetadata::isAnimatableProperty(property)); switch (property) { case CSSPropertyBackgroundColor: return createFromColor(property, style); case CSSPropertyBackgroundImage: return createFromFillLayers<CSSPropertyBackgroundImage>(style.backgroundLayers(), style); case CSSPropertyBackgroundPositionX: return createFromFillLayers<CSSPropertyBackgroundPositionX>(style.backgroundLayers(), style); case CSSPropertyBackgroundPositionY: return createFromFillLayers<CSSPropertyBackgroundPositionY>(style.backgroundLayers(), style); case CSSPropertyBackgroundSize: case CSSPropertyWebkitBackgroundSize: return createFromFillLayers<CSSPropertyBackgroundSize>(style.backgroundLayers(), style); case CSSPropertyBorderBottomColor: return createFromColor(property, style); case CSSPropertyBorderBottomLeftRadius: return createFromLengthSize(style.borderBottomLeftRadius(), style); case CSSPropertyBorderBottomRightRadius: return createFromLengthSize(style.borderBottomRightRadius(), style); case CSSPropertyBorderBottomWidth: return createFromDouble(style.borderBottomWidth()); case CSSPropertyBorderImageOutset: return createFromBorderImageLengthBox(style.borderImageOutset(), style); case CSSPropertyBorderImageSlice: return createFromLengthBox(style.borderImageSlices(), style); case CSSPropertyBorderImageSource: return createFromStyleImage(style.borderImageSource()); case CSSPropertyBorderImageWidth: return createFromBorderImageLengthBox(style.borderImageWidth(), style); case CSSPropertyBorderLeftColor: return createFromColor(property, style); case CSSPropertyBorderLeftWidth: return createFromDouble(style.borderLeftWidth()); case CSSPropertyBorderRightColor: return createFromColor(property, style); case CSSPropertyBorderRightWidth: return createFromDouble(style.borderRightWidth()); case CSSPropertyBorderTopColor: return createFromColor(property, style); case CSSPropertyBorderTopLeftRadius: return createFromLengthSize(style.borderTopLeftRadius(), style); case CSSPropertyBorderTopRightRadius: return createFromLengthSize(style.borderTopRightRadius(), style); case CSSPropertyBorderTopWidth: return createFromDouble(style.borderTopWidth()); case CSSPropertyBottom: return createFromLength(style.bottom(), style); case CSSPropertyBoxShadow: case CSSPropertyWebkitBoxShadow: return AnimatableShadow::create(style.boxShadow()); case CSSPropertyClip: if (style.hasAutoClip()) return AnimatableUnknown::create(CSSPrimitiveValue::create(CSSValueAuto)); return createFromLengthBox(style.clip(), style); case CSSPropertyColor: return createFromColor(property, style); case CSSPropertyFilter: return AnimatableFilterOperations::create(style.filter()); case CSSPropertyFlexGrow: return createFromDouble(style.flexGrow(), AnimatableDouble::InterpolationIsNonContinuousWithZero); case CSSPropertyFlexShrink: return createFromDouble(style.flexShrink(), AnimatableDouble::InterpolationIsNonContinuousWithZero); case CSSPropertyFlexBasis: return createFromLength(style.flexBasis(), style); case CSSPropertyFontSize: // Must pass a specified size to setFontSize if Text Autosizing is enabled, but a computed size // if text zoom is enabled (if neither is enabled it's irrelevant as they're probably the same). // FIXME: Should we introduce an option to pass the computed font size here, allowing consumers to // enable text zoom rather than Text Autosizing? See http://crbug.com/227545. return createFromDouble(style.specifiedFontSize()); case CSSPropertyFontStretch: return createFromFontStretch(style.fontStretch()); case CSSPropertyFontWeight: return createFromFontWeight(style.fontWeight()); case CSSPropertyHeight: return createFromLength(style.height(), style); case CSSPropertyLeft: return createFromLength(style.left(), style); case CSSPropertyLetterSpacing: return createFromDouble(style.letterSpacing()); case CSSPropertyLineHeight: return createFromLineHeight(style.specifiedLineHeight(), style); case CSSPropertyMarginBottom: return createFromLength(style.marginBottom(), style); case CSSPropertyMarginLeft: return createFromLength(style.marginLeft(), style); case CSSPropertyMarginRight: return createFromLength(style.marginRight(), style); case CSSPropertyMarginTop: return createFromLength(style.marginTop(), style); case CSSPropertyMaxHeight: return createFromLength(style.maxHeight(), style); case CSSPropertyMaxWidth: return createFromLength(style.maxWidth(), style); case CSSPropertyMinHeight: return createFromLength(style.minHeight(), style); case CSSPropertyMinWidth: return createFromLength(style.minWidth(), style); case CSSPropertyObjectPosition: return createFromLengthPoint(style.objectPosition(), style); case CSSPropertyOpacity: return createFromDouble(style.opacity()); case CSSPropertyOutlineColor: return createFromColor(property, style); case CSSPropertyOutlineOffset: return createFromDouble(style.outlineOffset()); case CSSPropertyOutlineWidth: return createFromDouble(style.outlineWidth()); case CSSPropertyPaddingBottom: return createFromLength(style.paddingBottom(), style); case CSSPropertyPaddingLeft: return createFromLength(style.paddingLeft(), style); case CSSPropertyPaddingRight: return createFromLength(style.paddingRight(), style); case CSSPropertyPaddingTop: return createFromLength(style.paddingTop(), style); case CSSPropertyRight: return createFromLength(style.right(), style); case CSSPropertyTextDecorationColor: return AnimatableColor::create(style.textDecorationColor().resolve(style.color())); case CSSPropertyTextIndent: return createFromLength(style.textIndent(), style); case CSSPropertyTextShadow: return AnimatableShadow::create(style.textShadow()); case CSSPropertyTop: return createFromLength(style.top(), style); case CSSPropertyWebkitBorderHorizontalSpacing: return createFromDouble(style.horizontalBorderSpacing()); case CSSPropertyWebkitBorderVerticalSpacing: return createFromDouble(style.verticalBorderSpacing()); case CSSPropertyWebkitClipPath: if (ClipPathOperation* operation = style.clipPath()) return AnimatableClipPathOperation::create(operation); return AnimatableUnknown::create(CSSValueNone); case CSSPropertyPerspective: return createFromDouble(style.perspective()); case CSSPropertyPerspectiveOrigin: return AnimatableLengthPoint::create( createFromLength(style.perspectiveOriginX(), style), createFromLength(style.perspectiveOriginY(), style)); case CSSPropertyWebkitTextStrokeColor: return createFromColor(property, style); case CSSPropertyTransform: return AnimatableTransform::create(style.transform()); case CSSPropertyTransformOrigin: return AnimatableLengthPoint3D::create( createFromLength(style.transformOriginX(), style), createFromLength(style.transformOriginY(), style), createFromDouble(style.transformOriginZ())); case CSSPropertyWidth: return createFromLength(style.width(), style); case CSSPropertyWordSpacing: return createFromDouble(style.wordSpacing()); case CSSPropertyVerticalAlign: if (style.verticalAlign() == LENGTH) return createFromLength(style.verticalAlignLength(), style); return AnimatableUnknown::create(CSSPrimitiveValue::create(style.verticalAlign())); case CSSPropertyZIndex: return createFromDouble(style.zIndex()); default: ASSERT_NOT_REACHED(); // This return value is to avoid a release crash if possible. return AnimatableUnknown::create(nullptr); } }
CSSValueImpl *CSSComputedStyleDeclarationImpl::getPropertyCSSValue(int propertyID, EUpdateLayout updateLayout) const { NodeImpl *node = m_node.handle(); if (!node) return 0; // Make sure our layout is up to date before we allow a query on these attributes. DocumentImpl* docimpl = node->getDocument(); if (docimpl && updateLayout) docimpl->updateLayout(); RenderObject *renderer = node->renderer(); if (!renderer) return 0; RenderStyle *style = renderer->style(); if (!style) return 0; switch (propertyID) { case CSS_PROP_BACKGROUND_COLOR: return new CSSPrimitiveValueImpl(style->backgroundColor().rgb()); case CSS_PROP_BACKGROUND_IMAGE: if (style->backgroundImage()) return new CSSPrimitiveValueImpl(style->backgroundImage()->url(), CSSPrimitiveValue::CSS_URI); return new CSSPrimitiveValueImpl(CSS_VAL_NONE); case CSS_PROP_BACKGROUND_REPEAT: switch (style->backgroundRepeat()) { case khtml::REPEAT: return new CSSPrimitiveValueImpl(CSS_VAL_REPEAT); case khtml::REPEAT_X: return new CSSPrimitiveValueImpl(CSS_VAL_REPEAT_X); case khtml::REPEAT_Y: return new CSSPrimitiveValueImpl(CSS_VAL_REPEAT_Y); case khtml::NO_REPEAT: return new CSSPrimitiveValueImpl(CSS_VAL_NO_REPEAT); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_BACKGROUND_ATTACHMENT: if (style->backgroundAttachment()) return new CSSPrimitiveValueImpl(CSS_VAL_SCROLL); else return new CSSPrimitiveValueImpl(CSS_VAL_FIXED); case CSS_PROP_BACKGROUND_POSITION: { DOMString string; Length length(style->backgroundXPosition()); if (length.isPercent()) string = numberAsString(length.length()) + "%"; else string = numberAsString(length.minWidth(renderer->contentWidth())); string += " "; length = style->backgroundYPosition(); if (length.isPercent()) string += numberAsString(length.length()) + "%"; else string += numberAsString(length.minWidth(renderer->contentWidth())); return new CSSPrimitiveValueImpl(string, CSSPrimitiveValue::CSS_STRING); } case CSS_PROP_BACKGROUND_POSITION_X: return valueForLength(style->backgroundXPosition()); case CSS_PROP_BACKGROUND_POSITION_Y: return valueForLength(style->backgroundYPosition()); #ifndef KHTML_NO_XBL case CSS_PROP__KHTML_BINDING: // FIXME: unimplemented break; #endif case CSS_PROP_BORDER_COLLAPSE: if (style->borderCollapse()) return new CSSPrimitiveValueImpl(CSS_VAL_COLLAPSE); else return new CSSPrimitiveValueImpl(CSS_VAL_SEPARATE); case CSS_PROP_BORDER_SPACING: { QString string(numberAsString(style->horizontalBorderSpacing()) + "px " + numberAsString(style->verticalBorderSpacing()) + "px"); return new CSSPrimitiveValueImpl(string, CSSPrimitiveValue::CSS_STRING); } case CSS_PROP__KHTML_BORDER_HORIZONTAL_SPACING: return new CSSPrimitiveValueImpl(style->horizontalBorderSpacing(), CSSPrimitiveValue::CSS_PX); case CSS_PROP__KHTML_BORDER_VERTICAL_SPACING: return new CSSPrimitiveValueImpl(style->verticalBorderSpacing(), CSSPrimitiveValue::CSS_PX); case CSS_PROP_BORDER_TOP_COLOR: return new CSSPrimitiveValueImpl(style->borderLeftColor().rgb()); case CSS_PROP_BORDER_RIGHT_COLOR: return new CSSPrimitiveValueImpl(style->borderRightColor().rgb()); case CSS_PROP_BORDER_BOTTOM_COLOR: return new CSSPrimitiveValueImpl(style->borderBottomColor().rgb()); case CSS_PROP_BORDER_LEFT_COLOR: return new CSSPrimitiveValueImpl(style->borderLeftColor().rgb()); case CSS_PROP_BORDER_TOP_STYLE: return valueForBorderStyle(style->borderTopStyle()); case CSS_PROP_BORDER_RIGHT_STYLE: return valueForBorderStyle(style->borderRightStyle()); case CSS_PROP_BORDER_BOTTOM_STYLE: return valueForBorderStyle(style->borderBottomStyle()); case CSS_PROP_BORDER_LEFT_STYLE: return valueForBorderStyle(style->borderLeftStyle()); case CSS_PROP_BORDER_TOP_WIDTH: return new CSSPrimitiveValueImpl(style->borderTopWidth(), CSSPrimitiveValue::CSS_PX); case CSS_PROP_BORDER_RIGHT_WIDTH: return new CSSPrimitiveValueImpl(style->borderRightWidth(), CSSPrimitiveValue::CSS_PX); case CSS_PROP_BORDER_BOTTOM_WIDTH: return new CSSPrimitiveValueImpl(style->borderBottomWidth(), CSSPrimitiveValue::CSS_PX); case CSS_PROP_BORDER_LEFT_WIDTH: return new CSSPrimitiveValueImpl(style->borderLeftWidth(), CSSPrimitiveValue::CSS_PX); case CSS_PROP_BOTTOM: return getPositionOffsetValue(renderer, CSS_PROP_BOTTOM); case CSS_PROP__KHTML_BOX_ALIGN: switch (style->boxAlign()) { case khtml::BSTRETCH: return new CSSPrimitiveValueImpl(CSS_VAL_STRETCH); case khtml::BSTART: return new CSSPrimitiveValueImpl(CSS_VAL_START); case khtml::BCENTER: return new CSSPrimitiveValueImpl(CSS_VAL_CENTER); case khtml::BEND: return new CSSPrimitiveValueImpl(CSS_VAL_END); case khtml::BBASELINE: return new CSSPrimitiveValueImpl(CSS_VAL_BASELINE); case khtml::BJUSTIFY: break; // not allowed } ASSERT_NOT_REACHED(); return 0; case CSS_PROP__KHTML_BOX_DIRECTION: switch (style->boxDirection()) { case khtml::BNORMAL: return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL); case khtml::BREVERSE: return new CSSPrimitiveValueImpl(CSS_VAL_REVERSE); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP__KHTML_BOX_FLEX: return new CSSPrimitiveValueImpl(style->boxFlex(), CSSPrimitiveValue::CSS_NUMBER); case CSS_PROP__KHTML_BOX_FLEX_GROUP: return new CSSPrimitiveValueImpl(style->boxFlexGroup(), CSSPrimitiveValue::CSS_NUMBER); case CSS_PROP__KHTML_BOX_LINES: switch (style->boxLines()) { case khtml::SINGLE: return new CSSPrimitiveValueImpl(CSS_VAL_SINGLE); case khtml::MULTIPLE: return new CSSPrimitiveValueImpl(CSS_VAL_MULTIPLE); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP__KHTML_BOX_ORDINAL_GROUP: return new CSSPrimitiveValueImpl(style->boxOrdinalGroup(), CSSPrimitiveValue::CSS_NUMBER); case CSS_PROP__KHTML_BOX_ORIENT: switch (style->boxOrient()) { case khtml::HORIZONTAL: return new CSSPrimitiveValueImpl(CSS_VAL_HORIZONTAL); case khtml::VERTICAL: return new CSSPrimitiveValueImpl(CSS_VAL_VERTICAL); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP__KHTML_BOX_PACK: switch (style->boxPack()) { case khtml::BSTART: return new CSSPrimitiveValueImpl(CSS_VAL_START); case khtml::BEND: return new CSSPrimitiveValueImpl(CSS_VAL_END); case khtml::BCENTER: return new CSSPrimitiveValueImpl(CSS_VAL_CENTER); case khtml::BJUSTIFY: return new CSSPrimitiveValueImpl(CSS_VAL_JUSTIFY); case khtml::BSTRETCH: case khtml::BBASELINE: break; // not allowed } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_CAPTION_SIDE: switch (style->captionSide()) { case khtml::CAPLEFT: return new CSSPrimitiveValueImpl(CSS_VAL_LEFT); case khtml::CAPRIGHT: return new CSSPrimitiveValueImpl(CSS_VAL_RIGHT); case khtml::CAPTOP: return new CSSPrimitiveValueImpl(CSS_VAL_TOP); case khtml::CAPBOTTOM: return new CSSPrimitiveValueImpl(CSS_VAL_BOTTOM); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_CLEAR: switch (style->clear()) { case khtml::CNONE: return new CSSPrimitiveValueImpl(CSS_VAL_NONE); case khtml::CLEFT: return new CSSPrimitiveValueImpl(CSS_VAL_LEFT); case khtml::CRIGHT: return new CSSPrimitiveValueImpl(CSS_VAL_RIGHT); case khtml::CBOTH: return new CSSPrimitiveValueImpl(CSS_VAL_BOTH); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_CLIP: // FIXME: unimplemented break; case CSS_PROP_COLOR: return new CSSPrimitiveValueImpl(style->color().rgb()); case CSS_PROP_CONTENT: // FIXME: unimplemented break; case CSS_PROP_COUNTER_INCREMENT: // FIXME: unimplemented break; case CSS_PROP_COUNTER_RESET: // FIXME: unimplemented break; case CSS_PROP_CURSOR: switch (style->cursor()) { case khtml::CURSOR_AUTO: return new CSSPrimitiveValueImpl(CSS_VAL_AUTO); case khtml::CURSOR_CROSS: return new CSSPrimitiveValueImpl(CSS_VAL_CROSSHAIR); case khtml::CURSOR_DEFAULT: return new CSSPrimitiveValueImpl(CSS_VAL_DEFAULT); case khtml::CURSOR_POINTER: return new CSSPrimitiveValueImpl(CSS_VAL_POINTER); case khtml::CURSOR_MOVE: return new CSSPrimitiveValueImpl(CSS_VAL_MOVE); case khtml::CURSOR_E_RESIZE: return new CSSPrimitiveValueImpl(CSS_VAL_E_RESIZE); case khtml::CURSOR_NE_RESIZE: return new CSSPrimitiveValueImpl(CSS_VAL_NE_RESIZE); case khtml::CURSOR_NW_RESIZE: return new CSSPrimitiveValueImpl(CSS_VAL_NW_RESIZE); case khtml::CURSOR_N_RESIZE: return new CSSPrimitiveValueImpl(CSS_VAL_N_RESIZE); case khtml::CURSOR_SE_RESIZE: return new CSSPrimitiveValueImpl(CSS_VAL_SE_RESIZE); case khtml::CURSOR_SW_RESIZE: return new CSSPrimitiveValueImpl(CSS_VAL_SW_RESIZE); case khtml::CURSOR_S_RESIZE: return new CSSPrimitiveValueImpl(CSS_VAL_S_RESIZE); case khtml::CURSOR_W_RESIZE: return new CSSPrimitiveValueImpl(CSS_VAL_W_RESIZE); case khtml::CURSOR_TEXT: return new CSSPrimitiveValueImpl(CSS_VAL_TEXT); case khtml::CURSOR_WAIT: return new CSSPrimitiveValueImpl(CSS_VAL_WAIT); case khtml::CURSOR_HELP: return new CSSPrimitiveValueImpl(CSS_VAL_HELP); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_DIRECTION: switch (style->direction()) { case khtml::LTR: return new CSSPrimitiveValueImpl(CSS_VAL_LTR); case khtml::RTL: return new CSSPrimitiveValueImpl(CSS_VAL_RTL); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_DISPLAY: switch (style->display()) { case khtml::INLINE: return new CSSPrimitiveValueImpl(CSS_VAL_INLINE); case khtml::BLOCK: return new CSSPrimitiveValueImpl(CSS_VAL_BLOCK); case khtml::LIST_ITEM: return new CSSPrimitiveValueImpl(CSS_VAL_LIST_ITEM); case khtml::RUN_IN: return new CSSPrimitiveValueImpl(CSS_VAL_RUN_IN); case khtml::COMPACT: return new CSSPrimitiveValueImpl(CSS_VAL_COMPACT); case khtml::INLINE_BLOCK: return new CSSPrimitiveValueImpl(CSS_VAL_INLINE_BLOCK); case khtml::TABLE: return new CSSPrimitiveValueImpl(CSS_VAL_TABLE); case khtml::INLINE_TABLE: return new CSSPrimitiveValueImpl(CSS_VAL_INLINE_TABLE); case khtml::TABLE_ROW_GROUP: return new CSSPrimitiveValueImpl(CSS_VAL_TABLE_ROW_GROUP); case khtml::TABLE_HEADER_GROUP: return new CSSPrimitiveValueImpl(CSS_VAL_TABLE_HEADER_GROUP); case khtml::TABLE_FOOTER_GROUP: return new CSSPrimitiveValueImpl(CSS_VAL_TABLE_FOOTER_GROUP); case khtml::TABLE_ROW: return new CSSPrimitiveValueImpl(CSS_VAL_TABLE_ROW); case khtml::TABLE_COLUMN_GROUP: return new CSSPrimitiveValueImpl(CSS_VAL_TABLE_COLUMN_GROUP); case khtml::TABLE_COLUMN: return new CSSPrimitiveValueImpl(CSS_VAL_TABLE_COLUMN); case khtml::TABLE_CELL: return new CSSPrimitiveValueImpl(CSS_VAL_TABLE_CELL); case khtml::TABLE_CAPTION: return new CSSPrimitiveValueImpl(CSS_VAL_TABLE_CAPTION); case khtml::BOX: return new CSSPrimitiveValueImpl(CSS_VAL__KHTML_BOX); case khtml::INLINE_BOX: return new CSSPrimitiveValueImpl(CSS_VAL__KHTML_INLINE_BOX); case khtml::NONE: return new CSSPrimitiveValueImpl(CSS_VAL_NONE); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_EMPTY_CELLS: switch (style->emptyCells()) { case khtml::SHOW: return new CSSPrimitiveValueImpl(CSS_VAL_SHOW); case khtml::HIDE: return new CSSPrimitiveValueImpl(CSS_VAL_HIDE); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_FLOAT: switch (style->floating()) { case khtml::FNONE: return new CSSPrimitiveValueImpl(CSS_VAL_NONE); case khtml::FLEFT: return new CSSPrimitiveValueImpl(CSS_VAL_LEFT); case khtml::FRIGHT: return new CSSPrimitiveValueImpl(CSS_VAL_RIGHT); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_FONT_FAMILY: { FontDef def = style->htmlFont().getFontDef(); return new CSSPrimitiveValueImpl(def.firstFamily().family().domString(), CSSPrimitiveValue::CSS_STRING); } case CSS_PROP_FONT_SIZE: { FontDef def = style->htmlFont().getFontDef(); return new CSSPrimitiveValueImpl(def.specifiedSize, CSSPrimitiveValue::CSS_PX); } case CSS_PROP_FONT_STRETCH: // FIXME: unimplemented break; case CSS_PROP_FONT_STYLE: { // FIXME: handle oblique? FontDef def = style->htmlFont().getFontDef(); if (def.italic) return new CSSPrimitiveValueImpl(CSS_VAL_ITALIC); else return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL); } case CSS_PROP_FONT_VARIANT: { FontDef def = style->htmlFont().getFontDef(); if (def.smallCaps) return new CSSPrimitiveValueImpl(CSS_VAL_SMALL_CAPS); else return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL); } case CSS_PROP_FONT_WEIGHT: { // FIXME: this does not reflect the full range of weights // that can be expressed with CSS FontDef def = style->htmlFont().getFontDef(); if (def.weight == QFont::Bold) return new CSSPrimitiveValueImpl(CSS_VAL_BOLD); else return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL); } case CSS_PROP_HEIGHT: return new CSSPrimitiveValueImpl(renderer->contentHeight(), CSSPrimitiveValue::CSS_PX); case CSS_PROP_LEFT: return getPositionOffsetValue(renderer, CSS_PROP_LEFT); case CSS_PROP_LETTER_SPACING: if (style->letterSpacing() == 0) return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL); return new CSSPrimitiveValueImpl(style->letterSpacing(), CSSPrimitiveValue::CSS_PX); case CSS_PROP__APPLE_LINE_CLAMP: return new CSSPrimitiveValueImpl(style->lineClamp(), CSSPrimitiveValue::CSS_PERCENTAGE); case CSS_PROP_LINE_HEIGHT: { Length length(style->lineHeight()); if (length.value < 0) return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL); if (length.isPercent()) { // This is imperfect, because it doesn't include the zoom factor and the real computation // for how high to be in pixels does include things like minimum font size and the zoom factor. // On the other hand, since font-size doesn't include the zoom factor, we really can't do // that here either. float fontSize = style->htmlFont().getFontDef().specifiedSize; return new CSSPrimitiveValueImpl((int)(length.length() * fontSize) / 100, CSSPrimitiveValue::CSS_PX); } else { return new CSSPrimitiveValueImpl(length.length(), CSSPrimitiveValue::CSS_PX); } } case CSS_PROP_LIST_STYLE_IMAGE: if (style->listStyleImage()) return new CSSPrimitiveValueImpl(style->listStyleImage()->url(), CSSPrimitiveValue::CSS_URI); return new CSSPrimitiveValueImpl(CSS_VAL_NONE); case CSS_PROP_LIST_STYLE_POSITION: switch (style->listStylePosition()) { case khtml::OUTSIDE: return new CSSPrimitiveValueImpl(CSS_VAL_OUTSIDE); case khtml::INSIDE: return new CSSPrimitiveValueImpl(CSS_VAL_INSIDE); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_LIST_STYLE_TYPE: switch (style->listStyleType()) { case khtml::LNONE: return new CSSPrimitiveValueImpl(CSS_VAL_NONE); case khtml::DISC: return new CSSPrimitiveValueImpl(CSS_VAL_DISC); case khtml::CIRCLE: return new CSSPrimitiveValueImpl(CSS_VAL_CIRCLE); case khtml::SQUARE: return new CSSPrimitiveValueImpl(CSS_VAL_SQUARE); case khtml::LDECIMAL: return new CSSPrimitiveValueImpl(CSS_VAL_DECIMAL); case khtml::DECIMAL_LEADING_ZERO: return new CSSPrimitiveValueImpl(CSS_VAL_DECIMAL_LEADING_ZERO); case khtml::LOWER_ROMAN: return new CSSPrimitiveValueImpl(CSS_VAL_LOWER_ROMAN); case khtml::UPPER_ROMAN: return new CSSPrimitiveValueImpl(CSS_VAL_UPPER_ROMAN); case khtml::LOWER_GREEK: return new CSSPrimitiveValueImpl(CSS_VAL_LOWER_GREEK); case khtml::LOWER_ALPHA: return new CSSPrimitiveValueImpl(CSS_VAL_LOWER_ALPHA); case khtml::LOWER_LATIN: return new CSSPrimitiveValueImpl(CSS_VAL_LOWER_LATIN); case khtml::UPPER_ALPHA: return new CSSPrimitiveValueImpl(CSS_VAL_UPPER_ALPHA); case khtml::UPPER_LATIN: return new CSSPrimitiveValueImpl(CSS_VAL_UPPER_LATIN); case khtml::HEBREW: return new CSSPrimitiveValueImpl(CSS_VAL_HEBREW); case khtml::ARMENIAN: return new CSSPrimitiveValueImpl(CSS_VAL_ARMENIAN); case khtml::GEORGIAN: return new CSSPrimitiveValueImpl(CSS_VAL_GEORGIAN); case khtml::CJK_IDEOGRAPHIC: return new CSSPrimitiveValueImpl(CSS_VAL_CJK_IDEOGRAPHIC); case khtml::HIRAGANA: return new CSSPrimitiveValueImpl(CSS_VAL_HIRAGANA); case khtml::KATAKANA: return new CSSPrimitiveValueImpl(CSS_VAL_KATAKANA); case khtml::HIRAGANA_IROHA: return new CSSPrimitiveValueImpl(CSS_VAL_HIRAGANA_IROHA); case khtml::KATAKANA_IROHA: return new CSSPrimitiveValueImpl(CSS_VAL_KATAKANA_IROHA); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_MARGIN_TOP: return valueForLength(style->marginTop()); case CSS_PROP_MARGIN_RIGHT: return valueForLength(style->marginRight()); case CSS_PROP_MARGIN_BOTTOM: return valueForLength(style->marginBottom()); case CSS_PROP_MARGIN_LEFT: return valueForLength(style->marginLeft()); case CSS_PROP__KHTML_MARQUEE: // FIXME: unimplemented break; case CSS_PROP__KHTML_MARQUEE_DIRECTION: switch (style->marqueeDirection()) { case khtml::MFORWARD: return new CSSPrimitiveValueImpl(CSS_VAL_FORWARDS); case khtml::MBACKWARD: return new CSSPrimitiveValueImpl(CSS_VAL_BACKWARDS); case khtml::MAUTO: return new CSSPrimitiveValueImpl(CSS_VAL_AUTO); case khtml::MUP: return new CSSPrimitiveValueImpl(CSS_VAL_UP); case khtml::MDOWN: return new CSSPrimitiveValueImpl(CSS_VAL_DOWN); case khtml::MLEFT: return new CSSPrimitiveValueImpl(CSS_VAL_LEFT); case khtml::MRIGHT: return new CSSPrimitiveValueImpl(CSS_VAL_RIGHT); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP__KHTML_MARQUEE_INCREMENT: return valueForLength(style->marqueeIncrement()); case CSS_PROP__KHTML_MARQUEE_REPETITION: if (style->marqueeLoopCount() < 0) return new CSSPrimitiveValueImpl(CSS_VAL_INFINITE); return new CSSPrimitiveValueImpl(style->marqueeLoopCount(), CSSPrimitiveValue::CSS_NUMBER); case CSS_PROP__KHTML_MARQUEE_SPEED: // FIXME: unimplemented break; case CSS_PROP__KHTML_MARQUEE_STYLE: switch (style->marqueeBehavior()) { case khtml::MNONE: return new CSSPrimitiveValueImpl(CSS_VAL_NONE); case khtml::MSCROLL: return new CSSPrimitiveValueImpl(CSS_VAL_SCROLL); case khtml::MSLIDE: return new CSSPrimitiveValueImpl(CSS_VAL_SLIDE); case khtml::MALTERNATE: return new CSSPrimitiveValueImpl(CSS_VAL_ALTERNATE); case khtml::MUNFURL: return new CSSPrimitiveValueImpl(CSS_VAL_UNFURL); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP__KHTML_USER_MODIFY: switch (style->userModify()) { case khtml::READ_ONLY: return new CSSPrimitiveValueImpl(CSS_VAL_READ_ONLY); case khtml::READ_WRITE: return new CSSPrimitiveValueImpl(CSS_VAL_READ_WRITE); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_MAX_HEIGHT: return valueForLength(style->maxHeight()); case CSS_PROP_MAX_WIDTH: return valueForLength(style->maxWidth()); case CSS_PROP_MIN_HEIGHT: return valueForLength(style->minHeight()); case CSS_PROP_MIN_WIDTH: return valueForLength(style->minWidth()); case CSS_PROP_OPACITY: return new CSSPrimitiveValueImpl(style->opacity(), CSSPrimitiveValue::CSS_NUMBER); case CSS_PROP_ORPHANS: return new CSSPrimitiveValueImpl(style->orphans(), CSSPrimitiveValue::CSS_NUMBER); case CSS_PROP_OUTLINE_COLOR: // FIXME: unimplemented break; case CSS_PROP_OUTLINE_OFFSET: // FIXME: unimplemented break; case CSS_PROP_OUTLINE_STYLE: if (style->outlineStyleIsAuto()) return new CSSPrimitiveValueImpl(CSS_VAL_AUTO); return valueForBorderStyle(style->outlineStyle()); case CSS_PROP_OUTLINE_WIDTH: // FIXME: unimplemented break; case CSS_PROP_OVERFLOW: switch (style->overflow()) { case khtml::OVISIBLE: return new CSSPrimitiveValueImpl(CSS_VAL_VISIBLE); case khtml::OHIDDEN: return new CSSPrimitiveValueImpl(CSS_VAL_HIDDEN); case khtml::OSCROLL: return new CSSPrimitiveValueImpl(CSS_VAL_SCROLL); case khtml::OAUTO: return new CSSPrimitiveValueImpl(CSS_VAL_AUTO); case khtml::OMARQUEE: return new CSSPrimitiveValueImpl(CSS_VAL_MARQUEE); case khtml::OOVERLAY: return new CSSPrimitiveValueImpl(CSS_VAL_OVERLAY); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_PADDING_TOP: return valueForLength(style->paddingTop()); case CSS_PROP_PADDING_RIGHT: return valueForLength(style->paddingRight()); case CSS_PROP_PADDING_BOTTOM: return valueForLength(style->paddingBottom()); case CSS_PROP_PADDING_LEFT: return valueForLength(style->paddingLeft()); case CSS_PROP_PAGE: // FIXME: unimplemented break; case CSS_PROP_PAGE_BREAK_AFTER: switch (style->pageBreakAfter()) { case khtml::PBAUTO: return new CSSPrimitiveValueImpl(CSS_VAL_AUTO); case khtml::PBALWAYS: return new CSSPrimitiveValueImpl(CSS_VAL_ALWAYS); case khtml::PBAVOID: return new CSSPrimitiveValueImpl(CSS_VAL_AVOID); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_PAGE_BREAK_BEFORE: switch (style->pageBreakBefore()) { case khtml::PBAUTO: return new CSSPrimitiveValueImpl(CSS_VAL_AUTO); case khtml::PBALWAYS: return new CSSPrimitiveValueImpl(CSS_VAL_ALWAYS); case khtml::PBAVOID: return new CSSPrimitiveValueImpl(CSS_VAL_AVOID); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_PAGE_BREAK_INSIDE: switch (style->pageBreakInside()) { case khtml::PBAUTO: return new CSSPrimitiveValueImpl(CSS_VAL_AUTO); case khtml::PBAVOID: return new CSSPrimitiveValueImpl(CSS_VAL_AVOID); case khtml::PBALWAYS: break; // not allowed } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_POSITION: switch (style->position()) { case khtml::STATIC: return new CSSPrimitiveValueImpl(CSS_VAL_STATIC); case khtml::RELATIVE: return new CSSPrimitiveValueImpl(CSS_VAL_RELATIVE); case khtml::ABSOLUTE: return new CSSPrimitiveValueImpl(CSS_VAL_ABSOLUTE); case khtml::FIXED: return new CSSPrimitiveValueImpl(CSS_VAL_FIXED); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_QUOTES: // FIXME: unimplemented break; case CSS_PROP_RIGHT: return getPositionOffsetValue(renderer, CSS_PROP_RIGHT); case CSS_PROP_SIZE: // FIXME: unimplemented break; case CSS_PROP_TABLE_LAYOUT: switch (style->tableLayout()) { case khtml::TAUTO: return new CSSPrimitiveValueImpl(CSS_VAL_AUTO); case khtml::TFIXED: return new CSSPrimitiveValueImpl(CSS_VAL_FIXED); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_TEXT_ALIGN: return valueForTextAlign(style->textAlign()); case CSS_PROP_TEXT_DECORATION: { QString string; if (style->textDecoration() & khtml::UNDERLINE) string += "underline"; if (style->textDecoration() & khtml::OVERLINE) { if (string.length() > 0) string += " "; string += "overline"; } if (style->textDecoration() & khtml::LINE_THROUGH) { if (string.length() > 0) string += " "; string += "line-through"; } if (style->textDecoration() & khtml::BLINK) { if (string.length() > 0) string += " "; string += "blink"; } if (string.length() == 0) return new CSSPrimitiveValueImpl(CSS_VAL_NONE); return new CSSPrimitiveValueImpl(string, CSSPrimitiveValue::CSS_STRING); } case CSS_PROP__KHTML_TEXT_DECORATIONS_IN_EFFECT: { QString string; if (style->textDecorationsInEffect() & khtml::UNDERLINE) string += "underline"; if (style->textDecorationsInEffect() & khtml::OVERLINE) { if (string.length() > 0) string += " "; string += "overline"; } if (style->textDecorationsInEffect() & khtml::LINE_THROUGH) { if (string.length() > 0) string += " "; string += "line-through"; } if (style->textDecorationsInEffect() & khtml::BLINK) { if (string.length() > 0) string += " "; string += "blink"; } if (string.length() == 0) return new CSSPrimitiveValueImpl(CSS_VAL_NONE); return new CSSPrimitiveValueImpl(string, CSSPrimitiveValue::CSS_STRING); } case CSS_PROP_TEXT_INDENT: return valueForLength(style->textIndent()); case CSS_PROP_TEXT_SHADOW: return valueForShadow(style->textShadow()); case CSS_PROP__APPLE_TEXT_SIZE_ADJUST: if (style->textSizeAdjust()) return new CSSPrimitiveValueImpl(CSS_VAL_AUTO); else return new CSSPrimitiveValueImpl(CSS_VAL_NONE); case CSS_PROP_TEXT_TRANSFORM: switch (style->textTransform()) { case khtml::CAPITALIZE: return new CSSPrimitiveValueImpl(CSS_VAL_CAPITALIZE); case khtml::UPPERCASE: return new CSSPrimitiveValueImpl(CSS_VAL_UPPERCASE); case khtml::LOWERCASE: return new CSSPrimitiveValueImpl(CSS_VAL_LOWERCASE); case khtml::TTNONE: return new CSSPrimitiveValueImpl(CSS_VAL_NONE); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_TOP: return getPositionOffsetValue(renderer, CSS_PROP_TOP); case CSS_PROP_UNICODE_BIDI: switch (style->unicodeBidi()) { case khtml::UBNormal: return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL); case khtml::Embed: return new CSSPrimitiveValueImpl(CSS_VAL_EMBED); case khtml::Override: return new CSSPrimitiveValueImpl(CSS_VAL_BIDI_OVERRIDE); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_VERTICAL_ALIGN: switch (style->verticalAlign()) { case khtml::BASELINE: return new CSSPrimitiveValueImpl(CSS_VAL_BASELINE); case khtml::MIDDLE: return new CSSPrimitiveValueImpl(CSS_VAL_MIDDLE); case khtml::SUB: return new CSSPrimitiveValueImpl(CSS_VAL_SUB); case khtml::SUPER: return new CSSPrimitiveValueImpl(CSS_VAL_SUPER); case khtml::TEXT_TOP: return new CSSPrimitiveValueImpl(CSS_VAL_TEXT_TOP); case khtml::TEXT_BOTTOM: return new CSSPrimitiveValueImpl(CSS_VAL_TEXT_BOTTOM); case khtml::TOP: return new CSSPrimitiveValueImpl(CSS_VAL_TOP); case khtml::BOTTOM: return new CSSPrimitiveValueImpl(CSS_VAL_BOTTOM); case khtml::BASELINE_MIDDLE: return new CSSPrimitiveValueImpl(CSS_VAL__KHTML_BASELINE_MIDDLE); case khtml::LENGTH: return valueForLength(style->verticalAlignLength()); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_VISIBILITY: switch (style->visibility()) { case khtml::VISIBLE: return new CSSPrimitiveValueImpl(CSS_VAL_VISIBLE); case khtml::HIDDEN: return new CSSPrimitiveValueImpl(CSS_VAL_HIDDEN); case khtml::COLLAPSE: return new CSSPrimitiveValueImpl(CSS_VAL_COLLAPSE); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_WHITE_SPACE: switch (style->whiteSpace()) { case khtml::NORMAL: return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL); case khtml::PRE: return new CSSPrimitiveValueImpl(CSS_VAL_PRE); case khtml::NOWRAP: return new CSSPrimitiveValueImpl(CSS_VAL_NOWRAP); case khtml::KHTML_NOWRAP: return new CSSPrimitiveValueImpl(CSS_VAL__KHTML_NOWRAP); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_WIDOWS: return new CSSPrimitiveValueImpl(style->widows(), CSSPrimitiveValue::CSS_NUMBER); case CSS_PROP_WIDTH: return new CSSPrimitiveValueImpl(renderer->contentWidth(), CSSPrimitiveValue::CSS_PX); case CSS_PROP_WORD_SPACING: return new CSSPrimitiveValueImpl(style->wordSpacing(), CSSPrimitiveValue::CSS_PX); case CSS_PROP_WORD_WRAP: switch (style->wordWrap()) { case khtml::WBNORMAL: return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL); case khtml::BREAK_WORD: return new CSSPrimitiveValueImpl(CSS_VAL_BREAK_WORD); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP__KHTML_LINE_BREAK: switch (style->khtmlLineBreak()) { case khtml::LBNORMAL: return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL); case khtml::AFTER_WHITE_SPACE: return new CSSPrimitiveValueImpl(CSS_VAL_AFTER_WHITE_SPACE); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP__KHTML_NBSP_MODE: switch (style->nbspMode()) { case khtml::NBNORMAL: return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL); case khtml::SPACE: return new CSSPrimitiveValueImpl(CSS_VAL_SPACE); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP__KHTML_MATCH_NEAREST_MAIL_BLOCKQUOTE_COLOR: switch (style->matchNearestMailBlockquoteColor()) { case khtml::BCNORMAL: return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL); case khtml::MATCH: return new CSSPrimitiveValueImpl(CSS_VAL_MATCH); } ASSERT_NOT_REACHED(); return 0; case CSS_PROP_Z_INDEX: if (style->hasAutoZIndex()) return new CSSPrimitiveValueImpl(CSS_VAL_NORMAL); return new CSSPrimitiveValueImpl(style->zIndex(), CSSPrimitiveValue::CSS_NUMBER); case CSS_PROP_BACKGROUND: // FIXME: unimplemented break; case CSS_PROP_BORDER: // FIXME: unimplemented break; case CSS_PROP_BORDER_COLOR: // FIXME: unimplemented break; case CSS_PROP_BORDER_STYLE: // FIXME: unimplemented break; case CSS_PROP_BORDER_TOP: // FIXME: unimplemented break; case CSS_PROP_BORDER_RIGHT: // FIXME: unimplemented break; case CSS_PROP_BORDER_BOTTOM: // FIXME: unimplemented break; case CSS_PROP_BORDER_LEFT: // FIXME: unimplemented break; case CSS_PROP_BORDER_WIDTH: // FIXME: unimplemented break; case CSS_PROP_FONT: // FIXME: unimplemented break; case CSS_PROP_LIST_STYLE: // FIXME: unimplemented break; case CSS_PROP_MARGIN: // FIXME: unimplemented break; case CSS_PROP_OUTLINE: // FIXME: unimplemented break; case CSS_PROP_PADDING: // FIXME: unimplemented break; #if !APPLE_CHANGES case CSS_PROP_SCROLLBAR_FACE_COLOR: // FIXME: unimplemented break; case CSS_PROP_SCROLLBAR_SHADOW_COLOR: // FIXME: unimplemented break; case CSS_PROP_SCROLLBAR_HIGHLIGHT_COLOR: // FIXME: unimplemented break; case CSS_PROP_SCROLLBAR_3DLIGHT_COLOR: // FIXME: unimplemented break; case CSS_PROP_SCROLLBAR_DARKSHADOW_COLOR: // FIXME: unimplemented break; case CSS_PROP_SCROLLBAR_TRACK_COLOR: // FIXME: unimplemented break; case CSS_PROP_SCROLLBAR_ARROW_COLOR: // FIXME: unimplemented break; #endif #if APPLE_CHANGES case CSS_PROP__APPLE_DASHBOARD_REGION: { QValueList<StyleDashboardRegion> regions = style->dashboardRegions(); uint i, count = regions.count(); if (count == 1 && regions[0].type == StyleDashboardRegion::None) return new CSSPrimitiveValueImpl (CSS_VAL_NONE); DashboardRegionImpl *firstRegion = new DashboardRegionImpl(), *region; region = firstRegion; for (i = 0; i < count; i++) { StyleDashboardRegion styleRegion = regions[i]; region->m_label = styleRegion.label; LengthBox offset = styleRegion.offset; region->setTop (new CSSPrimitiveValueImpl(offset.top.value, CSSPrimitiveValue::CSS_PX)); region->setRight (new CSSPrimitiveValueImpl(offset.right.value, CSSPrimitiveValue::CSS_PX)); region->setBottom (new CSSPrimitiveValueImpl(offset.bottom.value, CSSPrimitiveValue::CSS_PX)); region->setLeft (new CSSPrimitiveValueImpl(offset.left.value, CSSPrimitiveValue::CSS_PX)); region->m_isRectangle = (styleRegion.type == StyleDashboardRegion::Rectangle); region->m_isCircle = (styleRegion.type == StyleDashboardRegion::Circle); if (i != count-1) { DashboardRegionImpl *newRegion = new DashboardRegionImpl(); region->setNext (newRegion); region = newRegion; } } return new CSSPrimitiveValueImpl(firstRegion); } #endif } ERROR("unimplemented propertyID: %d", propertyID); return 0; }
PopupMenuStyle RenderMenuList::menuStyle() const { RenderStyle* s = m_innerBlock ? m_innerBlock->style() : style(); return PopupMenuStyle(s->color(), s->backgroundColor(), s->font(), s->visibility() == VISIBLE, s->textIndent(), s->direction()); }
// FIXME: Generate this function. PassRefPtrWillBeRawPtr<AnimatableValue> CSSAnimatableValueFactory::create(CSSPropertyID property, const RenderStyle& style) { ASSERT(CSSAnimations::isAnimatableProperty(property)); switch (property) { case CSSPropertyBackgroundColor: return createFromColor(property, style); case CSSPropertyBackgroundImage: return createFromFillLayers<CSSPropertyBackgroundImage>(style.backgroundLayers(), style); case CSSPropertyBackgroundPositionX: return createFromFillLayers<CSSPropertyBackgroundPositionX>(style.backgroundLayers(), style); case CSSPropertyBackgroundPositionY: return createFromFillLayers<CSSPropertyBackgroundPositionY>(style.backgroundLayers(), style); case CSSPropertyBackgroundSize: case CSSPropertyWebkitBackgroundSize: return createFromFillLayers<CSSPropertyBackgroundSize>(style.backgroundLayers(), style); case CSSPropertyBaselineShift: return AnimatableSVGLength::create(style.baselineShiftValue()); case CSSPropertyBorderBottomColor: return createFromColor(property, style); case CSSPropertyBorderBottomLeftRadius: return createFromLengthSize(style.borderBottomLeftRadius(), style); case CSSPropertyBorderBottomRightRadius: return createFromLengthSize(style.borderBottomRightRadius(), style); case CSSPropertyBorderBottomWidth: return createFromDouble(style.borderBottomWidth()); case CSSPropertyBorderImageOutset: return createFromBorderImageLengthBox(style.borderImageOutset(), style); case CSSPropertyBorderImageSlice: return createFromLengthBox(style.borderImageSlices(), style); case CSSPropertyBorderImageSource: return createFromStyleImage(style.borderImageSource()); case CSSPropertyBorderImageWidth: return createFromBorderImageLengthBox(style.borderImageWidth(), style); case CSSPropertyBorderLeftColor: return createFromColor(property, style); case CSSPropertyBorderLeftWidth: return createFromDouble(style.borderLeftWidth()); case CSSPropertyBorderRightColor: return createFromColor(property, style); case CSSPropertyBorderRightWidth: return createFromDouble(style.borderRightWidth()); case CSSPropertyBorderTopColor: return createFromColor(property, style); case CSSPropertyBorderTopLeftRadius: return createFromLengthSize(style.borderTopLeftRadius(), style); case CSSPropertyBorderTopRightRadius: return createFromLengthSize(style.borderTopRightRadius(), style); case CSSPropertyBorderTopWidth: return createFromDouble(style.borderTopWidth()); case CSSPropertyBottom: return createFromLength(style.bottom(), style); case CSSPropertyBoxShadow: case CSSPropertyWebkitBoxShadow: return AnimatableShadow::create(style.boxShadow()); case CSSPropertyClip: if (style.hasClip()) return createFromLengthBox(style.clip(), style); return AnimatableUnknown::create(CSSPrimitiveValue::create(CSSValueAuto)); case CSSPropertyColor: return createFromColor(property, style); case CSSPropertyFillOpacity: return createFromDouble(style.fillOpacity()); case CSSPropertyFill: return AnimatableSVGPaint::create(style.svgStyle()->fillPaintType(), style.svgStyle()->fillPaintColor(), style.svgStyle()->fillPaintUri()); case CSSPropertyFlexGrow: return createFromDouble(style.flexGrow(), AnimatableDouble::InterpolationIsNonContinuousWithZero); case CSSPropertyFlexShrink: return createFromDouble(style.flexShrink(), AnimatableDouble::InterpolationIsNonContinuousWithZero); case CSSPropertyFlexBasis: return createFromLength(style.flexBasis(), style); case CSSPropertyFloodColor: return createFromColor(property, style); case CSSPropertyFloodOpacity: return createFromDouble(style.floodOpacity()); case CSSPropertyFontSize: // Must pass a specified size to setFontSize if Text Autosizing is enabled, but a computed size // if text zoom is enabled (if neither is enabled it's irrelevant as they're probably the same). // FIXME: Should we introduce an option to pass the computed font size here, allowing consumers to // enable text zoom rather than Text Autosizing? See http://crbug.com/227545. return createFromDouble(style.specifiedFontSize()); case CSSPropertyFontWeight: return createFromFontWeight(style.fontWeight()); case CSSPropertyHeight: return createFromLength(style.height(), style); case CSSPropertyLightingColor: return createFromColor(property, style); case CSSPropertyListStyleImage: return createFromStyleImage(style.listStyleImage()); case CSSPropertyLeft: return createFromLength(style.left(), style); case CSSPropertyLetterSpacing: return createFromDouble(style.letterSpacing()); case CSSPropertyLineHeight: return createFromLineHeight(style.specifiedLineHeight(), style); case CSSPropertyMarginBottom: return createFromLength(style.marginBottom(), style); case CSSPropertyMarginLeft: return createFromLength(style.marginLeft(), style); case CSSPropertyMarginRight: return createFromLength(style.marginRight(), style); case CSSPropertyMarginTop: return createFromLength(style.marginTop(), style); case CSSPropertyMaxHeight: return createFromLength(style.maxHeight(), style); case CSSPropertyMaxWidth: return createFromLength(style.maxWidth(), style); case CSSPropertyMinHeight: return createFromLength(style.minHeight(), style); case CSSPropertyMinWidth: return createFromLength(style.minWidth(), style); case CSSPropertyObjectPosition: return createFromLengthPoint(style.objectPosition(), style); case CSSPropertyOpacity: return createFromDouble(style.opacity()); case CSSPropertyOrphans: return createFromDouble(style.orphans()); case CSSPropertyOutlineColor: return createFromColor(property, style); case CSSPropertyOutlineOffset: return createFromDouble(style.outlineOffset()); case CSSPropertyOutlineWidth: return createFromDouble(style.outlineWidth()); case CSSPropertyPaddingBottom: return createFromLength(style.paddingBottom(), style); case CSSPropertyPaddingLeft: return createFromLength(style.paddingLeft(), style); case CSSPropertyPaddingRight: return createFromLength(style.paddingRight(), style); case CSSPropertyPaddingTop: return createFromLength(style.paddingTop(), style); case CSSPropertyRight: return createFromLength(style.right(), style); case CSSPropertyStrokeWidth: return AnimatableSVGLength::create(style.strokeWidth()); case CSSPropertyStopColor: return createFromColor(property, style); case CSSPropertyStopOpacity: return createFromDouble(style.stopOpacity()); case CSSPropertyStrokeDasharray: return AnimatableStrokeDasharrayList::create(style.strokeDashArray()); case CSSPropertyStrokeDashoffset: return AnimatableSVGLength::create(style.strokeDashOffset()); case CSSPropertyStrokeMiterlimit: return createFromDouble(style.strokeMiterLimit()); case CSSPropertyStrokeOpacity: return createFromDouble(style.strokeOpacity()); case CSSPropertyStroke: return AnimatableSVGPaint::create(style.svgStyle()->strokePaintType(), style.svgStyle()->strokePaintColor(), style.svgStyle()->strokePaintUri()); case CSSPropertyTextDecorationColor: return AnimatableColor::create(style.textDecorationColor().resolve(style.color()), style.visitedLinkTextDecorationColor().resolve(style.visitedLinkColor())); case CSSPropertyTextIndent: return createFromLength(style.textIndent(), style); case CSSPropertyTextShadow: return AnimatableShadow::create(style.textShadow()); case CSSPropertyTop: return createFromLength(style.top(), style); case CSSPropertyWebkitBorderHorizontalSpacing: return createFromDouble(style.horizontalBorderSpacing()); case CSSPropertyWebkitBorderVerticalSpacing: return createFromDouble(style.verticalBorderSpacing()); case CSSPropertyWebkitClipPath: if (ClipPathOperation* operation = style.clipPath()) return AnimatableClipPathOperation::create(operation); return AnimatableUnknown::create(CSSValueNone); case CSSPropertyWebkitColumnCount: return createFromDouble(style.columnCount()); case CSSPropertyWebkitColumnGap: return createFromDouble(style.columnGap()); case CSSPropertyWebkitColumnRuleColor: return createFromColor(property, style); case CSSPropertyWebkitColumnRuleWidth: return createFromDouble(style.columnRuleWidth()); case CSSPropertyWebkitColumnWidth: return createFromDouble(style.columnWidth()); case CSSPropertyWebkitFilter: return AnimatableFilterOperations::create(style.filter()); case CSSPropertyWebkitMaskBoxImageOutset: return createFromBorderImageLengthBox(style.maskBoxImageOutset(), style); case CSSPropertyWebkitMaskBoxImageSlice: return createFromLengthBoxAndBool(style.maskBoxImageSlices(), style.maskBoxImageSlicesFill(), style); case CSSPropertyWebkitMaskBoxImageSource: return createFromStyleImage(style.maskBoxImageSource()); case CSSPropertyWebkitMaskBoxImageWidth: return createFromBorderImageLengthBox(style.maskBoxImageWidth(), style); case CSSPropertyWebkitMaskImage: return createFromFillLayers<CSSPropertyWebkitMaskImage>(style.maskLayers(), style); case CSSPropertyWebkitMaskPositionX: return createFromFillLayers<CSSPropertyWebkitMaskPositionX>(style.maskLayers(), style); case CSSPropertyWebkitMaskPositionY: return createFromFillLayers<CSSPropertyWebkitMaskPositionY>(style.maskLayers(), style); case CSSPropertyWebkitMaskSize: return createFromFillLayers<CSSPropertyWebkitMaskSize>(style.maskLayers(), style); case CSSPropertyPerspective: return createFromDouble(style.perspective()); case CSSPropertyPerspectiveOrigin: ASSERT(RuntimeEnabledFeatures::cssTransformsUnprefixedEnabled()); return AnimatableLengthPoint::create( createFromLength(style.perspectiveOriginX(), style), createFromLength(style.perspectiveOriginY(), style)); case CSSPropertyWebkitPerspectiveOriginX: ASSERT(!RuntimeEnabledFeatures::cssTransformsUnprefixedEnabled()); return createFromLength(style.perspectiveOriginX(), style); case CSSPropertyWebkitPerspectiveOriginY: ASSERT(!RuntimeEnabledFeatures::cssTransformsUnprefixedEnabled()); return createFromLength(style.perspectiveOriginY(), style); case CSSPropertyShapeOutside: return createFromShapeValue(style.shapeOutside()); case CSSPropertyShapeMargin: return createFromLength(style.shapeMargin(), style); case CSSPropertyShapeImageThreshold: return createFromDouble(style.shapeImageThreshold()); case CSSPropertyWebkitTextStrokeColor: return createFromColor(property, style); case CSSPropertyTransform: return AnimatableTransform::create(style.transform()); case CSSPropertyTransformOrigin: ASSERT(RuntimeEnabledFeatures::cssTransformsUnprefixedEnabled()); return AnimatableLengthPoint3D::create( createFromLength(style.transformOriginX(), style), createFromLength(style.transformOriginY(), style), createFromDouble(style.transformOriginZ())); case CSSPropertyWebkitTransformOriginX: ASSERT(!RuntimeEnabledFeatures::cssTransformsUnprefixedEnabled()); return createFromLength(style.transformOriginX(), style); case CSSPropertyWebkitTransformOriginY: ASSERT(!RuntimeEnabledFeatures::cssTransformsUnprefixedEnabled()); return createFromLength(style.transformOriginY(), style); case CSSPropertyWebkitTransformOriginZ: ASSERT(!RuntimeEnabledFeatures::cssTransformsUnprefixedEnabled()); return createFromDouble(style.transformOriginZ()); case CSSPropertyWidows: return createFromDouble(style.widows()); case CSSPropertyWidth: return createFromLength(style.width(), style); case CSSPropertyWordSpacing: return createFromDouble(style.wordSpacing()); case CSSPropertyVisibility: return AnimatableVisibility::create(style.visibility()); case CSSPropertyZIndex: return createFromDouble(style.zIndex()); case CSSPropertyZoom: return createFromDouble(style.zoom()); default: ASSERT_NOT_REACHED(); // This return value is to avoid a release crash if possible. return AnimatableUnknown::create(nullptr); } }