void TableCellPainter::paintBoxDecorationBackground(const PaintInfo& paintInfo, const LayoutPoint& paintOffset) { if (!paintInfo.shouldPaintWithinRoot(&m_renderTableCell)) return; RenderTable* tableElt = m_renderTableCell.table(); if (!tableElt->collapseBorders() && m_renderTableCell.style()->emptyCells() == HIDE && !m_renderTableCell.firstChild()) return; LayoutRect paintRect = paintBounds(paintOffset, DoNotAddOffsetFromParent); RenderDrawingRecorder recorder(paintInfo.context, m_renderTableCell, paintInfo.phase, pixelSnappedIntRect(paintRect)); if (recorder.canUseCachedDrawing()) return; BoxPainter::paintBoxShadow(paintInfo, paintRect, m_renderTableCell.style(), Normal); // Paint our cell background. paintBackgroundsBehindCell(paintInfo, paintOffset, &m_renderTableCell); BoxPainter::paintBoxShadow(paintInfo, paintRect, m_renderTableCell.style(), Inset); if (!m_renderTableCell.style()->hasBorder() || tableElt->collapseBorders()) return; BoxPainter::paintBorder(m_renderTableCell, paintInfo, paintRect, m_renderTableCell.style()); }
void RenderTableCell::paintBoxDecorations(PaintInfo& paintInfo, int tx, int ty) { #if PLATFORM(WKC) CRASH_IF_STACK_OVERFLOW(WKC_STACK_MARGIN_DEFAULT); #endif RenderTable* tableElt = table(); if (!tableElt->collapseBorders() && style()->emptyCells() == HIDE && !firstChild()) return; int w = width(); int h = height(); if (style()->boxShadow()) paintBoxShadow(paintInfo.context, tx, ty, w, h, style(), Normal); // Paint our cell background. paintBackgroundsBehindCell(paintInfo, tx, ty, this); if (style()->boxShadow()) paintBoxShadow(paintInfo.context, tx, ty, w, h, style(), Inset); if (!style()->hasBorder() || tableElt->collapseBorders()) return; paintBorder(paintInfo.context, tx, ty, w, h, style()); }
void RenderTableRow::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) { ASSERT(style()->display() == TABLE_ROW); RenderBox::styleDidChange(diff, oldStyle); propagateStyleToAnonymousChildren(); if (section() && oldStyle && style()->logicalHeight() != oldStyle->logicalHeight()) section()->rowLogicalHeightChanged(rowIndex()); // If border was changed, notify table. if (parent()) { RenderTable* table = this->table(); if (table && !table->selfNeedsLayout() && !table->normalChildNeedsLayout() && oldStyle && oldStyle->border() != style()->border()) table->invalidateCollapsedBorders(); if (table && oldStyle && diff == StyleDifferenceLayout && needsLayout() && table->collapseBorders() && borderWidthChanged(oldStyle, style())) { // If the border width changes on a row, we need to make sure the cells in the row know to lay out again. // This only happens when borders are collapsed, since they end up affecting the border sides of the cell // itself. for (RenderBox* childBox = firstChildBox(); childBox; childBox = childBox->nextSiblingBox()) { if (!childBox->isTableCell()) continue; childBox->setChildNeedsLayout(true, MarkOnlyThis); } } } }
void TableCellPainter::paintBackgroundsBehindCell(const PaintInfo& paintInfo, const LayoutPoint& paintOffset, RenderObject* backgroundObject) { if (!paintInfo.shouldPaintWithinRoot(&m_renderTableCell)) return; if (!backgroundObject) return; if (m_renderTableCell.style()->visibility() != VISIBLE) return; RenderTable* tableElt = m_renderTableCell.table(); if (!tableElt->collapseBorders() && m_renderTableCell.style()->emptyCells() == HIDE && !m_renderTableCell.firstChild()) return; Color c = backgroundObject->resolveColor(CSSPropertyBackgroundColor); const FillLayer& bgLayer = backgroundObject->style()->backgroundLayers(); LayoutRect paintRect = paintBounds(paintOffset, backgroundObject != &m_renderTableCell ? AddOffsetFromParent : DoNotAddOffsetFromParent); if (bgLayer.hasImage() || c.alpha()) { // We have to clip here because the background would paint // on top of the borders otherwise. This only matters for cells and rows. bool shouldClip = backgroundObject->hasLayer() && (backgroundObject == &m_renderTableCell || backgroundObject == m_renderTableCell.parent()) && tableElt->collapseBorders(); GraphicsContextStateSaver stateSaver(*paintInfo.context, shouldClip); if (shouldClip) { LayoutRect clipRect(paintRect.location(), m_renderTableCell.size()); clipRect.expand(m_renderTableCell.borderInsets()); paintInfo.context->clip(clipRect); } BoxPainter(m_renderTableCell).paintFillLayers(paintInfo, c, bgLayer, paintRect, BackgroundBleedNone, CompositeSourceOver, backgroundObject); } }
void RenderTableCell::paintMask(PaintInfo& paintInfo, IntSize paintOffset) { if (style()->visibility() != VISIBLE || paintInfo.phase != PaintPhaseMask) return; RenderTable* tableElt = table(); if (!tableElt->collapseBorders() && style()->emptyCells() == HIDE && !firstChild()) return; paintMaskImages(paintInfo, IntRect(toPoint(paintOffset), size())); }
void TableCellPainter::paintMask(const PaintInfo& paintInfo, const LayoutPoint& paintOffset) { if (m_renderTableCell.style()->visibility() != VISIBLE || paintInfo.phase != PaintPhaseMask) return; RenderTable* tableElt = m_renderTableCell.table(); if (!tableElt->collapseBorders() && m_renderTableCell.style()->emptyCells() == HIDE && !m_renderTableCell.firstChild()) return; BoxPainter(m_renderTableCell).paintMaskImages(paintInfo, paintBounds(paintOffset, DoNotAddOffsetFromParent)); }
void RenderTableCell::paintBoxDecorations(PaintInfo& paintInfo, int tx, int ty) { if (!paintInfo.shouldPaintWithinRoot(this)) return; RenderTable* tableElt = table(); if (!tableElt->collapseBorders() && style()->emptyCells() == HIDE && !firstChild()) return; IntRect paintRect = IntRect(IntPoint(tx, ty), size()); paintBoxShadow(paintInfo, paintRect, style(), Normal); // Paint our cell background. paintBackgroundsBehindCell(paintInfo, tx, ty, this); paintBoxShadow(paintInfo, paintRect, style(), Inset); if (!style()->hasBorder() || tableElt->collapseBorders()) return; paintBorder(paintInfo, paintRect, style()); }
void RenderTableCell::readyWRATHWidgetBackgroundsBehindCell(PaintedWidgetsOfWRATHHandle& handle, PaintInfoOfWRATH& paintInfo, int tx, int ty, RenderObject* backgroundObject) { RenderTableCell_ReadyWRATHWidgetBackgroundsBehindCell *d(RenderTableCell_ReadyWRATHWidgetBackgroundsBehindCell::object(this, handle)); ContextOfWRATH::AutoPushNode autoPushRoot(paintInfo.wrath_context, d->m_root_node); d->m_fill_layers.visible(false); if (!paintInfo.shouldPaintWithinRoot(this)) return; if (!backgroundObject) return; if (style()->visibility() != VISIBLE) return; RenderTable* tableElt = table(); if (!tableElt->collapseBorders() && style()->emptyCells() == HIDE && !firstChild()) return; if (backgroundObject != this) { tx += x(); ty += y(); } int w = width(); int h = height(); Color c = backgroundObject->style()->visitedDependentColor(CSSPropertyBackgroundColor); const FillLayer* bgLayer = backgroundObject->style()->backgroundLayers(); if (bgLayer->hasImage() || c.isValid()) { // We have to clip here because the background would paint // on top of the borders otherwise. This only matters for cells and rows. bool shouldClip = backgroundObject->hasLayer() && (backgroundObject == this || backgroundObject == parent()) && tableElt->collapseBorders(); ContextOfWRATH::AutoPushNode autoPushClip(paintInfo.wrath_context, d->m_clip_node); d->m_clip_node.widget()->node()->clipping_active(false); if (shouldClip) { IntRect clipRect(tx + borderLeft(), ty + borderTop(), w - borderLeft() - borderRight(), h - borderTop() - borderBottom()); ContextOfWRATH::set_clipping(d->m_clip_node, clipRect); d->m_clip_node.widget()->node()->clipping_active(true); } readyWRATHWidgetFillLayers(d->m_fill_layers, paintInfo, c, bgLayer, tx, ty, w, h, BackgroundBleedNone, CompositeSourceOver, backgroundObject); d->m_fill_layers.visible(true); } }
void RenderTableCell::readyWRATHWidgetBoxDecorations(PaintedWidgetsOfWRATHHandle& handle, PaintInfoOfWRATH& paintInfo, int tx, int ty) { RenderTableCell_ReadyWRATHWidgetBoxDecorations *d(RenderTableCell_ReadyWRATHWidgetBoxDecorations::object(this, handle)); ContextOfWRATH::AutoPushNode autoPushRoot(paintInfo.wrath_context, d->m_root_node); d->m_box_shadow.visible(false); d->m_backgrounds.visible(false); d->m_latter_box_shadow.visible(false); d->m_border.visible(false); if (!paintInfo.shouldPaintWithinRoot(this)) return; RenderTable* tableElt = table(); if (!tableElt->collapseBorders() && style()->emptyCells() == HIDE && !firstChild()) return; int w = width(); int h = height(); readyWRATHWidgetBoxShadow(d->m_box_shadow, paintInfo.wrath_context, tx, ty, w, h, style(), Normal); d->m_box_shadow.visible(true); // Paint our cell background. readyWRATHWidgetBackgroundsBehindCell(d->m_backgrounds, paintInfo, tx, ty, this); d->m_backgrounds.visible(true); readyWRATHWidgetBoxShadow(d->m_latter_box_shadow, paintInfo.wrath_context, tx, ty, w, h, style(), Inset); d->m_latter_box_shadow.visible(true); if (!style()->hasBorder() || tableElt->collapseBorders()) return; readyWRATHWidgetBorder(d->m_border, paintInfo.wrath_context, tx, ty, w, h, style()); d->m_border.visible(true); }
void RenderTableCell::paintMask(PaintInfo& paintInfo, int tx, int ty) { #if PLATFORM(WKC) CRASH_IF_STACK_OVERFLOW(WKC_STACK_MARGIN_DEFAULT); #endif if (style()->visibility() != VISIBLE || paintInfo.phase != PaintPhaseMask) return; RenderTable* tableElt = table(); if (!tableElt->collapseBorders() && style()->emptyCells() == HIDE && !firstChild()) return; int w = width(); int h = height(); paintMaskImages(paintInfo, tx, ty, w, h); }
void RenderTableCell::paintBackgroundsBehindCell(PaintInfo& paintInfo, int tx, int ty, RenderObject* backgroundObject) { #if PLATFORM(WKC) CRASH_IF_STACK_OVERFLOW(WKC_STACK_MARGIN_DEFAULT); #endif if (!backgroundObject) return; if (style()->visibility() != VISIBLE) return; RenderTable* tableElt = table(); if (!tableElt->collapseBorders() && style()->emptyCells() == HIDE && !firstChild()) return; if (backgroundObject != this) { tx += x(); ty += y(); } int w = width(); int h = height(); Color c = backgroundObject->style()->backgroundColor(); const FillLayer* bgLayer = backgroundObject->style()->backgroundLayers(); if (bgLayer->hasImage() || c.isValid()) { // We have to clip here because the background would paint // on top of the borders otherwise. This only matters for cells and rows. bool shouldClip = backgroundObject->hasLayer() && (backgroundObject == this || backgroundObject == parent()) && tableElt->collapseBorders(); if (shouldClip) { IntRect clipRect(tx + borderLeft(), ty + borderTop(), w - borderLeft() - borderRight(), h - borderTop() - borderBottom()); paintInfo.context->save(); paintInfo.context->clip(clipRect); } paintFillLayers(paintInfo, c, bgLayer, tx, ty, w, h); if (shouldClip) paintInfo.context->restore(); } }
void RenderTableCell::paintBackgroundsBehindCell(PaintInfo& paintInfo, int tx, int ty, RenderObject* backgroundObject) { if (!paintInfo.shouldPaintWithinRoot(this)) return; if (!backgroundObject) return; if (style()->visibility() != VISIBLE) return; RenderTable* tableElt = table(); if (!tableElt->collapseBorders() && style()->emptyCells() == HIDE && !firstChild()) return; if (backgroundObject != this) { tx += x(); ty += y(); } int w = width(); int h = height(); Color c = backgroundObject->style()->visitedDependentColor(CSSPropertyBackgroundColor); const FillLayer* bgLayer = backgroundObject->style()->backgroundLayers(); if (bgLayer->hasImage() || c.isValid()) { // We have to clip here because the background would paint // on top of the borders otherwise. This only matters for cells and rows. bool shouldClip = backgroundObject->hasLayer() && (backgroundObject == this || backgroundObject == parent()) && tableElt->collapseBorders(); GraphicsContextStateSaver stateSaver(*paintInfo.context, shouldClip); if (shouldClip) { IntRect clipRect(tx + borderLeft(), ty + borderTop(), w - borderLeft() - borderRight(), h - borderTop() - borderBottom()); paintInfo.context->clip(clipRect); } paintFillLayers(paintInfo, c, bgLayer, IntRect(tx, ty, w, h), BackgroundBleedNone, CompositeSourceOver, backgroundObject); } }