Sign in

Romain Guy

@romainguy.dev
3.5K followers 225 following 501 posts

Photography (curious-creature.com), Blog (romainguy.dev). In the past: Engineering Director, Android Toolkit team at Google.

PostsRepliesMedia
Romain Guy @romainguy.dev · 13/08/2026
😍
060
Romain Guy @romainguy.dev · 21/07/2026
I published vibrance-0.1.0 on Maven, now with support for Compose for Desktop (JVM). The APIs let you mix colors yourself, or draw gradients as modifiers or Compose brushes. Next steps: refine the model training to improve some color transitions, better alpha support. github.com/romainguy/vi...
24110
Romain Guy @romainguy.dev · 09/07/2026
Happy place
2321
Romain Guy @romainguy.dev · 02/07/2026
I just added Brush APIs to Vibrance. You can now use pigments mixing based gradients with any Compose API that accepts a Brush. See README.md for code examples. github.com/romainguy/vi...
Screenshot of an Android application showing 3 examples of the new Brush API. From top to bottom:
- 3 lines of text filled with a horizontal yellow to blue gradient. The gradient goes smoothly through green in the middle.
- The same 3 lines of text, filled with a vertical cyan to magenta gradient.
- A heart shape filled with a vertical gradient from yellow to red.
2180
Romain Guy @romainguy.dev · 16/06/2026
Vibrance now has radial and sweep gradients. github.com/romainguy/vi...
A screenshot of an Android application comparing gradients rendered with paint mixtures vs traditional sRGB gradients. There are 3 pages to showcase, from left to right, linear, radial, and sweep gradients. There are four rows in the first page: the first row shows an orange to red vertical gradient, with the paint mixture version on the left, sRGB on the right; the second and third row show a yellow to blue gradient, with the paint mixture on top, and the sRGB on the bottom; the fourth row shows a white to blue gradient, with the paint mixture on the left, sRGB on the right. The second page shows radial gradient comparisons as three rows. Each row has the paint mixture on the left, sRGB on the right. The gradients are, from top to bottom: yellow (center) to green (outside), magenta (center) to red, and white (center) to blue. The last page shows sweep gradients, with 3 rows (same layout as before). The gradients are from top to bottom: yellow to blue, magenta to yellow, and white to blue.
2271
Romain Guy @romainguy.dev · 15/06/2026
I've been working on a Kotlin/Compose Multiplatform to interpolate sRGB colors as mixtures of paints/pigments. It can produce results that are more appealing than the traditional sRGB interpolation that Composes uses (see screenshot). Not quite ready for release yet. github.com/romainguy/vi...
A screenshot of an Android application comparing gradients rendered with paint mixtures vs traditional sRGB gradients. There are four rows: the first row shows an orange to red vertical gradient, with the paint mixture version on the left, sRGB on the right. The second and third rows show a horizontal yellow to blue gradient: the top one is a paint mixture, the bottom one is traditional sRGB. The paint mixture version shows that the gradient becomes green in the middle. The last row compares a white to blue vertical gradient, with a paint mixture on left, and tradition sRGB on the right. The paint mixture version show a blue becoming brighter/lighter, whereas the traditional version becomes purple.
5515
Romain Guy @romainguy.dev · 31/03/2026
Osaka Night
1181
Romain Guy @romainguy.dev · 31/03/2026
Interface — Osaka, Japan www.curious-creature.com/posts/2026/i...
0120
Romain Guy @romainguy.dev · 15/03/2026
Parting — Kyoto, Japan www.curious-creature.com/posts/2026/p...
090
Romain Guy @romainguy.dev · 31/01/2026
Follow the Sign www.curious-creature.com/posts/2026/f...
0220
Romain Guy @romainguy.dev · 10/01/2026
Grand Canyon Sunset www.curious-creature.com/posts/2026/g...
0322
Romain Guy @romainguy.dev · 10/01/2026
Alone in Tokyo X www.flickr.com/photos/romai...
0110
Romain Guy @romainguy.dev · 07/12/2025
New blog post on how to detect tap on arbitrary shapes with Jetpack Compose, and in general how to easily check if a given set of coordinates is contained inside a path. www.romainguy.dev/posts/2025/a...
0263
Romain Guy @romainguy.dev · 29/11/2025
New blog post on how to render beautiful soft shadows projected by the user's finger with Jetpack Compose. www.romainguy.dev/posts/2025/f...
37323
Romain Guy @romainguy.dev · 19/11/2025
That's pretty cool, maps.google.com seems to be using Filament now. I found its symbols in the WASM file used by the site.
1376
Romain Guy @romainguy.dev · 07/11/2025
Ueno, Tokyo
080
Romain Guy @romainguy.dev · 15/10/2025
Sunrise at Mount Fuji
0654
Romain Guy @romainguy.dev · 07/10/2025
😂
210
Romain Guy @romainguy.dev · 01/10/2025
Foggy Night — Tokyo, Japan
1250
Romain Guy @romainguy.dev · 30/04/2025
Bliss www.flickr.com/photos/romai...
0140
Romain Guy @romainguy.dev · 22/04/2025
富士山 www.flickr.com/photos/romai...
1482
Romain Guy @romainguy.dev · 18/04/2025
Kinship Full resolution version at www.flickr.com/photos/romai...
1320
Romain Guy @romainguy.dev · 27/03/2025
Tranquility, Shirakabako #Photography
0450
Romain Guy @romainguy.dev · 27/03/2025
Photo qui résume mon expérience de la conduite au Japon
040
Romain Guy @romainguy.dev · 27/03/2025
Pals, Shibuya, Tokyo. #Photography www.flickr.com/photos/romai...
1371
Romain Guy @romainguy.dev · 06/03/2025
Under a Bridge www.curious-creature.com/posts/2025/u...
1220
Romain Guy @romainguy.dev · 15/02/2025
First light www.curious-creature.com/posts/2025/f...
2410
Romain Guy @romainguy.dev · 12/02/2025
Alone www.curious-creature.com/posts/2025/a...
1200
Romain Guy @romainguy.dev · 07/02/2025
Quiet Night II www.curious-creature.com/posts/2025/q...
1330
Romain Guy @romainguy.dev · 02/02/2025
Fall Sunset — La Sal Mountains, Utah www.curious-creature.com/posts/2025/f...
1340
Romain Guy @romainguy.dev · 31/12/2024
Having replayed through the new Sam and Max games (remastered), I'm trying something a bit different. So next up in my point and click adventure games list is The Fish Files on GameBoy Color. I started playing it when it originally came out, but never finished it.
0111
Romain Guy @romainguy.dev · 16/12/2024
040
Romain Guy @romainguy.dev · 16/12/2024
1110
Romain Guy @romainguy.dev · 16/12/2024
190
Romain Guy @romainguy.dev · 16/12/2024
It's the end of 2024 so I'm of course still (slowly) going through the list of photos I took in 2023. Here are the some of the photos from my trips in Japan last year.
2461
Romain Guy @romainguy.dev · 07/12/2024
Today's a fun day 🏎
3390
Romain Guy @romainguy.dev · 28/11/2024
First, because it would mirror the boolean not operator, but also because it can make reading bit twiddling expressions needlessly surprising since it comes last (screenshot). In the screenshot I even preferred writing -1 instead of 0.inv(). This function makes me grumpy every time I use it 😀
110
Romain Guy @romainguy.dev · 27/11/2024
I love Kotlin but please don't abuse its features. I regularly see code like in the first function when you can instead write a simple if statement: it's shorter, easier to read, and doesn't allocate an object! Thankfully both functions compile to the same assembly when R8 is turned on.

Two Kotlin functions that take 2 float parameters a and b. Each function returns a divided by b if b is not 0, or a constant called DefaultValue otherwise. The first function does so using takeIf, let, and the "elvis" operator. The second function uses a simple if/else statement.
1114033
Romain Guy @romainguy.dev · 22/11/2024
I took this photo 18 years ago with my first DSLR, and it's one of the photos I took that made me fall in love with the hobby. You may have seen it as an Android, ChromeOS, or even Gmail wallpaper/theme too! I should really take the time to take more photos of landscapes, I miss it.
1671
Romain Guy @romainguy.dev · 20/11/2024
Doing more work can help the compiler generate code that does less. In this example, a simple linear search in an array-backed collection is slightly modified to completely eliminate the array bounds check on every iteration.
Kotlin method called indexOf that performs a linear search of a specified value inside an array called elements. The number of entries in the array is tracked by a property called size. The linear search is a for loop from 0 until size.Kotlin method called indexOf that performs a linear search of a specified value inside an array called elements. The number of entries in the array is tracked by a property called size. The linear search is a for loop from 0 until the minimum of the size property and the size of the elements array.
1253
Romain Guy @romainguy.dev · 18/11/2024
Brightness — to simplify, how we perceived luminance — is affected by other attributes like surrounds, perceived edges, etc. In this image, both halves use the same shade of gray (sRGB 50%), but they appear different because of a small gradient in the middle used to create the perception of an edge.
0160
Romain Guy @romainguy.dev · 18/11/2024
Colors can also be difficult to work with because of psychophysical effects. For instance, saturation can affect brightness. In the image attached, all colored patches have the same luminance, but not the same brightness.
2293
Romain Guy @romainguy.dev · 17/11/2024
Alone in Tokyo
0270
Romain Guy @romainguy.dev · 16/11/2024
The kind of benchmark results I like (the Y axis is execution time, here showing a total drop of ~15% on the red line, ~19% on the blue and purple lines).
1140
Romain Guy @romainguy.dev · 15/11/2024
The attached picture is a simulation of displaying sRGB(0, 1, 0) (left column) in Display P3 (right column). In the top row, I applied a proper conversion, so both colors look the same. In the bottom row, I assigned Display P3 to the sRGB color values, so the perceived color is different.
170
Romain Guy @romainguy.dev · 09/11/2024
Work and Play — Tokyo, Japan
0180