void GraphicsLayerTextureMapper::updateBackingStoreIfNeeded() { TextureMapper* textureMapper = m_layer.textureMapper(); if (!textureMapper) return; if (!shouldHaveBackingStore()) { ASSERT(!m_backingStore); return; } ASSERT(m_backingStore); IntRect dirtyRect = enclosingIntRect(FloatRect(FloatPoint::zero(), m_size)); if (!m_needsDisplay) dirtyRect.intersect(enclosingIntRect(m_needsDisplayRect)); if (dirtyRect.isEmpty()) return; TextureMapperTiledBackingStore* backingStore = static_cast<TextureMapperTiledBackingStore*>(m_backingStore.get()); backingStore->updateContentsScale(pageScaleFactor() * deviceScaleFactor()); dirtyRect.scale(pageScaleFactor() * deviceScaleFactor()); backingStore->updateContents(*textureMapper, this, m_size, dirtyRect, BitmapTexture::UpdateCanModifyOriginalImageData); m_needsDisplay = false; m_needsDisplayRect = IntRect(); }
SmartClipData SmartClip::dataForRect(const IntRect& cropRect) { IntRect resizedCropRect = applyScaleWithoutCollapsingToZero(cropRect, 1 / pageScaleFactor()); Node* bestNode = findBestOverlappingNode(m_frame->document(), resizedCropRect); if (!bestNode) return SmartClipData(); if (Node* nodeFromFrame = nodeInsideFrame(bestNode)) { // FIXME: This code only hit-tests a single iframe. It seems like we ought support nested frames. if (Node* bestNodeInFrame = findBestOverlappingNode(nodeFromFrame, resizedCropRect)) bestNode = bestNodeInFrame; } WillBeHeapVector<RawPtrWillBeMember<Node> > hitNodes; collectOverlappingChildNodes(bestNode, resizedCropRect, hitNodes); if (hitNodes.isEmpty() || hitNodes.size() == bestNode->countChildren()) { hitNodes.clear(); hitNodes.append(bestNode); } // Unite won't work with the empty rect, so we initialize to the first rect. IntRect unitedRects = hitNodes[0]->pixelSnappedBoundingBox(); StringBuilder collectedText; for (size_t i = 0; i < hitNodes.size(); ++i) { collectedText.append(extractTextFromNode(hitNodes[i])); unitedRects.unite(hitNodes[i]->pixelSnappedBoundingBox()); } return SmartClipData(bestNode, convertRectToWindow(unitedRects), collectedText.toString()); }
void GraphicsLayerTextureMapper::setContentsToImage(Image* image) { if (image) { // Make the decision about whether the image has changed. // This code makes the assumption that pointer equality on a NativeImagePtr is a valid way to tell if the image is changed. // This assumption is true in Qt, GTK and EFL. NativeImagePtr newNativeImagePtr = image->nativeImageForCurrentFrame(); if (!newNativeImagePtr) return; if (newNativeImagePtr == m_compositedNativeImagePtr) return; m_compositedNativeImagePtr = newNativeImagePtr; if (!m_compositedImage) m_compositedImage = TextureMapperTiledBackingStore::create(); m_compositedImage->setContentsToImage(image); m_compositedImage->updateContentsScale(pageScaleFactor() * deviceScaleFactor()); } else { m_compositedNativeImagePtr = nullptr; m_compositedImage = nullptr; } setContentsToPlatformLayer(m_compositedImage.get(), ContentsLayerForImage); notifyChange(ContentChange); GraphicsLayer::setContentsToImage(image); }
float GraphicsLayerChromium::contentsScale() const { if (!appliesPageScale()) return pageScaleFactor() * deviceScaleFactor(); return 1; }
IntRect SmartClip::convertRectToWindow(const IntRect& nodeRect) { IntRect result = m_frame->document()->view()->contentsToWindow(nodeRect); result.scale(pageScaleFactor()); return result; }
float CoordinatedGraphicsLayer::effectiveContentsScale() { return selfOrAncestorHaveNonAffineTransforms() ? 1 : deviceScaleFactor() * pageScaleFactor(); }