Panda3D
pnm-image-filter-core.cxx
Go to the documentation of this file.
1 /**
2  * PANDA 3D SOFTWARE
3  * Copyright (c) Carnegie Mellon University. All rights reserved.
4  *
5  * All use of this software is subject to the terms of the revised BSD
6  * license. You should have received a copy of this license along
7  * with this source code in a file named "LICENSE."
8  *
9  * @file pnm-image-filter-core.cxx
10  */
11 
12 // We map X and Y to A and B, because we might change our minds about which is
13 // dominant, and we map getset functions for the channel in question to
14 // GETVALSETVAL.
15 
16 
17 static void
18 FUNCTION_NAME(IMAGETYPE &dest, const IMAGETYPE &source,
19  float width, FilterFunction *make_filter, int channel) {
20  if (!dest.is_valid() || !source.is_valid()) {
21  return;
22  }
23 
24  // First, set up a 2-d column-major matrix of StoreTypes, big enough to hold
25  // the image xelvals scaled in the A direction only. This will hold the
26  // adjusted xel data from our first pass.
27 
28  StoreType **matrix = (StoreType **)PANDA_MALLOC_ARRAY(dest.ASIZE() * sizeof(StoreType *));
29 
30  int a, b;
31 
32  for (a=0; a<dest.ASIZE(); a++) {
33  matrix[a] = (StoreType *)PANDA_MALLOC_ARRAY(source.BSIZE() * sizeof(StoreType));
34  }
35 
36  // First, scale the image in the A direction.
37  float scale;
38  StoreType *temp_source, *temp_dest;
39 
40  scale = (float)dest.ASIZE() / (float)source.ASIZE();
41  temp_source = (StoreType *)PANDA_MALLOC_ARRAY(source.ASIZE() * sizeof(StoreType));
42  temp_dest = (StoreType *)PANDA_MALLOC_ARRAY(dest.ASIZE() * sizeof(StoreType));
43 
44  WorkType *filter;
45  float filter_width;
46 
47  make_filter(scale, width, filter, filter_width);
48 
49  for (b = 0; b < source.BSIZE(); b++) {
50  for (a = 0; a < source.ASIZE(); a++) {
51  temp_source[a] = (StoreType)(source_max * source.GETVAL(a, b, channel));
52  }
53 
54  filter_row(temp_dest, dest.ASIZE(),
55  temp_source, source.ASIZE(),
56  scale,
57  filter, filter_width);
58 
59  for (a = 0; a < dest.ASIZE(); a++) {
60  matrix[a][b] = temp_dest[a];
61  }
62  }
63 
64  PANDA_FREE_ARRAY(temp_source);
65  PANDA_FREE_ARRAY(temp_dest);
66  PANDA_FREE_ARRAY(filter);
67 
68  // Now, scale the image in the B direction.
69  scale = (float)dest.BSIZE() / (float)source.BSIZE();
70  temp_dest = (StoreType *)PANDA_MALLOC_ARRAY(dest.BSIZE() * sizeof(StoreType));
71 
72  make_filter(scale, width, filter, filter_width);
73 
74  for (a = 0; a < dest.ASIZE(); a++) {
75  filter_row(temp_dest, dest.BSIZE(),
76  matrix[a], source.BSIZE(),
77  scale,
78  filter, filter_width);
79 
80  for (b = 0; b < dest.BSIZE(); b++) {
81  dest.SETVAL(a, b, channel, (float)temp_dest[b]/(float)source_max);
82  }
83  }
84 
85  PANDA_FREE_ARRAY(temp_dest);
86  PANDA_FREE_ARRAY(filter);
87 
88  // Now, clean up our temp matrix and go home!
89 
90  for (a = 0; a < dest.ASIZE(); a++) {
91  PANDA_FREE_ARRAY(matrix[a]);
92  }
93  PANDA_FREE_ARRAY(matrix);
94 }