Skip to content

Commit

Permalink
[UnifiedPDF] Get initial painting working
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=262311
rdar://116185973

Reviewed by Tim Horton.

Start getting PDF drawing working for Unified PDF. Currently this just draws the first
page via `CGPDFDocumentCreateWithProvider()` and `CGPDFDocumentGetPage()`.

Move two bits of code into PDFPluginBase; first, have it handle `geometryDidChange()` so
we can store the size. Second, because UnifiedPDFPlugin isn't layer-backed, we need to
plumb through a `paint()` function from `PluginView`.

* Source/WebKit/WebProcess/Plugins/PDF/PDFPlugin.h:
* Source/WebKit/WebProcess/Plugins/PDF/PDFPlugin.mm:
(WebKit::PDFPlugin::geometryDidChange):
* Source/WebKit/WebProcess/Plugins/PDF/PDFPluginBase.h:
(WebKit::PDFPluginBase::paint):
(WebKit::PDFPluginBase::size const):
(WebKit::PDFPluginBase::geometryDidChange): Deleted.
* Source/WebKit/WebProcess/Plugins/PDF/PDFPluginBase.mm:
(WebKit::PDFPluginBase::geometryDidChange):
* Source/WebKit/WebProcess/Plugins/PDF/UnifiedPDF/UnifiedPDFPlugin.h:
* Source/WebKit/WebProcess/Plugins/PDF/UnifiedPDF/UnifiedPDFPlugin.mm:
(WebKit::UnifiedPDFPlugin::createPDFDocument):
(WebKit::UnifiedPDFPlugin::installPDFDocument):
(WebKit::UnifiedPDFPlugin::paint):
(WebKit::UnifiedPDFPlugin::geometryDidChange):
* Source/WebKit/WebProcess/Plugins/PluginView.cpp:
(WebKit::PluginView::paint):

Canonical link: https://commits.webkit.org/268610@main
  • Loading branch information
smfr committed Sep 28, 2023
1 parent 4d66b5d commit 8b9d4c4
Show file tree
Hide file tree
Showing 7 changed files with 74 additions and 8 deletions.
4 changes: 0 additions & 4 deletions Source/WebKit/WebProcess/Plugins/PDF/PDFPlugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,6 @@ class PDFPlugin final : public PDFPluginBase, public WebCore::ScrollableArea {

static WebCore::PluginInfo pluginInfo();

WebCore::IntSize size() const { return m_size; }

void didMutatePDFDocument() { m_pdfDocumentWasMutated = true; }

void paintControlForLayerInContext(CALayer *, CGContextRef);
Expand Down Expand Up @@ -301,8 +299,6 @@ class PDFPlugin final : public PDFPluginBase, public WebCore::ScrollableArea {

RetainPtr<WKPDFLayerControllerDelegate> m_pdfLayerControllerDelegate;

WebCore::IntSize m_size;

URL m_sourceURL;

RetainPtr<PDFDocument> m_pdfDocument;
Expand Down
3 changes: 2 additions & 1 deletion Source/WebKit/WebProcess/Plugins/PDF/PDFPlugin.mm
Original file line number Diff line number Diff line change
Expand Up @@ -2008,7 +2008,8 @@ static void jsPDFDocFinalize(JSObjectRef object)
if (size() == pluginSize && m_view->pageScaleFactor() == [m_pdfLayerController contentScaleFactor])
return;

m_size = pluginSize;
PDFPluginBase::geometryDidChange(pluginSize, pluginToRootViewTransform);

m_rootViewToPluginTransform = valueOrDefault(pluginToRootViewTransform.inverse());
[m_pdfLayerController setFrameSize:pluginSize];

Expand Down
7 changes: 6 additions & 1 deletion Source/WebKit/WebProcess/Plugins/PDF/PDFPluginBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,15 @@ class PDFPluginBase : public ThreadSafeRefCounted<PDFPluginBase> {

virtual bool isComposited() const { return false; }

virtual void paint(WebCore::GraphicsContext&, const WebCore::IntRect&) { }

virtual CGFloat scaleFactor() const = 0;

// FIXME: Can we use PDFDocument here?
virtual RetainPtr<PDFDocument> pdfDocumentForPrinting() const = 0;
virtual WebCore::FloatSize pdfDocumentSizeForPrinting() const = 0;

virtual void geometryDidChange(const WebCore::IntSize& pluginSize, const WebCore::AffineTransform& pluginToRootViewTransform) { }
virtual void geometryDidChange(const WebCore::IntSize& pluginSize, const WebCore::AffineTransform& pluginToRootViewTransform);
virtual void visibilityDidChange(bool) { }
virtual void contentsScaleFactorChanged(float) { }

Expand Down Expand Up @@ -119,6 +121,7 @@ class PDFPluginBase : public ThreadSafeRefCounted<PDFPluginBase> {
bool isBeingDestroyed() const { return m_isBeingDestroyed; }

bool isFullFramePlugin() const;
WebCore::IntSize size() const { return m_size; }

void streamDidReceiveResponse(const WebCore::ResourceResponse&);
void streamDidReceiveData(const WebCore::SharedBuffer&);
Expand Down Expand Up @@ -149,6 +152,8 @@ class PDFPluginBase : public ThreadSafeRefCounted<PDFPluginBase> {
String m_suggestedFilename;
uint64_t m_streamedBytes { 0 };

WebCore::IntSize m_size;

bool m_documentFinishedLoading { false };
bool m_isBeingDestroyed { false };
bool m_hasBeenDestroyed { false };
Expand Down
5 changes: 5 additions & 0 deletions Source/WebKit/WebProcess/Plugins/PDF/PDFPluginBase.mm
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,11 @@
m_view->frame()->document()->loader()->addArchiveResource(resource.releaseNonNull());
}

void PDFPluginBase::geometryDidChange(const IntSize& pluginSize, const AffineTransform& pluginToRootViewTransform)
{
m_size = pluginSize;
}

} // namespace WebKit

#endif // ENABLE(PDFKIT_PLUGIN) || ENABLE(UNIFIED_PDF)
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,15 @@ class UnifiedPDFPlugin final : public PDFPluginBase {
void createPDFDocument() override;
void installPDFDocument() override;

void paint(WebCore::GraphicsContext&, const WebCore::IntRect&) override;

CGFloat scaleFactor() const override;

RetainPtr<PDFDocument> pdfDocumentForPrinting() const override;
WebCore::FloatSize pdfDocumentSizeForPrinting() const override;

void geometryDidChange(const WebCore::IntSize&, const WebCore::AffineTransform&) override;

RefPtr<WebCore::FragmentedSharedBuffer> liveResourceData() const override;

bool handleMouseEvent(const WebMouseEvent&) override;
Expand All @@ -75,6 +79,8 @@ class UnifiedPDFPlugin final : public PDFPluginBase {
id accessibilityHitTest(const WebCore::IntPoint&) const override;
id accessibilityObject() const override;
id accessibilityAssociatedPluginParentForElement(WebCore::Element*) const override;

RetainPtr<CGPDFDocumentRef> m_pdfDocument;
};

} // namespace WebKit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@

#if ENABLE(UNIFIED_PDF)

#include <CoreGraphics/CoreGraphics.h>
#include <WebCore/GraphicsContext.h>
#include <WebCore/ImageBuffer.h>

namespace WebKit {
using namespace WebCore;
Expand All @@ -49,19 +52,66 @@

void UnifiedPDFPlugin::createPDFDocument()
{

auto dataProvider = adoptCF(CGDataProviderCreateWithCFData(m_data.get()));
m_pdfDocument = adoptCF(CGPDFDocumentCreateWithProvider(dataProvider.get()));
}

void UnifiedPDFPlugin::installPDFDocument()
{
ASSERT(isMainRunLoop());

if (m_hasBeenDestroyed)
return;

if (!m_pdfDocument)
return;

if (!m_view)
return;

}

void UnifiedPDFPlugin::paint(GraphicsContext& context, const WebCore::IntRect& rect)
{
ALWAYS_LOG_WITH_STREAM(stream << "UnifiedPDFPlugin::paint " << rect);
ASSERT(!context.paintingDisabled());

if (m_size.isEmpty())
return;

auto imageBuffer = ImageBuffer::create(m_size, RenderingPurpose::Unspecified, 1.0, DestinationColorSpace::SRGB(), PixelFormat::BGRA8);
if (!imageBuffer)
return;

RetainPtr firstPage = CGPDFDocumentGetPage(m_pdfDocument.get(), 1);
if (!firstPage)
return;

CGContextRef cgContext = imageBuffer->context().platformContext();
CGRect pageCropBox = CGPDFPageGetBoxRect(firstPage.get(), kCGPDFCropBox);

CGRect clipRect = CGRectMake(0, 0, pageCropBox.size.width, pageCropBox.size.height);
CGContextAddRect(cgContext, clipRect);
CGContextClip(cgContext);

CGContextDrawPDFPage(cgContext, firstPage.get());

context.drawImageBuffer(*imageBuffer, FloatPoint { });
}

CGFloat UnifiedPDFPlugin::scaleFactor() const
{
return 1;
}

void UnifiedPDFPlugin::geometryDidChange(const IntSize& pluginSize, const AffineTransform& pluginToRootViewTransform)
{
if (size() == pluginSize)
return;

PDFPluginBase::geometryDidChange(pluginSize, pluginToRootViewTransform);
}

RetainPtr<PDFDocument> UnifiedPDFPlugin::pdfDocumentForPrinting() const
{
return nil;
Expand Down
5 changes: 4 additions & 1 deletion Source/WebKit/WebProcess/Plugins/PluginView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -452,7 +452,7 @@ void PluginView::setFrameRect(const WebCore::IntRect& rect)
viewGeometryDidChange();
}

void PluginView::paint(GraphicsContext& context, const IntRect& /*dirtyRect*/, Widget::SecurityOriginPaintPolicy, RegionContext*)
void PluginView::paint(GraphicsContext& context, const IntRect& dirtyRect, Widget::SecurityOriginPaintPolicy, RegionContext*)
{
if (!m_isInitialized)
return;
Expand Down Expand Up @@ -481,7 +481,10 @@ void PluginView::paint(GraphicsContext& context, const IntRect& /*dirtyRect*/, W
deviceScaleFactor = page->deviceScaleFactor();
m_transientPaintingSnapshot->paint(context, deviceScaleFactor, frameRect().location(), m_transientPaintingSnapshot->bounds());
}
return;
}

m_plugin->paint(context, dirtyRect);
}

void PluginView::frameRectsChanged()
Expand Down

0 comments on commit 8b9d4c4

Please sign in to comment.