| 1 | #include "imager.h" |
| 2 | #include "regmach.h" |
| 3 | |
| 4 | /* |
| 5 | =head1 NAME |
| 6 | |
| 7 | trans2.c - entry point for the general transformation engine |
| 8 | |
| 9 | =head1 SYNOPSIS |
| 10 | |
| 11 | int width, height, channels; |
| 12 | struct rm_ops *ops; |
| 13 | int op_count; |
| 14 | double *n_regs; |
| 15 | int n_regs_count; |
| 16 | i_color *c_regs; |
| 17 | int c_regs_count; |
| 18 | i_img **in_imgs; |
| 19 | int in_imgs_count; |
| 20 | i_img *result = transform2(width, height, channels, ops, ops_count, |
| 21 | n_regs, n_regs_count, c_regs, c_regs_count, |
| 22 | in_imgs, in_imgs_count); |
| 23 | |
| 24 | =head1 DESCRIPTION |
| 25 | |
| 26 | This (short) file implements the transform2() function, just iterating |
| 27 | over the image - most of the work is done in L<regmach.c> |
| 28 | |
| 29 | =cut |
| 30 | */ |
| 31 | |
| 32 | i_img* i_transform2(i_img_dim width, i_img_dim height, int channels, |
| 33 | struct rm_op *ops, int ops_count, |
| 34 | double *n_regs, int n_regs_count, |
| 35 | i_color *c_regs, int c_regs_count, |
| 36 | i_img **in_imgs, int in_imgs_count) |
| 37 | { |
| 38 | i_img *new_img; |
| 39 | i_img_dim x, y; |
| 40 | i_color val; |
| 41 | int i; |
| 42 | int need_images; |
| 43 | |
| 44 | i_clear_error(); |
| 45 | |
| 46 | /* since the number of images is variable and the image numbers |
| 47 | for getp? are fixed, we can check them here instead of in the |
| 48 | register machine - this will help performance */ |
| 49 | need_images = 0; |
| 50 | for (i = 0; i < ops_count; ++i) { |
| 51 | switch (ops[i].code) { |
| 52 | case rbc_getp1: |
| 53 | case rbc_getp2: |
| 54 | case rbc_getp3: |
| 55 | if (ops[i].code - rbc_getp1 + 1 > need_images) { |
| 56 | need_images = ops[i].code - rbc_getp1 + 1; |
| 57 | } |
| 58 | } |
| 59 | } |
| 60 | |
| 61 | if (need_images > in_imgs_count) { |
| 62 | i_push_errorf(0, "not enough images, code requires %d, %d supplied", |
| 63 | need_images, in_imgs_count); |
| 64 | return NULL; |
| 65 | } |
| 66 | |
| 67 | new_img = i_img_empty_ch(NULL, width, height, channels); |
| 68 | for (x = 0; x < width; ++x) { |
| 69 | for (y = 0; y < height; ++y) { |
| 70 | n_regs[0] = x; |
| 71 | n_regs[1] = y; |
| 72 | val = i_rm_run(ops, ops_count, n_regs, n_regs_count, c_regs, c_regs_count, |
| 73 | in_imgs, in_imgs_count); |
| 74 | i_ppix(new_img, x, y, &val); |
| 75 | } |
| 76 | } |
| 77 | |
| 78 | return new_img; |
| 79 | } |
| 80 | |
| 81 | /* |
| 82 | =head1 AUTHOR |
| 83 | |
| 84 | Tony Cook <tony@develop-help.com> |
| 85 | |
| 86 | =head1 SEE ALSO |
| 87 | |
| 88 | Imager(3), regmach.c |
| 89 | |
| 90 | =cut |
| 91 | */ |