/* * CINELERRA * Copyright (C) 2011 Adam Williams * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include "bchash.h" #include "mwindow.h" #include "picture.h" #include PictureItem::PictureItem() { name[0] = 0; min = 0; max = 0; default_ = 0; step = 0; type = 0; value = 0; device_id = 0; } PictureItem::~PictureItem() { } void PictureItem::copy_from(PictureItem *src) { strcpy(this->name, src->name); this->device_id = src->device_id; this->min = src->min; this->max = src->max; this->default_ = src->default_; this->step = src->step; this->type = src->type; this->value = src->value; } char* PictureItem::get_default_string(char *string) { sprintf(string, "VIDEO_%s_VALUE", name); int len = strlen(string); for(int i = 0; i < len; i++) string[i] = toupper(string[i]); return string; } PictureConfig::PictureConfig() { char path[BCTEXTLEN]; MWindow::create_defaults_path(path, PICTURE_FILE); defaults = new BC_Hash(path); brightness = -1; hue = -1; color = -1; contrast = -1; whiteness = -1; use_brightness = 0; use_contrast = 0; use_color = 0; use_hue = 0; use_whiteness = 0; } PictureConfig::~PictureConfig() { controls.remove_all_objects(); delete defaults; } void PictureConfig::copy_settings(PictureConfig *picture) { this->brightness = picture->brightness; this->hue = picture->hue; this->color = picture->color; this->contrast = picture->contrast; this->whiteness = picture->whiteness; for(int i = 0; i < picture->controls.total; i++) { PictureItem *src_item = picture->controls.values[i]; PictureItem *dst_item = 0; for(int j = 0; j < controls.total; j++) { if(controls.values[j]->device_id == src_item->device_id) { dst_item = controls.values[j]; break; } } if(!dst_item) { dst_item = new PictureItem; controls.append(dst_item); } dst_item->copy_from(src_item); } } void PictureConfig::copy_usage(PictureConfig *picture) { this->use_brightness = picture->use_brightness; this->use_contrast = picture->use_contrast; this->use_color = picture->use_color; this->use_hue = picture->use_hue; this->use_whiteness = picture->use_whiteness; // Add the controls if they don't exists but don't replace existing values. for(int i = 0; i < picture->controls.total; i++) { PictureItem *src = picture->controls.values[i]; int got_it = 0; for(int j = 0; j < controls.total; j++) { if(controls.values[j]->device_id == src->device_id) { got_it = 1; break; } } if(!got_it) { PictureItem *dst = new PictureItem; controls.append(dst); dst->copy_from(src); } } } void PictureConfig::load_defaults() { if(!defaults) { printf("PictureConfig::load_defaults: no defaults pointer.\n"); return; } defaults->load(); brightness = defaults->get("VIDEO_BRIGHTNESS", 0); hue = defaults->get("VIDEO_HUE", 0); color = defaults->get("VIDEO_COLOR", 0); contrast = defaults->get("VIDEO_CONTRAST", 0); whiteness = defaults->get("VIDEO_WHITENESS", 0); // The device must be probed first to keep unsupported controls from getting // displayed. for(int i = 0; i < controls.total; i++) { PictureItem *item = controls.values[i]; char string[BCTEXTLEN]; item->get_default_string(string); item->value = defaults->get(string, item->value); //printf("PictureConfig::load_defaults %s %d %d\n", item->name, item->device_id, item->value); } } void PictureConfig::save_defaults() { if(!defaults) { printf("PictureConfig::save_defaults: no defaults pointer.\n"); return; } defaults->update("VIDEO_BRIGHTNESS", brightness); defaults->update("VIDEO_HUE", hue); defaults->update("VIDEO_COLOR", color); defaults->update("VIDEO_CONTRAST", contrast); defaults->update("VIDEO_WHITENESS", whiteness); for(int i = 0; i < controls.total; i++) { PictureItem *item = controls.values[i]; char string[BCTEXTLEN]; item->get_default_string(string); defaults->update(string, item->value); //printf("PictureConfig::save_defaults %s %d %d\n", string, item->device_id, item->value); } defaults->save(); } void PictureConfig::dump() { printf(" VIDEO_BRIGHTNESS=%d\n", brightness); printf(" VIDEO_HUE=%d\n", hue); printf(" VIDEO_COLOR=%d\n", color); printf(" VIDEO_CONTRAST=%d\n", contrast); printf(" VIDEO_WHITENESS=%d\n", whiteness); for(int i = 0; i < controls.total; i++) { PictureItem *item = controls.values[i]; char string[BCTEXTLEN]; item->get_default_string(string); printf(" %s=%d\n", string, item->value); } } PictureItem* PictureConfig::new_item(const char *name) { for(int i = 0; i < controls.total; i++) { if(!strcmp(controls.values[i]->name, name)) return controls.values[i]; } PictureItem *item = new PictureItem; strcpy(item->name, name); controls.append(item); return item; } PictureItem* PictureConfig::get_item(const char *name, int id) { for(int i = 0; i < controls.total; i++) { if(!strcmp(controls.values[i]->name, name) && controls.values[i]->device_id == id) return controls.values[i]; } return 0; } int PictureConfig::set_item(int device_id, int value) { for(int i = 0; i < controls.total; i++) { if(controls.values[i]->device_id == device_id) { if(controls.values[i]->value != value) { controls.values[i]->value = value; return 1; } return 0; } } return 0; }