File: paint_preview_tracker.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (133 lines) | stat: -rw-r--r-- 5,130 bytes parent folder | download | duplicates (9)
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_