blob: 84c257a46a2233d65786f49f21520299a983c0db [file]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "pdf/pdf_ink_conversions.h"
#include <cmath>
#include <variant>
#include "base/check_op.h"
#include "base/time/time.h"
#include "third_party/blink/public/common/input/web_pointer_properties.h"
#include "third_party/ink/src/ink/brush/brush.h"
#include "third_party/ink/src/ink/brush/brush_coat.h"
#include "third_party/ink/src/ink/brush/brush_paint.h"
#include "third_party/ink/src/ink/brush/color_function.h"
#include "third_party/ink/src/ink/color/color.h"
#include "third_party/ink/src/ink/geometry/point.h"
#include "third_party/ink/src/ink/strokes/input/stroke_input.h"
#include "ui/gfx/geometry/point_f.h"
namespace chrome_pdf {
namespace {
float InkPressureFromBlinkPressure(float pressure) {
return std::isnan(pressure) ? ink::StrokeInput::kNoPressure : pressure;
}
} // namespace
ink::StrokeInput CreateInkStrokeInput(ink::StrokeInput::ToolType tool_type,
const gfx::PointF& position,
base::TimeDelta elapsed_time) {
return CreateInkStrokeInputWithProperties(tool_type, position, elapsed_time,
/*properties=*/nullptr);
}
ink::StrokeInput CreateInkStrokeInputWithProperties(
ink::StrokeInput::ToolType tool_type,
const gfx::PointF& position,
base::TimeDelta elapsed_time,
const blink::WebPointerProperties* properties) {
ink::StrokeInput result{
.tool_type = tool_type,
.position = InkPointFromGfxPoint(position),
.elapsed_time = ink::Duration32::Seconds(
static_cast<float>(elapsed_time.InSecondsF())),
};
if (properties) {
result.pressure = InkPressureFromBlinkPressure(properties->force);
}
return result;
}
SkColor GetSkColorFromInkBrush(const ink::Brush& brush) {
ink::Color::RgbaUint8 rgba =
brush.GetColor().AsUint8(ink::Color::Format::kGammaEncoded);
return SkColorSetARGB(rgba.a, rgba.r, rgba.g, rgba.b);
}
float GetOpacityMultiplierFromBrush(const ink::Brush& brush) {
CHECK_EQ(brush.CoatCount(), 1u);
const ink::BrushCoat& coat = brush.GetCoats()[0];
CHECK_EQ(coat.paint_preferences.size(), 1u);
const ink::BrushPaint& paint = coat.paint_preferences[0];
CHECK_EQ(paint.color_functions.size(), 1u);
const auto& parameters = paint.color_functions[0].parameters;
return std::get<ink::ColorFunction::OpacityMultiplier>(parameters).multiplier;
}
ink::Point InkPointFromGfxPoint(const gfx::PointF& point) {
return ink::Point(point.x(), point.y());
}
} // namespace chrome_pdf