Adonthell
0.4
|
00001 /* 00002 (C) Copyright 2000 Joel Vennin 00003 Part of the Adonthell Project http://adonthell.linuxgames.com 00004 00005 This program is free software; you can redistribute it and/or modify 00006 it under the terms of the GNU General Public License. 00007 This program is distributed in the hope that it will be useful, 00008 but WITHOUT ANY WARRANTY. 00009 00010 See the COPYING file for more details 00011 */ 00012 00013 #include "win_theme.h" 00014 #include "win_border.h" 00015 00016 00017 win_border::win_border() 00018 { 00019 wb_=NULL; 00020 00021 init(); 00022 00023 set_trans_border(false); 00024 00025 set_visible_border( false ); 00026 00027 set_brightness_border( false ); 00028 00029 } 00030 00031 00032 win_border::win_border(win_base *wb) 00033 { 00034 wb_=wb; 00035 00036 init(); 00037 00038 set_trans_border(false); 00039 00040 set_visible_border( false ); 00041 00042 set_brightness_border( false ); 00043 } 00044 00045 win_border::win_border(char * rep,const char * size) 00046 { 00047 wb_=NULL; 00048 00049 init(); 00050 00051 set_visible_border( false ); 00052 00053 set_trans_border(false); 00054 00055 set_brightness_border( false ); 00056 00057 win_border::load(rep,size); 00058 00059 refresh(); 00060 } 00061 00062 00063 win_border::win_border(win_border & wb) 00064 { 00065 wb_=NULL; 00066 00067 init(); 00068 00069 set_visible_border( false ); 00070 00071 set_trans_border(false); 00072 00073 set_brightness_border( false ); 00074 00075 *this=wb; 00076 00077 refresh(); 00078 } 00079 00080 win_border::~win_border() 00081 { 00082 destroy(); 00083 } 00084 00085 00086 void win_border::set_border(win_border & wb) 00087 { 00088 *this=wb; 00089 00090 refresh(); 00091 } 00092 00093 00094 void win_border::set_border(win_theme & wt, u_int8 size) 00095 { 00096 switch(size) 00097 { 00098 case NORMAL: 00099 *this=*(wt.normal); 00100 break; 00101 00102 case MINI: 00103 *this=*(wt.mini); 00104 break; 00105 } 00106 refresh(); 00107 } 00108 00109 00110 void win_border::init() 00111 { 00112 h_border_template_=NULL; 00113 v_border_template_=NULL; 00114 for(u_int8 i=0;i<NB_BORDER_IMAGE;i++) 00115 border_[i]=border_brightness_[i]=NULL; 00116 } 00117 00118 win_border & win_border::operator=(win_border & wb) 00119 { 00120 00121 destroy(); 00122 h_border_template_=new image(); 00123 *h_border_template_=*(wb.h_border_template_); 00124 v_border_template_=new image(); 00125 *v_border_template_=*(wb.v_border_template_); 00126 00127 for(u_int8 i=0;i<NB_BORDER_IMAGE-2;i++) 00128 { 00129 border_[i]=new image(); 00130 border_brightness_[i]=new image(); 00131 *(border_[i])=*(wb.border_[i]); 00132 *(border_brightness_[i])=*(wb.border_brightness_[i]); 00133 border_[i]->set_mask(true); 00134 border_brightness_[i]->set_mask(true); 00135 } 00136 00137 for(u_int8 i=NB_BORDER_IMAGE-2;i<NB_BORDER_IMAGE;i++) 00138 { 00139 border_[i]=new image(); 00140 border_brightness_[i]=new image(); 00141 border_[i]->set_mask(true); 00142 border_brightness_[i]->set_mask(true); 00143 } 00144 update(); 00145 return *this; 00146 } 00147 00148 void win_border::destroy() 00149 { 00150 if(h_border_template_) delete h_border_template_; 00151 if(v_border_template_) delete v_border_template_; 00152 00153 for(u_int8 i = 0; i< NB_BORDER_IMAGE; i++) 00154 {delete border_[i];delete border_brightness_[i];} 00155 00156 init(); 00157 } 00158 00159 void win_border::load(char * rep,const char *size) 00160 { 00161 destroy(); 00162 00163 char path[255];char tmp[255]; 00164 strcpy(path,WIN_DIRECTORY); 00165 strcat(path,WIN_BORDER_DIRECTORY); 00166 strcat(path,rep); 00167 strcat(path,size); 00168 00169 h_border_template_=new image(); 00170 strcpy(tmp,path); 00171 strcat(tmp,WIN_H_BORDER_TEMPLATE_FILE); 00172 h_border_template_->load_pnm(tmp);//new 00173 00174 00175 v_border_template_=new image(); 00176 strcpy(tmp,path); 00177 strcat(tmp,WIN_V_BORDER_TEMPLATE_FILE); 00178 v_border_template_->load_pnm(tmp);//new 00179 00180 00181 border_[0]=new image(); 00182 strcpy(tmp,path); 00183 strcat(tmp,WIN_CORNER_TOP_LEFT_FILE); 00184 border_[0]->load_pnm(tmp); 00185 border_brightness_[0]=new image(); 00186 border_brightness_[0]->brightness(*(border_[0]),WIN_BRIGHTNESS_LEVEL); 00187 border_[0]->set_mask(true); 00188 border_brightness_[0]->set_mask(true); 00189 00190 border_[1]=new image(); 00191 strcpy(tmp,path); 00192 strcat(tmp,WIN_CORNER_TOP_RIGHT_FILE); 00193 border_[1]->load_pnm(tmp); 00194 border_brightness_[1]=new image(); 00195 border_brightness_[1]->brightness(*(border_[1]),WIN_BRIGHTNESS_LEVEL); 00196 border_[1]->set_mask(true); 00197 border_brightness_[1]->set_mask(true); 00198 00199 00200 border_[2]=new image(); 00201 strcpy(tmp,path); 00202 strcat(tmp,WIN_CORNER_BOTTOM_LEFT_FILE); 00203 border_[2]->load_pnm(tmp); 00204 border_brightness_[2]=new image(); 00205 border_brightness_[2]->brightness(*(border_[2]),WIN_BRIGHTNESS_LEVEL); 00206 border_[2]->set_mask(true); 00207 border_brightness_[2]->set_mask(true); 00208 00209 00210 border_[3]=new image(); 00211 strcpy(tmp,path); 00212 strcat(tmp,WIN_CORNER_BOTTOM_RIGHT_FILE); 00213 border_[3]->load_pnm(tmp); 00214 border_brightness_[3]=new image(); 00215 border_brightness_[3]->brightness(*(border_[3]),WIN_BRIGHTNESS_LEVEL); 00216 border_[3]->set_mask(true); 00217 border_brightness_[3]->set_mask(true); 00218 00219 for(u_int8 i=NB_BORDER_IMAGE-2;i<NB_BORDER_IMAGE;i++) 00220 { 00221 border_[i]=new image(); 00222 border_brightness_[i]=new image(); 00223 border_[i]->set_mask(true); 00224 border_brightness_[i]->set_mask(true); 00225 } 00226 } 00227 00228 00229 void win_border::update() 00230 { 00231 if(!h_border_template_ || !v_border_template_ || !wb_) return; 00232 00233 border_[4]->resize(v_border_template_->length(),wb_->height()); 00234 border_[4]->tile(*v_border_template_); 00235 border_brightness_[4]->brightness(*(border_[4]),WIN_BRIGHTNESS_LEVEL); 00236 00237 border_[5]->resize(wb_->length(),h_border_template_->height()); 00238 border_[5]->tile(*h_border_template_); 00239 border_brightness_[5]->brightness(*(border_[5]),WIN_BRIGHTNESS_LEVEL); 00240 } 00241 00242 u_int16 win_border::height_border() 00243 { 00244 if(h_border_template_) return h_border_template_->height(); 00245 return 0; 00246 } 00247 00248 u_int16 win_border::length_border() 00249 { 00250 if(v_border_template_) return v_border_template_->length(); 00251 return 0; 00252 } 00253 00254 00255 void win_border::set_trans_border(bool b) 00256 { 00257 if(!h_border_template_) return; 00258 if(b) 00259 for(u_int8 i=0; i<NB_BORDER_IMAGE;i++) 00260 { 00261 border_[i]->set_alpha(130); 00262 border_brightness_[i]->set_alpha(130); 00263 } 00264 else 00265 for(u_int8 i=0; i<NB_BORDER_IMAGE;i++) 00266 { 00267 border_[i]->set_alpha(255); 00268 border_brightness_[i]->set_alpha(255); 00269 } 00270 } 00271 00272 00273 void win_border::draw(drawing_area * da) 00274 { 00275 if(!h_border_template_ || !visible_border_ || !wb_) return; 00276 00277 u_int8 xodd = (border_draw_[0]->length () % 2); 00278 u_int8 yodd = (border_draw_[0]->length () % 2); 00279 00280 border_draw_[5]->draw(wb_->real_x(), wb_->real_y() - height_border(),da); 00281 00282 border_draw_[5]->draw(wb_->real_x(), wb_->real_y() + wb_->height(),da); 00283 00284 border_draw_[4]->draw(wb_->real_x() - length_border() , wb_->real_y(),da); 00285 00286 border_draw_[4]->draw(wb_->real_x() + wb_->length(), wb_->real_y(),da); 00287 00288 border_draw_[0]->draw(wb_->real_x() - (border_draw_[0]->length()>>1) - (length_border()>>1) - xodd, 00289 wb_->real_y() - (border_draw_[0]->height()>>1) - (height_border()>>1) - yodd, da); 00290 00291 border_draw_[1]->draw(wb_->real_x() + wb_->length() - (border_draw_[0]->length()>>1) + (length_border()>>1), 00292 wb_->real_y() - (border_draw_[0]->height()>>1) - (height_border()>>1) - yodd, da); 00293 00294 border_draw_[2]->draw(wb_->real_x() - (border_draw_[0]->length()>>1) - (length_border()>>1) - xodd , 00295 wb_->real_y() + wb_->height() - (border_draw_[0]->height()>>1) + (height_border()>>1), da); 00296 00297 border_draw_[3]->draw(wb_->real_x() + wb_->length() - (border_draw_[0]->length()>>1) + (length_border()>>1), 00298 wb_->real_y() + wb_->height() - (border_draw_[0]->height()>>1) + (height_border()>>1), da); 00299 } 00300 00301 00302 void win_border::set_brightness_border(bool b) 00303 { 00304 brightness_=b; 00305 refresh(); 00306 } 00307 00308 00309 void win_border::refresh() 00310 { 00311 border_draw_ = (brightness_) ? border_brightness_ : border_; 00312 } 00313 00314 00315 00316 00317 00318 00319 00320