Making a colorpicker
cage
cage-dev at twistfold.it
Thu Aug 15 08:41:52 UTC 2019
On Wed, Aug 14, 2019 at 08:49:30PM +0200, Tom wrote:
> Hi,
Hello!
> I'm back from vacation and continuing my exploration of ltk.
Hope you had fun! :)
> I'm currently
> trying to build a color picker
i think this is an exercise (and a good one in my opinion) otherwise
please consider using:
https://www.tcl.tk/man/tcl8.6/TkCmd/chooseColor.htm
> and I'm modeling it after the blender color
> picker. To replicate how it looks I need a nice gradient. My first instinct
> was to just put a bunch of really small rectangles (pixels) on a canvas.
> This worked (see attachment), but it took about 5 minutes for all the pixels
> to be put on the canvas. Not ideal,
Yes, canvas is slow for these operations.
> especially if I have to redraw the
> gradient when the brightness value is changed by some slider or something.
> My next idea was to use a bitmap. This leads my to my first question: How do
> I get a bitmap on a canvas? I tried the following code.
Please note that 'bitmap' is for 1 bit color depth image (i e. two
color) plus a transparency binary value, according to the
documentation:
https://www.tcl.tk/man/tcl8.6/TkCmd/bitmap.htm
Moreover the format the library accepts is not MS bitmap but X11
bitmap format, never used but likely these are the specification
(please someone correct if i am wrong):
https://en.wikipedia.org/wiki/X_BitMap
What i think you need is a photo-image:
https://www.tcl.tk/man/tcl8.6/TkCmd/photo.htm
that, instead support 24bit (plus alpha in the upcoming 8.7 release of
tcl/tk) color depth image.
Tk supports only PNG and GIF format (you can write your own loader but
this is a more complicate task, so i will stick to PNG here):
(with-ltk ()
(let ((canvas (make-canvas nil :width 64 :height 64))
(image (make-image)))
(image-load image "/path/to/a/file/in/png/format.png")
(create-image canvas 0 0 :image image)
(pack canvas)))
>
> There is really no example given in the documentation. So I need help with
> this one (Using SBCL on Linux by the way).
>
> The next question is concerning transparent colors. To darken the gradient I
> thought of having an oval over the bitmap, on which I can change the
> transparency value. I haven't found a way to do that with "itemconfigure".
> And I also haven't found a place where all the keyword arguments are listed
> for "itemconfigure".
I suggest to look at the ltk sources and the official tk documentation.
https://www.tcl.tk/man/tcl8.6/TkCmd/canvas.htm
IIRC usually the options that 'ltk:itemconfigure' accepts are the same that
'ltk:create-*' accepts.
> I'm almost certain that there are no transparency
> options for canvas items in tcl/tk. But in case I've overlooked them, I'm
> asking anyway.
As far as i know there is not an alpha channel but probably you could
just do the calculation for transparency value outside and draw the
oval with the results color (in this case could be useful to look at
ltk:image-setpixel); this, also, could be a tedious and complex task
to accomplish, though.
>
> I'd also like to say that I accept tips on my approach. Is there an obvious
> solution that I'm missing or are there other general tips I need to figure
> it out myself. Please let me know! Thanks in advance for any help.
Well the best i can suggest is to take a look here :-)
https://github.com/VitoVan/cl-pkr
Bye, and happy hacking! :)
C.
PS: annoying legal stuff: all my code in this message is released under MIT license
https://opensource.org/licenses/MIT
More information about the ltk-user
mailing list