Reorganization, replacing CPU debayering entirely

This commit is contained in:
Benjamin Schaaf
2021-04-18 23:13:56 +10:00
parent 337526e9b9
commit 91817b167a
48 changed files with 571 additions and 1657 deletions

View File

@@ -1,4 +1,6 @@
#ifdef GL_ES
precision mediump float;
#endif
uniform sampler2D texture;

View File

@@ -1,4 +1,6 @@
#ifdef GL_ES
precision mediump float;
#endif
attribute vec2 vert;
attribute vec2 tex_coord;

8
data/camera.css Normal file
View File

@@ -0,0 +1,8 @@
.errorbox {
background: #dd0000;
color: #ffffff;
}
.controlbox {
background: rgba(0,0,0,0.2);
}

336
data/camera.ui Normal file
View File

@@ -0,0 +1,336 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk" version="4.0"/>
<object class="GtkAdjustment" id="control_adj">
<property name="upper">100</property>
<property name="step-increment">1</property>
<property name="page-increment">10</property>
</object>
<object class="GtkWindow" id="window">
<property name="can-focus">0</property>
<property name="default-width">360</property>
<property name="default-height">640</property>
<property name="decorated">0</property>
<property name="child">
<object class="GtkStack" id="main_stack">
<property name="can-focus">0</property>
<child>
<object class="GtkStackPage">
<property name="name">main</property>
<property name="child">
<object class="GtkBox" id="page_main">
<property name="can-focus">0</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkGLArea" id="preview">
<property name="vexpand">1</property>
<property name="can-focus">0</property>
<property name="use-es">1</property>
</object>
</child>
<child>
<object class="GtkBox" id="control_box">
<property name="visible">0</property>
<property name="can-focus">0</property>
<child>
<object class="GtkBox">
<property name="hexpand">1</property>
<property name="can-focus">0</property>
<property name="margin-start">10</property>
<property name="margin-end">10</property>
<property name="margin-top">10</property>
<property name="margin-bottom">10</property>
<child>
<object class="GtkLabel" id="control_name">
<property name="can-focus">0</property>
<property name="margin-end">10</property>
<property name="label" translatable="yes">ISO</property>
</object>
</child>
<child>
<object class="GtkScale" id="control_slider">
<property name="hexpand">1</property>
<property name="adjustment">control_adj</property>
<property name="round-digits">1</property>
</object>
</child>
<child>
<object class="GtkToggleButton" id="control_auto">
<property name="label" translatable="yes">Auto</property>
<property name="receives-default">1</property>
<property name="margin-start">10</property>
</object>
</child>
</object>
</child>
<style>
<class name="controlbox"/>
</style>
</object>
</child>
<child>
<object class="GtkActionBar" id="controls_box">
<property name="can-focus">0</property>
<child type="start">
<object class="GtkButton" id="settings">
<property name="receives-default">1</property>
<child>
<object class="GtkImage">
<property name="can-focus">0</property>
<property name="resource">/org/postmarketos/Megapixels/settings-symbolic.svg</property>
</object>
</child>
</object>
</child>
<child type="start">
<object class="GtkButton" id="switch_camera">
<property name="receives-default">1</property>
<child>
<object class="GtkImage">
<property name="can-focus">0</property>
<property name="resource">/org/postmarketos/Megapixels/switch-camera.svg</property>
</object>
</child>
</object>
</child>
<child type="center">
<object class="GtkButton" id="shutter">
<property name="width-request">48</property>
<property name="height-request">48</property>
<property name="receives-default">1</property>
<child>
<object class="GtkImage">
<property name="can-focus">0</property>
<property name="resource">/org/postmarketos/Megapixels/shutter-button.svg</property>
</object>
</child>
<style>
<class name="circular"/>
</style>
</object>
</child>
<child type="end">
<object class="GtkButton" id="open_directory">
<property name="receives-default">1</property>
<child>
<object class="GtkImage">
<property name="can-focus">0</property>
<property name="resource">/org/postmarketos/Megapixels/folder-symbolic.svg</property>
</object>
</child>
</object>
</child>
<child type="end">
<object class="GtkButton" id="open_last">
<property name="receives-default">1</property>
<child>
<object class="GtkStack" id="open_last_stack">
<property name="can-focus">0</property>
<child>
<object class="GtkImage" id="thumb_last">
<property name="width-request">24</property>
<property name="height-request">24</property>
<property name="can-focus">0</property>
</object>
</child>
<child>
<object class="GtkSpinner" id="process_spinner">
<property name="width-request">24</property>
<property name="height-request">24</property>
<property name="can-focus">0</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox" id="error_box">
<property name="visible">0</property>
<property name="can-focus">0</property>
<child>
<object class="GtkBox">
<property name="hexpand">1</property>
<property name="can-focus">0</property>
<property name="margin-start">10</property>
<property name="margin-end">10</property>
<property name="margin-top">10</property>
<property name="margin-bottom">10</property>
<property name="spacing">10</property>
<child>
<object class="GtkLabel" id="error_message">
<property name="hexpand">1</property>
<property name="can-focus">0</property>
<property name="halign">start</property>
<property name="label" translatable="yes">No error</property>
</object>
</child>
<child>
<object class="GtkButton" id="error_close">
<property name="label">gtk-close</property>
<property name="receives-default">1</property>
</object>
</child>
</object>
</child>
<style>
<class name="errorbox"/>
</style>
</object>
</child>
</object>
</property>
</object>
</child>
<!-- <child>
<object class="GtkStackPage">
<property name="name">settings</property>
<property name="title" translatable="yes">page1</property>
<property name="position">1</property>
<property name="child">
<object class="GtkScrolledWindow" id="page_settings">
<property name="shadow-type">in</property>
<property name="child">
<object class="GtkViewport">
<property name="can-focus">0</property>
<property name="shadow-type">none</property>
<property name="child">
<object class="GtkBox">
<property name="can-focus">0</property>
<property name="margin-start">10</property>
<property name="margin-end">10</property>
<property name="margin-top">10</property>
<property name="margin-bottom">10</property>
<property name="orientation">vertical</property>
<property name="spacing">10</property>
<child>
<object class="GtkBox">
<property name="can-focus">0</property>
<child>
<object class="GtkButton" id="settings_back">
<property name="label" translatable="yes">Back</property>
<property name="receives-default">1</property>
<property name="margin-start">10</property>
<property name="margin-end">10</property>
<style>
<class name="suggested-action"/>
</style>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="can-focus">0</property>
<property name="label" translatable="yes">Settings aren&apos;t functional yet</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox">
<property name="can-focus">0</property>
<property name="orientation">vertical</property>
<property name="spacing">4</property>
<child>
<object class="GtkLabel">
<property name="can-focus">0</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Photos</property>
<style>
<class name="heading"/>
</style>
</object>
</child>
<child>
<object class="GtkFrame">
<property name="can-focus">0</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkAlignment">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="left-padding">12</property>
<child>
<object class="GtkBox">
<property name="can-focus">0</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel">
<property name="can-focus">0</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Resolution</property>
</object>
</child>
<child>
<object class="GtkComboBox">
<property name="can-focus">0</property>
</object>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<object class="GtkLabel">
<property name="can-focus">0</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Storage mode</property>
</object>
</child>
<child>
<object class="GtkBox">
<property name="can-focus">0</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkCheckButton" id="store_vng">
<property name="label" translatable="yes">Debayer with VNG (slowest)</property>
<property name="active">1</property>
</object>
</child>
<child>
<object class="GtkCheckButton" id="store_simple">
<property name="label" translatable="yes">Debayer with linear interpolation</property>
<property name="group">store_vng</property>
</object>
</child>
<child>
<object class="GtkCheckButton" id="store_raw">
<property name="label" translatable="yes">Raw</property>
<property name="group">store_vng</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
<child type="label_item">
<placeholder/>
</child>
<style>
<class name="view"/>
</style>
</object>
</child>
</object>
</child>
<child>
<placeholder/>
</child>
</object>
</property>
</object>
</property>
</object>
</property>
</object>
</child> -->
</object>
</property>
</object>
</interface>

View File

@@ -1,37 +1,28 @@
precision highp float;
#ifdef GL_ES
precision mediump float;
#endif
uniform sampler2D texture;
uniform sampler2D pixel_layout;
uniform mat3 color_matrix;
uniform vec2 pixel_size;
// varying vec2 uv1;
// varying vec2 uv2;
varying vec2 top_left_uv;
varying vec2 top_right_uv;
varying vec2 bottom_left_uv;
varying vec2 bottom_right_uv;
varying vec2 half_pixel_coord;
#define fetch(p) texture2D(texture, p).r
void main() {
vec4 pixels = vec4(
fetch(top_left_uv),
fetch(top_right_uv),
fetch(bottom_right_uv),
fetch(bottom_left_uv));
// Note the coordinates for texture samples need to be a varying, as the
// Mali-400 has this as a fast path allowing 32-bit floats. Otherwise
// they end up as 16-bit floats and that's not accurate enough.
vec4 samples = vec4(
texture2D(texture, top_left_uv).r,
texture2D(texture, top_right_uv).r,
texture2D(texture, bottom_left_uv).r,
texture2D(texture, bottom_right_uv).r);
vec2 arrangement = floor(half_pixel_coord);
vec2 is_bottom_left = step(1.0, arrangement);
// vec3 color = mix(
// mix(pixels.xyz, pixels.yzw, is_bottom_left.y),
// mix(pixels.wzy, pixels.zyx, is_bottom_left.y),
// is_bottom_left.x);
vec3 color = pixels.zyx;
// Assume BGGR for now. Currently this just takes 3 of the four samples
// for each pixel, there's room here to do some better debayering.
vec3 color = samples.wyx;
// Fast SRGB estimate. See https://mimosa-pudica.net/fast-gamma/
vec3 srgb_color = (vec3(1.138) * inversesqrt(color) - vec3(0.138)) * color;

View File

@@ -1,20 +1,17 @@
precision highp float;
#ifdef GL_ES
precision mediump float;
#endif
attribute vec2 vert;
attribute vec2 tex_coord;
uniform mat3 transform;
uniform vec2 pixel_size;
uniform vec2 half_image_size;
// varying vec2 uv1;
// varying vec2 uv2;
varying vec2 top_left_uv;
varying vec2 top_right_uv;
varying vec2 bottom_left_uv;
varying vec2 bottom_right_uv;
varying vec2 half_pixel_coord;
void main() {
top_left_uv = tex_coord - pixel_size / 2.0;
@@ -22,11 +19,5 @@ void main() {
top_right_uv = vec2(top_left_uv.x, bottom_right_uv.y);
bottom_left_uv = vec2(bottom_right_uv.x, top_left_uv.y);
// uv1 = tex_coord - pixel_size / 2.0;
// uv2 = tex_coord + pixel_size / 2.0;
// uv1 += pixel_size;
// uv2 += pixel_size;
half_pixel_coord = top_left_uv * half_image_size;
gl_Position = vec4(transform * vec3(vert, 1), 1);
}

36
data/folder-symbolic.svg Normal file
View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
version="1.1"
id="svg945">
<metadata
id="metadata951">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs949" />
<path
d="M1 1a1 1 0 00-1 1v11s-.014.459.23.947C.476 14.436 1.168 15 2 15h12s.459.014.947-.23C15.436 14.525 16 13.833 16 13V6H3v7H2V6s0-1 1-1h11v-.832A1 1 0 0013 3H8.414L6.707 1.293A1 1 0 006 1z"
style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1;fill-opacity:1;fill:#bebebe"
color="#000"
font-weight="400"
font-family="sans-serif"
overflow="visible"
fill="#2e3436"
fill-rule="evenodd"
id="path943" />
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

15
data/meson.build Normal file
View File

@@ -0,0 +1,15 @@
resources = gnome.compile_resources('megapixels-resources',
'org.postmarketos.Megapixels.gresource.xml')
install_data(['org.postmarketos.Megapixels.desktop'],
install_dir: get_option('datadir') / 'applications')
install_data(['org.postmarketos.Megapixels.metainfo.xml'],
install_dir: get_option('datadir') / 'metainfo')
install_data('org.postmarketos.Megapixels.svg',
install_dir: join_paths(get_option('datadir'), 'icons/hicolor/scalable/apps'))
install_data(['postprocess.sh'],
install_dir: get_option('datadir') / 'megapixels/',
install_mode: 'rwxr-xr-x')

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/org/postmarketos/Megapixels">
<file preprocess="xml-stripblanks">camera.ui</file>
<file>camera.css</file>
<file preprocess="xml-stripblanks">switch-camera.svg</file>
<file preprocess="xml-stripblanks">shutter-button.svg</file>
<file preprocess="xml-stripblanks">folder-symbolic.svg</file>
<file preprocess="xml-stripblanks">settings-symbolic.svg</file>
<file>blit.vert</file>
<file>blit.frag</file>
<file>debayer.vert</file>
<file>debayer.frag</file>
</gresource>
</gresources>

94
data/postprocess.sh Executable file
View File

@@ -0,0 +1,94 @@
#!/bin/sh
# The post-processing script gets called after taking a burst of
# pictures into a temporary directory. The first argument is the
# directory containing the raw files in the burst. The contents
# are 1.dng, 2.dng.... up to the number of photos in the burst.
#
# The second argument is the filename for the final photo without
# the extension, like "/home/user/Pictures/IMG202104031234"
#
# The post-processing script is responsible for cleaning up
# temporary directory for the burst.
if [ "$#" -ne 2 ]; then
echo "Usage: $0 [burst-dir] [target-name]"
exit 2
fi
BURST_DIR="$1"
TARGET_NAME="$2"
MAIN_PICTURE="$BURST_DIR"/1
# Copy the first frame of the burst as the raw photo
cp "$BURST_DIR"/1.dng "$TARGET_NAME.dng"
# Create a .jpg if raw processing tools are installed
DCRAW=""
TIFF_EXT="dng.tiff"
if command -v "dcraw_emu" > /dev/null
then
DCRAW=dcraw_emu
# -fbdd 1 Raw denoising with FBDD
set -- -fbdd 1
elif [ -x "/usr/lib/libraw/dcraw_emu" ]; then
DCRAW=/usr/lib/libraw/dcraw_emu
# -fbdd 1 Raw denoising with FBDD
set -- -fbdd 1
elif command -v "dcraw" > /dev/null
then
DCRAW=dcraw
TIFF_EXT="tiff"
set --
fi
CONVERT=""
if command -v "convert" > /dev/null
then
CONVERT="convert"
# -fbdd 1 Raw denoising with FBDD
set -- -fbdd 1
elif command -v "gm" > /dev/null
then
CONVERT="gm"
fi
if [ -n "$DCRAW" ]; then
# +M use embedded color matrix
# -H 4 Recover highlights by rebuilding them
# -o 1 Output in sRGB colorspace
# -q 3 Debayer with AHD algorithm
# -T Output TIFF
$DCRAW +M -H 4 -o 1 -q 3 -T "$@" "$MAIN_PICTURE.dng"
# If imagemagick is available, convert the tiff to jpeg and apply slight sharpening
if [ -n "$CONVERT" ];
then
if [ "$CONVERT" = "convert" ]; then
convert "$MAIN_PICTURE.$TIFF_EXT" -sharpen 0x1.0 "$TARGET_NAME.jpg"
else
gm convert "$MAIN_PICTURE.$TIFF_EXT" -sharpen 0x1.0 "$TARGET_NAME.jpg"
fi
# If exiftool is installed copy the exif data over from the tiff to the jpeg
# since imagemagick is stupid
if command -v exiftool > /dev/null
then
exiftool -tagsFromfile "$MAIN_PICTURE.$TIFF_EXT" \
-software="Megapixels" \
-overwrite_original "$TARGET_NAME.jpg"
fi
echo "$TARGET_NAME.jpg"
else
cp "$MAIN_PICTURE.$TIFF_EXT" "$TARGET_NAME.tiff"
echo "$TARGET_NAME.tiff"
fi
fi
# Clean up the temp dir containing the burst
rm -rf "$BURST_DIR"

View File

@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
version="1.1"
id="svg881">
<metadata
id="metadata887">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs885" />
<path
d="M7.502 1.019a.996.996 0 0 0-.998.998v.451a5.734 5.734 0 0 0-1.356.566l-.322-.322a.995.995 0 0 0-1.41 0l-.705.705a.995.995 0 0 0 0 1.41l.32.32a5.734 5.734 0 0 0-.56 1.358h-.454a.995.995 0 0 0-.998.996V8.5c0 .553.446.996.998.996h.45a5.734 5.734 0 0 0 .566 1.356l-.322.322a.995.995 0 0 0 0 1.41l.705.705c.39.391 1.02.391 1.41 0l.32-.32a5.734 5.734 0 0 0 1.358.56v.456c0 .552.445.996.998.996h.996a.995.995 0 0 0 .998-.996v-.451a5.734 5.734 0 0 0 1.355-.567l.323.322c.39.391 1.02.391 1.41 0l.705-.705a.995.995 0 0 0 0-1.41l-.32-.32a5.734 5.734 0 0 0 .56-1.358h.453a.995.995 0 0 0 .998-.996v-.998a.995.995 0 0 0-.998-.996h-.449a5.734 5.734 0 0 0-.566-1.355l.322-.323a.995.995 0 0 0 0-1.41l-.705-.705a.995.995 0 0 0-1.41 0l-.32.32a5.734 5.734 0 0 0-1.358-.56v-.455a.996.996 0 0 0-.998-.998zm.515 3.976a3 3 0 0 1 3 3 3 3 0 0 1-3 3 3 3 0 0 1-3-3 3 3 0 0 1 3-3z"
style="marker:none;fill-opacity:1;fill:#bebebe"
fill="#2e3436"
id="path879" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

42
data/shutter-button.svg Normal file
View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
width="32"
height="32"
viewBox="0 0 8.4666665 8.466667"
version="1.1"
id="svg8">
<defs
id="defs2" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
transform="matrix(0.49996357,0,0,0.49996357,0.01938007,0.00978634)">
<path
id="path833"
style="fill:#bebebe;fill-opacity:1;stroke-width:0.999999"
d="M 31.810547,0.07421875 A 31.916231,31.916231 0 0 0 0.14648438,31.990234 31.916231,31.916231 0 0 0 32.0625,63.90625 31.916231,31.916231 0 0 0 63.978516,31.990234 31.916231,31.916231 0 0 0 32.0625,0.07421875 a 31.916231,31.916231 0 0 0 -0.251953,0 z M 31.919922,3.578125 A 28.472441,28.472441 0 0 1 60.392578,32.050781 28.472441,28.472441 0 0 1 31.919922,60.523438 28.472441,28.472441 0 0 1 3.4472656,32.050781 28.472441,28.472441 0 0 1 31.919922,3.578125 Z"
transform="scale(0.26458333)" />
<circle
style="fill:#bebebe;fill-opacity:1;stroke-width:0.254438"
id="path840"
cx="8.3893003"
cy="8.432106"
r="7.0744858" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

51
data/switch-camera.svg Normal file
View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 6.3499999 6.3500002"
version="1.1"
id="svg8">
<defs
id="defs2" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1">
<path
id="rect10"
style="fill:#bebebe;fill-rule:evenodd;stroke-width:0.981721;fill-opacity:1"
d="M 6.2675781 7 C 5.642948 7 5.0792263 7.250453 4.6699219 7.65625 L 5.0527344 8.1835938 L 6.7832031 7 L 6.2675781 7 z M 7.7753906 7 L 6.6464844 12.794922 L 4 12.832031 L 4 14.732422 C 4 15.988737 5.0112635 17 6.2675781 17 L 15.414062 17 L 18.443359 12.070312 L 20 12.646484 L 20 9.2675781 C 20 8.0112632 18.988737 7 17.732422 7 L 7.7753906 7 z M 11.984375 8.4414062 A 3.4999999 3.4999999 0 0 1 15.484375 11.941406 A 3.4999999 3.4999999 0 0 1 11.984375 15.441406 A 3.4999999 3.4999999 0 0 1 8.484375 11.941406 A 3.4999999 3.4999999 0 0 1 11.984375 8.4414062 z "
transform="scale(0.26458333)" />
<rect
style="fill:#bebebe;stroke-width:0.430371;fill-opacity:1"
id="rect32"
width="2.1166666"
x="2.1166666"
y="1.3229167"
rx="2.7755576e-17"
height="0.79374999" />
<path
style="fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 2.9104166,0.79374999 C 1.0262128,0.90909341 0.00928708,1.445563 0.8274781,2.7119284 0.70723812,2.8613287 0.26458333,3.175 0.26458333,3.175 H 1.5875 L 1.8521525,2.0440428 c 0,0 -0.035266,0.029416 -0.5759985,0.4042251 C 0.2287544,1.4462035 1.9079139,1.1486032 2.9104166,0.79374999 Z"
id="path864" />
<path
style="fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 2.9647831,5.3081179 C 4.7938353,5.7751257 5.9261679,5.5757251 5.5349326,4.119685 5.6951359,4.0142668 6.2125632,3.8511655 6.2125632,3.8511655 L 4.9531606,3.4461794 4.3549929,4.4418202 c 0,0 0.042578,-0.017208 0.6720904,-0.2084869 0.69035,1.2745964 -0.9992967,1.0438655 -2.0623002,1.0747846 z"
id="path864-0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB