summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/platform/graphics/paint/paint_record_builder.cc
blob: 239f61dc8c5f2e8840364394ea435d2972a0d1d0 (plain)
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
// Copyright 2015 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 "third_party/blink/renderer/platform/graphics/paint/paint_record_builder.h"

#include "third_party/blink/renderer/platform/geometry/float_rect.h"
#include "third_party/blink/renderer/platform/graphics/graphics_context.h"
#include "third_party/blink/renderer/platform/graphics/paint/paint_controller.h"

namespace blink {

PaintRecordBuilder::PaintRecordBuilder(SkMetaData* meta_data,
                                       GraphicsContext* containing_context,
                                       PaintController* paint_controller)
    : paint_controller_(nullptr) {
  GraphicsContext::DisabledMode disabled_mode =
      GraphicsContext::kNothingDisabled;
  if (containing_context && containing_context->ContextDisabled())
    disabled_mode = GraphicsContext::kFullyDisabled;

  if (paint_controller) {
    paint_controller_ = paint_controller;
  } else {
    own_paint_controller_ =
        PaintController::Create(PaintController::kTransient);
    paint_controller_ = own_paint_controller_.get();
  }

  paint_controller_->UpdateCurrentPaintChunkProperties(
      base::nullopt, PropertyTreeState::Root());

  const HighContrastSettings* high_contrast_settings =
      containing_context ? &containing_context->high_contrast_settings()
                         : nullptr;
  context_ = std::make_unique<GraphicsContext>(*paint_controller_,
                                               disabled_mode, meta_data);
  if (high_contrast_settings)
    context_->SetHighContrast(*high_contrast_settings);

  if (containing_context) {
    context_->SetDeviceScaleFactor(containing_context->DeviceScaleFactor());
    context_->SetPrinting(containing_context->Printing());
  }
}

PaintRecordBuilder::~PaintRecordBuilder() = default;

sk_sp<PaintRecord> PaintRecordBuilder::EndRecording(
    const PropertyTreeState& replay_state) {
  context_->BeginRecording(FloatRect());
  paint_controller_->CommitNewDisplayItems();
  paint_controller_->FinishCycle();
  paint_controller_->GetPaintArtifact().Replay(*context_, replay_state);
  return context_->EndRecording();
}

void PaintRecordBuilder::EndRecording(cc::PaintCanvas& canvas,
                                      const PropertyTreeState& replay_state) {
  paint_controller_->CommitNewDisplayItems();
  paint_controller_->FinishCycle();
  paint_controller_->GetPaintArtifact().Replay(canvas, replay_state);
}

}  // namespace blink