It is currently Fri Apr 19, 2024 5:21 pm


All times are UTC - 5 hours [ DST ]



Post new topic Reply to topic  [ 127 posts ]  Go to page 1, 2, 3, 4, 5 ... 7  Next
Author Message
 Post subject: Bytes and Pixels Vector Path plugin
PostPosted: Wed May 16, 2012 7:41 pm  (#1) 
Offline
GimpChat Member
User avatar

Joined: May 16, 2010
Posts: 14709
Location: USA
He tested it on Gimp-2.6 but i tested it in Gimp-2.8 and it does work.
Make sure and read the README file included in the zip download.(it gives you install instructions)
With the correct formula you could make some pretty cool knotwork with this one. :)
http://registry.gimp.org/node/26303

Example
Image

Example created finished path
Image

_________________
Image
Edmund Burke nailed it when he said, "The only thing necessary for the triumph of evil is for good men to do nothing."


Share on Facebook Share on Twitter Share on Orkut Share on Digg Share on MySpace Share on Delicious Share on Technorati
Top
 Post subject: Re: Bytes and Pixels Vector Path plugin
PostPosted: Wed May 16, 2012 7:42 pm  (#2) 
Offline
GimpChat Member
User avatar

Joined: May 16, 2010
Posts: 14709
Location: USA
I did have to make the canvas size larger after. The path was too long. :)

_________________
Image
Edmund Burke nailed it when he said, "The only thing necessary for the triumph of evil is for good men to do nothing."


Top
 Post subject: Re: Bytes and Pixels Vector Path plugin
PostPosted: Wed May 16, 2012 7:48 pm  (#3) 
Offline
GimpChat Member
User avatar

Joined: Sep 24, 2010
Posts: 12516
I've been waiting for B-and-P to release this one Rod; going to download it shortly and thanks for the heads up. :)

_________________
Lyle

Psalm 109:8

Image


Top
 Post subject: Re: Bytes and Pixels Vector Path plugin
PostPosted: Wed May 16, 2012 8:02 pm  (#4) 
Offline
GimpChat Member
User avatar

Joined: May 16, 2010
Posts: 14709
Location: USA
lylejk wrote:
I've been waiting for B-and-P to release this one Rod; going to download it shortly and thanks for the heads up. :)


I thought i saw he had some of the designs out there and i was wondering how he created them. This looks like a good one if you can figure out a few formulas. I assume if anyone creates a masterpiece they could share the formula with others. :) :bigthup - I could see saving a big collection of them somewhere.

I asked if B and P would consider adding a save preset or formula functionality.

_________________
Image
Edmund Burke nailed it when he said, "The only thing necessary for the triumph of evil is for good men to do nothing."


Top
 Post subject: Re: Bytes and Pixels Vector Path plugin
PostPosted: Wed May 16, 2012 8:09 pm  (#5) 
Offline
GimpChat Member
User avatar

Joined: Apr 30, 2010
Posts: 1937
Location: Missouri
That's a handy site, thanks

_________________
Image
The last time I kept an open mind,
my brain fell out and the dog grabbed it.
Now it's full of dirt, toothmarks, and dog slobber.
No more open minds or dogs for me.


Top
 Post subject: Re: Bytes and Pixels Vector Path plugin
PostPosted: Wed May 16, 2012 8:28 pm  (#6) 
Offline
GimpChat Member
User avatar

Joined: Sep 24, 2010
Posts: 12516
I noticed that the x and y should be swapped on his formula that he shared. Have to get a mathbook out to concoct some formulas for it though. lol

:)

_________________
Lyle

Psalm 109:8

Image


Top
 Post subject: Re: Bytes and Pixels Vector Path plugin
PostPosted: Wed May 16, 2012 8:52 pm  (#7) 
Offline
GimpChat Member
User avatar

Joined: May 16, 2010
Posts: 14709
Location: USA
I did this image with the last formula i tried.
Then did a stroke path then a theirs>pan to Bow, and then a alpha to selection on the pan bow layer and select to path.Then i stroked the path with the vine brush.
Then i did another alpha to selection and stroked with a dark green to bring it out more. :)

Image

_________________
Image
Edmund Burke nailed it when he said, "The only thing necessary for the triumph of evil is for good men to do nothing."


Top
 Post subject: Re: Bytes and Pixels Vector Path plugin
PostPosted: Wed May 16, 2012 9:09 pm  (#8) 
Offline
GimpChat Member
User avatar

Joined: Sep 24, 2010
Posts: 12516
It's what I do. lol

:)

Image

_________________
Lyle

Psalm 109:8

Image


Top
 Post subject: Re: Bytes and Pixels Vector Path plugin
PostPosted: Wed May 16, 2012 10:15 pm  (#9) 
Offline
GimpChat Member

Joined: Apr 29, 2012
Posts: 44
The length of the path is determined by the number of points, Rod.

I agree that there should be a Save/Load preset functionality, I just don't know how to do it.

I agree that there should be a database somewhere of formulae with screenshots, maybe start a thread for that purpose here or something.
I think my formula viewer app is perfect for that - users will just play with it, then do PrintScreen when something nice has came out, then post it. The only draw back here is that formulas will have to be manually typed from the image by others.:)

TIP: During development I saved a few formulas inside the script comments. Check them out, they still there. Actually, I'll paste it here for convenience:
            # loops vine
            #X = i*4+sin(i*0.1)*100
            #Y = 200+sin(i*0.05)*100*cos(i*0.1)

            # loops sym
            #X = i*2+(sin(i*0.05)*100)
            #Y = 200+sin(i*0.05)*100*cos(i*0.1)

            #loop chain border
            #X = i*4+sin(i*0.1)*sin(i*0.2)*100
            #Y = 200+sin(i*0.1)*cos(i*0.2)*100

            #X = i*6+sin(i*1.618)*sin(i*1.618)*100
            #Y = 200+cos(i*1.618)*sin(i*1.618)*80+sin(i*88)*200

            #sin(i)*50+sin(i*1.1)*5+i*pi+sin(i)*1.2
            #100+sin(i*1.1)*20+(sin(i)*20)

            #((i*0.8)*4)+(sin(i*0.1)*phi)+(sin(i*0.8)*10)
            #200+(sin(i*0.2)*20)*(sin(i*0.1)*phi)

            #((i*0.4)*4)+(sin(i*0.4)*phi)+(sin(i*0.6)*10)-(sin(i*0.4)*20)
            #100+(sin(i*0.2)*20)*(sin(i*0.2)*phi)

            #nice loops
            #((i*0.5)*5)+(sin(i*0.125)*100)
            #100+(sin(i*0.25)*20)+(cos(i*1)*0.25)


Top
 Post subject: Re: Bytes and Pixels Vector Path plugin
PostPosted: Thu May 17, 2012 3:19 am  (#10) 
Offline
GimpChat Member
User avatar

Joined: May 16, 2010
Posts: 14709
Location: USA
Thanks i will give those a tryout. :)

_________________
Image
Edmund Burke nailed it when he said, "The only thing necessary for the triumph of evil is for good men to do nothing."


Top
 Post subject: Re: Bytes and Pixels Vector Path plugin
PostPosted: Thu May 17, 2012 9:54 am  (#11) 
Offline
GimpChat Member
User avatar

Joined: Jan 20, 2012
Posts: 583
Why don't you just create a function that appends a .txt file with a preset formula. Then to read have it read each line as a new preset or have it separated by a special char.

_________________


"In the face of adversity, there's three things: fly, freeze or fight; We're choosing to fight..."- Guy Boucher, Tampa Bay Lighting Head Coach


Top
 Post subject: Re: Bytes and Pixels Vector Path plugin
PostPosted: Thu May 17, 2012 10:15 am  (#12) 
Offline
GimpChat Member
User avatar

Joined: Jan 20, 2012
Posts: 583
Would seem to be simple.
Create your "formula" have it in a set format. (Not true code but you should be able to understand)
Like this:
saveFormula(String name, String XForm, String YForm, Int pointsAmt){
appendText("formulas.txt",saveFormula());

_________________


"In the face of adversity, there's three things: fly, freeze or fight; We're choosing to fight..."- Guy Boucher, Tampa Bay Lighting Head Coach


Top
 Post subject: Re: Bytes and Pixels Vector Path plugin
PostPosted: Fri May 18, 2012 1:36 pm  (#13) 
Offline
GimpChat Member
User avatar

Joined: Jan 20, 2012
Posts: 583
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Color Grading v1.5.2
# Copyright (c) 2012 John Lakkas
# john_lakkas@yahoo.gr
# Licence: GNU GPLv3  ( http://www.gnu.org/licenses/ )

# This program is distributed WITHOUT ANY WARRANTY.
# You using it in your own risk.

# Version: 1.5.2
# > GIMP 2.8 compatibility fixes
# > Code cleaning
# Version: 1.5.1
# > Code bugfix
# Version: 1.5
# > Information pane for applying the corrections in another program
# > Profiles
# Version: 1.4
# > Major engine refactoring
# > Speed improvement
# Version: 1.3
# > Double version slider/colorwheel availability
# > UI reshaping to look like professional tools
# > Midtones bugfix
# Version: 1.2
# > saturation introduced
# Version: 1.1
# > levels introduced
# Version: 1.0
# > first production version

# Preview function taken from:
# python High Pass Sharpen
# version-1.2 01/04/2010
# Copyright (c) 2008-2010 Paul Sherman
# inspired by layerfx.py by Jonathan Stipe
# and the high-pass-sharpen.scm by Martin Egger

# HSV conversions taken from libgimpcolor/gimphsv.c
# LIBGIMP - The GIMP Library
# Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball

# From the following links:
# http://www.gimphelp.org/python_fu.shtml
# http://www.gimphelp.org/scripts/high_end_sharpen_py.shtml

import gimp, gimpplugin, math
from gimpenums import *
pdb = gimp.pdb
import gtk, gimpui, gimpcolor
from gimpshelf import shelf

import os
#import numpy
import math
import cairo
import ConfigParser
import string

class reuse_init(object):
   previewLayer = None

   def get_layer_pos(self, layer):
      i = 0
      while i < len(self.img.layers):
         if layer == self.img.layers[i]:
            return i
      else:
         i += 1
      return -1


   def layer_exists(self, layer):
      return layer != None and layer in self.img.layers

   def removePreviews(self):
      if self.layer_exists(self.previewLayer):
         self.img.remove_layer(self.previewLayer)
         self.previewLayer = None
      gimp.displays_flush()

   def make_label(self, text):
      label = gtk.Label(text)
      label.set_use_underline(True)
      label.set_alignment(1.0, 0.5)
      label.show()
      return label

   def make_slider_and_spinner(self, init, min, max, step, page, digits):
      controls = {'adj':gtk.Adjustment(init, min, max, step, page), 'slider':gtk.HScale(), 'spinner':gtk.SpinButton()}
      controls['slider'].set_adjustment(controls['adj'])
      controls['slider'].set_draw_value(False)
      controls['spinner'].set_adjustment(controls['adj'])
      controls['spinner'].set_digits(digits)
      controls['slider'].show()
      controls['spinner'].show()
      return controls

   def show_error_msg(self, msg):
      origMsgHandler = pdb.gimp_message_get_handler()
      pdb.gimp_message_set_handler(ERROR_CONSOLE)
      pdb.gimp_message(msg)
      pdb.gimp_message_set_handler(origMsgHandler)

   def stringToColor(self, string):
      colorlist = string[5:-1].split(", ")
      return gimpcolor.RGB(float(colorlist[0]), float(colorlist[1]), float(colorlist[2]), float(colorlist[3]))


class color_grading_cw(reuse_init):
   def __init__(self, runmode, img, drawable, shh, shs, shlev, midh, mids, midlev, highh, highs, highlev, satlev):
      self.img = img
      self.drawable = drawable
      #self.shelfkey = 'layerfx-drop-shadow'
      #print "runmode:"
      #print runmode
      if (runmode ==0 ):
         self.showDialog()
      else:
         fxlayer = self.makeLayer(self.img, self.drawable,
                           shh,
                           shs,
                           shlev,
                           midh,
                           mids,
                           midlev,
                           highh,
                           highs,
                           highlev,
                           satlev
                           )

   def showDialog(self):
      self.dialog = gimpui.Dialog("Color Grading", "colorgradingdialog")

      #notebook page1

      self.table = gtk.Table(5, 3, True)
      self.table.set_homogeneous(False)
      self.table.set_row_spacings(8)
      self.table.set_col_spacings(8)
      self.table.set_border_width(10)
      self.table.show()
      
      filename = os.path.join(os.path.expanduser("~"), ".gimp-2.8", "plug-ins", "colorwheel_150.png")
      self.pixbuf = gtk.gdk.pixbuf_new_from_file(filename)
      
      self.wheel_sh = ColorWheel(self.pixbuf, 75, 75, 75)
      self.wheel_sh.show()
      self.wheel_mid = ColorWheel(self.pixbuf, 75, 75, 75)
      self.wheel_mid.show()
      self.wheel_high = ColorWheel(self.pixbuf, 75, 75, 75)
      self.wheel_high.show()
      self.table.attach(self.wheel_sh, 0, 1, 1, 2)
      self.table.attach(self.wheel_mid, 1, 2, 1, 2)
      self.table.attach(self.wheel_high, 2, 3, 1, 2)
      
      self.shlev_label = self.make_label("Shadows level:")
      self.midlev_label = self.make_label("Midtones level:")
      self.highlev_label = self.make_label("Highlights level:")
      self.satlev_label = self.make_label("Saturation:")

      self.table.attach(self.shlev_label, 0, 1, 2, 3)
      self.table.attach(self.midlev_label, 1, 2, 2, 3)
      self.table.attach(self.highlev_label, 2, 3, 2, 3)
      self.table.attach(self.satlev_label, 0, 1, 5, 6)

      self.shlev_spinner = self.make_slider_and_spinner(0, -100, 100, 1, 1, 0)
      self.midlev_spinner = self.make_slider_and_spinner(0, -100, 100, 1, 1, 0)
      self.highlev_spinner = self.make_slider_and_spinner(0, -100, 100, 1, 1, 0)
      self.satlev_spinner = self.make_slider_and_spinner(0, -100, 100, 1, 1, 0)
      
      self.shlev_spinner['adj'].set_value(0)
      self.midlev_spinner['adj'].set_value(0)
      self.highlev_spinner['adj'].set_value(0)
      self.satlev_spinner['adj'].set_value(0)
      
      self.shlev_label.set_mnemonic_widget(self.shlev_spinner['spinner'])
      self.midlev_label.set_mnemonic_widget(self.midlev_spinner['spinner'])
      self.highlev_label.set_mnemonic_widget(self.highlev_spinner['spinner'])
      self.satlev_label.set_mnemonic_widget(self.satlev_spinner['spinner'])
      
      self.table.attach(self.shlev_spinner['slider'], 0, 1, 3, 4)
      self.table.attach(self.midlev_spinner['slider'], 1, 2, 3, 4)
      self.table.attach(self.highlev_spinner['slider'], 2, 3, 3, 4)
      self.table.attach(self.satlev_spinner['slider'], 1, 2, 5, 6)

      self.table.attach(self.shlev_spinner['spinner'], 0, 1, 4, 5)
      self.table.attach(self.midlev_spinner['spinner'], 1, 2, 4, 5)
      self.table.attach(self.highlev_spinner['spinner'], 2, 3, 4, 5)
      self.table.attach(self.satlev_spinner['spinner'], 2, 3, 5, 6)
      
      #notebook page2

      self.table2 = gtk.Table(13, 2, True)
      self.table2.set_homogeneous(False)
      self.table2.set_row_spacings(8)
      self.table2.set_col_spacings(8)
      self.table2.set_border_width(10)
      self.table2.show()
      
      #self.table2.set_col_spacing(1, 40)
      
      self.sh_hsv_label = self.make_label("Shadows HSV:")
      self.mid_hsv_label = self.make_label("Midtones HSV:")
      self.high_hsv_label = self.make_label("Highlights HSV:")
      
      self.sh_hsvv_label = self.make_label("1,1,1")
      self.mid_hsvv_label = self.make_label("1,1,1")
      self.high_hsvv_label = self.make_label("1,1,1")
      self.sh_hsvv_label.set_alignment(0.0, 0.5)
      self.mid_hsvv_label.set_alignment(0.0, 0.5)
      self.high_hsvv_label.set_alignment(0.0, 0.5)
      
      self.rch_label = self.make_label("Red Levels:")
      self.gch_label = self.make_label("Green Levels:")
      self.bch_label = self.make_label("Blue Levels:")

      self.rinp_label = self.make_label("Input:")
      self.ginp_label = self.make_label("Input:")
      self.binp_label = self.make_label("Input:")
      self.rout_label = self.make_label("Output:")
      self.gout_label = self.make_label("Output:")
      self.bout_label = self.make_label("Output:")
      
      self.sat_label = self.make_label("Saturation:")
      self.satv_label = self.make_label("1")
      self.satv_label.set_alignment(0.0, 0.5)
      
      self.rinpv_label = self.make_label("1")
      self.ginpv_label = self.make_label("1")
      self.binpv_label = self.make_label("1")
      self.routv_label = self.make_label("1")
      self.goutv_label = self.make_label("1")
      self.boutv_label = self.make_label("1")
      
      self.rinpv_label.set_alignment(0.0, 0.5)
      self.ginpv_label.set_alignment(0.0, 0.5)
      self.binpv_label.set_alignment(0.0, 0.5)
      self.routv_label.set_alignment(0.0, 0.5)
      self.goutv_label.set_alignment(0.0, 0.5)
      self.boutv_label.set_alignment(0.0, 0.5)
      
      self.table2.attach(self.sh_hsv_label, 0, 1, 0, 1)
      self.table2.attach(self.mid_hsv_label, 0, 1, 1, 2)
      self.table2.attach(self.high_hsv_label, 0, 1, 2, 3)
      self.table2.attach(self.sh_hsvv_label, 1, 2, 0, 1)
      self.table2.attach(self.mid_hsvv_label, 1, 2, 1, 2)
      self.table2.attach(self.high_hsvv_label, 1, 2, 2, 3)
      
      self.table2.attach(self.rch_label, 0, 1, 4, 5)
      self.table2.attach(self.rinp_label, 0, 1, 5, 6)
      self.table2.attach(self.rout_label, 0, 1, 6, 7)
      self.table2.attach(self.gch_label, 0, 1, 7, 8)
      self.table2.attach(self.ginp_label, 0, 1, 8, 9)
      self.table2.attach(self.gout_label, 0, 1, 9, 10)
      self.table2.attach(self.bch_label, 0, 1, 10, 11)
      self.table2.attach(self.binp_label, 0, 1, 11, 12)
      self.table2.attach(self.bout_label, 0, 1, 12, 13)
      self.table2.attach(self.sat_label, 0, 1, 13, 14)
      
      self.table2.attach(self.rinpv_label, 1, 2, 5, 6)
      self.table2.attach(self.routv_label, 1, 2, 6, 7)
      self.table2.attach(self.ginpv_label, 1, 2, 8, 9)
      self.table2.attach(self.goutv_label, 1, 2, 9, 10)
      self.table2.attach(self.binpv_label, 1, 2, 11, 12)
      self.table2.attach(self.boutv_label, 1, 2, 12, 13)
      self.table2.attach(self.satv_label, 1, 2, 13, 14)
      
      #notebook page3
      
      self.table3 = gtk.Table(5, 1, True)
      self.table3.set_homogeneous(False)
      self.table3.set_row_spacings(8)
      self.table3.set_col_spacings(8)
      self.table3.set_border_width(10)
      self.table3.show()
      
      self.liststore = gtk.ListStore(int, str)
      #self.liststore.append([1, 'Profile 1'])
      self.prof_list = gtk.TreeView(self.liststore)
      cell_renderer = gtk.CellRendererText()
      column0 = gtk.TreeViewColumn('id', cell_renderer, text=0)
      column1 = gtk.TreeViewColumn('Profile Name', cell_renderer, text=1)
      column0.set_resizable(True)
      column1.set_resizable(True)
      self.prof_list.append_column(column0)
      self.prof_list.append_column(column1)
      self.prof_list.connect("cursor-changed", self.prof_list_selection)
      self.prof_list.show()
      self.selected_profile = -1
      
      self.table3.attach(self.prof_list, 0, 1, 0, 1, gtk.FILL | gtk.EXPAND, gtk.FILL | gtk.EXPAND)
      
      self.prof_name_text = gtk.Entry()
      self.prof_name_text.show()
      
      self.load_profile_button = gtk.Button("Load Profile")
      self.saveas_profile_button = gtk.Button("Save As Profile")
      self.delete_profile_button = gtk.Button("Delete Profile")
      self.load_profile_button.connect("clicked", self.load_sel_profile)
      self.saveas_profile_button.connect("clicked", self.saveas_sel_profile)
      self.delete_profile_button.connect("clicked", self.delete_sel_profile)
      self.load_profile_button.show()
      self.saveas_profile_button.show()
      self.delete_profile_button.show()
      
      self.table3.attach(self.load_profile_button, 0, 1, 1, 2, gtk.FILL, gtk.FILL)
      self.table3.attach(self.delete_profile_button, 0, 1, 2, 3, gtk.FILL, gtk.FILL)
      self.table3.attach(self.saveas_profile_button, 0, 1, 3, 4, gtk.FILL, gtk.FILL)
      self.table3.attach(self.prof_name_text, 0, 1, 4, 5, gtk.FILL, gtk.FILL)
      
      
      #notebook definition
      
      self.notebook = gtk.Notebook()
      self.notebook.connect("switch-page", self.refresh_info)
      self.notebook.show()
      
      self.nb_label1 = gtk.Label('Color Wheels')
      self.nb_label1.show()
      self.nb_label2 = gtk.Label('Information')
      self.nb_label2.show()
      self.nb_label3 = gtk.Label('Profiles')
      self.nb_label3.show()

      self.notebook.append_page(self.table, self.nb_label1)
      self.notebook.append_page(self.table2, self.nb_label2)
      self.notebook.append_page(self.table3, self.nb_label3)
      
      #Profile loading: If file does not exist create one.
      self.parser = ConfigParser.SafeConfigParser(
         defaults={
            'name':'Default profile',
            'shadowshsv': '0.0|0.0|0.0',
            'midtoneshsv': '0.0|0.0|0.0',
            'highlightshsv': '0.0|0.0|0.0',
            'redlevels_in': '0|1.0|255',
            'greenlevels_in': '0|1.0|255',
            'bluelevels_in': '0|1.0|255',
            'redlevels_out': '0|255',
            'greenlevels_out': '0|255',
            'bluelevels_out': '0|255',
            'saturation': '0',
            'shadowslev': '0',
            'midtoneslev': '0',
            'highlightslev': '0'
            })
      
      self.profile_filename = os.path.join(os.path.expanduser("~"), ".gimp-2.8", "plug-ins", "colorgrading.profiles")
      if (os.path.isfile(self.profile_filename) == True):
         self.parser.read(self.profile_filename)
      else:
         self.parser.add_section('Profiles')
         self.parser.set('Profiles', 'list', 'DEFAULT')
         self.parser.set('Profiles', 'userprofileprefix', 'Prof')
         self.parser.set('Profiles', 'integercurrent', '0')
         
         f = file(self.profile_filename, 'w')
         self.parser.write(f)
         f.close()
         
      self.refresh_prof_list()
      self.load_profile('DEFAULT')
      
      # Rest UI loading stuff
      
      self.dialog.vbox.hbox1 = gtk.HBox(False, 7)
      self.dialog.vbox.hbox1.show()
      self.dialog.vbox.pack_start(self.dialog.vbox.hbox1, True, True, 7)
      self.dialog.vbox.hbox1.pack_start(self.notebook, True, True, 7)
      
      reset_button = gtk.Button("_Reset")
      reset_button.connect("clicked", self.resetbutton)
      reset_button.show()
      
      self.preview_button = gtk.Button("Preview")
      self.preview_button.connect("clicked", self.preview)
      self.preview_button.set_size_request(100, -1)
      self.preview_button.show()
      
      if gtk.alternative_dialog_button_order():
         ok_button = self.dialog.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
         cancel_button = self.dialog.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
         self.dialog.action_area.add(reset_button)
         self.dialog.action_area.add(self.preview_button)
      else:
         self.dialog.action_area.add(self.preview_button)
         self.dialog.action_area.add(reset_button)
         cancel_button = self.dialog.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
         ok_button = self.dialog.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
      ok_button.connect("clicked", self.okbutton)
      
      self.dialog.show()
      self.dialog.run()
      self.removePreviews()
      
   
   def refresh_info(self, widget, page, page_num):
      if (page_num == 1):
         sh_hsv = self.wheel_sh.get_wheel_hsv()
         mid_hsv = self.wheel_mid.get_wheel_hsv()
         high_hsv = self.wheel_high.get_wheel_hsv()
      
         sh_hsv_str = "{0}, {1}, {2}".format( str(round(sh_hsv[0],1)), str(round(sh_hsv[1],3)), str(round(sh_hsv[2],2)) )
         mid_hsv_str = "{0}, {1}, {2}".format( str(round(mid_hsv[0],1)), str(round(mid_hsv[1],3)), str(round(mid_hsv[2],2)) )
         high_hsv_str = "{0}, {1}, {2}".format( str(round(high_hsv[0],1)), str(round(high_hsv[1],3)), str(round(high_hsv[2],2)) )
         
         self.sh_hsvv_label.set_text(sh_hsv_str)
         self.mid_hsvv_label.set_text(mid_hsv_str)
         self.high_hsvv_label.set_text(high_hsv_str)
         
         rgbshift = self.convert_to_rgbshifts(
                                 self.wheel_sh.hsv[0],
                                 self.wheel_sh.hsv[1],
                                 self.shlev_spinner['adj'].get_value(),
                                 self.wheel_mid.hsv[0],
                                 self.wheel_mid.hsv[1],
                                 self.midlev_spinner['adj'].get_value(),
                                 self.wheel_high.hsv[0],
                                 self.wheel_high.hsv[1],
                                 self.highlev_spinner['adj'].get_value(),
                                 self.satlev_spinner['adj'].get_value()
                                 )
         
         levels = self.convert_to_levels(rgbshift[0], rgbshift[1], rgbshift[2], rgbshift[3], rgbshift[4], rgbshift[5], rgbshift[6], rgbshift[7], rgbshift[8], rgbshift[9], rgbshift[10], rgbshift[11], rgbshift[12])
         
         redinp = "{0}  {1}  {2}".format( str(int(levels[0][0])), str(round(levels[0][2],2)), str(int(levels[0][1])) )
         redout = "{0}  {1}".format( str(int(levels[0][3])), str(int(levels[0][4])) )
         greeninp = "{0}  {1}  {2}".format( str(int(levels[1][0])), str(round(levels[1][2],2)), str(int(levels[1][1])) )
         greenout = "{0}  {1}".format( str(int(levels[1][3])), str(int(levels[1][4])) )
         blueinp = "{0}  {1}  {2}".format( str(int(levels[2][0])), str(round(levels[2][2],2)), str(int(levels[2][1])) )
         blueout = "{0}  {1}".format( str(int(levels[2][3])), str(int(levels[2][4])) )
         sat = str(int(levels[3][0]))
         
         self.rinpv_label.set_text(redinp)
         self.routv_label.set_text(redout)
         self.ginpv_label.set_text(greeninp)
         self.goutv_label.set_text(greenout)
         self.binpv_label.set_text(blueinp)
         self.boutv_label.set_text(blueout)
         self.satv_label.set_text(sat)
         
   
   def refresh_prof_list(self):
      self.profiles = string.split(self.parser.get('Profiles', 'list'), '|')
      self.profile_int = int(self.parser.get('Profiles', 'integercurrent'))
      self.liststore.clear()
      n = len(self.profiles)
      for i in range(0, n):
         name = self.parser.get(self.profiles[i], 'name')
         self.liststore.append([i, name])
   
   
   def prof_list_selection(self, widget):
      treeselection = widget.get_selection()
      selection = treeselection.get_selected()
      treemodel = selection[0]
      treeiter = selection[1]
      self.selected_profile = treemodel.get_value(treeiter, 0)
      #print treemodel.get_value(treeiter, 0)
      self.prof_name_text.set_text(treemodel.get_value(treeiter, 1))
      
      if (self.selected_profile == 0):
         self.delete_profile_button.set_sensitive(False)
      else:
         self.delete_profile_button.set_sensitive(True)
   
   
   def load_profile(self, profile_internal_name):
      hsv = string.split(self.parser.get(profile_internal_name, 'shadowshsv'), '|')
      sh_hsv = [float(hsv[0]), float(hsv[1]), float(hsv[2])]
      hsv = string.split(self.parser.get(profile_internal_name, 'midtoneshsv'), '|')
      mid_hsv = [float(hsv[0]), float(hsv[1]), float(hsv[2])]
      hsv = string.split(self.parser.get(profile_internal_name, 'highlightshsv'), '|')
      high_hsv = [float(hsv[0]), float(hsv[1]), float(hsv[2])]
      
      self.shlev_spinner['adj'].set_value( float(self.parser.get(profile_internal_name, 'shadowslev')) )
      self.midlev_spinner['adj'].set_value( float(self.parser.get(profile_internal_name, 'midtoneslev')) )
      self.highlev_spinner['adj'].set_value( float(self.parser.get(profile_internal_name, 'highlightslev')) )
      self.satlev_spinner['adj'].set_value( float(self.parser.get(profile_internal_name, 'saturation')) )
      
      self.wheel_sh.set_wheel_hsv(sh_hsv)
      self.wheel_mid.set_wheel_hsv(mid_hsv)
      self.wheel_high.set_wheel_hsv(high_hsv)
   
   
   def load_sel_profile(self, widget):
      self.load_profile(self.profiles[self.selected_profile])
      self.wheel_sh.refresh_view()
      self.wheel_mid.refresh_view()
      self.wheel_high.refresh_view()
   
   
   def saveas_sel_profile(self, widget):
      exists = False
      internal_name = ""
      profile_name = self.prof_name_text.get_text()
      
      if (profile_name != ""):
         n = len(self.profiles)
         for i in range(0, n):
            name = self.parser.get(self.profiles[i], 'name')
            if (profile_name == name):
               exists = True
               internal_name = self.profiles[i]
               break
      
         if (exists == False):
            internal_name = self.parser.get('Profiles', 'userprofileprefix') + str( int(self.parser.get('Profiles', 'integercurrent')) +1 )
            self.parser.add_section(internal_name)
            self.profile_int = self.profile_int + 1
            self.parser.set('Profiles', 'integercurrent', str(self.profile_int))
            self.profiles = self.profiles.append(internal_name)
            self.parser.set('Profiles', 'list', self.parser.get('Profiles', 'list') + "|" + internal_name )
      
         self.parser.set(internal_name, 'name', profile_name)
      
         sh_hsv = self.wheel_sh.get_wheel_hsv()
         mid_hsv = self.wheel_mid.get_wheel_hsv()
         high_hsv = self.wheel_high.get_wheel_hsv()
      
         sh_hsv_str = "{0}|{1}|{2}".format( str(round(sh_hsv[0],1)), str(round(sh_hsv[1],3)), str(round(sh_hsv[2],2)) )
         mid_hsv_str = "{0}|{1}|{2}".format( str(round(mid_hsv[0],1)), str(round(mid_hsv[1],3)), str(round(mid_hsv[2],2)) )
         high_hsv_str = "{0}|{1}|{2}".format( str(round(high_hsv[0],1)), str(round(high_hsv[1],3)), str(round(high_hsv[2],2)) )
      
         rgbshift = self.convert_to_rgbshifts(
                                 self.wheel_sh.hsv[0],
                                 self.wheel_sh.hsv[1],
                                 self.shlev_spinner['adj'].get_value(),
                                 self.wheel_mid.hsv[0],
                                 self.wheel_mid.hsv[1],
                                 self.midlev_spinner['adj'].get_value(),
                                 self.wheel_high.hsv[0],
                                 self.wheel_high.hsv[1],
                                 self.highlev_spinner['adj'].get_value(),
                                 self.satlev_spinner['adj'].get_value()
                                 )
         
         levels = self.convert_to_levels(rgbshift[0], rgbshift[1], rgbshift[2], rgbshift[3], rgbshift[4], rgbshift[5], rgbshift[6], rgbshift[7], rgbshift[8], rgbshift[9], rgbshift[10], rgbshift[11], rgbshift[12])
      
         redinp = "{0}|{1}|{2}".format( str(int(levels[0][0])), str(round(levels[0][2],2)), str(int(levels[0][1])) )
         redout = "{0}|{1}".format( str(int(levels[0][3])), str(int(levels[0][4])) )
         greeninp = "{0}|{1}|{2}".format( str(int(levels[1][0])), str(round(levels[1][2],2)), str(int(levels[1][1])) )
         greenout = "{0}|{1}".format( str(int(levels[1][3])), str(int(levels[1][4])) )
         blueinp = "{0}|{1}|{2}".format( str(int(levels[2][0])), str(round(levels[2][2],2)), str(int(levels[2][1])) )
         blueout = "{0}|{1}".format( str(int(levels[2][3])), str(int(levels[2][4])) )
         sat = str(int(levels[3][0]))
      
         self.parser.set(internal_name, 'shadowshsv', sh_hsv_str)
         self.parser.set(internal_name, 'midtoneshsv', mid_hsv_str)
         self.parser.set(internal_name, 'highlightshsv', high_hsv_str)
      
         self.parser.set(internal_name, 'redlevels_in', redinp)
         self.parser.set(internal_name, 'greenlevels_in', greeninp)
         self.parser.set(internal_name, 'bluelevels_in', blueinp)
         self.parser.set(internal_name, 'redlevels_out', redout)
         self.parser.set(internal_name, 'greenlevels_out', greenout)
         self.parser.set(internal_name, 'bluelevels_out', blueout)
      
         self.parser.set(internal_name, 'saturation', sat)
         self.parser.set(internal_name, 'shadowslev', str(self.shlev_spinner['adj'].get_value()))
         self.parser.set(internal_name, 'midtoneslev', str(self.midlev_spinner['adj'].get_value()))
         self.parser.set(internal_name, 'highlightslev', str(self.highlev_spinner['adj'].get_value()))
      
         f = file(self.profile_filename, 'w')
         self.parser.write(f)
         f.close()
      
         self.refresh_prof_list()
   
   
   def delete_sel_profile(self, widget):
      self.parser.remove_section(self.profiles[self.selected_profile])
      
      new_profiles = ""
      
      n = len(self.profiles)
      j = 0
      for i in range(0, n):
         if (self.selected_profile != i):
            j = j +1
            if (j != n-1):
               new_profiles = new_profiles + self.profiles[i] + "|"
            else:
               new_profiles = new_profiles + self.profiles[i]
      
      self.parser.set('Profiles', 'list', new_profiles)
      self.profiles = string.split(self.parser.get('Profiles', 'list'), '|')
      
      f = file(self.profile_filename, 'w')
      self.parser.write(f)
      f.close()
      
      self.refresh_prof_list()
   
   
   def okbutton(self, widget):
      # remove old preview layer if it exists
      if self.layer_exists(self.previewLayer):
         self.img.remove_layer(self.previewLayer)
         self.previewLayer = None

      # then build new layer with current settings to actually impliment...
      fxlayer = self.makeLayer(self.img, self.drawable,
         self.wheel_sh.hsv[0],
         self.wheel_sh.hsv[1],
         self.shlev_spinner['adj'].get_value(),
         self.wheel_mid.hsv[0],
         self.wheel_mid.hsv[1],
         self.midlev_spinner['adj'].get_value(),
         self.wheel_high.hsv[0],
         self.wheel_high.hsv[1],
         self.highlev_spinner['adj'].get_value(),
         self.satlev_spinner['adj'].get_value()
         )


   def resetbutton(self, widget):
      self.wheel_sh.reset()
      self.shlev_spinner['adj'].set_value(0)
      self.wheel_mid.reset()
      self.midlev_spinner['adj'].set_value(0)
      self.wheel_high.reset()
      self.highlev_spinner['adj'].set_value(0)
      self.satlev_spinner['adj'].set_value(0)


   def preview(self, widget):
      ptxt = self.preview_button.get_label()

      if self.layer_exists(self.previewLayer):
         self.img.remove_layer(self.previewLayer)
         gimp.displays_flush()

      else:
         self.previewLayer = self.makeLayer(self.img, self.drawable,
            self.wheel_sh.hsv[0],
            self.wheel_sh.hsv[1],
            self.shlev_spinner['adj'].get_value(),
            self.wheel_mid.hsv[0],
            self.wheel_mid.hsv[1],
            self.midlev_spinner['adj'].get_value(),
            self.wheel_high.hsv[0],
            self.wheel_high.hsv[1],
            self.highlev_spinner['adj'].get_value(),
            self.satlev_spinner['adj'].get_value()
            )


      if ptxt == "Preview":
         ptxt = "Undo Preview"
      else:
         ptxt = "Preview"
      self.preview_button.set_label(ptxt)
   
   
   def convert_to_rgbshifts(self, shh, shs, shlev, midh, mids, midlev, highh, highs, highlev, satlev):
      hsvsh = [shh, 1.0, shs * 0.40]
      hsvmid = [midh, 1.0, mids * 0.40]
      hsvhigh = [highh, 1.0, highs * 0.40]
      
      hsvtool = HSVbasics()
      
      rgbsh = hsvtool.gimp_hsv_to_rgb4(hsvsh)
      rgbmid = hsvtool.gimp_hsv_to_rgb4(hsvmid)
      rgbhigh = hsvtool.gimp_hsv_to_rgb4(hsvhigh)
      
      crsh = rgbsh[0]
      mgsh = rgbsh[1]
      ybsh = rgbsh[2]
      crmid = rgbmid[0]
      mgmid = rgbmid[1]
      ybmid = rgbmid[2]
      crhigh = rgbhigh[0]
      mghigh = rgbhigh[1]
      ybhigh = rgbhigh[2]
      return [crsh, mgsh, ybsh, shlev, crmid, mgmid, ybmid, midlev, crhigh, mghigh, ybhigh, highlev, satlev]
      
   
   def convert_to_levels(self, crsh, mgsh, ybsh, shlev, crmid, mgmid, ybmid, midlev, crhigh, mghigh, ybhigh, highlev, satlev):
      lowinred=0
      hiinred=255
      lowingreen=0
      hiingreen=255
      lowinblue=0
      hiinblue=255
      
      gammared=0.
      gammagreen=0.
      gammablue=0.
      
      lowoutred=0
      hioutred=255
      lowoutgreen=0
      hioutgreen=255
      lowoutblue=0
      hioutblue=255
      
      lowred = 0
      lowgreen = 0
      lowblue = 0
      
      lowin=0
      hiin=255
      lowout=0
      hiout=255
      gamma=1.

      #MIDTONES
      if (crmid > 0.):
         gammared = gammared +0.4*crmid/100.
         gammagreen = gammagreen -0.3*crmid/100.
         gammablue = gammablue -0.3*crmid/100.
      if (crmid < 0.):
         gammared = gammared +0.3*crmid/100.
         gammagreen = gammagreen -0.4*crmid/100.
         gammablue = gammablue -0.4*crmid/100.
      if (mgmid > 0.):
         gammared = gammared -0.3*mgmid/100.
         gammagreen = gammagreen +0.4*mgmid/100.
         gammablue = gammablue -0.3*mgmid/100.
      if (mgmid < 0.):
         gammared = gammared -0.4*mgmid/100.
         gammagreen = gammagreen +0.3*mgmid/100.
         gammablue = gammablue -0.4*mgmid/100.
      if (ybmid > 0.):
         gammared = gammared -0.3*ybmid/100.
         gammagreen = gammagreen -0.3*ybmid/100.
         gammablue = gammablue +0.4*ybmid/100.
      if (ybmid < 0.):
         gammared = gammared -0.4*ybmid/100.
         gammagreen = gammagreen -0.4*ybmid/100.
         gammablue = gammablue +0.3*ybmid/100.
      gammared = gammared +1.
      gammagreen = gammagreen +1.
      gammablue = gammablue +1.
      
      if (midlev > 0.):
         gammared = gammared +0.4*midlev/100.
         gammagreen = gammagreen +0.4*midlev/100.

         gammablue = gammablue +0.4*midlev/100.
      if (midlev < 0.):
         gammared = gammared +0.3*midlev/100.
         gammagreen = gammagreen +0.3*midlev/100.
         gammablue = gammablue +0.3*midlev/100.
      
      
      #SHADOWS
      crsh = crsh * 0.3
      mgsh = mgsh * 0.3
      ybsh = ybsh * 0.3
      
      if (crsh>0):
         lowingreen = lowingreen + crsh
         lowinblue = lowinblue + crsh
         lowoutred = lowoutred + crsh
      else:
         lowinred = lowinred - crsh
         lowoutgreen = lowoutgreen - crsh
         lowoutblue = lowoutblue - crsh
      
      if (mgsh>0):
         lowinred = lowinred + mgsh
         lowinblue = lowinblue + mgsh
         lowoutgreen = lowoutgreen + mgsh
      else:
         lowingreen = lowingreen - mgsh
         lowoutred = lowoutred - mgsh
         lowoutblue = lowoutblue - mgsh
      
      if (ybsh>0):
         lowinred = lowinred + ybsh
         lowingreen = lowingreen + ybsh
         lowoutblue = lowoutblue + ybsh
      else:
         lowinblue = lowinblue - ybsh
         lowoutred = lowoutred - ybsh
         lowoutgreen = lowoutgreen - ybsh
      
      
      if (shlev>0):
         lowoutred = lowoutred + shlev
         lowoutgreen = lowoutgreen + shlev
         lowoutblue = lowoutblue + shlev
      if (shlev<0):
         lowinred = lowinred - shlev
         lowingreen = lowingreen - shlev
         lowinblue = lowinblue - shlev
      
      
      #HIGHLIGHTS
      crhigh = crhigh * 0.3
      mghigh = mghigh * 0.3
      ybhigh = ybhigh * 0.3
      
      if (crhigh>0):
         hiinred = hiinred - crhigh
         hioutgreen = hioutgreen - crhigh
         hioutblue = hioutgreen - crhigh
      else:
         hiingreen = hiingreen + crhigh
         hiinblue = hiinblue + crhigh
         hioutred = hioutred + crhigh
      
      if (mghigh>0):
         hiingreen = hiingreen - mghigh
         hioutred = hioutred - mghigh
         hioutblue = hioutblue - mghigh
      else:
         hiinred = hiinred + mghigh
         hiinblue = hiinblue + mghigh
         hioutgreen = hioutgreen + mghigh
      
      if (ybhigh>0):
         hiinblue = hiinblue - ybhigh
         hioutred = hioutred - ybhigh
         hioutgreen = hioutgreen - ybhigh
      else:
         hiinred = hiinred + ybhigh
         hiingreen = hiingreen + ybhigh
         hioutblue = hioutblue + ybhigh
      
      if (highlev>0):
         hiinred = hiinred - highlev

         hiingreen = hiingreen - highlev
         hiinblue = hiinblue - highlev
      if (highlev<0):
         hioutred = hioutred + highlev
         hioutgreen = hioutgreen + highlev
         hioutblue = hioutblue + highlev
   
      return [[lowinred, hiinred, gammared, lowoutred, hioutred], [lowingreen, hiingreen, gammagreen, lowoutgreen, hioutgreen], [lowinblue, hiinblue, gammablue, lowoutblue, hioutblue], [satlev]]


   def makeLayer(self, img, drawable, shh, shs, shlev, midh, mids, midlev, highh, highs, highlev, satlev):
      pdb.gimp_image_undo_group_start(img)
      tmpLayer1 = pdb.gimp_layer_copy(drawable, True)
      pdb.gimp_image_add_layer(img, tmpLayer1, -1)
      tmpLayer1.name = drawable.name + " Color Grading"

      channelred=1
      channelgreen=2
      channelblue=3      
      
      rgbshift = self.convert_to_rgbshifts(shh, shs, shlev, midh, mids, midlev, highh, highs, highlev, satlev)
      levels = self.convert_to_levels(rgbshift[0], rgbshift[1], rgbshift[2], rgbshift[3], rgbshift[4], rgbshift[5], rgbshift[6], rgbshift[7], rgbshift[8], rgbshift[9], rgbshift[10], rgbshift[11], rgbshift[12])
      
      pdb.gimp_levels(tmpLayer1, channelred, levels[0][0], levels[0][1], levels[0][2], levels[0][3], levels[0][4])
      pdb.gimp_levels(tmpLayer1, channelgreen, levels[1][0], levels[1][1], levels[1][2], levels[1][3], levels[1][4])
      pdb.gimp_levels(tmpLayer1, channelblue, levels[2][0], levels[2][1], levels[2][2], levels[2][3], levels[2][4])
      pdb.gimp_hue_saturation(tmpLayer1, 0, 0., 0., levels[3][0])

      gimp.displays_flush()
      pdb.gimp_image_undo_group_end(img)
      return tmpLayer1


class ColorWheel(gtk.DrawingArea):
   def __init__(self, pixbuf1, centerx, centery, radius):
      gtk.DrawingArea.__init__(self)
      self.connect('expose-event', self.do_expose )
      self.connect("motion_notify_event", self.mouse_mv)
      self.set_events(gtk.gdk.EXPOSURE_MASK
         | gtk.gdk.LEAVE_NOTIFY_MASK
         | gtk.gdk.BUTTON_PRESS_MASK
         | gtk.gdk.POINTER_MOTION_MASK
         | gtk.gdk.POINTER_MOTION_HINT_MASK)
      self.set_size_request(2*radius, 2*radius)
      
      self.pixbuf = pixbuf1
      self.centerx = centerx
      self.centery = centery
      self.radius = radius
      self.x = centerx
      self.y = centery

      self.hsv = [0., 0., 1.]
   
   def mouse_mv(self, widget, event):
      if event.is_hint:
         x, y, state = event.window.get_pointer()
         
      else:
         x = event.x
         y = event.y
         state = event.state

      if state & gtk.gdk.BUTTON1_MASK:
         centerx = self.centerx
         centery = self.centery
         radius = self.radius

         x2 = (float(x) - float(centerx)) * (float(x) - float(centerx))
         y2 = (float(centery) - float(y)) * (float(centery) - float(y))
         r2 = float(radius) * float(radius)
         if (x2 + y2 < r2):
            self.x = x
            self.y = y
            self.refresh_view()
            #print self.get_wheel_hsv()
   
   def refresh_view(self):
      centerx = self.centerx
      centery = self.centery
      radius = self.radius
      x = self.x
      y = self.y

      x2 = (float(x) - float(centerx)) * (float(x) - float(centerx))
      y2 = (float(centery) - float(y)) * (float(centery) - float(y))
      r2 = float(radius) * float(radius)
      if (x2 + y2 < r2):
         dist = math.sqrt( ( x2 + y2 ) / r2 )

         theta = math.atan2(float(centery) - float(y), float(x) - float(centerx))
         if theta > 0:
            h = theta
            h = h / (2*math.pi)
         else:
            h = 2*math.pi + theta
            h = h / (2*math.pi)
         s = dist
         v = 1.0

         #hsvtool = HSVbasics()
         
         self.hsv = [h, s, v]
         #self.rgb = hsvtool.gimp_hsv_to_rgb4(self.hsv)
         #print self.hsvdeg
         #print self.rgb
         #print [x, y]
         
      self.cr = self.window.cairo_create()
      self.cr.set_operator(cairo.OPERATOR_SOURCE)
      #self.cr.set_source_rgb(0,0,0)
      #self.cr.paint()
      self.cr.set_source_pixbuf(self.pixbuf, 0, 0)
      self.cr.paint()
      self.cr.set_line_width(2)
      self.cr.stroke_preserve()
      self.cr.set_source_rgb(0.5, 0.5, 0.5)
      self.cr.arc(x, y, 4., 0.0, 2*math.pi)
      self.cr.stroke_preserve()
      #self.cr.fill()
   
   def get_wheel_hsv(self):
      h = self.hsv[0]*360
      s = self.hsv[1]
      v = 1.0
      return [h, s, v]

   def set_wheel_hsv(self, wheel_hsv):
      self.x = self.centerx + wheel_hsv[1] * self.radius * math.cos(wheel_hsv[0]*2*math.pi/360.0)
      self.y = self.centery - wheel_hsv[1] * self.radius * math.sin(wheel_hsv[0]*2*math.pi/360.0)
      #self.refresh_view()

   def reset(self):
      self.x = self.centerx
      self.y = self.centery
      self.hsv = [0., 0., 1.]
      self.cr = self.window.cairo_create()
      self.cr.set_operator(cairo.OPERATOR_SOURCE)
      #self.cr.set_source_rgb(0,0,0)
      #self.cr.paint()
      self.cr.set_source_pixbuf(self.pixbuf, 0, 0)
      self.cr.paint()
      self.cr.set_line_width(2)
      self.cr.stroke_preserve()
      self.cr.set_source_rgb(0.5, 0.5, 0.5)
      self.cr.arc(self.centerx, self.centery, 4., 0.0, 2*math.pi)
      self.cr.stroke_preserve()
      #self.cr.fill()

   def do_expose(self, widget, event):
      self.refresh_view()


class HSVbasics:



   #LIBGIMP - The GIMP Library
   # * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball
   # *
   # * This library is free software; you can redistribute it and/or
   # * modify it under the terms of the GNU Lesser General Public
   # * License as published by the Free Software Foundation; either
   # * version 2 of the License, or (at your option) any later version.
   # *
   # * This library 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
   # * Library General Public License for more details.
   # *
   # * You should have received a copy of the GNU Lesser General Public
   # * License along with this library; if not, write to the
   # * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   # * Boston, MA 02111-1307, USA.



   # * gimp_rgb_to_hsv4:
   # * @rgb:        RGB triplet, rgb[0] is red channel, rgb[1] is green,
   # *              rgb[2] is blue (0..255)
   # * @hue:        Pointer to hue channel (0..1)
   # * @saturation: Pointer to saturation channel (0..1)
   # * @value:      Pointer to value channel (0..1)


   def gimp_rgb_to_hsv4(self, rgb):

      #double red, green, blue;
      #double h, s, v;
      #double min, max;
      #double delta;

      #double hue;
      #double saturation;
      #double value;

      #double[] hsv;

      red   = rgb[0] / 255.0;
      green = rgb[1] / 255.0;
      blue  = rgb[2] / 255.0;

      h = 0.0; #/* Shut up -Wall */

      if (red > green):
         maxc = max([red,   blue])
         minc = min([green, blue])
      else:
         maxc = max([green, blue])
         minc = min([red,   blue])
   
      v = maxc

      if (maxc != 0.0):
         s = (maxc - minc) / maxc
      else:
         s = 0.0

      if (s == 0.0):
         h = 0.0
      else:
         delta = maxc - minc

         if (delta == 0.0):
            delta = 1.0

         if (red == maxc):
            h = (green - blue) / delta
         elif (green == maxc):
            h = 2 + (blue - red) / delta
         elif (blue == maxc):
            h = 4 + (red - green) / delta

         h /= 6.0

         if (h < 0.0):
            h += 1.0
         elif (h > 1.0):
            h -= 1.0

      hue        = h
      saturation = s
      value      = v

      hsv = [hue, saturation, value]

      return hsv



   # * gimp_hsv_to_rgb4:
   # * @rgb:        RGB triplet, rgb[0] is red channel, rgb[1] is green,
   # *              rgb[2] is blue (0..255)
   # * @hue:        Hue channel (0..1)
   # * @saturation: Saturation channel (0..1)
   # * @value:      Value channel (0..1)

   def gimp_hsv_to_rgb4(self, hsv):
   
      #double h, s, v;
      #double f, p, q, t;

      hue = hsv[0]
      saturation = hsv[1]
      value = hsv[2]

      #double[] rgb;

      if (saturation == 0.0):
         hue = value
         saturation = value
         #value = value
      else:
         h = hue * 6.0
         s = saturation
         v = value

         if (h == 6.0):
            h = 0.0;

         f = h - int(h)
         p = v * (1.0 - s)
         q = v * (1.0 - s * f)
         t = v * (1.0 - s * (1.0 - f))

         if (int(h)==0):
            hue = v
            saturation = t
            value = p

         elif (int(h)==1):
            hue = q
            saturation = v
            value = p

         elif (int(h)==2):
            hue = p
            saturation = v
            value = t

         elif (int(h)==3):
            hue = p
            saturation = q
            value = v

         elif (int(h)==4):
            hue = t
            saturation = p
            value = v

         elif (int(h)==5):
            hue = v
            saturation = p
            value = q


      #rgb = new Double[3];

      rgb = [round(hue * 255.0), round(saturation * 255.0), round(value * 255.0)]

      return rgb;


class pycolorgradingcw(gimpplugin.plugin):
   def start(self):
      gimp.main(self.init, self.quit, self.query, self._run)

   def init(self):
      pass

   def quit(self):
      pass

   def query(self):
      authorname = "John Lakkas"
      copyrightname = "John Lakkas"
      menu_location = "<Image>/Filters/Color Grading Color Wheel etition"
      date = "May 2012"
      plug_description = "Color Grading plug-in alters image/layer shadows, midtones and highlights color tones"
      plug_help = "Color Grading plug-in alters image/layer shadows, midtones and highlights color tones."
      plug_params = [
         (PDB_INT32, "run_mode", "Run mode"),
         (PDB_IMAGE, "image", "Input image"),
         (PDB_DRAWABLE, "drawable", "Input drawable"),
         ####### 3 params above needed by all scripts using gimpplugin.plugin ######################
         (PDB_FLOAT, "shh", "Shadows Hue"),
         (PDB_FLOAT, "shs", "Shadows Saturation"),
         (PDB_FLOAT, "shlev", "Shadows levels"),
         (PDB_FLOAT, "midh", "Midtones Hue"),
         (PDB_FLOAT, "mids", "Midtones Saturation"),
         (PDB_FLOAT, "midlev", "Midtones levels"),
         (PDB_FLOAT, "highh", "Highlights Hue"),
         (PDB_FLOAT, "highs", "Highlights Saturation"),
         (PDB_FLOAT, "highlev", "Highlights levels"),
         (PDB_FLOAT, "satlev", "Saturation")
         ]

      gimp.install_procedure("py_color_grading_cw",
         plug_description,
         plug_help,
         authorname,
         copyrightname,
         date,
         menu_location,
         "RGB*, GRAY*",
         PLUGIN,
         plug_params,
         [])

   def py_color_grading_cw(self, runmode, img, drawable, shh=0.0, shs=0.0, shlev=0, midh=0.0, mids=0.0, midlev=0, highh=0.0, highs=0.0, highlev=0, satlev=0):
      color_grading_cw(runmode, img, drawable, shh, shs, shlev, midh, mids, midlev, highh, highs, highlev, satlev)

if __name__ == '__main__':
   pycolorgradingcw().start()

Try adapting this plugins save features for your own. It might help out.

_________________


"In the face of adversity, there's three things: fly, freeze or fight; We're choosing to fight..."- Guy Boucher, Tampa Bay Lighting Head Coach


Top
 Post subject: Re: Bytes and Pixels Vector Path plugin
PostPosted: Fri May 18, 2012 9:19 pm  (#14) 
Offline
Script Coder
User avatar

Joined: Feb 18, 2011
Posts: 4827
Location: Bendigo Vic. Australia
Could someone who has this working show where they installed the 2 files please, as I think I did not understand the readme file correctly.

_________________
Image
No matter how much you push the envelope, it'll still be stationery.


Top
 Post subject: Re: Bytes and Pixels Vector Path plugin
PostPosted: Fri May 18, 2012 9:27 pm  (#15) 
Offline
GimpChat Member
User avatar

Joined: Jan 20, 2012
Posts: 583
Userpath/plugins

_________________


"In the face of adversity, there's three things: fly, freeze or fight; We're choosing to fight..."- Guy Boucher, Tampa Bay Lighting Head Coach


Top
 Post subject: Re: Bytes and Pixels Vector Path plugin
PostPosted: Fri May 18, 2012 9:47 pm  (#16) 
Offline
Script Coder
User avatar

Joined: Feb 18, 2011
Posts: 4827
Location: Bendigo Vic. Australia
I open a blank image and select vector path then nothing happens, no menu comes up

_________________
Image
No matter how much you push the envelope, it'll still be stationery.


Top
 Post subject: Re: Bytes and Pixels Vector Path plugin
PostPosted: Fri May 18, 2012 9:48 pm  (#17) 
Offline
GimpChat Member
User avatar

Joined: May 16, 2010
Posts: 14709
Location: USA
Graechan wrote:
Could someone who has this working show where they installed the 2 files please, as I think I did not understand the readme file correctly.


Parthas Build.
Place the b&p_vector_path_1.py file in the plugins folder and the other formula_viewer.pyw file needs to go in
gimp-2.8\python
and
gimp-2.8\lib\gimp\2.0\python Graechan. :)


I am not sure about any other compiled src. If the compile includes python it should be the same.

_________________
Image
Edmund Burke nailed it when he said, "The only thing necessary for the triumph of evil is for good men to do nothing."


Top
 Post subject: Re: Bytes and Pixels Vector Path plugin
PostPosted: Fri May 18, 2012 10:19 pm  (#18) 
Offline
Script Coder
User avatar

Joined: Feb 18, 2011
Posts: 4827
Location: Bendigo Vic. Australia
I placed the formula viewer here C:\Program Files\GIMP 2\Python and vector path here C:\Users\Graechan\.gimp-2.8\plug-ins
still no go

_________________
Image
No matter how much you push the envelope, it'll still be stationery.


Top
 Post subject: Re: Bytes and Pixels Vector Path plugin
PostPosted: Fri May 18, 2012 10:20 pm  (#19) 
Offline
GimpChat Member
User avatar

Joined: May 16, 2010
Posts: 14709
Location: USA
Try and place it also in the gimp 2\lib\gimp\2.0\python file Graechan.
I had to place it in both locations.

_________________
Image
Edmund Burke nailed it when he said, "The only thing necessary for the triumph of evil is for good men to do nothing."


Top
 Post subject: Re: Bytes and Pixels Vector Path plugin
PostPosted: Fri May 18, 2012 10:38 pm  (#20) 
Offline
Script Coder
User avatar

Joined: Feb 18, 2011
Posts: 4827
Location: Bendigo Vic. Australia
This is my C:\Program Files\GIMP 2\lib\gimp\2.0 folder and it does not hav a python folder
should I create one

Image

_________________
Image
No matter how much you push the envelope, it'll still be stationery.


Top
Post new topic Reply to topic  [ 127 posts ]  Go to page 1, 2, 3, 4, 5 ... 7  Next

All times are UTC - 5 hours [ DST ]


   Similar Topics   Replies 
No new posts Attachment(s) [solved] plugin bend path

14

No new posts GIMP XCF image plug-in could not open image; File is Not 0 Bytes

4

No new posts Attachment(s) Default to inches instead of pixels

3

No new posts Select Layer by Pixels

2

No new posts Attachment(s) i struggle with the option to copy the path - the path where a file i

3


cron

* Login  



Powered by phpBB3 © phpBB Group