1 | #include "jwindow.hpp" |
---|
2 | #include "lisp.hpp" |
---|
3 | #include "scroller.hpp" |
---|
4 | #include "id.hpp" |
---|
5 | #include "cache.hpp" |
---|
6 | #include "language.hpp" |
---|
7 | #include "dprint.hpp" |
---|
8 | #include "loader2.hpp" |
---|
9 | #include <math.h> |
---|
10 | |
---|
11 | extern window_manager *eh; |
---|
12 | extern int dev_ok; |
---|
13 | palette *old_pal=NULL; |
---|
14 | |
---|
15 | class gray_picker : public spicker |
---|
16 | { |
---|
17 | public : |
---|
18 | int sc; |
---|
19 | virtual void draw_item(window_manager *wm, image *screen, int x, int y, int num, int active) |
---|
20 | { |
---|
21 | long x2=x+item_width(wm)-1; |
---|
22 | long y2=y+item_height(wm)-1; |
---|
23 | screen->bar(x,y,x2,y2,0); |
---|
24 | screen->bar(x,y,x2-3,y2,sc+num); |
---|
25 | if (active) screen->rectangle(x,y,x2,y2,255); |
---|
26 | } |
---|
27 | void set_pos(int x) { cur_sel=x; } |
---|
28 | virtual int total() { return 32; } |
---|
29 | virtual int item_width(window_manager *wm) { return 12; } |
---|
30 | virtual int item_height(window_manager *wm) { return 20; } |
---|
31 | virtual int activate_on_mouse_move() { return 0; } |
---|
32 | gray_picker(int X, int Y, int ID, int start, int current, ifield *Next) : spicker(X,Y,ID,1,20,0,0,Next) |
---|
33 | { cur_sel=current; sc=start; reconfigure(); cur_sel=current; } |
---|
34 | } ; |
---|
35 | |
---|
36 | |
---|
37 | FILE *open_FILE(char *filename, char *mode); |
---|
38 | |
---|
39 | void gamma_correct(palette *&pal, int force_menu) |
---|
40 | { |
---|
41 | long dr=0,dg=0,db=0,old_dg=0; |
---|
42 | int abort=0; |
---|
43 | |
---|
44 | Cell *gs=find_symbol("darkest_gray"); // see if user has already done this routine |
---|
45 | |
---|
46 | if (old_pal) |
---|
47 | { delete pal; pal=old_pal; old_pal=NULL; } |
---|
48 | |
---|
49 | if (gs && DEFINEDP(symbol_value(gs)) && !force_menu) |
---|
50 | dg=lnumber_value(symbol_value(gs)); |
---|
51 | else |
---|
52 | { |
---|
53 | if (gs && DEFINEDP(symbol_value(gs))) |
---|
54 | dg=old_dg=lnumber_value(symbol_value(gs)); |
---|
55 | |
---|
56 | |
---|
57 | palette *gray_pal=pal->copy(); // load in a fine gray palette they can chose from |
---|
58 | int i=0; |
---|
59 | int tc=32; |
---|
60 | |
---|
61 | for (;i<tc;i++) |
---|
62 | gray_pal->set(i,i*4,i*4,i*4); |
---|
63 | |
---|
64 | gray_pal->load(); |
---|
65 | |
---|
66 | |
---|
67 | int wm_bc=eh->bright_color(),wm_mc=eh->medium_color(),wm_dc=eh->dark_color(); |
---|
68 | |
---|
69 | int br_r=pal->red(wm_bc)+20; if (br_r>255) br_r=255; |
---|
70 | int br_g=pal->green(wm_bc)+20; if (br_g>255) br_g=255; |
---|
71 | int br_b=pal->blue(wm_bc)+20; if (br_b>255) br_b=255; |
---|
72 | |
---|
73 | int md_r=pal->red(wm_mc)-20; if (md_r<0) md_r=0; |
---|
74 | int md_g=pal->green(wm_mc)-20; if (md_g<0) md_g=0; |
---|
75 | int md_b=pal->blue(wm_mc)-20; if (md_b<0) md_b=0; |
---|
76 | |
---|
77 | int dr_r=pal->red(wm_dc)-40; if (dr_r<0) dr_r=0; |
---|
78 | int dr_g=pal->green(wm_dc)-40; if (dr_g<0) dr_g=0; |
---|
79 | int dr_b=pal->blue(wm_dc)-40; if (dr_b<0) dr_b=0; |
---|
80 | |
---|
81 | eh->set_colors(gray_pal->find_closest(br_r,br_g,br_b), |
---|
82 | gray_pal->find_closest(md_r,md_g,md_b), |
---|
83 | gray_pal->find_closest(dr_r,dr_g,dr_b)); |
---|
84 | |
---|
85 | |
---|
86 | int wl=WINDOW_FRAME_LEFT,wh=WINDOW_FRAME_TOP; |
---|
87 | int sh=eh->font()->height()+35; |
---|
88 | button *but=new button(wl+5,wh+5+sh*3,ID_GAMMA_OK,cash.img(ok_button), |
---|
89 | new info_field(wl+35,wh+10+sh*3,ID_NULL,lang_string("gamma_msg"),0)); |
---|
90 | |
---|
91 | gray_picker *gp=new gray_picker(wl+2,wh+5+sh*1,ID_GREEN_PICKER,0,dg/4,but); gp->set_pos(dg/4); |
---|
92 | |
---|
93 | jwindow *gw=eh->new_window(xres/2-190,yres/2-90,-1,-1,gp); |
---|
94 | |
---|
95 | event ev; |
---|
96 | eh->flush_screen(); |
---|
97 | do |
---|
98 | { |
---|
99 | do { eh->get_event(ev); } while (ev.type==EV_MOUSE_MOVE && eh->event_waiting()); |
---|
100 | eh->flush_screen(); |
---|
101 | if (ev.type==EV_CLOSE_WINDOW) abort=1; |
---|
102 | if (ev.type==EV_KEY && ev.key==JK_ESC) abort=1; |
---|
103 | } while (!abort && (ev.type!=EV_MESSAGE || ev.message.id!=ID_GAMMA_OK)); |
---|
104 | |
---|
105 | dg=((spicker *)gw->inm->get(ID_GREEN_PICKER))->first_selected()*4; |
---|
106 | |
---|
107 | eh->close_window(gw); |
---|
108 | eh->flush_screen(); |
---|
109 | |
---|
110 | eh->set_colors(wm_bc,wm_mc,wm_dc); |
---|
111 | delete gray_pal; |
---|
112 | |
---|
113 | if (!abort) |
---|
114 | { |
---|
115 | FILE *fp=open_FILE("gamma.lsp","wb"); |
---|
116 | if (fp) |
---|
117 | { |
---|
118 | fprintf(fp,"(setq darkest_gray %d)\n",dg); |
---|
119 | fclose(fp); |
---|
120 | int sp=current_space; |
---|
121 | current_space=PERM_SPACE; |
---|
122 | set_symbol_value(make_find_symbol("darkest_gray"),new_lisp_number(dg)); |
---|
123 | |
---|
124 | current_space=sp; |
---|
125 | } else dprintf("Unable to write to file gamma.lsp\n"); |
---|
126 | } |
---|
127 | } |
---|
128 | |
---|
129 | if (abort) dg=old_dg; |
---|
130 | |
---|
131 | if (dg<1) dg=1; else if (dg>128) dg=128; |
---|
132 | |
---|
133 | double gamma=log(dg/255.0)/log(16.0/255.0); |
---|
134 | |
---|
135 | old_pal=pal; |
---|
136 | pal=new palette; |
---|
137 | for (int i=0;i<256;i++) |
---|
138 | { |
---|
139 | double r,g,b; |
---|
140 | uchar or,og,ob; |
---|
141 | old_pal->get(i,or,og,ob); |
---|
142 | pal->set(i,(int)(pow(or/255.0,gamma)*255), |
---|
143 | (int)(pow(og/255.0,gamma)*255), |
---|
144 | (int)(pow(ob/255.0,gamma)*255)); |
---|
145 | } |
---|
146 | |
---|
147 | pal->load(); |
---|
148 | } |
---|
149 | |
---|
150 | |
---|
151 | |
---|
152 | |
---|
153 | |
---|
154 | |
---|