2 #include "bcwindowbase.h"
21 image_sets.remove_all_objects();
26 printf("BC_Theme::dump 1 image_sets=%d contents=%d\n",
29 for(int i = 0; i < contents.total; i++)
30 printf(" %s %p\n", contents.values[i], pointers.values[i]);
33 BC_Resources* BC_Theme::get_resources()
35 return BC_WindowBase::get_resources();
39 // These create single images for storage in the image_sets table.
40 VFrame* BC_Theme::new_image(char *title, char *path)
42 VFrame *existing_image = title[0] ? get_image(title) : 0;
43 if(existing_image) return existing_image;
45 BC_ThemeSet *result = new BC_ThemeSet(1, 0, title);
46 result->data[0] = new VFrame(get_image_data(path));
47 image_sets.append(result);
48 return result->data[0];
51 VFrame* BC_Theme::new_image(char *path)
53 return new_image("", path);
56 // These create image sets which are stored in the image_sets table.
57 VFrame** BC_Theme::new_image_set(char *title, int total, va_list *args)
59 VFrame **existing_image_set = title[0] ? get_image_set(title) : 0;
60 if(existing_image_set) return existing_image_set;
62 BC_ThemeSet *result = new BC_ThemeSet(total, 1, title);
63 image_sets.append(result);
64 for(int i = 0; i < total; i++)
66 char *path = va_arg(*args, char*);
67 result->data[i] = new_image(path);
72 VFrame** BC_Theme::new_image_set(char *title, int total, ...)
75 va_start(list, total);
76 VFrame **result = new_image_set(title, total, &list);
82 VFrame** BC_Theme::new_image_set(int total, ...)
85 va_start(list, total);
86 VFrame **result = new_image_set("", total, &list);
92 VFrame* BC_Theme::get_image(char *title)
94 for(int i = 0; i < image_sets.total; i++)
96 if(!strcmp(image_sets.values[i]->title, title))
98 return image_sets.values[i]->data[0];
104 // TODO: Need to return a default image
108 VFrame** BC_Theme::get_image_set(char *title)
110 for(int i = 0; i < image_sets.total; i++)
112 if(!strcmp(image_sets.values[i]->title, title))
114 return image_sets.values[i]->data;
120 // TODO: Need to return a default image set
136 VFrame** BC_Theme::new_button(char *overlay_path,
141 VFrame default_data(get_image_data(overlay_path));
142 BC_ThemeSet *result = new BC_ThemeSet(3, 1, "");
144 result->data[0] = new_image(up_path);
145 result->data[1] = new_image(hi_path);
146 result->data[2] = new_image(dn_path);
147 for(int i = 0; i < 3; i++)
148 overlay(result->data[i], &default_data);
153 VFrame** BC_Theme::new_button(char *overlay_path,
158 VFrame default_data(get_image_data(overlay_path));
159 BC_ThemeSet *result = new BC_ThemeSet(3, 0, "");
161 result->data[0] = new VFrame(*up);
162 result->data[1] = new VFrame(*hi);
163 result->data[2] = new VFrame(*dn);
164 for(int i = 0; i < 3; i++)
165 overlay(result->data[i], &default_data);
170 VFrame** BC_Theme::new_toggle(char *overlay_path,
175 char *checkedhi_path)
177 VFrame default_data(get_image_data(overlay_path));
178 BC_ThemeSet *result = new BC_ThemeSet(5, 1, "");
180 result->data[0] = new_image(up_path);
181 result->data[1] = new_image(hi_path);
182 result->data[2] = new_image(checked_path);
183 result->data[3] = new_image(dn_path);
184 result->data[4] = new_image(checkedhi_path);
185 for(int i = 0; i < 5; i++)
186 overlay(result->data[i], &default_data);
190 VFrame** BC_Theme::new_toggle(char *overlay_path,
197 VFrame default_data(get_image_data(overlay_path));
198 BC_ThemeSet *result = new BC_ThemeSet(5, 0, "");
200 result->data[0] = new VFrame(*up);
201 result->data[1] = new VFrame(*hi);
202 result->data[2] = new VFrame(*checked);
203 result->data[3] = new VFrame(*dn);
204 result->data[4] = new VFrame(*checkedhi);
205 for(int i = 0; i < 5; i++)
206 overlay(result->data[i], &default_data);
209 void BC_Theme::overlay(VFrame *dst, VFrame *src, int in_x1, int in_x2)
213 unsigned char **in_rows;
214 unsigned char **out_rows;
218 w = MIN(src->get_w(), dst->get_w());
219 h = MIN(dst->get_h(), src->get_h());
226 h = MIN(dst->get_h(), src->get_h());
228 in_rows = src->get_rows();
229 out_rows = dst->get_rows();
231 switch(src->get_color_model())
234 switch(dst->get_color_model())
237 for(int i = 0; i < h; i++)
239 unsigned char *in_row = in_rows[i] + in_x1 * 4;
240 unsigned char *out_row = out_rows[i];
241 for(int j = 0; j < w; j++)
243 int opacity = in_row[3];
244 int transparency = 0xff - opacity;
245 out_row[0] = (in_row[0] * opacity + out_row[0] * transparency) / 0xff;
246 out_row[1] = (in_row[1] * opacity + out_row[1] * transparency) / 0xff;
247 out_row[2] = (in_row[2] * opacity + out_row[2] * transparency) / 0xff;
248 out_row[3] = MAX(in_row[3], out_row[3]);
255 for(int i = 0; i < h; i++)
257 unsigned char *in_row = in_rows[i] + in_x1 * 4;
258 unsigned char *out_row = out_rows[i];
259 for(int j = 0; j < w; j++)
261 int opacity = in_row[3];
262 int transparency = 0xff - opacity;
263 out_row[0] = (in_row[0] * opacity + out_row[0] * transparency) / 0xff;
264 out_row[1] = (in_row[1] * opacity + out_row[1] * transparency) / 0xff;
265 out_row[2] = (in_row[2] * opacity + out_row[2] * transparency) / 0xff;
276 void BC_Theme::set_data(unsigned char *ptr)
278 contents_ptr = (char*)(ptr + sizeof(int));
279 int contents_size = *(int*)ptr - sizeof(int);
280 data_ptr = contents_ptr + contents_size;
282 for(int i = 0; i < contents_size; )
285 contents.append(contents_ptr + i);
286 while(contents_ptr[i] && i < contents_size)
288 if(i < contents_size)
291 pointers.append((unsigned char*)data_ptr +
292 *(unsigned int*)(contents_ptr + i));
297 pointers.append((unsigned char*)data_ptr);
303 unsigned char* BC_Theme::get_image_data(char *title)
307 fprintf(stderr, "BC_Theme::get_image_data: no data set\n");
311 // Image is the same as the last one
312 if(last_image && !strcasecmp(last_image, title))
317 // Search for image anew.
318 for(int i = 0; i < contents.total; i++)
320 if(!strcasecmp(contents.values[i], title))
322 last_pointer = pointers.values[i];
323 last_image = contents.values[i];
325 return pointers.values[i];
329 fprintf(stderr, _("Theme::get_image: %s not found.\n"), title);
333 void BC_Theme::check_used()
335 // Can't use because some images are gotten the old fashioned way.
338 for(int i = 0; i < used.total; i++)
343 printf(_("BC_Theme::check_used: Images aren't used.\n"));
344 printf("%s ", contents.values[i]);
348 if(got_it) printf("\n");
362 BC_ThemeSet::BC_ThemeSet(int total, int is_reference, char *title)
366 this->is_reference = is_reference;
367 data = new VFrame*[total];
370 BC_ThemeSet::~BC_ThemeSet()
376 for(int i = 0; i < total; i++)