Merge branch 'master' into pr/1875
@@ -46,9 +46,9 @@ QString CrossDissolveTransition::Description() const
|
||||
return tr("Smoothly transition between two clips.");
|
||||
}
|
||||
|
||||
ShaderCode CrossDissolveTransition::GetShaderCode(const QString &shader_id) const
|
||||
ShaderCode CrossDissolveTransition::GetShaderCode(const ShaderRequest &request) const
|
||||
{
|
||||
Q_UNUSED(shader_id)
|
||||
Q_UNUSED(request)
|
||||
|
||||
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/crossdissolve.frag"), QString());
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ public:
|
||||
|
||||
//virtual void Retranslate() override;
|
||||
|
||||
virtual ShaderCode GetShaderCode(const QString& shader_id) const override;
|
||||
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
|
||||
|
||||
protected:
|
||||
virtual void ShaderJobEvent(const NodeValueRow &value, ShaderJob& job) const override;
|
||||
|
||||
@@ -49,9 +49,9 @@ QString DipToColorTransition::Description() const
|
||||
return tr("Transition between clips by dipping to a color.");
|
||||
}
|
||||
|
||||
ShaderCode DipToColorTransition::GetShaderCode(const QString &shader_id) const
|
||||
ShaderCode DipToColorTransition::GetShaderCode(const ShaderRequest &request) const
|
||||
{
|
||||
Q_UNUSED(shader_id)
|
||||
Q_UNUSED(request)
|
||||
|
||||
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/diptoblack.frag"), QString());
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ public:
|
||||
virtual QVector<CategoryID> Category() const override;
|
||||
virtual QString Description() const override;
|
||||
|
||||
virtual ShaderCode GetShaderCode(const QString& shader_id) const override;
|
||||
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
|
||||
|
||||
static const QString kColorInput;
|
||||
|
||||
|
||||
@@ -108,9 +108,9 @@ void CornerPinDistortNode::Value(const NodeValueRow &value, const NodeGlobals &g
|
||||
}
|
||||
}
|
||||
|
||||
ShaderCode CornerPinDistortNode::GetShaderCode(const QString &shader_id) const
|
||||
ShaderCode CornerPinDistortNode::GetShaderCode(const ShaderRequest &request) const
|
||||
{
|
||||
Q_UNUSED(shader_id)
|
||||
Q_UNUSED(request)
|
||||
|
||||
return ShaderCode(FileFunctions::ReadFileAsString(QStringLiteral(":/shaders/cornerpin.frag")),
|
||||
FileFunctions::ReadFileAsString(QStringLiteral(":/shaders/cornerpin.vert")));
|
||||
|
||||
@@ -61,7 +61,7 @@ public:
|
||||
|
||||
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
|
||||
|
||||
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
|
||||
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
|
||||
|
||||
virtual void UpdateGizmoPositions(const NodeValueRow &row, const NodeGlobals &globals) override;
|
||||
|
||||
|
||||
@@ -94,9 +94,9 @@ void CropDistortNode::Value(const NodeValueRow &value, const NodeGlobals &global
|
||||
}
|
||||
}
|
||||
|
||||
ShaderCode CropDistortNode::GetShaderCode(const QString &shader_id) const
|
||||
ShaderCode CropDistortNode::GetShaderCode(const ShaderRequest &request) const
|
||||
{
|
||||
Q_UNUSED(shader_id)
|
||||
Q_UNUSED(request)
|
||||
return ShaderCode(FileFunctions::ReadFileAsString(QStringLiteral(":/shaders/crop.frag")));
|
||||
}
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ public:
|
||||
|
||||
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
|
||||
|
||||
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
|
||||
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
|
||||
|
||||
virtual void UpdateGizmoPositions(const NodeValueRow &row, const NodeGlobals &globals) override;
|
||||
|
||||
|
||||
@@ -69,9 +69,9 @@ void FlipDistortNode::Retranslate()
|
||||
SetInputName(kVerticalInput, tr("Vertical"));
|
||||
}
|
||||
|
||||
ShaderCode FlipDistortNode::GetShaderCode(const QString& shader_id) const
|
||||
ShaderCode FlipDistortNode::GetShaderCode(const ShaderRequest &request) const
|
||||
{
|
||||
Q_UNUSED(shader_id)
|
||||
Q_UNUSED(request)
|
||||
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/flip.frag"));
|
||||
}
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ public:
|
||||
|
||||
virtual void Retranslate() override;
|
||||
|
||||
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
|
||||
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
|
||||
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
|
||||
|
||||
static const QString kTextureInput;
|
||||
|
||||
@@ -119,9 +119,9 @@ void TransformDistortNode::Value(const NodeValueRow &value, const NodeGlobals &g
|
||||
}
|
||||
}
|
||||
|
||||
ShaderCode TransformDistortNode::GetShaderCode(const QString &shader_id) const
|
||||
ShaderCode TransformDistortNode::GetShaderCode(const ShaderRequest &request) const
|
||||
{
|
||||
Q_UNUSED(shader_id);
|
||||
Q_UNUSED(request);
|
||||
|
||||
// Returns default frag and vert shader
|
||||
return ShaderCode();
|
||||
|
||||
@@ -65,7 +65,7 @@ public:
|
||||
|
||||
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
|
||||
|
||||
virtual ShaderCode GetShaderCode(const QString& shader_id) const override;
|
||||
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
|
||||
|
||||
enum AutoScaleType {
|
||||
kAutoScaleNone,
|
||||
|
||||
@@ -37,9 +37,9 @@ void OpacityEffect::Retranslate()
|
||||
SetInputName(kValueInput, tr("Opacity"));
|
||||
}
|
||||
|
||||
ShaderCode OpacityEffect::GetShaderCode(const QString &shader_id) const
|
||||
ShaderCode OpacityEffect::GetShaderCode(const ShaderRequest &request) const
|
||||
{
|
||||
Q_UNUSED(shader_id)
|
||||
Q_UNUSED(request)
|
||||
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/opacity.frag"));
|
||||
}
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ public:
|
||||
|
||||
virtual void Retranslate() override;
|
||||
|
||||
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
|
||||
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
|
||||
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
|
||||
|
||||
static const QString kTextureInput;
|
||||
|
||||
@@ -83,9 +83,9 @@ void BlurFilterNode::Retranslate()
|
||||
SetInputName(kRepeatEdgePixelsInput, tr("Repeat Edge Pixels"));
|
||||
}
|
||||
|
||||
ShaderCode BlurFilterNode::GetShaderCode(const QString &shader_id) const
|
||||
ShaderCode BlurFilterNode::GetShaderCode(const ShaderRequest &request) const
|
||||
{
|
||||
Q_UNUSED(shader_id)
|
||||
Q_UNUSED(request)
|
||||
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/blur.frag"));
|
||||
}
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ public:
|
||||
|
||||
virtual void Retranslate() override;
|
||||
|
||||
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
|
||||
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
|
||||
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
|
||||
|
||||
static const QString kTextureInput;
|
||||
|
||||
@@ -73,9 +73,9 @@ void MosaicFilterNode::Value(const NodeValueRow &value, const NodeGlobals &globa
|
||||
}
|
||||
}
|
||||
|
||||
ShaderCode MosaicFilterNode::GetShaderCode(const QString &shader_id) const
|
||||
ShaderCode MosaicFilterNode::GetShaderCode(const ShaderRequest &request) const
|
||||
{
|
||||
Q_UNUSED(shader_id)
|
||||
Q_UNUSED(request)
|
||||
|
||||
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/mosaic.frag"));
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ public:
|
||||
virtual void Retranslate() override;
|
||||
|
||||
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
|
||||
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
|
||||
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
|
||||
|
||||
static const QString kTextureInput;
|
||||
static const QString kHorizInput;
|
||||
|
||||
@@ -101,9 +101,9 @@ void StrokeFilterNode::Value(const NodeValueRow &value, const NodeGlobals &globa
|
||||
}
|
||||
}
|
||||
|
||||
ShaderCode StrokeFilterNode::GetShaderCode(const QString &shader_id) const
|
||||
ShaderCode StrokeFilterNode::GetShaderCode(const ShaderRequest &request) const
|
||||
{
|
||||
Q_UNUSED(shader_id)
|
||||
Q_UNUSED(request)
|
||||
|
||||
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/stroke.frag"));
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ public:
|
||||
virtual void Retranslate() override;
|
||||
|
||||
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
|
||||
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
|
||||
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
|
||||
|
||||
static const QString kTextureInput;
|
||||
static const QString kColorInput;
|
||||
|
||||
@@ -73,7 +73,7 @@ void NoiseGeneratorNode::Retranslate()
|
||||
SetInputName(kColorInput, tr("Color"));
|
||||
}
|
||||
|
||||
ShaderCode NoiseGeneratorNode::GetShaderCode(const QString& shader_id) const
|
||||
ShaderCode NoiseGeneratorNode::GetShaderCode(const ShaderRequest &request) const
|
||||
{
|
||||
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/noise.frag"));
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ class NoiseGeneratorNode : public Node {
|
||||
|
||||
virtual void Retranslate() override;
|
||||
|
||||
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
|
||||
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
|
||||
virtual void Value(const NodeValueRow &value, const NodeGlobals &globals, NodeValueTable *table) const override;
|
||||
|
||||
static const QString kBaseIn;
|
||||
|
||||
@@ -42,9 +42,9 @@ void GeneratorWithMerge::Retranslate()
|
||||
SetInputName(kBaseInput, tr("Base"));
|
||||
}
|
||||
|
||||
ShaderCode GeneratorWithMerge::GetShaderCode(const QString &shader_id) const
|
||||
ShaderCode GeneratorWithMerge::GetShaderCode(const ShaderRequest &request) const
|
||||
{
|
||||
if (shader_id == QStringLiteral("mrg")) {
|
||||
if (request.id == QStringLiteral("mrg")) {
|
||||
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/alphaover.frag"));
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ public:
|
||||
|
||||
virtual void Retranslate() override;
|
||||
|
||||
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
|
||||
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
|
||||
|
||||
static const QString kBaseInput;
|
||||
|
||||
|
||||
@@ -61,12 +61,12 @@ void ShapeNode::Retranslate()
|
||||
SetComboBoxStrings(kTypeInput, {tr("Rectangle"), tr("Ellipse")});
|
||||
}
|
||||
|
||||
ShaderCode ShapeNode::GetShaderCode(const QString &shader_id) const
|
||||
ShaderCode ShapeNode::GetShaderCode(const ShaderRequest &request) const
|
||||
{
|
||||
if (shader_id == QStringLiteral("shape")) {
|
||||
if (request.id == QStringLiteral("shape")) {
|
||||
return ShaderCode(FileFunctions::ReadFileAsString(QStringLiteral(":/shaders/shape.frag")));
|
||||
} else {
|
||||
return super::GetShaderCode(shader_id);
|
||||
return super::GetShaderCode(request);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ public:
|
||||
|
||||
virtual void Retranslate() override;
|
||||
|
||||
virtual ShaderCode GetShaderCode(const QString& shader_id) const override;
|
||||
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
|
||||
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
|
||||
|
||||
static QString kTypeInput;
|
||||
|
||||
@@ -68,9 +68,9 @@ void SolidGenerator::Value(const NodeValueRow &value, const NodeGlobals &globals
|
||||
table->Push(NodeValue::kTexture, QVariant::fromValue(job), this);
|
||||
}
|
||||
|
||||
ShaderCode SolidGenerator::GetShaderCode(const QString &shader_id) const
|
||||
ShaderCode SolidGenerator::GetShaderCode(const ShaderRequest &request) const
|
||||
{
|
||||
Q_UNUSED(shader_id)
|
||||
Q_UNUSED(request)
|
||||
|
||||
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/solid.frag"));
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ public:
|
||||
virtual void Retranslate() override;
|
||||
|
||||
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
|
||||
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
|
||||
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
|
||||
|
||||
static const QString kColorInput;
|
||||
|
||||
|
||||
@@ -83,9 +83,9 @@ void ColorDifferenceKeyNode::Retranslate()
|
||||
SetInputName(kMaskOnlyInput, tr("Show Mask Only"));
|
||||
}
|
||||
|
||||
ShaderCode ColorDifferenceKeyNode::GetShaderCode(const QString &shader_id) const
|
||||
ShaderCode ColorDifferenceKeyNode::GetShaderCode(const ShaderRequest &request) const
|
||||
{
|
||||
Q_UNUSED(shader_id)
|
||||
Q_UNUSED(request)
|
||||
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/colordifferencekey.frag"));
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ class ColorDifferenceKeyNode : public Node {
|
||||
|
||||
virtual void Retranslate() override;
|
||||
|
||||
virtual ShaderCode GetShaderCode(const QString& shader_id) const override;
|
||||
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
|
||||
virtual void Value(const NodeValueRow& value, const NodeGlobals& globals, NodeValueTable* table) const override;
|
||||
|
||||
static const QString kTextureInput;
|
||||
|
||||
@@ -75,8 +75,8 @@ void DespillNode::Retranslate()
|
||||
SetInputName(kPreserveLuminanceInput, tr("Preserve Luminance"));
|
||||
}
|
||||
|
||||
ShaderCode DespillNode::GetShaderCode(const QString& shader_id) const {
|
||||
Q_UNUSED(shader_id)
|
||||
ShaderCode DespillNode::GetShaderCode(const ShaderRequest &request) const {
|
||||
Q_UNUSED(request)
|
||||
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/despill.frag"));
|
||||
}
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ class DespillNode : public Node {
|
||||
|
||||
virtual void Retranslate() override;
|
||||
|
||||
virtual ShaderCode GetShaderCode(const QString& shader_id) const override;
|
||||
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
|
||||
virtual void Value(const NodeValueRow& value, const NodeGlobals& globals, NodeValueTable* table) const override;
|
||||
|
||||
static const QString kTextureInput;
|
||||
|
||||
@@ -80,9 +80,9 @@ void MathNode::Retranslate()
|
||||
SetComboBoxStrings(kMethodIn, operations);
|
||||
}
|
||||
|
||||
ShaderCode MathNode::GetShaderCode(const QString &shader_id) const
|
||||
ShaderCode MathNode::GetShaderCode(const ShaderRequest &request) const
|
||||
{
|
||||
return GetShaderCodeInternal(shader_id, kParamAIn, kParamBIn);
|
||||
return GetShaderCodeInternal(request.id, kParamAIn, kParamBIn);
|
||||
}
|
||||
|
||||
void MathNode::Value(const NodeValueRow &value, const NodeGlobals &globals, NodeValueTable *table) const
|
||||
|
||||
@@ -40,7 +40,7 @@ public:
|
||||
|
||||
virtual void Retranslate() override;
|
||||
|
||||
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
|
||||
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
|
||||
|
||||
Operation GetOperation() const
|
||||
{
|
||||
|
||||
@@ -416,8 +416,6 @@ void MathNodeBase::ValueInternal(Operation operation, Pairing pairing, const QSt
|
||||
} else {
|
||||
output->Push(NodeValue::kSamples, QVariant::fromValue(job), this);
|
||||
}
|
||||
} else {
|
||||
output->Push(NodeValue::kSamples, QVariant::fromValue(job), this);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -67,9 +67,9 @@ void MergeNode::Retranslate()
|
||||
SetInputName(kBlendIn, tr("Blend"));
|
||||
}
|
||||
|
||||
ShaderCode MergeNode::GetShaderCode(const QString &shader_id) const
|
||||
ShaderCode MergeNode::GetShaderCode(const ShaderRequest &request) const
|
||||
{
|
||||
Q_UNUSED(shader_id)
|
||||
Q_UNUSED(request)
|
||||
|
||||
return ShaderCode(FileFunctions::ReadFileAsString(":/shaders/alphaover.frag"));
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ public:
|
||||
|
||||
virtual void Retranslate() override;
|
||||
|
||||
virtual ShaderCode GetShaderCode(const QString &shader_id) const override;
|
||||
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const override;
|
||||
virtual void Value(const NodeValueRow& value, const NodeGlobals &globals, NodeValueTable *table) const override;
|
||||
|
||||
static const QString kBaseIn;
|
||||
|
||||
@@ -1519,10 +1519,8 @@ QVector<Node *> Node::GetImmediateDependencies() const
|
||||
return GetDependenciesInternal(false, false);
|
||||
}
|
||||
|
||||
ShaderCode Node::GetShaderCode(const QString &shader_id) const
|
||||
ShaderCode Node::GetShaderCode(const ShaderRequest &request) const
|
||||
{
|
||||
Q_UNUSED(shader_id)
|
||||
|
||||
return ShaderCode(QString(), QString());
|
||||
}
|
||||
|
||||
|
||||
@@ -665,10 +665,21 @@ public:
|
||||
*/
|
||||
QVector<Node *> GetImmediateDependencies() const;
|
||||
|
||||
struct ShaderRequest
|
||||
{
|
||||
ShaderRequest(const QString &shader_id)
|
||||
{
|
||||
id = shader_id;
|
||||
}
|
||||
|
||||
QString id;
|
||||
QString stub;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Generate hardware accelerated code for this Node
|
||||
*/
|
||||
virtual ShaderCode GetShaderCode(const QString& shader_id) const;
|
||||
virtual ShaderCode GetShaderCode(const ShaderRequest &request) const;
|
||||
|
||||
/**
|
||||
* @brief If Value() pushes a ShaderJob, this is the function that will process them.
|
||||
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 556 B |
|
After Width: | Height: | Size: 385 B |
|
After Width: | Height: | Size: 693 B |
|
After Width: | Height: | Size: 551 B |
|
After Width: | Height: | Size: 961 B |
|
After Width: | Height: | Size: 966 B |
@@ -0,0 +1,276 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
sodipodi:docname="text-edit.svg"
|
||||
inkscape:version="1.3-dev (e659668, 2022-05-03)"
|
||||
sodipodi:version="0.32"
|
||||
id="svg2"
|
||||
height="64"
|
||||
width="64"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
version="1.1"
|
||||
viewBox="0 0 64 64"
|
||||
inkscape:export-filename="./text-bold.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<defs
|
||||
id="defs14">
|
||||
<inkscape:path-effect
|
||||
effect="fillet_chamfer"
|
||||
id="path-effect13"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2,0,1 @ F,0,0,1,0,2,0,1"
|
||||
unit="px"
|
||||
method="auto"
|
||||
mode="F"
|
||||
radius="2"
|
||||
chamfer_steps="1"
|
||||
flexible="false"
|
||||
use_knot_distance="true"
|
||||
apply_no_radius="true"
|
||||
apply_with_radius="true"
|
||||
only_selected="false"
|
||||
hide_knots="false" />
|
||||
<inkscape:path-effect
|
||||
effect="fillet_chamfer"
|
||||
id="path-effect11"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2,0,1 @ F,0,0,1,0,2,0,1"
|
||||
unit="px"
|
||||
method="auto"
|
||||
mode="F"
|
||||
radius="2"
|
||||
chamfer_steps="1"
|
||||
flexible="false"
|
||||
use_knot_distance="true"
|
||||
apply_no_radius="true"
|
||||
apply_with_radius="true"
|
||||
only_selected="false"
|
||||
hide_knots="false" />
|
||||
<inkscape:path-effect
|
||||
effect="fillet_chamfer"
|
||||
id="path-effect9"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2,0,1 @ F,0,0,1,0,2,0,1"
|
||||
unit="px"
|
||||
method="auto"
|
||||
mode="F"
|
||||
radius="2"
|
||||
chamfer_steps="1"
|
||||
flexible="false"
|
||||
use_knot_distance="true"
|
||||
apply_no_radius="true"
|
||||
apply_with_radius="true"
|
||||
only_selected="false"
|
||||
hide_knots="false" />
|
||||
<inkscape:path-effect
|
||||
effect="fillet_chamfer"
|
||||
id="path-effect8"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2,0,1 @ F,0,0,1,0,2,0,1"
|
||||
unit="px"
|
||||
method="auto"
|
||||
mode="F"
|
||||
radius="2"
|
||||
chamfer_steps="1"
|
||||
flexible="false"
|
||||
use_knot_distance="true"
|
||||
apply_no_radius="true"
|
||||
apply_with_radius="true"
|
||||
only_selected="false"
|
||||
hide_knots="false" />
|
||||
<inkscape:path-effect
|
||||
effect="fillet_chamfer"
|
||||
id="path-effect7"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
nodesatellites_param="F,0,0,1,0,7.0710678,0,1 @ F,0,0,1,0,7.0710678,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
|
||||
unit="px"
|
||||
method="auto"
|
||||
mode="F"
|
||||
radius="0"
|
||||
chamfer_steps="1"
|
||||
flexible="false"
|
||||
use_knot_distance="true"
|
||||
apply_no_radius="true"
|
||||
apply_with_radius="true"
|
||||
only_selected="false"
|
||||
hide_knots="false" />
|
||||
<inkscape:path-effect
|
||||
effect="fillet_chamfer"
|
||||
id="path-effect6"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.8284271,0,1 @ F,0,0,1,0,5.0374209,0,1 @ F,0,0,1,0,2.8284271,0,1 @ F,0,0,1,0,0,0,1"
|
||||
unit="px"
|
||||
method="auto"
|
||||
mode="F"
|
||||
radius="0"
|
||||
chamfer_steps="1"
|
||||
flexible="false"
|
||||
use_knot_distance="true"
|
||||
apply_no_radius="true"
|
||||
apply_with_radius="true"
|
||||
only_selected="false"
|
||||
hide_knots="false" />
|
||||
<inkscape:path-effect
|
||||
effect="fillet_chamfer"
|
||||
id="path-effect1"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
nodesatellites_param="F,0,0,1,0,9.8994949,0,1 @ F,0,0,1,0,9.8994949,0,1 @ F,0,0,1,0,2.8284271,0,1 @ F,0,0,1,0,3.1608267,0,1 @ F,0,0,1,0,2.8284271,0,1"
|
||||
unit="px"
|
||||
method="auto"
|
||||
mode="F"
|
||||
radius="0"
|
||||
chamfer_steps="1"
|
||||
flexible="false"
|
||||
use_knot_distance="true"
|
||||
apply_no_radius="true"
|
||||
apply_with_radius="true"
|
||||
only_selected="false"
|
||||
hide_knots="false" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
stroke="#3465a4"
|
||||
inkscape:window-y="23"
|
||||
inkscape:window-x="47"
|
||||
inkscape:window-height="927"
|
||||
inkscape:window-width="1633"
|
||||
inkscape:showpageshadow="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:grid-bbox="true"
|
||||
showgrid="true"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:cy="29.019123"
|
||||
inkscape:cx="20.532398"
|
||||
inkscape:zoom="7.3055274"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1"
|
||||
bordercolor="#ffffff"
|
||||
pagecolor="#000000"
|
||||
id="base"
|
||||
fill="#729fcf"
|
||||
inkscape:window-maximized="0"
|
||||
borderlayer="true"
|
||||
inkscape:snap-global="true"
|
||||
inkscape:snap-bbox="true"
|
||||
inkscape:snap-bbox-midpoints="false"
|
||||
inkscape:bbox-nodes="true"
|
||||
inkscape:snap-nodes="true"
|
||||
inkscape:snap-smooth-nodes="true"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:lockguides="true"
|
||||
guidecolor="#ff0000"
|
||||
guideopacity="0.30196078"
|
||||
inkscape:deskcolor="#000000">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid_pixels"
|
||||
color="#ffffff"
|
||||
opacity="0.05098039"
|
||||
empcolor="#ffffff"
|
||||
empopacity="0.10196078"
|
||||
dotted="false"
|
||||
empspacing="8"
|
||||
spacingx="1"
|
||||
spacingy="1"
|
||||
visible="true"
|
||||
snapvisiblegridlinesonly="true"
|
||||
enabled="true" />
|
||||
<sodipodi:guide
|
||||
position="2,64"
|
||||
orientation="1,0"
|
||||
id="guide6912"
|
||||
inkscape:locked="true" />
|
||||
<sodipodi:guide
|
||||
position="62,64"
|
||||
orientation="1,0"
|
||||
id="guide6914"
|
||||
inkscape:locked="true" />
|
||||
<sodipodi:guide
|
||||
position="0,62"
|
||||
orientation="0,-1"
|
||||
id="guide6916"
|
||||
inkscape:locked="true" />
|
||||
<sodipodi:guide
|
||||
position="0,2"
|
||||
orientation="0,-1"
|
||||
id="guide6918"
|
||||
inkscape:locked="true" />
|
||||
<sodipodi:guide
|
||||
position="32,32"
|
||||
orientation="0,-1"
|
||||
id="guide6920"
|
||||
inkscape:locked="true" />
|
||||
<sodipodi:guide
|
||||
position="32,32"
|
||||
orientation="1,0"
|
||||
id="guide6922"
|
||||
inkscape:locked="true" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata4">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Martin Ruskov</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:source>http://commons.wikimedia.org/wiki/Tango_icon</dc:source>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Design"
|
||||
id="layer1"
|
||||
transform="translate(0,16)">
|
||||
<path
|
||||
id="path5"
|
||||
style="color:#ffffff;fill:#ffffff;fill-opacity:0.86274511;stroke-width:8;stroke-linecap:round;stroke-dashoffset:8;paint-order:stroke fill markers"
|
||||
d="M 41,-5 11,25 C 9.6823712,26.317629 8.6656745,27.905781 8.0214844,29.654297 L 3.7421875,41.273438 c -0.6856883,1.861154 1.123221,3.670063 2.984375,2.984374 L 18.345703,39.978516 C 20.094219,39.334326 21.682371,38.317629 23,37 L 53,7 Z m 0,6 6,6 -28,28 c -0.781013,0.780846 -2.218987,0.780846 -3,0 l -3,-3 c -0.780846,-0.781013 -0.780846,-2.218987 0,-3 z"
|
||||
sodipodi:nodetypes="csccccsccccccccc" />
|
||||
<path
|
||||
id="path1"
|
||||
style="opacity:1;fill:#ffffff;fill-opacity:0.86274511;stroke-width:1.51181;stroke-linecap:round;stroke-dashoffset:8;paint-order:stroke fill markers;stop-color:#ffffff"
|
||||
d="m 57,-11 2,2 c 3,3 3,7 0,9.99999999 L 56,4 44,-8 l 3,-3 c 3,-3 7,-3 10,0 z"
|
||||
sodipodi:nodetypes="cccccsc" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 8.7 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 603 B |
|
After Width: | Height: | Size: 513 B |
|
After Width: | Height: | Size: 744 B |
|
After Width: | Height: | Size: 753 B |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,276 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
sodipodi:docname="text-edit.svg"
|
||||
inkscape:version="1.3-dev (e659668, 2022-05-03)"
|
||||
sodipodi:version="0.32"
|
||||
id="svg2"
|
||||
height="64"
|
||||
width="64"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
version="1.1"
|
||||
viewBox="0 0 64 64"
|
||||
inkscape:export-filename="./text-bold.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<defs
|
||||
id="defs14">
|
||||
<inkscape:path-effect
|
||||
effect="fillet_chamfer"
|
||||
id="path-effect13"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2,0,1 @ F,0,0,1,0,2,0,1"
|
||||
unit="px"
|
||||
method="auto"
|
||||
mode="F"
|
||||
radius="2"
|
||||
chamfer_steps="1"
|
||||
flexible="false"
|
||||
use_knot_distance="true"
|
||||
apply_no_radius="true"
|
||||
apply_with_radius="true"
|
||||
only_selected="false"
|
||||
hide_knots="false" />
|
||||
<inkscape:path-effect
|
||||
effect="fillet_chamfer"
|
||||
id="path-effect11"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2,0,1 @ F,0,0,1,0,2,0,1"
|
||||
unit="px"
|
||||
method="auto"
|
||||
mode="F"
|
||||
radius="2"
|
||||
chamfer_steps="1"
|
||||
flexible="false"
|
||||
use_knot_distance="true"
|
||||
apply_no_radius="true"
|
||||
apply_with_radius="true"
|
||||
only_selected="false"
|
||||
hide_knots="false" />
|
||||
<inkscape:path-effect
|
||||
effect="fillet_chamfer"
|
||||
id="path-effect9"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2,0,1 @ F,0,0,1,0,2,0,1"
|
||||
unit="px"
|
||||
method="auto"
|
||||
mode="F"
|
||||
radius="2"
|
||||
chamfer_steps="1"
|
||||
flexible="false"
|
||||
use_knot_distance="true"
|
||||
apply_no_radius="true"
|
||||
apply_with_radius="true"
|
||||
only_selected="false"
|
||||
hide_knots="false" />
|
||||
<inkscape:path-effect
|
||||
effect="fillet_chamfer"
|
||||
id="path-effect8"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2,0,1 @ F,0,0,1,0,2,0,1"
|
||||
unit="px"
|
||||
method="auto"
|
||||
mode="F"
|
||||
radius="2"
|
||||
chamfer_steps="1"
|
||||
flexible="false"
|
||||
use_knot_distance="true"
|
||||
apply_no_radius="true"
|
||||
apply_with_radius="true"
|
||||
only_selected="false"
|
||||
hide_knots="false" />
|
||||
<inkscape:path-effect
|
||||
effect="fillet_chamfer"
|
||||
id="path-effect7"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
nodesatellites_param="F,0,0,1,0,7.0710678,0,1 @ F,0,0,1,0,7.0710678,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
|
||||
unit="px"
|
||||
method="auto"
|
||||
mode="F"
|
||||
radius="0"
|
||||
chamfer_steps="1"
|
||||
flexible="false"
|
||||
use_knot_distance="true"
|
||||
apply_no_radius="true"
|
||||
apply_with_radius="true"
|
||||
only_selected="false"
|
||||
hide_knots="false" />
|
||||
<inkscape:path-effect
|
||||
effect="fillet_chamfer"
|
||||
id="path-effect6"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.8284271,0,1 @ F,0,0,1,0,5.0374209,0,1 @ F,0,0,1,0,2.8284271,0,1 @ F,0,0,1,0,0,0,1"
|
||||
unit="px"
|
||||
method="auto"
|
||||
mode="F"
|
||||
radius="0"
|
||||
chamfer_steps="1"
|
||||
flexible="false"
|
||||
use_knot_distance="true"
|
||||
apply_no_radius="true"
|
||||
apply_with_radius="true"
|
||||
only_selected="false"
|
||||
hide_knots="false" />
|
||||
<inkscape:path-effect
|
||||
effect="fillet_chamfer"
|
||||
id="path-effect1"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
nodesatellites_param="F,0,0,1,0,9.8994949,0,1 @ F,0,0,1,0,9.8994949,0,1 @ F,0,0,1,0,2.8284271,0,1 @ F,0,0,1,0,3.1608267,0,1 @ F,0,0,1,0,2.8284271,0,1"
|
||||
unit="px"
|
||||
method="auto"
|
||||
mode="F"
|
||||
radius="0"
|
||||
chamfer_steps="1"
|
||||
flexible="false"
|
||||
use_knot_distance="true"
|
||||
apply_no_radius="true"
|
||||
apply_with_radius="true"
|
||||
only_selected="false"
|
||||
hide_knots="false" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
stroke="#3465a4"
|
||||
inkscape:window-y="23"
|
||||
inkscape:window-x="47"
|
||||
inkscape:window-height="927"
|
||||
inkscape:window-width="1633"
|
||||
inkscape:showpageshadow="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:grid-bbox="true"
|
||||
showgrid="true"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:cy="29.019123"
|
||||
inkscape:cx="20.532398"
|
||||
inkscape:zoom="7.3055274"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1"
|
||||
bordercolor="#212121"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
fill="#729fcf"
|
||||
inkscape:window-maximized="0"
|
||||
borderlayer="true"
|
||||
inkscape:snap-global="true"
|
||||
inkscape:snap-bbox="true"
|
||||
inkscape:snap-bbox-midpoints="false"
|
||||
inkscape:bbox-nodes="true"
|
||||
inkscape:snap-nodes="true"
|
||||
inkscape:snap-smooth-nodes="true"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:lockguides="true"
|
||||
guidecolor="#ff0000"
|
||||
guideopacity="0.30196078"
|
||||
inkscape:deskcolor="#d1d1d1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid_pixels"
|
||||
color="#000000"
|
||||
opacity="0.05098039"
|
||||
empcolor="#000000"
|
||||
empopacity="0.10196078"
|
||||
dotted="false"
|
||||
empspacing="8"
|
||||
spacingx="1"
|
||||
spacingy="1"
|
||||
visible="true"
|
||||
snapvisiblegridlinesonly="true"
|
||||
enabled="true" />
|
||||
<sodipodi:guide
|
||||
position="2,64"
|
||||
orientation="1,0"
|
||||
id="guide6912"
|
||||
inkscape:locked="true" />
|
||||
<sodipodi:guide
|
||||
position="62,64"
|
||||
orientation="1,0"
|
||||
id="guide6914"
|
||||
inkscape:locked="true" />
|
||||
<sodipodi:guide
|
||||
position="0,62"
|
||||
orientation="0,-1"
|
||||
id="guide6916"
|
||||
inkscape:locked="true" />
|
||||
<sodipodi:guide
|
||||
position="0,2"
|
||||
orientation="0,-1"
|
||||
id="guide6918"
|
||||
inkscape:locked="true" />
|
||||
<sodipodi:guide
|
||||
position="32,32"
|
||||
orientation="0,-1"
|
||||
id="guide6920"
|
||||
inkscape:locked="true" />
|
||||
<sodipodi:guide
|
||||
position="32,32"
|
||||
orientation="1,0"
|
||||
id="guide6922"
|
||||
inkscape:locked="true" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata4">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Martin Ruskov</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:source>http://commons.wikimedia.org/wiki/Tango_icon</dc:source>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Design"
|
||||
id="layer1"
|
||||
transform="translate(0,16)">
|
||||
<path
|
||||
id="path5"
|
||||
style="color:#000000;fill:#212121;fill-opacity:0.86274511;stroke-width:8;stroke-linecap:round;stroke-dashoffset:8;paint-order:stroke fill markers"
|
||||
d="M 41,-5 11,25 C 9.6823712,26.317629 8.6656745,27.905781 8.0214844,29.654297 L 3.7421875,41.273438 c -0.6856883,1.861154 1.123221,3.670063 2.984375,2.984374 L 18.345703,39.978516 C 20.094219,39.334326 21.682371,38.317629 23,37 L 53,7 Z m 0,6 6,6 -28,28 c -0.781013,0.780846 -2.218987,0.780846 -3,0 l -3,-3 c -0.780846,-0.781013 -0.780846,-2.218987 0,-3 z"
|
||||
sodipodi:nodetypes="csccccsccccccccc" />
|
||||
<path
|
||||
id="path1"
|
||||
style="opacity:1;fill:#212121;fill-opacity:0.86274511;stroke-width:1.51181;stroke-linecap:round;stroke-dashoffset:8;paint-order:stroke fill markers;stop-color:#000000"
|
||||
d="m 57,-11 2,2 c 3,3 3,7 0,9.99999999 L 56,4 44,-8 l 3,-3 c 3,-3 7,-3 10,0 z"
|
||||
sodipodi:nodetypes="cccccsc" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 8.7 KiB |
@@ -37,7 +37,6 @@ QVector<AudioMonitor*> AudioMonitor::instances_;
|
||||
|
||||
AudioMonitor::AudioMonitor(QWidget *parent) :
|
||||
QOpenGLWidget(parent),
|
||||
file_(nullptr),
|
||||
waveform_(nullptr),
|
||||
cached_channels_(0)
|
||||
{
|
||||
@@ -70,15 +69,13 @@ void AudioMonitor::SetParams(const AudioParams ¶ms)
|
||||
|
||||
void AudioMonitor::Stop()
|
||||
{
|
||||
delete file_;
|
||||
file_ = nullptr;
|
||||
waveform_ = nullptr;
|
||||
|
||||
// We don't stop the update loop here so that the monitor can show a smooth fade out. The update
|
||||
// loop will stop itself since file_ and waveform_ are null.
|
||||
}
|
||||
|
||||
void AudioMonitor::PushBytes(const QByteArray &d)
|
||||
void AudioMonitor::PushSampleBuffer(SampleBufferPtr d)
|
||||
{
|
||||
if (!params_.channel_count()) {
|
||||
return;
|
||||
@@ -86,9 +83,12 @@ void AudioMonitor::PushBytes(const QByteArray &d)
|
||||
|
||||
QVector<double> v(params_.channel_count(), 0);
|
||||
|
||||
BytesToSampleSummary(d, v);
|
||||
AudioVisualWaveform::Sample summed = AudioVisualWaveform::SumSamples(d, 0, d->sample_count());
|
||||
|
||||
PushValue(v);
|
||||
AudioVisualWaveformSampleToInternalValues(summed, v);
|
||||
|
||||
// Fill values because they get averaged out for smoothing
|
||||
values_.fill(v);
|
||||
|
||||
SetUpdateLoop(true);
|
||||
}
|
||||
@@ -236,13 +236,7 @@ void AudioMonitor::paintGL()
|
||||
delta_time *= abs_speed;
|
||||
}
|
||||
|
||||
if (file_) {
|
||||
UpdateValuesFromFile(v, delta_time);
|
||||
|
||||
if (file_->atEnd()) {
|
||||
Stop();
|
||||
}
|
||||
} else if (waveform_) {
|
||||
if (waveform_) {
|
||||
UpdateValuesFromWaveform(v, delta_time);
|
||||
|
||||
if (waveform_time_ >= waveform_->length()) {
|
||||
@@ -304,30 +298,6 @@ void AudioMonitor::mousePressEvent(QMouseEvent *)
|
||||
update();
|
||||
}
|
||||
|
||||
void AudioMonitor::UpdateValuesFromFile(QVector<double>& v, qint64 delta_time)
|
||||
{
|
||||
// Convert ms to float seconds and determine how many bytes that is
|
||||
qint64 bytes_to_read = params_.time_to_bytes(static_cast<double>(delta_time) * 0.001);
|
||||
|
||||
if (playback_speed_ < 0) {
|
||||
// If reversing, jump back by the amount of bytes we're going to read
|
||||
bytes_to_read = qMin(bytes_to_read, file_->pos());
|
||||
|
||||
file_->seek(file_->pos() - bytes_to_read);
|
||||
}
|
||||
|
||||
// Read bytes in from file
|
||||
QByteArray b = file_->read(bytes_to_read);
|
||||
|
||||
if (playback_speed_ < 0) {
|
||||
// If reversing, head back to where we were before the read so that the next read starts
|
||||
// from where we left off
|
||||
file_->seek(file_->pos() - bytes_to_read);
|
||||
}
|
||||
|
||||
BytesToSampleSummary(b, v);
|
||||
}
|
||||
|
||||
void AudioMonitor::UpdateValuesFromWaveform(QVector<double> &v, qint64 delta_time)
|
||||
{
|
||||
// Delta time is provided in milliseconds, so we convert to seconds in rational
|
||||
@@ -335,18 +305,23 @@ void AudioMonitor::UpdateValuesFromWaveform(QVector<double> &v, qint64 delta_tim
|
||||
|
||||
AudioVisualWaveform::Sample sum = waveform_->GetSummaryFromTime(waveform_time_, length);
|
||||
|
||||
for (int i=0; i<sum.size(); i++) {
|
||||
float max = qMax(qAbs(sum.at(i).min), qAbs(sum.at(i).max));
|
||||
|
||||
int output_index = i%v.size();
|
||||
if (max > v.at(output_index)) {
|
||||
v[output_index] = max;
|
||||
}
|
||||
}
|
||||
AudioVisualWaveformSampleToInternalValues(sum, v);
|
||||
|
||||
waveform_time_ += length;
|
||||
}
|
||||
|
||||
void AudioMonitor::AudioVisualWaveformSampleToInternalValues(const AudioVisualWaveform::Sample &in, QVector<double> &out)
|
||||
{
|
||||
for (int i=0; i<in.size(); i++) {
|
||||
float max = qMax(qAbs(in.at(i).min), qAbs(in.at(i).max));
|
||||
|
||||
int output_index = i%out.size();
|
||||
if (max > out.at(output_index)) {
|
||||
out[output_index] = max;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AudioMonitor::PushValue(const QVector<double> &v)
|
||||
{
|
||||
int lim = values_.size()-1;
|
||||
|
||||
@@ -42,7 +42,7 @@ public:
|
||||
|
||||
bool IsPlaying() const
|
||||
{
|
||||
return file_ || waveform_;
|
||||
return waveform_;
|
||||
}
|
||||
|
||||
static void StartWaveformOnAll(const AudioVisualWaveform *waveform, const rational& start, int playback_speed)
|
||||
@@ -59,10 +59,10 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
static void PushBytesOnAll(const QByteArray &d)
|
||||
static void PushSampleBufferOnAll(SampleBufferPtr d)
|
||||
{
|
||||
foreach (AudioMonitor *m, instances_) {
|
||||
m->PushBytes(d);
|
||||
m->PushSampleBuffer(d);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@ public slots:
|
||||
|
||||
void Stop();
|
||||
|
||||
void PushBytes(const QByteArray& d);
|
||||
void PushSampleBuffer(SampleBufferPtr samples);
|
||||
|
||||
void StartWaveform(const AudioVisualWaveform *waveform, const rational& start, int playback_speed);
|
||||
|
||||
@@ -83,10 +83,10 @@ protected:
|
||||
private:
|
||||
void SetUpdateLoop(bool e);
|
||||
|
||||
void UpdateValuesFromFile(QVector<double> &v, qint64 delta_time);
|
||||
|
||||
void UpdateValuesFromWaveform(QVector<double> &v, qint64 delta_time);
|
||||
|
||||
void AudioVisualWaveformSampleToInternalValues(const AudioVisualWaveform::Sample &in, QVector<double> &out);
|
||||
|
||||
void PushValue(const QVector<double>& v);
|
||||
|
||||
void BytesToSampleSummary(const QByteArray& bytes, QVector<double>& v);
|
||||
@@ -95,7 +95,6 @@ private:
|
||||
|
||||
AudioParams params_;
|
||||
|
||||
QIODevice* file_;
|
||||
qint64 last_time_;
|
||||
|
||||
const AudioVisualWaveform* waveform_;
|
||||
|
||||
@@ -571,6 +571,11 @@ void NodeView::mouseMoveEvent(QMouseEvent *event)
|
||||
} else {
|
||||
// Otherwise, we may have to iterate to find a valid one
|
||||
for (const QString& input : attached_node->inputs()) {
|
||||
if (input == Node::kEnabledInput) {
|
||||
// Ignore enabled input
|
||||
continue;
|
||||
}
|
||||
|
||||
NodeInput i(attached_node, input);
|
||||
|
||||
if (attached_node->IsInputConnectable(input)) {
|
||||
|
||||
@@ -98,6 +98,11 @@ ViewerWidget::ViewerWidget(QWidget *parent) :
|
||||
connect(display_widget_, &ViewerDisplayWidget::HandDragMoved, sizer_, &ViewerSizer::HandDragMove);
|
||||
sizer_->SetWidget(display_widget_);
|
||||
|
||||
// Make the display widget the first tabbable widget. While the viewer display cannot actually
|
||||
// be interacted with by tabbing, it prevents the actual first tabbable widget (the playhead
|
||||
// slider in `controls_`) from getting auto-focused any time the panel is maximized (with `)
|
||||
display_widget_->setFocusPolicy(Qt::TabFocus);
|
||||
|
||||
// Create waveform view when audio is connected and video isn't
|
||||
waveform_view_ = new AudioWaveformView();
|
||||
ConnectTimelineView(waveform_view_, true);
|
||||
@@ -571,7 +576,7 @@ void ViewerWidget::ReceivedAudioBufferForScrubbing()
|
||||
if (!AudioManager::instance()->PushToOutput(audio_processor_.to(), packed, &error)) {
|
||||
Core::instance()->ShowStatusBarMessage(tr("Audio scrubbing failed: %1").arg(error));
|
||||
}
|
||||
AudioMonitor::PushBytesOnAll(packed);
|
||||
AudioMonitor::PushSampleBufferOnAll(samples);
|
||||
}
|
||||
} else {
|
||||
qCritical() << "Failed to process audio for scrubbing:" << r;
|
||||
@@ -704,11 +709,11 @@ void ViewerWidget::PlayInternal(int speed, bool in_to_out_only)
|
||||
|
||||
AudioParams ap = GetConnectedNode()->GetAudioParams();
|
||||
if (ap.is_valid()) {
|
||||
AudioManager::instance()->SetOutputNotifyInterval(ap.time_to_bytes(kAudioPlaybackInterval));
|
||||
connect(AudioManager::instance(), &AudioManager::OutputNotify, this, &ViewerWidget::QueueNextAudioBuffer);
|
||||
|
||||
UpdateAudioProcessor();
|
||||
|
||||
AudioManager::instance()->SetOutputNotifyInterval(audio_processor_.to().time_to_bytes(kAudioPlaybackInterval));
|
||||
connect(AudioManager::instance(), &AudioManager::OutputNotify, this, &ViewerWidget::QueueNextAudioBuffer);
|
||||
|
||||
static const int prequeue_count = 2;
|
||||
prequeuing_audio_ = prequeue_count; // Queue two buffers ahead of time
|
||||
audio_playback_queue_time_ = GetTime();
|
||||
|
||||