1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_PAINT_PREVIEW_COMMON_PAINT_PREVIEW_TRACKER_H_
#define COMPONENTS_PAINT_PREVIEW_COMMON_PAINT_PREVIEW_TRACKER_H_
#include <stdint.h>
#include <memory>
#include <optional>
#include <vector>
#include "base/containers/flat_map.h"
#include "base/unguessable_token.h"
#include "components/paint_preview/common/glyph_usage.h"
#include "components/paint_preview/common/mojom/paint_preview_recorder.mojom.h"
#include "components/paint_preview/common/serial_utils.h"
#include "third_party/skia/include/core/SkMatrix.h"
#include "third_party/skia/include/core/SkPicture.h"
#include "third_party/skia/include/core/SkRefCnt.h"
#include "third_party/skia/include/core/SkTextBlob.h"
#include "ui/gfx/geometry/rect.h"
#include "url/gurl.h"
namespace paint_preview {
// Tracks metadata for a Paint Preview. Contains all the data required to
// produce a PaintPreviewFrameProto.
class PaintPreviewTracker {
public:
PaintPreviewTracker(
const base::UnguessableToken& guid,
const std::optional<base::UnguessableToken>& embedding_token,
bool is_main_frame);
~PaintPreviewTracker();
// Getters ------------------------------------------------------------------
const base::UnguessableToken& Guid() const { return guid_; }
const std::optional<base::UnguessableToken>& EmbeddingToken() const {
return embedding_token_;
}
bool IsMainFrame() const { return is_main_frame_; }
// Transform methods --------------------------------------------------------
// Used to transform the position of links when parsing the paint op buffer.
// These are inspired by the methods in SkCanvas.
void Save();
void Restore();
void SetMatrix(const SkMatrix& matrix);
void Concat(const SkMatrix& matrix);
void Scale(SkScalar x, SkScalar y);
void Rotate(SkScalar degrees);
void Translate(SkScalar x, SkScalar y);
// Data Collection ----------------------------------------------------------
// Creates a placeholder SkPicture for an OOP subframe located at |rect|
// mapped to the |embedding_token| of OOP RenderFrame. Returns the content id
// of the placeholder SkPicture.
uint32_t CreateContentForRemoteFrame(
const gfx::Rect& rect,
const base::UnguessableToken& embedding_token);
// Adds the glyphs in |blob| to the glyph usage tracker for the |blob|'s
// associated typface.
void AddGlyphs(const SkTextBlob* blob);
// Adds |link| with bounding box |rect| to the list of links.
void AnnotateLink(const GURL& link, const SkRect& rect);
// Used when walking the PaintOpBuffer to transforms the clip rect associated
// with the SkPicture with |id| to be relative to the top-left corner of
// the root space of the current frame associated with this tracker using
// |matrix_|. Originally the clip rect is relative to the current matrix stack
// of the canvas at time of drawing. The result in stored and accessible via
// the PictureSerializationContext during serialization.
void TransformClipForFrame(uint32_t id);
// Data Serialization -------------------------------------------------------
// NOTE: once any of these methods are called the PaintPreviewTracker should
// be considered immutable.
// Inserts the OOP subframe placeholder associated with |content_id| into
// |canvas|. The cull rect of the placeholder will encode the position and
// size of the the subframe in its parent's coordinate system.
void CustomDataToSkPictureCallback(SkCanvas* canvas, uint32_t content_id);
// Expose internal maps for use in MakeSerialProcs().
// NOTE: Cannot be const due to how SkPicture procs work.
PictureSerializationContext* GetPictureSerializationContext() {
return &picture_context_;
}
TypefaceUsageMap* GetTypefaceUsageMap() { return &typeface_glyph_usage_; }
ImageSerializationContext* GetImageSerializationContext() {
return &image_context_;
}
// Expose links for serialization to a PaintPreviewFrameProto.
const std::vector<mojom::LinkDataPtr>& GetLinks() { return links_; }
// Moves |links_| to out. Invalidates existing entries in |links_|.
void MoveLinks(std::vector<mojom::LinkDataPtr>* out);
const base::flat_map<uint32_t, sk_sp<SkPicture>>&
GetSubframePicsForTesting() {
return subframe_pics_;
}
private:
const base::UnguessableToken guid_;
const std::optional<base::UnguessableToken> embedding_token_;
const bool is_main_frame_;
// TODO(crbug.com/40735471): Change this to an SkM44.
SkMatrix matrix_;
std::vector<SkMatrix> states_;
std::vector<mojom::LinkDataPtr> links_;
ImageSerializationContext image_context_;
PictureSerializationContext picture_context_;
TypefaceUsageMap typeface_glyph_usage_;
base::flat_map<uint32_t, sk_sp<SkPicture>> subframe_pics_;
PaintPreviewTracker(const PaintPreviewTracker&) = delete;
PaintPreviewTracker& operator=(const PaintPreviewTracker&) = delete;
};
} // namespace paint_preview
#endif // COMPONENTS_PAINT_PREVIEW_COMMON_PAINT_PREVIEW_TRACKER_H_
|