From 46f9793b84123e5fa95cb306547066d0031ceb8e Mon Sep 17 00:00:00 2001 From: Colin White Date: Wed, 11 May 2022 16:27:35 -0400 Subject: [PATCH] Support setting custom CSS rules for SVG. (#1210) * Support setting custom CSS rules for SVG. * Update API. * Remove. --- coil-svg/api/coil-svg.api | 10 ++++++++++ .../src/main/java/coil/decode/SvgDecoder.kt | 8 ++++++-- coil-svg/src/main/java/coil/request/Svgs.kt | 19 +++++++++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 coil-svg/src/main/java/coil/request/Svgs.kt diff --git a/coil-svg/api/coil-svg.api b/coil-svg/api/coil-svg.api index 6cfa7ce0f6..9fa9346c2e 100644 --- a/coil-svg/api/coil-svg.api +++ b/coil-svg/api/coil-svg.api @@ -3,6 +3,8 @@ public final class coil/decode/SvgDecodeUtils { } public final class coil/decode/SvgDecoder : coil/decode/Decoder { + public static final field CSS_KEY Ljava/lang/String; + public static final field Companion Lcoil/decode/SvgDecoder$Companion; public fun (Lcoil/decode/ImageSource;Lcoil/request/Options;)V public fun (Lcoil/decode/ImageSource;Lcoil/request/Options;Z)V public synthetic fun (Lcoil/decode/ImageSource;Lcoil/request/Options;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -10,6 +12,9 @@ public final class coil/decode/SvgDecoder : coil/decode/Decoder { public final fun getUseViewBoundsAsIntrinsicSize ()Z } +public final class coil/decode/SvgDecoder$Companion { +} + public final class coil/decode/SvgDecoder$Factory : coil/decode/Decoder$Factory { public fun ()V public fun (Z)V @@ -20,3 +25,8 @@ public final class coil/decode/SvgDecoder$Factory : coil/decode/Decoder$Factory public fun hashCode ()I } +public final class coil/request/Svgs { + public static final fun css (Lcoil/request/ImageRequest$Builder;Ljava/lang/String;)Lcoil/request/ImageRequest$Builder; + public static final fun css (Lcoil/request/Parameters;)Ljava/lang/String; +} + diff --git a/coil-svg/src/main/java/coil/decode/SvgDecoder.kt b/coil-svg/src/main/java/coil/decode/SvgDecoder.kt index 5fb1f7f44a..28fc31ebc7 100644 --- a/coil-svg/src/main/java/coil/decode/SvgDecoder.kt +++ b/coil-svg/src/main/java/coil/decode/SvgDecoder.kt @@ -7,10 +7,12 @@ import androidx.core.graphics.drawable.toDrawable import coil.ImageLoader import coil.fetch.SourceResult import coil.request.Options +import coil.request.css import coil.size.Scale import coil.size.isOriginal import coil.util.toPx import coil.util.toSoftware +import com.caverock.androidsvg.RenderOptions import com.caverock.androidsvg.SVG import kotlinx.coroutines.runInterruptible import kotlin.math.roundToInt @@ -69,7 +71,8 @@ class SvgDecoder @JvmOverloads constructor( svg.setDocumentHeight("100%") val bitmap = createBitmap(bitmapWidth, bitmapHeight, options.config.toSoftware()) - svg.renderToCanvas(Canvas(bitmap)) + val renderOptions = options.parameters.css()?.let { RenderOptions().css(it) } + svg.renderToCanvas(Canvas(bitmap), renderOptions) DecodeResult( drawable = bitmap.toDrawable(options.context.resources), @@ -110,8 +113,9 @@ class SvgDecoder @JvmOverloads constructor( override fun hashCode() = useViewBoundsAsIntrinsicSize.hashCode() } - private companion object { + companion object { private const val MIME_TYPE_SVG = "image/svg+xml" private const val DEFAULT_SIZE = 512f + const val CSS_KEY = "coil#css" } } diff --git a/coil-svg/src/main/java/coil/request/Svgs.kt b/coil-svg/src/main/java/coil/request/Svgs.kt new file mode 100644 index 0000000000..3572e7053e --- /dev/null +++ b/coil-svg/src/main/java/coil/request/Svgs.kt @@ -0,0 +1,19 @@ +@file:Suppress("UNCHECKED_CAST") +@file:JvmName("Svgs") + +package coil.request + +import coil.decode.SvgDecoder.Companion.CSS_KEY + +/** + * Specifies additional CSS rules that will be applied when rendering an SVG in addition to any + * rules specified in the SVG itself. + */ +fun ImageRequest.Builder.css(css: String): ImageRequest.Builder { + return setParameter(CSS_KEY, css) +} + +/** + * Get the additional CSS rules. + */ +fun Parameters.css(): String? = value(CSS_KEY)