OSDN Git Service

https://osdn.net/projects/swfed/scm/git/swfed/commits/a38e463ddaf7c6b915bdd94ee064a51...
[swfed/swfed.git] / src / swf_cxform.c
1 #include <stdio.h>
2 #include "bitstream.h"
3 #include "swf_cxform.h"
4
5 int
6 swf_cxform_parse(bitstream_t *bs, swf_cxform_t *cx) {
7     int ret, nbits;
8     bitstream_align(bs);
9     cx->has_add_terms  = bitstream_getbit(bs);
10     cx->has_mult_terms = bitstream_getbit(bs);
11     nbits = bitstream_getbits(bs, 4);
12     cx->nbits = nbits;
13     if (cx->has_mult_terms) {
14         cx->red_mult_term   = bitstream_getbits(bs, nbits);
15         cx->green_mult_term = bitstream_getbits(bs, nbits);
16         ret = bitstream_getbits(bs, nbits);
17         if (ret == -1) {
18             return 1;
19         }
20         cx->blue_mult_term  = ret;
21     }
22     if (cx->has_add_terms) {
23         cx->red_add_term   = bitstream_getbits(bs, nbits);
24         cx->green_add_term = bitstream_getbits(bs, nbits);
25         ret = bitstream_getbits(bs, nbits);
26         if (ret == -1) {
27             return 1;
28         }
29         cx->blue_add_term  = ret;
30     }
31     return 0;
32 }
33
34 int
35 swf_cxform_build(bitstream_t *bs, swf_cxform_t *cx) {
36     int nbits;
37     bitstream_align(bs);
38     bitstream_putbit(bs, cx->has_add_terms);
39     bitstream_putbit(bs, cx->has_mult_terms);
40     nbits = cx->nbits;
41     bitstream_putbits(bs, nbits, 4);
42     if (cx->has_mult_terms) {
43         bitstream_putbits(bs, cx->red_mult_term,   nbits);
44         bitstream_putbits(bs, cx->green_mult_term, nbits);
45         bitstream_putbits(bs, cx->blue_mult_term,  nbits);
46     }
47     if (cx->has_add_terms) {
48         bitstream_putbits(bs, cx->red_add_term,   nbits);
49         bitstream_putbits(bs, cx->green_add_term, nbits);
50         bitstream_putbits(bs, cx->blue_add_term,  nbits);
51     }
52     return 0;
53 }
54
55 int
56 swf_cxform_print(swf_cxform_t *cx, int indent_depth) {
57     print_indent(indent_depth);
58     printf("CXFORM:");
59     if (cx->has_mult_terms) {
60         printf("  MultTerm:%02x%02x%02x",
61                cx->red_mult_term, cx->green_mult_term, cx->blue_mult_term);
62     }
63     if (cx->has_add_terms) {
64         printf("  AddTerm:%02x%02x%02x",
65                cx->red_add_term, cx->green_add_term, cx->blue_add_term);
66     }
67     if ((cx->has_add_terms == 0) && (cx->has_mult_terms == 0)) {
68         printf("  (no add_terms or mult_terms)");
69     }
70     printf("\n");
71     return 0;
72 }