88
99# ' @rdname rgb-hls
1010# ' @export
11- rgb2hls <- function (x ) azny_rgb_to_hls(x )
11+ rgb2hls <- function (x ) azny_rgb_to_hls(floor( x ) )
1212
1313# ' @rdname rgb-hls
1414# ' @export
15- hls2rgb <- function (x ) azny_hls_to_rgb(x )
15+ hls2rgb <- function (x ) azny_hls_to_rgb(floor(x ))
16+
17+ # ' Create a native raster filled with a color
18+ # '
19+ # ' @param width,height A positive integer scalar.
20+ # ' @param color Color name or hex code.
21+ # ' @returns A `nativeRaster` object.
22+ # ' @export
23+ fill_with <- function (width , height , color ) {
24+ packed_int <-
25+ grDevices :: col2rgb(color [1 ], alpha = TRUE ) | >
26+ rlang :: as_function(
27+ ~ {
28+ x <- as.double(. )
29+ azny_pack_integers(x [1 : 3 ], x [4 ], 1 , 1 )
30+ }
31+ )()
32+ out <- rep_len(packed_int , width * height )
33+ dim(out ) <- c(height , width )
34+ as_nr(out )
35+ }
1636
1737# ' Color manipulation
1838# '
1939# ' @param nr A `nativeRaster` object.
2040# ' @param intensity A numeric scalar.
21- # ' @param depth An integer scalar.
22- # ' @param color A character string; the color to be set.
23- # ' @param alpha A numeric scalar in range `[0, 1]`.
24- # ' The alpha value to be reset for transparency.
41+ # ' @param depth,shades A positive integer scalar.
42+ # ' @param gamma A numeric scalar. The gamma exponent.
2543# ' @param rad A numeric scalar. The rotation angle in radians.
44+ # ' @param color,color_a,color_b,ink,paper A character string;
45+ # ' color name or hex code.
46+ # ' @param alpha,threshold A numeric scalar in range `[0, 1]`.
2647# ' @param max An integer scalar. The maximum value of the color code.
2748# ' @returns A `nativeRaster` object.
2849# ' @rdname color-manip
3152
3253# ' @rdname color-manip
3354# ' @export
34- unpremul <- function (nr , max = 255L ) {
55+ brighten <- function (nr , intensity ) {
3556 sz <- dim(nr )
3657 ret <- nr_to_rgba(nr , " nr" )
37- rgb <- ret [1 : 3 , ] / ( ret [ 4 , ] / max )
58+ rgb <- clamp( ret [1 : 3 , ] * ( 1 + intensity ), 0 , 255 )
3859 as_nr(azny_pack_integers(rgb , ret [4 , ] * 1 , sz [1 ], sz [2 ]))
3960}
4061
4162# ' @rdname color-manip
4263# ' @export
43- set_matte <- function (nr , color = " green" ) {
44- rgb_int <-
45- grDevices :: col2rgb(color [1 ], alpha = FALSE )
64+ contrast <- function (nr , intensity ) {
4665 sz <- dim(nr )
4766 ret <- nr_to_rgba(nr , " nr" )
48- ret [1 , ][ret [4 , ] != 255 ] <- rgb_int [1 , ] * 1
49- ret [2 , ][ret [4 , ] != 255 ] <- rgb_int [2 , ] * 1
50- ret [3 , ][ret [4 , ] != 255 ] <- rgb_int [3 , ] * 1
51- as_nr(azny_pack_integers(ret [1 : 3 , ], ret [4 , ], sz [1 ], sz [2 ]))
67+ rgb <- clamp((ret [1 : 3 , ] / 255 - 0.5 ) * (1 + intensity ) + 0.5 , 0 , 1 ) * 255
68+ as_nr(azny_pack_integers(rgb , ret [4 , ] * 1 , sz [1 ], sz [2 ]))
5269}
5370
5471# ' @rdname color-manip
5572# ' @export
56- reset_alpha <- function (nr , alpha = 1 ) {
73+ duotone <- function (nr , color_a = " yellow " , color_b = " navy " , gamma = 2.2 ) {
5774 sz <- dim(nr )
75+ color_a <- fill_with(sz [1 ], sz [2 ], color_a ) | > nr_to_rgba(" color_a" )
76+ color_b <- fill_with(sz [1 ], sz [2 ], color_b ) | > nr_to_rgba(" color_b" )
5877 ret <- nr_to_rgba(nr , " nr" )
59- ret [4 , ] <- clamp(alpha * 255 , 0 , 255 )
60- as_nr(azny_pack_integers(ret [1 : 3 , ], ret [4 , ], sz [1 ], sz [2 ]))
78+ luminance <- clamp(gray(ret [1 : 3 , ])^ (1 / gamma ), 0 , 1 )
79+ rgb <- mix(color_a [1 : 3 , ], color_b [1 : 3 , ], luminance )
80+ as_nr(azny_pack_integers(rgb , ret [4 , ] * 1 , sz [1 ], sz [2 ]))
81+ }
82+
83+ # ' @rdname color-manip
84+ # ' @export
85+ grayscale <- function (nr ) {
86+ sz <- dim(nr )
87+ ret <- nr_to_rgba(nr , " nr" )
88+ rgb <- t(colSums(ret [1 : 3 , ]) / 3 ) %x% c(1 , 1 , 1 )
89+ as_nr(azny_pack_integers(rgb , ret [4 , ] * 1 , sz [1 ], sz [2 ]))
6190}
6291
6392# ' @rdname color-manip
@@ -92,22 +121,43 @@ hue_rotate <- function(nr, rad) {
92121
93122# ' @rdname color-manip
94123# ' @export
95- contrast <- function (nr , intensity ) {
124+ invert <- function (nr ) {
96125 sz <- dim(nr )
97126 ret <- nr_to_rgba(nr , " nr" )
98- rgb <- clamp(( ret [1 : 3 , ] / 255 - 0.5 ) * ( 1 + intensity ) + 0.5 , 0 , 1 ) * 255
127+ rgb <- 255 - ret [1 : 3 , ]
99128 as_nr(azny_pack_integers(rgb , ret [4 , ] * 1 , sz [1 ], sz [2 ]))
100129}
101130
102131# ' @rdname color-manip
103132# ' @export
104- brighten <- function (nr , intensity ) {
133+ linocut <- function (nr , ink = " navy " , paper = " snow " , threshold = 0.4 ) {
105134 sz <- dim(nr )
135+ ink <- fill_with(sz [1 ], sz [2 ], ink ) | > nr_to_rgba(" ink" )
136+ paper <- fill_with(sz [1 ], sz [2 ], paper ) | > nr_to_rgba(" paper" )
106137 ret <- nr_to_rgba(nr , " nr" )
107- rgb <- clamp(ret [1 : 3 , ] * (1 + intensity ), 0 , 255 )
138+ luminance <- step(gray(ret [1 : 3 , ]), threshold )
139+ rgb <- mix(paper [1 : 3 , ], ink [1 : 3 , ], luminance )
108140 as_nr(azny_pack_integers(rgb , ret [4 , ] * 1 , sz [1 ], sz [2 ]))
109141}
110142
143+ # ' @rdname color-manip
144+ # ' @export
145+ posterize <- function (nr , shades = 4 ) {
146+ sz <- dim(nr )
147+ ret <- nr_to_rgba(nr , " nr" )
148+ rgb <- floor(ret [1 : 3 , ] / 255 * shades ) / as.integer(shades - 1 )
149+ as_nr(azny_pack_integers(rgb * 255 , ret [4 , ] * 1 , sz [1 ], sz [2 ]))
150+ }
151+
152+ # ' @rdname color-manip
153+ # ' @export
154+ reset_alpha <- function (nr , alpha = 1 ) {
155+ sz <- dim(nr )
156+ ret <- nr_to_rgba(nr , " nr" )
157+ ret [4 , ] <- clamp(alpha * 255 , 0 , 255 )
158+ as_nr(azny_pack_integers(ret [1 : 3 , ], ret [4 , ], sz [1 ], sz [2 ]))
159+ }
160+
111161# ' @rdname color-manip
112162# ' @export
113163saturate <- function (nr , intensity ) {
@@ -123,16 +173,7 @@ saturate <- function(nr, intensity) {
123173
124174# ' @rdname color-manip
125175# ' @export
126- grayscale <- function (nr ) {
127- sz <- dim(nr )
128- ret <- nr_to_rgba(nr , " nr" )
129- rgb <- t(colSums(ret [1 : 3 , ]) / 3 ) %x% c(1 , 1 , 1 )
130- as_nr(azny_pack_integers(rgb , ret [4 , ] * 1 , sz [1 ], sz [2 ]))
131- }
132-
133- # ' @rdname color-manip
134- # ' @export
135- sepia <- function (nr , intensity = 1 , depth = 20 ) {
176+ sepia <- function (nr , intensity , depth = 20 ) {
136177 sz <- dim(nr )
137178 ret <- nr_to_rgba(nr , " nr" )
138179 rgb <- rbind(
@@ -145,22 +186,34 @@ sepia <- function(nr, intensity = 1, depth = 20) {
145186 as_nr(azny_pack_integers(rgb , ret [4 , ] * 1 , sz [1 ], sz [2 ]))
146187}
147188
148- # ' Create a native raster filled with a color
149- # '
150- # ' @param width,height A positive integer scalar.
151- # ' @param color Color name or hex code.
152- # ' @returns A `nativeRaster` object.
189+ # ' @rdname color-manip
153190# ' @export
154- fill_with <- function (width , height , color ) {
155- packed_int <-
156- grDevices :: col2rgb(color [1 ], alpha = TRUE ) | >
157- rlang :: as_function(
158- ~ {
159- x <- as.double(. )
160- azny_pack_integers(x [1 : 3 ], x [4 ], 1 , 1 )
161- }
162- )()
163- out <- rep(packed_int , width * height )
164- dim(out ) <- c(height , width )
165- as_nr(out )
191+ set_matte <- function (nr , color = " green" ) {
192+ rgb_int <-
193+ grDevices :: col2rgb(color [1 ], alpha = FALSE )
194+ sz <- dim(nr )
195+ ret <- nr_to_rgba(nr , " nr" )
196+ ret [1 , ][ret [4 , ] != 255 ] <- rgb_int [1 , ] * 1
197+ ret [2 , ][ret [4 , ] != 255 ] <- rgb_int [2 , ] * 1
198+ ret [3 , ][ret [4 , ] != 255 ] <- rgb_int [3 , ] * 1
199+ as_nr(azny_pack_integers(ret [1 : 3 , ], ret [4 , ], sz [1 ], sz [2 ]))
200+ }
201+
202+ # ' @rdname color-manip
203+ # ' @export
204+ solarize <- function (nr , threshold = 0.5 ) {
205+ sz <- dim(nr )
206+ ret <- nr_to_rgba(nr , " nr" )
207+ intensity <- colSums(ret [1 : 3 , ] / 255 ) / 3
208+ rgb <- ifelse(intensity > threshold , 255 - ret [1 : 3 , ], ret [1 : 3 , ])
209+ as_nr(azny_pack_integers(rgb , ret [4 , ] * 1 , sz [1 ], sz [2 ]))
210+ }
211+
212+ # ' @rdname color-manip
213+ # ' @export
214+ unpremul <- function (nr , max = 255L ) {
215+ sz <- dim(nr )
216+ ret <- nr_to_rgba(nr , " nr" )
217+ rgb <- ret [1 : 3 , ] / (ret [4 , ] / max )
218+ as_nr(azny_pack_integers(rgb , ret [4 , ] * 1 , sz [1 ], sz [2 ]))
166219}
0 commit comments