void SunkenFrameShadow::updateGeometry() { QWidget* widget = parentWidget(); if (!widget) return; QRect cr = widget->contentsRect(); switch (shadowArea()) { case Top: cr.setHeight( SHADOW_SIZE_TOP ); cr.adjust( -1, -1, 1, 0 ); break; case Left: cr.setWidth(SHADOW_SIZE_LEFT); cr.adjust(-1, SHADOW_SIZE_TOP, 0, -SHADOW_SIZE_BOTTOM); break; case Bottom: cr.setTop(cr.bottom() - SHADOW_SIZE_BOTTOM + 1); cr.adjust( -1, 0, 1, 1 ); break; case Right: cr.setLeft(cr.right() - SHADOW_SIZE_RIGHT + 1); cr.adjust(0, SHADOW_SIZE_TOP, 1, -SHADOW_SIZE_BOTTOM); break; case UnknownArea: default: return; } setGeometry(cr); }
//____________________________________________________________________________________ void FlatFrameShadow::updateGeometry() { QWidget *widget = parentWidget(); if( !widget ) return; QRect cr = widget->contentsRect(); switch (shadowArea()) { case Top: cr.setHeight( SHADOW_SIZE_TOP-3 ); break; case Bottom: cr.setTop(cr.bottom() - SHADOW_SIZE_BOTTOM + 4); break; case Unknown: default: return; } setGeometry(cr); }
//____________________________________________________________________________________ void SunkenFrameShadow::paintEvent(QPaintEvent *event ) { // this fixes shadows in frames that change frameStyle() after polish() if (QFrame *frame = qobject_cast<QFrame *>(parentWidget())) { if (frame->frameStyle() != (QFrame::StyledPanel | QFrame::Sunken)) return; } QWidget *parent = parentWidget(); if(!parent) return; QRect r = parent->contentsRect(); r.translate(mapFromParent(QPoint(0, 0))); QColor base( palette().color(QPalette::Window) ); TileSet::Tiles tiles; switch( shadowArea() ) { case Top: { tiles = TileSet::Left|TileSet::Top|TileSet::Right; r.adjust( -2, -2, 2, -1 ); break; } case Bottom: { tiles = TileSet::Left|TileSet::Bottom|TileSet::Right; r.adjust( -2, 1, 2, 2 ); break; } case Left: { tiles = TileSet::Left; r.adjust( -2, -4, -1, 4 ); break; } case Right: { tiles = TileSet::Right; r.adjust( -1, -4, 2, 4 ); break; } default: return; } HoleOptions options( HoleOutline ); if( _focus ) options |= HoleFocus; if( _hover ) options |= HoleHover; if( hasContrast() ) options |= HoleContrast; QPainter painter(this); painter.setClipRegion( event->region() ); _helper.renderHole( &painter, palette().color( QPalette::Window ), r, options, _opacity, _mode, tiles ); return; }
void FEDropShadow::platformApplySoftware() { FilterEffect* in = inputEffect(0); ImageBuffer* resultImage = createImageBufferResult(); if (!resultImage) return; Filter& filter = this->filter(); FloatSize blurRadius(2 * filter.applyHorizontalScale(m_stdX), 2 * filter.applyVerticalScale(m_stdY)); blurRadius.scale(filter.filterScale()); FloatSize offset(filter.applyHorizontalScale(m_dx), filter.applyVerticalScale(m_dy)); FloatRect drawingRegion = drawingRegionOfInputImage(in->absolutePaintRect()); FloatRect drawingRegionWithOffset(drawingRegion); drawingRegionWithOffset.move(offset); ImageBuffer* sourceImage = in->asImageBuffer(); if (!sourceImage) return; GraphicsContext& resultContext = resultImage->context(); resultContext.setAlpha(m_shadowOpacity); resultContext.drawImageBuffer(*sourceImage, drawingRegionWithOffset); resultContext.setAlpha(1); ShadowBlur contextShadow(blurRadius, offset, m_shadowColor); // TODO: Direct pixel access to ImageBuffer would avoid copying the ImageData. IntRect shadowArea(IntPoint(), resultImage->internalSize()); RefPtr<Uint8ClampedArray> srcPixelArray = resultImage->getPremultipliedImageData(shadowArea, ImageBuffer::BackingStoreCoordinateSystem); contextShadow.blurLayerImage(srcPixelArray->data(), shadowArea.size(), 4 * shadowArea.size().width()); resultImage->putByteArray(Premultiplied, srcPixelArray.get(), shadowArea.size(), shadowArea, IntPoint(), ImageBuffer::BackingStoreCoordinateSystem); resultContext.setCompositeOperation(CompositeSourceIn); resultContext.fillRect(FloatRect(FloatPoint(), absolutePaintRect().size()), m_shadowColor); resultContext.setCompositeOperation(CompositeDestinationOver); resultImage->context().drawImageBuffer(*sourceImage, drawingRegion); }
void FEDropShadow::platformApplySoftware() { FilterEffect* in = inputEffect(0); ImageBuffer* resultImage = createImageBufferResult(); if (!resultImage) return; Filter* filter = this->filter(); FloatSize blurRadius(filter->applyHorizontalScale(m_stdX), filter->applyVerticalScale(m_stdY)); FloatSize offset(filter->applyHorizontalScale(m_dx), filter->applyVerticalScale(m_dy)); FloatRect drawingRegion = drawingRegionOfInputImage(in->absolutePaintRect()); FloatRect drawingRegionWithOffset(drawingRegion); drawingRegionWithOffset.move(offset); ImageBuffer* sourceImage = in->asImageBuffer(); ASSERT(sourceImage); GraphicsContext* resultContext = resultImage->context(); ASSERT(resultContext); resultContext->setAlpha(m_shadowOpacity); resultContext->drawImageBuffer(sourceImage, ColorSpaceDeviceRGB, drawingRegionWithOffset); resultContext->setAlpha(1); ShadowBlur contextShadow(blurRadius, offset, m_shadowColor, ColorSpaceDeviceRGB); // TODO: Direct pixel access to ImageBuffer would avoid copying the ImageData. IntRect shadowArea(IntPoint(), resultImage->size()); RefPtr<ByteArray> srcPixelArray = resultImage->getPremultipliedImageData(shadowArea); contextShadow.blurLayerImage(srcPixelArray->data(), shadowArea.size(), 4 * shadowArea.size().width()); resultImage->putPremultipliedImageData(srcPixelArray.get(), shadowArea.size(), shadowArea, IntPoint()); resultContext->setCompositeOperation(CompositeSourceIn); resultContext->fillRect(FloatRect(FloatPoint(), absolutePaintRect().size()), m_shadowColor, ColorSpaceDeviceRGB); resultContext->setCompositeOperation(CompositeDestinationOver); resultImage->context()->drawImageBuffer(sourceImage, ColorSpaceDeviceRGB, drawingRegion); }