bool KeyframeAnimation::computeExtentOfTransformAnimation(LayoutRect& bounds) const { ASSERT(m_keyframes.containsProperty(CSSPropertyTransform)); if (!is<RenderBox>(m_object)) return true; // Non-boxes don't get transformed; RenderBox& box = downcast<RenderBox>(*m_object); FloatRect rendererBox = snapRectToDevicePixels(box.borderBoxRect(), box.document().deviceScaleFactor()); FloatRect cumulativeBounds = bounds; for (auto& keyframe : m_keyframes.keyframes()) { if (!keyframe.containsProperty(CSSPropertyTransform)) continue; LayoutRect keyframeBounds = bounds; bool canCompute; if (isTransformFunctionListValid()) canCompute = computeTransformedExtentViaTransformList(rendererBox, *keyframe.style(), keyframeBounds); else canCompute = computeTransformedExtentViaMatrix(rendererBox, *keyframe.style(), keyframeBounds); if (!canCompute) return false; cumulativeBounds.unite(keyframeBounds); } bounds = LayoutRect(cumulativeBounds); return true; }
// Copied from RenderBox, this method likely requires further refactoring to work easily for both SVG and CSS Box Model content. // FIXME: This may also need to move into SVGRenderSupport as the RenderBox version depends // on borderBoundingBox() which SVG RenderBox subclases (like SVGRenderBlock) do not implement. LayoutRect RenderSVGModelObject::outlineBoundsForRepaint(const RenderLayerModelObject* repaintContainer, const RenderGeometryMap*) const { LayoutRect box = enclosingLayoutRect(repaintRectInLocalCoordinates()); adjustRectForOutlineAndShadow(box); FloatQuad containerRelativeQuad = localToContainerQuad(FloatRect(box), repaintContainer); return LayoutRect(snapRectToDevicePixels(LayoutRect(containerRelativeQuad.boundingBox()), document().deviceScaleFactor())); }
bool RenderTheme::paintDecorations(const RenderBox& box, const PaintInfo& paintInfo, const LayoutRect& rect) { if (paintInfo.context().paintingDisabled()) return false; IntRect integralSnappedRect = snappedIntRect(rect); FloatRect devicePixelSnappedRect = snapRectToDevicePixels(rect, box.document().deviceScaleFactor()); // Call the appropriate paint method based off the appearance value. switch (box.style().appearance()) { case MenulistButtonPart: return paintMenuListButtonDecorations(box, paintInfo, devicePixelSnappedRect); case TextFieldPart: return paintTextFieldDecorations(box, paintInfo, devicePixelSnappedRect); case TextAreaPart: return paintTextAreaDecorations(box, paintInfo, devicePixelSnappedRect); case CheckboxPart: return paintCheckboxDecorations(box, paintInfo, integralSnappedRect); case RadioPart: return paintRadioDecorations(box, paintInfo, integralSnappedRect); case PushButtonPart: return paintPushButtonDecorations(box, paintInfo, integralSnappedRect); case SquareButtonPart: return paintSquareButtonDecorations(box, paintInfo, integralSnappedRect); case ButtonPart: return paintButtonDecorations(box, paintInfo, integralSnappedRect); case MenulistPart: return paintMenuListDecorations(box, paintInfo, integralSnappedRect); case SliderThumbHorizontalPart: case SliderThumbVerticalPart: return paintSliderThumbDecorations(box, paintInfo, integralSnappedRect); case SearchFieldPart: return paintSearchFieldDecorations(box, paintInfo, integralSnappedRect); #if ENABLE(METER_ELEMENT) case MeterPart: case RelevancyLevelIndicatorPart: case ContinuousCapacityLevelIndicatorPart: case DiscreteCapacityLevelIndicatorPart: case RatingLevelIndicatorPart: #endif case ProgressBarPart: case SliderHorizontalPart: case SliderVerticalPart: case ListboxPart: case DefaultButtonPart: case SearchFieldCancelButtonPart: case SearchFieldDecorationPart: case SearchFieldResultsDecorationPart: case SearchFieldResultsButtonPart: #if ENABLE(SERVICE_CONTROLS) case ImageControlsButtonPart: #endif default: break; } return false; }
bool RenderTheme::paintBorderOnly(const RenderObject& o, const PaintInfo& paintInfo, const LayoutRect& r) { if (paintInfo.context->paintingDisabled()) return false; #if PLATFORM(IOS) UNUSED_PARAM(r); return o.style().appearance() != NoControlPart; #else FloatRect devicePixelSnappedRect = snapRectToDevicePixels(r, o.document().deviceScaleFactor()); // Call the appropriate paint method based off the appearance value. switch (o.style().appearance()) { case TextFieldPart: return paintTextField(o, paintInfo, devicePixelSnappedRect); case ListboxPart: case TextAreaPart: return paintTextArea(o, paintInfo, devicePixelSnappedRect); case MenulistButtonPart: case SearchFieldPart: return true; case CheckboxPart: case RadioPart: case PushButtonPart: case SquareButtonPart: case DefaultButtonPart: case ButtonPart: case MenulistPart: #if ENABLE(METER_ELEMENT) case MeterPart: case RelevancyLevelIndicatorPart: case ContinuousCapacityLevelIndicatorPart: case DiscreteCapacityLevelIndicatorPart: case RatingLevelIndicatorPart: #endif case ProgressBarPart: case SliderHorizontalPart: case SliderVerticalPart: case SliderThumbHorizontalPart: case SliderThumbVerticalPart: case SearchFieldCancelButtonPart: case SearchFieldDecorationPart: case SearchFieldResultsDecorationPart: case SearchFieldResultsButtonPart: #if ENABLE(SERVICE_CONTROLS) case ImageControlsButtonPart: #endif default: break; } return false; #endif }
void FilterEffectRendererHelper::applyFilterEffect(GraphicsContext& destinationContext) { ASSERT(m_haveFilterEffect && m_renderLayer->filterRenderer()); FilterEffectRenderer* filter = m_renderLayer->filterRenderer(); filter->inputContext()->restore(); filter->apply(); // Get the filtered output and draw it in place. LayoutRect destRect = filter->outputRect(); destRect.move(m_paintOffset.x(), m_paintOffset.y()); destinationContext.drawImageBuffer(filter->output(), m_renderLayer->renderer().style().colorSpace(), snapRectToDevicePixels(destRect, m_renderLayer->renderer().document().deviceScaleFactor())); filter->clearIntermediateResults(); }
Vector<FloatRect> NinePieceImage::computeIntrinsicRects(const FloatRect& outer, const LayoutBoxExtent& slices, float deviceScaleFactor) { FloatRect inner = outer; inner.move(slices.left(), slices.top()); inner.contract(slices.left() + slices.right(), slices.top() + slices.bottom()); ASSERT(outer.contains(inner)); Vector<FloatRect> rects(MaxPiece); rects[TopLeftPiece] = snapRectToDevicePixels(outer.x(), outer.y(), slices.left(), slices.top(), deviceScaleFactor); rects[BottomLeftPiece] = snapRectToDevicePixels(outer.x(), inner.maxY(), slices.left(), slices.bottom(), deviceScaleFactor); rects[LeftPiece] = snapRectToDevicePixels(outer.x(), inner.y(), slices.left(), inner.height(), deviceScaleFactor); rects[TopRightPiece] = snapRectToDevicePixels(inner.maxX(), outer.y(), slices.right(), slices.top(), deviceScaleFactor); rects[BottomRightPiece] = snapRectToDevicePixels(inner.maxX(), inner.maxY(), slices.right(), slices.bottom(), deviceScaleFactor); rects[RightPiece] = snapRectToDevicePixels(inner.maxX(), inner.y(), slices.right(), inner.height(), deviceScaleFactor); rects[TopPiece] = snapRectToDevicePixels(inner.x(), outer.y(), inner.width(), slices.top(), deviceScaleFactor); rects[BottomPiece] = snapRectToDevicePixels(inner.x(), inner.maxY(), inner.width(), slices.bottom(), deviceScaleFactor); rects[MiddlePiece] = snapRectToDevicePixels(inner.x(), inner.y(), inner.width(), inner.height(), deviceScaleFactor); return rects; }
bool RenderTheme::paint(const RenderBox& box, ControlStates& controlStates, const PaintInfo& paintInfo, const LayoutRect& rect) { // If painting is disabled, but we aren't updating control tints, then just bail. // If we are updating control tints, just schedule a repaint if the theme supports tinting // for that control. if (paintInfo.context().updatingControlTints()) { if (controlSupportsTints(box)) box.repaint(); return false; } if (paintInfo.context().paintingDisabled()) return false; ControlPart part = box.style().appearance(); IntRect integralSnappedRect = snappedIntRect(rect); float deviceScaleFactor = box.document().deviceScaleFactor(); FloatRect devicePixelSnappedRect = snapRectToDevicePixels(rect, deviceScaleFactor); #if USE(NEW_THEME) float pageScaleFactor = box.document().page() ? box.document().page()->pageScaleFactor() : 1.0f; switch (part) { case CheckboxPart: case RadioPart: case PushButtonPart: case SquareButtonPart: case DefaultButtonPart: case ButtonPart: case InnerSpinButtonPart: updateControlStatesForRenderer(box, controlStates); m_theme->paint(part, controlStates, paintInfo.context(), devicePixelSnappedRect, box.style().effectiveZoom(), &box.view().frameView(), deviceScaleFactor, pageScaleFactor); return false; default: break; } #else UNUSED_PARAM(controlStates); #endif // Call the appropriate paint method based off the appearance value. switch (part) { #if !USE(NEW_THEME) case CheckboxPart: return paintCheckbox(box, paintInfo, integralSnappedRect); case RadioPart: return paintRadio(box, paintInfo, integralSnappedRect); case PushButtonPart: case SquareButtonPart: case DefaultButtonPart: case ButtonPart: return paintButton(box, paintInfo, integralSnappedRect); case InnerSpinButtonPart: return paintInnerSpinButton(box, paintInfo, integralSnappedRect); #endif case MenulistPart: return paintMenuList(box, paintInfo, devicePixelSnappedRect); #if ENABLE(METER_ELEMENT) case MeterPart: case RelevancyLevelIndicatorPart: case ContinuousCapacityLevelIndicatorPart: case DiscreteCapacityLevelIndicatorPart: case RatingLevelIndicatorPart: return paintMeter(box, paintInfo, integralSnappedRect); #endif case ProgressBarPart: return paintProgressBar(box, paintInfo, integralSnappedRect); case SliderHorizontalPart: case SliderVerticalPart: return paintSliderTrack(box, paintInfo, integralSnappedRect); case SliderThumbHorizontalPart: case SliderThumbVerticalPart: return paintSliderThumb(box, paintInfo, integralSnappedRect); case MediaEnterFullscreenButtonPart: case MediaExitFullscreenButtonPart: return paintMediaFullscreenButton(box, paintInfo, integralSnappedRect); case MediaPlayButtonPart: return paintMediaPlayButton(box, paintInfo, integralSnappedRect); case MediaOverlayPlayButtonPart: return paintMediaOverlayPlayButton(box, paintInfo, integralSnappedRect); case MediaMuteButtonPart: return paintMediaMuteButton(box, paintInfo, integralSnappedRect); case MediaSeekBackButtonPart: return paintMediaSeekBackButton(box, paintInfo, integralSnappedRect); case MediaSeekForwardButtonPart: return paintMediaSeekForwardButton(box, paintInfo, integralSnappedRect); case MediaRewindButtonPart: return paintMediaRewindButton(box, paintInfo, integralSnappedRect); case MediaReturnToRealtimeButtonPart: return paintMediaReturnToRealtimeButton(box, paintInfo, integralSnappedRect); case MediaToggleClosedCaptionsButtonPart: return paintMediaToggleClosedCaptionsButton(box, paintInfo, integralSnappedRect); case MediaSliderPart: return paintMediaSliderTrack(box, paintInfo, integralSnappedRect); case MediaSliderThumbPart: return paintMediaSliderThumb(box, paintInfo, integralSnappedRect); case MediaVolumeSliderMuteButtonPart: return paintMediaMuteButton(box, paintInfo, integralSnappedRect); case MediaVolumeSliderContainerPart: return paintMediaVolumeSliderContainer(box, paintInfo, integralSnappedRect); case MediaVolumeSliderPart: return paintMediaVolumeSliderTrack(box, paintInfo, integralSnappedRect); case MediaVolumeSliderThumbPart: return paintMediaVolumeSliderThumb(box, paintInfo, integralSnappedRect); case MediaFullScreenVolumeSliderPart: return paintMediaFullScreenVolumeSliderTrack(box, paintInfo, integralSnappedRect); case MediaFullScreenVolumeSliderThumbPart: return paintMediaFullScreenVolumeSliderThumb(box, paintInfo, integralSnappedRect); case MediaTimeRemainingPart: return paintMediaTimeRemaining(box, paintInfo, integralSnappedRect); case MediaCurrentTimePart: return paintMediaCurrentTime(box, paintInfo, integralSnappedRect); case MediaControlsBackgroundPart: return paintMediaControlsBackground(box, paintInfo, integralSnappedRect); case MenulistButtonPart: case TextFieldPart: case TextAreaPart: case ListboxPart: return true; case SearchFieldPart: return paintSearchField(box, paintInfo, integralSnappedRect); case SearchFieldCancelButtonPart: return paintSearchFieldCancelButton(box, paintInfo, integralSnappedRect); case SearchFieldDecorationPart: return paintSearchFieldDecorationPart(box, paintInfo, integralSnappedRect); case SearchFieldResultsDecorationPart: return paintSearchFieldResultsDecorationPart(box, paintInfo, integralSnappedRect); case SearchFieldResultsButtonPart: return paintSearchFieldResultsButton(box, paintInfo, integralSnappedRect); case SnapshottedPluginOverlayPart: return paintSnapshottedPluginOverlay(box, paintInfo, integralSnappedRect); #if ENABLE(SERVICE_CONTROLS) case ImageControlsButtonPart: return paintImageControlsButton(box, paintInfo, integralSnappedRect); #endif case CapsLockIndicatorPart: return paintCapsLockIndicator(box, paintInfo, integralSnappedRect); #if ENABLE(ATTACHMENT_ELEMENT) case AttachmentPart: return paintAttachment(box, paintInfo, integralSnappedRect); #endif default: break; } return true; // We don't support the appearance, so let the normal background/border paint. }