|
| 1 | +#ifdef USE_IMAGE_NATIVES |
1 | 2 | /***********************************************************************
|
2 | 3 | **
|
3 | 4 | ** REBOL [R3] Language Interpreter and Run-time Environment
|
|
30 | 31 |
|
31 | 32 | #include "sys-core.h"
|
32 | 33 | #include "reb-codec.h"
|
| 34 | +#include "sys-magick.h" // used for `resize` native |
33 | 35 |
|
34 | 36 |
|
35 | 37 | typedef struct REBCLR {
|
@@ -196,7 +198,7 @@ typedef struct REBCLR {
|
196 | 198 | g2 = rgb->g;
|
197 | 199 | b2 = rgb->b;
|
198 | 200 |
|
199 |
| - amount0 = Clip_Dec(IS_INTEGER(val_amount) ? (REBDEC)VAL_INT64(val_amount) : VAL_DECIMAL(val_amount), 0.0, 1.0); |
| 201 | + amount0 = Clip_Dec(AS_DECIMAL(val_amount), 0.0, 1.0); |
200 | 202 | amount1 = 1.0 - amount0;
|
201 | 203 |
|
202 | 204 | if (IS_TUPLE(val_trg)) {
|
@@ -228,6 +230,80 @@ typedef struct REBCLR {
|
228 | 230 | return R_ARG1;
|
229 | 231 | }
|
230 | 232 |
|
| 233 | +/*********************************************************************** |
| 234 | +** |
| 235 | +*/ REBNATIVE(resize) |
| 236 | +/* |
| 237 | +// resize: native [ |
| 238 | +// "Resizes an image to the given size." |
| 239 | +// image [image!] "Image to resize" |
| 240 | +// size [pair! percent! integer!] |
| 241 | +// "Size of the new image (integer value is used as width)" |
| 242 | +// /filter "Using given filter type (default is Lanczos)" |
| 243 | +// name [word! integer!] "One of: system/catalog/filters" |
| 244 | +// /blur |
| 245 | +// factor [number!] "The blur factor where > 1 is blurry, < 1 is sharp" |
| 246 | +// ] |
| 247 | +***********************************************************************/ |
| 248 | +{ |
| 249 | + REBVAL *val_img = D_ARG(1); |
| 250 | + REBVAL *val_size = D_ARG(2); |
| 251 | +// REBOOL ref_filter = D_REF(3); |
| 252 | + REBVAL *val_filter = D_ARG(4); |
| 253 | + REBOOL ref_blur = D_REF(5); |
| 254 | + REBVAL *val_blur = D_ARG(6); |
| 255 | + REBSER *result; |
| 256 | + REBCNT filter = 0; |
| 257 | + REBDEC blur = 1.0; |
| 258 | + REBOOL has_alpha = Image_Has_Alpha(val_img, FALSE); |
| 259 | + REBINT wide, high; |
| 260 | + |
| 261 | + if (IS_INTEGER(val_filter)) |
| 262 | + filter = VAL_INT32(val_filter); |
| 263 | + else if (IS_WORD(val_filter)) { |
| 264 | + filter = VAL_WORD_CANON(val_filter) - SYM_POINT + 1; |
| 265 | + } |
| 266 | + |
| 267 | + if (filter < 0 || filter > 15) |
| 268 | + Trap1(RE_INVALID_ARG, val_filter); |
| 269 | + |
| 270 | + if (ref_blur) { |
| 271 | + blur = AS_DECIMAL(val_blur); |
| 272 | + blur = MIN(blur, MAX_RESIZE_BLUR); |
| 273 | + } |
| 274 | + |
| 275 | + if (IS_PAIR(val_size)) { |
| 276 | + wide = VAL_PAIR_X_INT(val_size); |
| 277 | + high = VAL_PAIR_Y_INT(val_size); |
| 278 | + } |
| 279 | + else if (IS_INTEGER(val_size)) { |
| 280 | + wide = VAL_INT32(val_size); |
| 281 | + high = 0; // will be computed later |
| 282 | + } |
| 283 | + else if (IS_PERCENT(val_size)) { |
| 284 | + wide = ROUND_TO_INT(VAL_DECIMAL(val_size) * VAL_IMAGE_WIDE(val_img)); |
| 285 | + high = ROUND_TO_INT(VAL_DECIMAL(val_size) * VAL_IMAGE_HIGH(val_img)); |
| 286 | + } |
| 287 | + if (wide < 0 || high < 0 || (wide == 0 && high == 0)) |
| 288 | + Trap1(RE_INVALID_ARG, val_size); |
| 289 | + |
| 290 | + if (wide == 0) { |
| 291 | + wide = ROUND_TO_INT( VAL_IMAGE_WIDE(val_img) * high / VAL_IMAGE_HIGH(val_img) ); |
| 292 | + } |
| 293 | + if (high == 0) { |
| 294 | + high = ROUND_TO_INT( VAL_IMAGE_HIGH(val_img) * wide / VAL_IMAGE_WIDE(val_img) ); |
| 295 | + } |
| 296 | + |
| 297 | + result = ResizeImage(VAL_SERIES(val_img), wide, high, filter, blur, has_alpha); |
| 298 | + |
| 299 | + if (result == NULL) { |
| 300 | + Trap1(RE_NO_CREATE, Get_Type_Word(REB_IMAGE)); |
| 301 | + } |
| 302 | + |
| 303 | + SET_IMAGE(D_RET, result); |
| 304 | + return R_RET; |
| 305 | +} |
| 306 | + |
231 | 307 | /***********************************************************************
|
232 | 308 | **
|
233 | 309 | */ REBNATIVE(image)
|
@@ -388,3 +464,5 @@ typedef struct REBCLR {
|
388 | 464 | #endif
|
389 | 465 | return R_RET;
|
390 | 466 | }
|
| 467 | + |
| 468 | +#endif // USE_IMAGE_NATIVES |
0 commit comments