diff options
author | Ton Roosendaal <ton@blender.org> | 2004-07-06 02:15:27 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2004-07-06 02:15:27 +0400 |
commit | 4321a8889ea989e5ca24a62ceda91c41156412dd (patch) | |
tree | eef98ceac47e1807f1a55c64542e85bea7f20841 /source | |
parent | 20dbb446ed59ed772ae3434bba540f72c7f49a60 (diff) |
Colorpicker variant 2; One large field for S and V, and slider for H, like
Gimp has for example.
The previous picker is still as code there... ongoing experiments.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/src/interface.c | 91 | ||||
-rw-r--r-- | source/blender/src/interface_draw.c | 17 |
2 files changed, 95 insertions, 13 deletions
diff --git a/source/blender/src/interface.c b/source/blender/src/interface.c index 98d650d2a72..91d324b86fb 100644 --- a/source/blender/src/interface.c +++ b/source/blender/src/interface.c @@ -2065,13 +2065,12 @@ static int ui_do_but_LINK(uiBlock *block, uiBut *but) return 0; } -/* picker sizes S size, D spacer, B button/pallette height */ +/* picker sizes S hsize, F full size, D spacer, B button/pallette height */ #define SPICK 110.0 +#define FPICK 180.0 #define DPICK 6.0 #define BPICK 24.0 -static short pick_mode=0; - #define UI_PALETTE_TOT 16 static float palette[UI_PALETTE_TOT][3]= { {0.0, 0.0, 0.0}, {1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}, @@ -2180,7 +2179,7 @@ static void do_palette1_cb(void *bt1, void *bt2) } /* color picker, cube version */ -static int ui_do_but_COL(uiBut *but) +static int ui_do_but_COL1(uiBut *but) { uiBlock *block; uiBut *bt; @@ -2235,12 +2234,6 @@ static int ui_do_but_COL(uiBut *but) bt= uiDefButF(block, NUM, 0, "V ", DPICK+1.5*SPICK,BPICK+DPICK+SPICK-60,SPICK/2,20, hsv+2, 0.0, 1.0, 10, 2, ""); uiButSetFunc(bt, do_palette1_cb, bt, but); - //uiBlockBeginAlign(block); - //uiDefButS(block, ROW, 0, "Paste to color", DPICK+SPICK, BPICK+DPICK+20, SPICK,20, &pick_mode, 0.0, 0.0, 0, 0, "Clicks in palette pastes to active color"); - //uiDefButS(block, ROW, 0, "Copy to palette",DPICK+SPICK, BPICK+DPICK, SPICK,20, &pick_mode, 0.0, 1.0, 0, 0, "Clicks in palette copies from active color"); - //uiBlockEndAlign(block); - - // safety uiDefBut(block, LABEL, 0, "", -DPICK,-DPICK,2*SPICK+3*DPICK,2*SPICK+4*DPICK+BPICK, NULL, 0.0, 0.0, 0, 0, ""); @@ -2253,6 +2246,79 @@ static int ui_do_but_COL(uiBut *but) return but->retval; } +/* color picker, Gimp version */ +static int ui_do_but_COL(uiBut *but) +{ + uiBlock *block; + uiBut *bt; + ListBase listb={NULL, NULL}; + float oldcol[3], col[3], hsv[3], h; + int a; + short event; + + // signal to prevent calling up color picker + if(but->a1 == -1 || but->pointype!=FLO) { + uibut_do_func(but); + return 0; + } + + block= uiNewBlock(&listb, "colorpicker", UI_EMBOSSP, UI_HELV, but->win); + block->flag= UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_NUMSELECT; + block->themecol= TH_BUT_NUM; + + ui_get_but_vectorf(but, col); + VECCOPY(oldcol, col); + + // the cube intersection + bt= uiDefButF(block, HSVCUBE, 0, "", 0,DPICK+BPICK,FPICK,FPICK, (float *)but->poin, 0.0, 0.0, 2, 0, ""); + uiButSetFlag(bt, UI_NO_HILITE); + + bt= uiDefButF(block, HSVCUBE, 0, "", 0,0,FPICK,BPICK, (float *)but->poin, 0.0, 0.0, 3, 0, ""); + uiButSetFlag(bt, UI_NO_HILITE); + + // palette + uiDefButF(block, COL, 0, "", FPICK+DPICK, 0, BPICK,BPICK, oldcol, 0.0, 0.0, -1, 0, ""); + uiDefButF(block, COL, 0, "", FPICK+DPICK, BPICK+DPICK, BPICK,60-BPICK-DPICK, col, 0.0, 0.0, -1, 0, ""); + + h= (DPICK+BPICK+FPICK-64)/(UI_PALETTE_TOT/2.0); + for(a=0; a<UI_PALETTE_TOT/2; a++) { + bt= uiDefButF(block, COL, 0, "", FPICK+DPICK, 65.0+(float)a*h, BPICK/2, h, palette[a+UI_PALETTE_TOT/2], 0.0, 0.0, -1, 0, ""); + uiButSetFunc(bt, do_palette_cb, bt, but); + bt= uiDefButF(block, COL, 0, "", FPICK+DPICK+BPICK/2, 65.0+(float)a*h, BPICK/2, h, palette[a], 0.0, 0.0, -1, 0, ""); + uiButSetFunc(bt, do_palette_cb, bt, but); + } + + // buttons + rgb_to_hsv(col[0], col[1], col[2], hsv, hsv+1, hsv+2); + + h= (FPICK+DPICK+BPICK)/3.0; + bt= uiDefButF(block, NUM, 0, "R ", 0, BPICK+2*DPICK+FPICK+20, h,20, col, 0.0, 1.0, 10, 2, ""); + uiButSetFunc(bt, do_palette1_cb, bt, but); + bt= uiDefButF(block, NUM, 0, "G ", h, BPICK+2*DPICK+FPICK+20, h,20, col+1, 0.0, 1.0, 10, 2, ""); + uiButSetFunc(bt, do_palette1_cb, bt, but); + bt= uiDefButF(block, NUM, 0, "B ", 2*h, BPICK+2*DPICK+FPICK+20, h,20, col+2, 0.0, 1.0, 10, 2, ""); + uiButSetFunc(bt, do_palette1_cb, bt, but); + + bt= uiDefButF(block, NUM, 0, "H ", 0, BPICK+2*DPICK+FPICK, h,20, hsv, 0.0, 1.0, 10, 2, ""); + uiButSetFunc(bt, do_palette1_cb, bt, but); + bt= uiDefButF(block, NUM, 0, "S ", h, BPICK+2*DPICK+FPICK, h,20, hsv+1, 0.0, 1.0, 10, 2, ""); + uiButSetFunc(bt, do_palette1_cb, bt, but); + bt= uiDefButF(block, NUM, 0, "V ", 2*h, BPICK+2*DPICK+FPICK, h,20, hsv+2, 0.0, 1.0, 10, 2, ""); + uiButSetFunc(bt, do_palette1_cb, bt, but); + + // safety + uiDefBut(block, LABEL, 0, "", -DPICK,-DPICK, FPICK+3*DPICK+BPICK, FPICK+4*DPICK+BPICK+40, NULL, 0.0, 0.0, 0, 0, ""); + + /* and lets go */ + block->direction= UI_TOP; + ui_positionblock(block, but); + block->win= G.curscreen->mainwin; + event= uiDoBlocks(&listb, 0); + + return but->retval; + +} + static int ui_do_but_HSVCUBE(uiBut *but) { uiBut *bt; @@ -2279,10 +2345,13 @@ static int ui_do_but_HSVCUBE(uiBut *but) /* assign position to color */ ui_get_but_vectorf(but, col); rgb_to_hsv(col[0], col[1], col[2], &h, &s, &v); + if(v==0.0) v= 0.001; + if(s==0.0) s= 0.001; if(but->a1==0) hsv_to_rgb(x, s, y, col, col+1, col+2); else if(but->a1==1) hsv_to_rgb(x, y, v, col, col+1, col+2); - else hsv_to_rgb(h, y, x, col, col+1, col+2); + else if(but->a1==2) hsv_to_rgb(h, y, x, col, col+1, col+2); + else hsv_to_rgb(x, s, v, col, col+1, col+2); ui_set_but_vectorf(but, col); diff --git a/source/blender/src/interface_draw.c b/source/blender/src/interface_draw.c index 8278a6babe6..d2b35be8a1b 100644 --- a/source/blender/src/interface_draw.c +++ b/source/blender/src/interface_draw.c @@ -1518,13 +1518,20 @@ static void ui_draw_but_HSVCUBE(uiBut *but) hsv_to_rgb(0.0, 1.0, v, &col1[3][0], &col1[3][1], &col1[3][2]); x= h; y= s; } - else { // S and V vary + else if(but->a1==2) { // S and V vary hsv_to_rgb(h, 0.0, 0.0, &col1[0][0], &col1[0][1], &col1[0][2]); hsv_to_rgb(h, 0.333, 0.0, &col1[1][0], &col1[1][1], &col1[1][2]); hsv_to_rgb(h, 0.666, 0.0, &col1[2][0], &col1[2][1], &col1[2][2]); hsv_to_rgb(h, 1.0, 0.0, &col1[3][0], &col1[3][1], &col1[3][2]); x= v; y= s; } + else { // only hue slider + hsv_to_rgb(0.0, 1.0, 1.0, &col1[0][0], &col1[0][1], &col1[0][2]); + VECCOPY(col1[1], col1[0]); + VECCOPY(col1[2], col1[0]); + VECCOPY(col1[3], col1[0]); + x= h; y= 0.5; + } for(dx=0.0; dx<1.0; dx+= 0.05) { // previous color @@ -1546,12 +1553,18 @@ static void ui_draw_but_HSVCUBE(uiBut *but) hsv_to_rgb(dx, 0.666, v, &col1[2][0], &col1[2][1], &col1[2][2]); hsv_to_rgb(dx, 1.0, v, &col1[3][0], &col1[3][1], &col1[3][2]); } - else { // S and V vary + else if(but->a1==2) { // S and V vary hsv_to_rgb(h, 0.0, dx, &col1[0][0], &col1[0][1], &col1[0][2]); hsv_to_rgb(h, 0.333, dx, &col1[1][0], &col1[1][1], &col1[1][2]); hsv_to_rgb(h, 0.666, dx, &col1[2][0], &col1[2][1], &col1[2][2]); hsv_to_rgb(h, 1.0, dx, &col1[3][0], &col1[3][1], &col1[3][2]); } + else { // only H + hsv_to_rgb(dx, 1.0, 1.0, &col1[0][0], &col1[0][1], &col1[0][2]); + VECCOPY(col1[1], col1[0]); + VECCOPY(col1[2], col1[0]); + VECCOPY(col1[3], col1[0]); + } // rect sx1= but->x1 + dx*(but->x2-but->x1); |