blob: 7c93b6f15af28e95bcf0b8d03ed64696951d0ad7 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/paint_preview/renderer/paint_preview_recorder_utils.h"
#include <utility>
#include "base/bind.h"
#include "components/paint_preview/common/file_stream.h"
#include "components/paint_preview/common/paint_preview_tracker.h"
#include "mojo/public/cpp/base/shared_memory_utils.h"
namespace paint_preview {
void ParseGlyphs(const cc::PaintOpBuffer* buffer,
PaintPreviewTracker* tracker) {
for (cc::PaintOpBuffer::Iterator it(buffer); it; ++it) {
if (it->GetType() == cc::PaintOpType::DrawTextBlob) {
auto* text_blob_op = static_cast<cc::DrawTextBlobOp*>(*it);
tracker->AddGlyphs(text_blob_op->blob.get());
} else if (it->GetType() == cc::PaintOpType::DrawRecord) {
// Recurse into nested records if they contain text blobs (equivalent to
// nested SkPictures).
auto* record_op = static_cast<cc::DrawRecordOp*>(*it);
if (record_op->HasText())
ParseGlyphs(record_op->record.get(), tracker);
}
}
}
bool SerializeAsSkPicture(sk_sp<const cc::PaintRecord> record,
PaintPreviewTracker* tracker,
const gfx::Rect& dimensions,
base::File file) {
if (!file.IsValid())
return false;
// base::Unretained is safe as |tracker| outlives the usage of
// |custom_callback|.
cc::PlaybackParams::CustomDataRasterCallback custom_callback =
base::BindRepeating(&PaintPreviewTracker::CustomDataToSkPictureCallback,
base::Unretained(tracker));
auto skp = ToSkPicture(
record, SkRect::MakeWH(dimensions.width(), dimensions.height()), nullptr,
custom_callback);
if (!skp)
return false;
TypefaceSerializationContext typeface_context(tracker->GetTypefaceUsageMap());
auto serial_procs = MakeSerialProcs(tracker->GetPictureSerializationContext(),
&typeface_context);
FileWStream stream(std::move(file));
skp->serialize(&stream, &serial_procs);
stream.flush();
stream.Close();
return true;
}
void BuildResponse(PaintPreviewTracker* tracker,
mojom::PaintPreviewCaptureResponse* response) {
response->id = tracker->RoutingId();
for (const auto& id_pair : *(tracker->GetPictureSerializationContext())) {
response->content_id_proxy_id_map.insert({id_pair.first, id_pair.second});
}
for (const auto& link : tracker->GetLinks())
response->links.push_back(link.Clone());
}
} // namespace paint_preview