blob: ddf2f3433c16c173720ad3c5503c37f2319279b7 [file] [log] [blame]
// 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();
paint_controller_ = own_paint_controller_.get();
}
if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled()) {
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());
}
if (!paint_controller)
cache_skipper_.emplace(*context_);
}
sk_sp<PaintRecord> PaintRecordBuilder::EndRecording(
const PropertyTreeState& replay_state) {
context_->BeginRecording(FloatRect());
paint_controller_->CommitNewDisplayItems();
paint_controller_->GetPaintArtifact().Replay(*context_, replay_state);
return context_->EndRecording();
}
void PaintRecordBuilder::EndRecording(PaintCanvas& canvas,
const PropertyTreeState& replay_state) {
if (!RuntimeEnabledFeatures::SlimmingPaintV175Enabled()) {
canvas.drawPicture(EndRecording());
} else {
paint_controller_->CommitNewDisplayItems();
paint_controller_->GetPaintArtifact().Replay(canvas, replay_state);
}
}
} // namespace blink