void TextureMapperLayer::paintWithIntermediateSurface(const TextureMapperPaintOptions& options, const IntRect& rect) { RefPtr<BitmapTexture> replicaSurface; RefPtr<BitmapTexture> mainSurface; TextureMapperPaintOptions paintOptions(options); paintOptions.offset = -IntSize(rect.x(), rect.y()); paintOptions.opacity = 1; paintOptions.transform = TransformationMatrix(); if (m_state.replicaLayer) { paintOptions.transform = replicaTransform(); replicaSurface = paintIntoSurface(paintOptions, rect.size()); paintOptions.transform = TransformationMatrix(); if (m_state.replicaLayer->m_state.maskLayer) m_state.replicaLayer->m_state.maskLayer->applyMask(paintOptions); } if (replicaSurface && options.opacity == 1) { commitSurface(options, replicaSurface, rect, 1); replicaSurface = nullptr; } mainSurface = paintIntoSurface(paintOptions, rect.size()); if (replicaSurface) { options.textureMapper->bindSurface(replicaSurface.get()); options.textureMapper->drawTexture(*mainSurface.get(), FloatRect(FloatPoint::zero(), rect.size())); mainSurface = replicaSurface; } commitSurface(options, mainSurface, rect, options.opacity); }
PassRefPtr<BitmapTexture> TextureMapperLayer::paintIntoSurface(const TextureMapperPaintOptions& options, const IntSize& size) { RefPtr<BitmapTexture> surface = options.textureMapper->acquireTextureFromPool(size); TextureMapperPaintOptions paintOptions(options); paintOptions.surface = surface; options.textureMapper->bindSurface(surface.get()); paintSelfAndChildren(paintOptions); if (m_state.maskLayer) m_state.maskLayer->applyMask(options); surface = surface->applyFilters(options.textureMapper, m_currentFilters); options.textureMapper->bindSurface(surface.get()); return surface.release(); }
void TextureMapperLayer::paintRecursive(const TextureMapperPaintOptions& options) { if (!isVisible()) return; TextureMapperPaintOptions paintOptions(options); paintOptions.opacity *= m_currentOpacity; if (!shouldBlend()) { paintSelfAndChildrenWithReplica(paintOptions); return; } paintUsingOverlapRegions(paintOptions); }
void TextureMapperLayer::paintRecursive(const TextureMapperPaintOptions& options) { if (!isVisible()) return; float opacity = options.opacity * m_opacity; RefPtr<BitmapTexture> maskTexture = m_state.maskLayer ? m_state.maskLayer->texture() : 0; TextureMapperPaintOptions paintOptions(options); paintOptions.mask = maskTexture.get(); IntRect surfaceRect; RefPtr<BitmapTexture> surface; if (!shouldPaintToIntermediateSurface()) { paintOptions.opacity = opacity; paintSelfAndChildrenWithReplica(paintOptions); return; } // Prepare a surface to paint into. // We paint into the surface ignoring the opacity/transform of the current layer. surfaceRect = intermediateSurfaceRect(); surface = options.textureMapper->acquireTextureFromPool(surfaceRect.size()); options.textureMapper->bindSurface(surface.get()); paintOptions.opacity = 1; // We have to use combinedForChildren() and not combined(), otherwise preserve-3D doesn't work. paintOptions.transform = m_transform.combinedForChildren().inverse(); paintOptions.offset = -IntSize(surfaceRect.x(), surfaceRect.y()); paintSelfAndChildrenWithReplica(paintOptions); // If we painted the replica, the mask is already applied so we don't need to paint it again. if (m_state.replicaLayer) maskTexture = 0; #if ENABLE(CSS_FILTERS) surface = applyFilters(m_state.filters, options.textureMapper, surface.get(), surfaceRect); #endif options.textureMapper->bindSurface(options.surface.get()); TransformationMatrix targetTransform = TransformationMatrix(options.transform) .multiply(m_transform.combined()) .translate(options.offset.width(), options.offset.height()); options.textureMapper->drawTexture(*surface.get(), surfaceRect, targetTransform, opacity, maskTexture.get()); }
PassRefPtr<BitmapTexture> TextureMapperLayer::paintIntoSurface(const TextureMapperPaintOptions& options, const IntSize& size) { RefPtr<BitmapTexture> surface = options.textureMapper->acquireTextureFromPool(size); TextureMapperPaintOptions paintOptions(options); paintOptions.surface = surface; options.textureMapper->bindSurface(surface.get()); paintSelfAndChildren(paintOptions); if (m_state.maskLayer) m_state.maskLayer->applyMask(options); #if ENABLE(CSS_FILTERS) if (!m_currentFilters.isEmpty()) surface = applyFilters(m_currentFilters, options.textureMapper, surface.get()); #endif options.textureMapper->bindSurface(surface.get()); return surface; }