Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support setting custom CSS rules for SVG. #1210

Merged
merged 4 commits into from May 11, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 10 additions & 0 deletions coil-svg/api/coil-svg.api
Expand Up @@ -3,13 +3,18 @@ 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 <init> (Lcoil/decode/ImageSource;Lcoil/request/Options;)V
public fun <init> (Lcoil/decode/ImageSource;Lcoil/request/Options;Z)V
public synthetic fun <init> (Lcoil/decode/ImageSource;Lcoil/request/Options;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun decode (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
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 <init> ()V
public fun <init> (Z)V
Expand All @@ -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;
}

8 changes: 6 additions & 2 deletions coil-svg/src/main/java/coil/decode/SvgDecoder.kt
Expand Up @@ -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
Expand Down Expand Up @@ -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),
Expand Down Expand Up @@ -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"
}
}
19 changes: 19 additions & 0 deletions 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)