mirror of
https://gitlab.gnome.org/GNOME/gimp.git
synced 2025-07-04 09:53:25 +00:00
ScriptFu: Plugins: fix #11346 broken "Export Palette" plugin.
Fix ScriptFu, CRITICAL handling filename args user-entered in old-style interface. Fix plugin, changes to API re Resource i.e. Palette and Colormap Add message giving mangled name of output file. Driveby minor refactoring of plugin. Driveby cleanup, remove old email addresses. Driveby use script-fu-use-v3 binding to PDB.
This commit is contained in:
parent
c691bd2a0b
commit
55cc32e7f4
2 changed files with 226 additions and 180 deletions
|
@ -80,8 +80,12 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
static void pspec_set_default_file (GParamSpec *pspec, const gchar *filepath);
|
static void pspec_set_default_file (GParamSpec *pspec,
|
||||||
static void append_int_repr_from_gvalue (GString *result_string, GValue *gvalue);
|
const gchar *filepath);
|
||||||
|
static void append_int_repr_from_gvalue (GString *result_string,
|
||||||
|
GValue *gvalue);
|
||||||
|
static void append_scheme_repr_of_c_string (const gchar *user_string,
|
||||||
|
GString *result_string);
|
||||||
|
|
||||||
/* Free any allocated members.
|
/* Free any allocated members.
|
||||||
* Somewhat hides what members of the SFArg struct are allocated.
|
* Somewhat hides what members of the SFArg struct are allocated.
|
||||||
|
@ -513,13 +517,7 @@ script_fu_arg_append_repr_from_gvalue (SFArg *arg,
|
||||||
|
|
||||||
case SF_STRING:
|
case SF_STRING:
|
||||||
case SF_TEXT:
|
case SF_TEXT:
|
||||||
{
|
append_scheme_repr_of_c_string (g_value_get_string (gvalue), result_string);
|
||||||
gchar *tmp;
|
|
||||||
|
|
||||||
tmp = script_fu_strescape (g_value_get_string (gvalue));
|
|
||||||
g_string_append_printf (result_string, "\"%s\"", tmp);
|
|
||||||
g_free (tmp);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SF_FILENAME:
|
case SF_FILENAME:
|
||||||
|
@ -652,13 +650,7 @@ script_fu_arg_append_repr_from_self (SFArg *arg,
|
||||||
|
|
||||||
case SF_STRING:
|
case SF_STRING:
|
||||||
case SF_TEXT:
|
case SF_TEXT:
|
||||||
{
|
append_scheme_repr_of_c_string (arg_value->sfa_value, result_string);
|
||||||
gchar *tmp;
|
|
||||||
|
|
||||||
tmp = script_fu_strescape (arg_value->sfa_value);
|
|
||||||
g_string_append_printf (result_string, "\"%s\"", tmp);
|
|
||||||
g_free (tmp);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SF_ADJUSTMENT:
|
case SF_ADJUSTMENT:
|
||||||
|
@ -673,13 +665,7 @@ script_fu_arg_append_repr_from_self (SFArg *arg,
|
||||||
|
|
||||||
case SF_FILENAME:
|
case SF_FILENAME:
|
||||||
case SF_DIRNAME:
|
case SF_DIRNAME:
|
||||||
{
|
append_scheme_repr_of_c_string (arg_value->sfa_file.filename, result_string);
|
||||||
gchar *tmp;
|
|
||||||
|
|
||||||
tmp = script_fu_strescape (arg_value->sfa_file.filename);
|
|
||||||
g_string_append_printf (result_string, "\"%s\"", tmp);
|
|
||||||
g_free (tmp);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SF_OPTION:
|
case SF_OPTION:
|
||||||
|
@ -916,3 +902,35 @@ append_int_repr_from_gvalue (GString *result_string, GValue *gvalue)
|
||||||
g_string_append (result_string, "1");
|
g_string_append (result_string, "1");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* For the given C string IN, which can be user input so almost anything,
|
||||||
|
* append the Scheme repr to the GString OUT.
|
||||||
|
*
|
||||||
|
* The Scheme repr is:
|
||||||
|
* - escaped certain characters
|
||||||
|
* - surrounded by double quotes.
|
||||||
|
*
|
||||||
|
* When user input string is NULL, appends just a pair of quotes
|
||||||
|
* i.e. the Scheme representation of an empty string.
|
||||||
|
*
|
||||||
|
* Caller owns the result_string, and it is a GString, appendable.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
append_scheme_repr_of_c_string (const gchar *user_string, GString *result_string)
|
||||||
|
{
|
||||||
|
gchar *tmp;
|
||||||
|
|
||||||
|
if (user_string == NULL)
|
||||||
|
{
|
||||||
|
g_string_append (result_string, "\"\"");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* strescape requires user_string not null. */
|
||||||
|
tmp = script_fu_strescape (user_string);
|
||||||
|
g_string_append_printf (result_string, "\"%s\"", tmp);
|
||||||
|
g_free (tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,9 @@
|
||||||
; utility function to help in exporting to other (text-based) formats.
|
; utility function to help in exporting to other (text-based) formats.
|
||||||
; See instruction on adding new exporters at the end
|
; See instruction on adding new exporters at the end
|
||||||
;
|
;
|
||||||
|
|
||||||
|
; !!! Here run functions call script-fu-use-v3, to bind PDB returns succintly.
|
||||||
|
|
||||||
; -----------------------------------------------------------------------------
|
; -----------------------------------------------------------------------------
|
||||||
; Numbers and Math
|
; Numbers and Math
|
||||||
; -----------------------------------------------------------------------------
|
; -----------------------------------------------------------------------------
|
||||||
|
@ -155,6 +158,49 @@
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
(define (bad-file-name)
|
||||||
|
(gimp-message (string-append _"The filename you entered is not a suitable name for a file."
|
||||||
|
"\n\n"
|
||||||
|
_"All characters in the name are either white-spaces or characters which can not appear in filenames.")))
|
||||||
|
|
||||||
|
; Return path to a file, or abort with error to Gimp.
|
||||||
|
;
|
||||||
|
; IN filename is from a string widget.
|
||||||
|
; A user entered the filename. It could be strange characters, empty, etc.
|
||||||
|
; Valid: see valid-file-name, which may be overly strict for some platforms.
|
||||||
|
;
|
||||||
|
; IN directory-name is from a GtkFileChooser widget in mode "choose folder"
|
||||||
|
; When empty, returned path is just the in filename.
|
||||||
|
; When not empty, returned path is to the filename in that directory.
|
||||||
|
; The file at that path might exist already.
|
||||||
|
;
|
||||||
|
; FUTURE a proper widget for choosing a file destination.
|
||||||
|
|
||||||
|
(define (get-path-or-abort directory-name filename)
|
||||||
|
(let* ((validated-file-name (valid-file-name filename))
|
||||||
|
(result-path ""))
|
||||||
|
(if (not validated-file-name)
|
||||||
|
(begin
|
||||||
|
(bad-file-name) ; gimp-message w translated text
|
||||||
|
(quit -1)))
|
||||||
|
; FUTURE: The above should be (error "Invalid file name"))
|
||||||
|
; with the existing translated text, when ScriptFu error is fixed.
|
||||||
|
|
||||||
|
(set! result-path
|
||||||
|
(if (> (string-length directory-name) 0)
|
||||||
|
; result is full path
|
||||||
|
(string-append directory-name DIR-SEPARATOR validated-file-name)
|
||||||
|
; result is just the filename
|
||||||
|
validated-file-name))
|
||||||
|
|
||||||
|
; Side effect.
|
||||||
|
; Tell the user the mangled path, might be different than user entered.
|
||||||
|
; The user should not need to search for the file.
|
||||||
|
(gimp-message (string-append _"Exported palette to file: " result-path))
|
||||||
|
|
||||||
|
result-path))
|
||||||
|
|
||||||
|
|
||||||
; Filters a string from all the characters which are not alpha-numeric
|
; Filters a string from all the characters which are not alpha-numeric
|
||||||
; (this also removes whitespaces)
|
; (this also removes whitespaces)
|
||||||
(define (name-alpha-numeric str)
|
(define (name-alpha-numeric str)
|
||||||
|
@ -179,25 +225,23 @@
|
||||||
(define displayln (lambda (obj) (display obj) (display "\n")))
|
(define displayln (lambda (obj) (display obj) (display "\n")))
|
||||||
|
|
||||||
; The loop for exporting all the colors
|
; The loop for exporting all the colors
|
||||||
(define (export-palette palette-name color-convertor name-convertor
|
(define (export-palette palette ; since v3, palette is numeric ID
|
||||||
|
color-convertor name-convertor
|
||||||
start name-pre name-after name-color-seperator
|
start name-pre name-after name-color-seperator
|
||||||
color-pre color-after entry-seperator end)
|
color-pre color-after entry-seperator end)
|
||||||
|
|
||||||
(define (write-color-line index)
|
(define (write-color-line index)
|
||||||
(display name-pre)
|
(display name-pre)
|
||||||
(display (name-convertor
|
(display (name-convertor (gimp-palette-entry-get-name palette index)))
|
||||||
(car (gimp-palette-entry-get-name palette-name index))))
|
|
||||||
(display name-after)
|
(display name-after)
|
||||||
(display name-color-seperator)
|
(display name-color-seperator)
|
||||||
(display color-pre)
|
(display color-pre)
|
||||||
(display (color-convertor
|
(display (color-convertor (gimp-palette-entry-get-color palette index)))
|
||||||
(car (gimp-palette-entry-get-color palette-name index))))
|
|
||||||
(display color-after)
|
(display color-after)
|
||||||
)
|
)
|
||||||
|
|
||||||
(let ((color-count (car (gimp-palette-get-colors palette-name)))
|
(let ((color-count (gimp-palette-get-color-count palette))
|
||||||
(i 0)
|
(i 0))
|
||||||
)
|
|
||||||
|
|
||||||
(display start)
|
(display start)
|
||||||
|
|
||||||
|
@ -214,8 +258,27 @@
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
; -----------
|
||||||
|
; Methods for getting palette and its name from context.
|
||||||
|
; These plugins are in the RMB pop-up menu of the Palettes dockable.
|
||||||
|
; User clicking RMB on a palette puts it in the Gimp context i.e chooses it.
|
||||||
|
; The palette is not actually passed as an arg to these plugins.
|
||||||
|
; -----------
|
||||||
|
|
||||||
|
; Return numeric ID of palette in context.
|
||||||
|
(define (palette-in-context) (gimp-context-get-palette))
|
||||||
|
|
||||||
|
; Return name of palette in context.
|
||||||
|
; Since v3, resources in ScriptFu have numeric ID, not a string
|
||||||
|
(define (palette-name-in-context)(gimp-resource-get-name (palette-in-context)))
|
||||||
|
|
||||||
|
|
||||||
|
; -----------
|
||||||
|
; Register exporter as run-function of a plugin.
|
||||||
|
; -----------
|
||||||
|
|
||||||
(define (register-palette-exporter
|
(define (register-palette-exporter
|
||||||
export-type export-name file-type description author copyright date)
|
export-type export-name file-type description author copyright date)
|
||||||
(script-fu-register (string-append "gimp-palette-export-" export-type)
|
(script-fu-register (string-append "gimp-palette-export-" export-type)
|
||||||
export-name
|
export-name
|
||||||
description
|
description
|
||||||
|
@ -231,172 +294,137 @@
|
||||||
"<Palettes>/Palettes Menu/Export as")
|
"<Palettes>/Palettes Menu/Export as")
|
||||||
)
|
)
|
||||||
|
|
||||||
(define (bad-file-name)
|
|
||||||
(gimp-message (string-append _"The filename you entered is not a suitable name for a file."
|
|
||||||
"\n\n"
|
|
||||||
_"All characters in the name are either white-spaces or characters which can not appear in filenames.")))
|
|
||||||
|
|
||||||
; -----------------------------------------------------------------------------
|
; -----------------------------------------------------------------------------
|
||||||
; Exporters
|
; Exporters
|
||||||
|
; Run functions of the plugins.
|
||||||
; -----------------------------------------------------------------------------
|
; -----------------------------------------------------------------------------
|
||||||
|
|
||||||
(define (gimp-palette-export-css directory-name file-name)
|
(define (gimp-palette-export-css directory-name file-name)
|
||||||
(let ((valid-name (valid-file-name file-name)))
|
(script-fu-use-v3)
|
||||||
(if valid-name
|
(let ((path (get-path-or-abort directory-name file-name)))
|
||||||
(with-output-to-file (string-append
|
(with-output-to-file path
|
||||||
directory-name DIR-SEPARATOR file-name)
|
(lambda () (export-palette (palette-in-context)
|
||||||
(lambda () (export-palette (car (gimp-context-get-palette))
|
color-rgb-to-css
|
||||||
color-rgb-to-css
|
name-alpha-numeric ; name-convertor
|
||||||
name-alpha-numeric ; name-convertor
|
"/* Generated with GIMP Palette Export */\n" ; start
|
||||||
"/* Generated with GIMP Palette Export */\n" ; start
|
"." ; name-pre
|
||||||
"." ; name-pre
|
"" ; name-after
|
||||||
"" ; name-after
|
" { " ; name-color-seperator
|
||||||
" { " ; name-color-seperator
|
"color: " ; color-pre
|
||||||
"color: " ; color-pre
|
" }" ; color-after
|
||||||
" }" ; color-after
|
"\n" ; entry-seperator
|
||||||
"\n" ; entry-seperator
|
"" ; end
|
||||||
"" ; end
|
)))))
|
||||||
)))
|
|
||||||
(bad-file-name)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
(register-palette-exporter "css" _"_CSS stylesheet..." "css"
|
(register-palette-exporter "css" _"_CSS stylesheet..." "css"
|
||||||
(string-append _"Export the active palette as a CSS stylesheet with the color entry name as their class name, and the color itself as the color attribute")
|
(string-append _"Export the active palette as a CSS stylesheet with the color entry name as their class name, and the color itself as the color attribute")
|
||||||
"Barak Itkin <lightningismyname@gmail.com>"
|
"Barak Itkin" "Barak Itkin" "May 15, 2009")
|
||||||
"Barak Itkin" "May 15th, 2009")
|
|
||||||
|
|
||||||
(define (gimp-palette-export-php directory-name file-name)
|
(define (gimp-palette-export-php directory-name file-name)
|
||||||
(let ((valid-name (valid-file-name file-name)))
|
(script-fu-use-v3)
|
||||||
(if valid-name
|
(let ((path (get-path-or-abort directory-name file-name)))
|
||||||
(with-output-to-file (string-append
|
(with-output-to-file path
|
||||||
directory-name DIR-SEPARATOR file-name)
|
(lambda () (export-palette (palette-in-context)
|
||||||
(lambda () (export-palette (car (gimp-context-get-palette))
|
color-rgb-to-hexa-decimal
|
||||||
color-rgb-to-hexa-decimal
|
name-standard ; name-convertor
|
||||||
name-standard ; name-convertor
|
"<?php\n/* Generated with GIMP Palette Export */\n$colors={\n" ; start
|
||||||
"<?php\n/* Generated with GIMP Palette Export */\n$colors={\n" ; start
|
"'" ; name-pre
|
||||||
"'" ; name-pre
|
"'" ; name-after
|
||||||
"'" ; name-after
|
" => " ; name-color-seperator
|
||||||
" => " ; name-color-seperator
|
"'" ; color-pre
|
||||||
"'" ; color-pre
|
"'" ; color-after
|
||||||
"'" ; color-after
|
",\n" ; entry-seperator
|
||||||
",\n" ; entry-seperator
|
"}\n?>" ; end
|
||||||
"}\n?>" ; end
|
)))))
|
||||||
)))
|
|
||||||
(bad-file-name)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
(register-palette-exporter "php" _"P_HP dictionary..." "php"
|
(register-palette-exporter "php" _"P_HP dictionary..." "php"
|
||||||
_"Export the active palette as a PHP dictionary (name => color)"
|
_"Export the active palette as a PHP dictionary (name => color)"
|
||||||
"Barak Itkin <lightningismyname@gmail.com>"
|
"Barak Itkin" "Barak Itkin" "May 15, 2009")
|
||||||
"Barak Itkin" "May 15th, 2009")
|
|
||||||
|
|
||||||
(define (gimp-palette-export-python directory-name file-name)
|
(define (gimp-palette-export-python directory-name file-name)
|
||||||
(let ((valid-name (valid-file-name file-name)))
|
(script-fu-use-v3)
|
||||||
(if valid-name
|
(let ((path (get-path-or-abort directory-name file-name)))
|
||||||
(with-output-to-file (string-append
|
(with-output-to-file path
|
||||||
directory-name DIR-SEPARATOR file-name)
|
(lambda ()
|
||||||
(lambda ()
|
(displayln "# Generated with GIMP Palette Export")
|
||||||
(let ((palette-name (car (gimp-context-get-palette))))
|
(displayln (string-append
|
||||||
(begin (displayln "# Generated with GIMP Palette Export")
|
"# Based on the palette " (palette-name-in-context)))
|
||||||
(displayln (string-append
|
(export-palette (palette-in-context)
|
||||||
"# Based on the palette " palette-name))
|
color-rgb-to-hexa-decimal
|
||||||
(export-palette palette-name
|
name-standard ; name-convertor
|
||||||
color-rgb-to-hexa-decimal
|
"colors={\n" ; start
|
||||||
name-standard ; name-convertor
|
"'" ; name-pre
|
||||||
"colors={\n" ; start
|
"'" ; name-after
|
||||||
"'" ; name-pre
|
": " ; name-color-seperator
|
||||||
"'" ; name-after
|
"'" ; color-pre
|
||||||
": " ; name-color-seperator
|
"'" ; color-after
|
||||||
"'" ; color-pre
|
",\n" ; entry-seperator
|
||||||
"'" ; color-after
|
"}" ; end
|
||||||
",\n" ; entry-seperator
|
)))))
|
||||||
"}" ; end
|
|
||||||
))))
|
|
||||||
)
|
|
||||||
(bad-file-name)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
(register-palette-exporter "python" _"_Python dictionary..." "py"
|
(register-palette-exporter "python" _"_Python dictionary..." "py"
|
||||||
_"Export the active palette as a Python dictionary (name: color)"
|
_"Export the active palette as a Python dictionary (name: color)"
|
||||||
"Barak Itkin <lightningismyname@gmail.com>"
|
"Barak Itkin" "Barak Itkin" "May 15, 2009")
|
||||||
"Barak Itkin" "May 15th, 2009")
|
|
||||||
|
|
||||||
(define (gimp-palette-export-text directory-name file-name)
|
(define (gimp-palette-export-text directory-name file-name)
|
||||||
(let ((valid-name (valid-file-name file-name)))
|
(script-fu-use-v3)
|
||||||
(if valid-name
|
(let ((path (get-path-or-abort directory-name file-name)))
|
||||||
(with-output-to-file (string-append
|
(with-output-to-file path
|
||||||
directory-name DIR-SEPARATOR file-name)
|
(lambda ()
|
||||||
(lambda ()
|
(export-palette (palette-in-context)
|
||||||
(export-palette (car (gimp-context-get-palette))
|
color-rgb-to-hexa-decimal
|
||||||
color-rgb-to-hexa-decimal
|
name-none ; name-convertor
|
||||||
name-none ; name-convertor
|
"" ; start
|
||||||
"" ; start
|
"" ; name-pre
|
||||||
"" ; name-pre
|
"" ; name-after
|
||||||
"" ; name-after
|
"" ; name-color-seperator
|
||||||
"" ; name-color-seperator
|
"" ; color-pre
|
||||||
"" ; color-pre
|
"" ; color-after
|
||||||
"" ; color-after
|
"\n" ; entry-seperator
|
||||||
"\n" ; entry-seperator
|
"" ; end
|
||||||
"" ; end
|
)))))
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
(bad-file-name)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
(register-palette-exporter "text" _"_Text file..." "txt"
|
(register-palette-exporter "text" _"_Text file..." "txt"
|
||||||
_"Write all the colors in a palette to a text file, one hexadecimal value per line (no names)"
|
_"Write all the colors in a palette to a text file, one hexadecimal value per line (no names)"
|
||||||
"Barak Itkin <lightningismyname@gmail.com>"
|
"Barak Itkin" "Barak Itkin" "May 15, 2009")
|
||||||
"Barak Itkin" "May 15th, 2009")
|
|
||||||
|
|
||||||
(define (gimp-palette-export-java directory-name file-name)
|
(define (gimp-palette-export-java directory-name file-name)
|
||||||
(let ((valid-name (valid-file-name file-name)))
|
(script-fu-use-v3)
|
||||||
(if valid-name
|
(let ((path (get-path-or-abort directory-name file-name)))
|
||||||
(with-output-to-file (string-append directory-name
|
(with-output-to-file path
|
||||||
DIR-SEPARATOR file-name)
|
(lambda ()
|
||||||
(lambda ()
|
(let ((palette-name (palette-name-in-context)))
|
||||||
(let ((palette-name (car (gimp-context-get-palette))))
|
(displayln "")
|
||||||
(begin (displayln "")
|
(displayln "import java.awt.Color;")
|
||||||
(displayln "import java.awt.Color;")
|
(displayln "import java.util.Hashtable;")
|
||||||
(displayln "import java.util.Hashtable;")
|
(displayln "")
|
||||||
(displayln "")
|
(displayln "// Generated with GIMP palette Export ")
|
||||||
(displayln "// Generated with GIMP palette Export ")
|
(displayln (string-append
|
||||||
(displayln (string-append
|
"// Based on the palette " palette-name))
|
||||||
"// Based on the palette " palette-name))
|
(displayln (string-append
|
||||||
(displayln (string-append
|
"public class "
|
||||||
"public class "
|
(name-standard palette-name) " {"))
|
||||||
(name-standard palette-name) " {"))
|
(displayln "")
|
||||||
(displayln "")
|
(displayln " Hashtable<String, Color> colors;")
|
||||||
(displayln " Hashtable<String, Color> colors;")
|
(displayln "")
|
||||||
(displayln "")
|
(displayln (string-append
|
||||||
(displayln (string-append
|
" public "
|
||||||
" public "
|
(name-standard palette-name) "() {"))
|
||||||
(name-standard palette-name) "() {"))
|
(export-palette (palette-in-context)
|
||||||
(export-palette (car (gimp-context-get-palette))
|
color-rgb-to-comma-separated-list
|
||||||
color-rgb-to-comma-separated-list
|
name-no-conversion
|
||||||
name-no-conversion
|
" colors = new Hashtable<String,Color>();\n" ; start
|
||||||
" colors = new Hashtable<String,Color>();\n" ; start
|
" colors.put(\"" ; name-pre
|
||||||
" colors.put(\"" ; name-pre
|
"\"" ; name-after
|
||||||
"\"" ; name-after
|
", " ; name-color-seperator
|
||||||
", " ; name-color-seperator
|
"new Color" ; color-pre
|
||||||
"new Color" ; color-pre
|
");" ; color-after
|
||||||
");" ; color-after
|
"\n" ; entry-seperator
|
||||||
"\n" ; entry-seperator
|
"\n }" ; end
|
||||||
"\n }" ; end
|
)
|
||||||
)
|
(display "\n}"))))))
|
||||||
(display "\n}"))))
|
|
||||||
)
|
|
||||||
(bad-file-name)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
(register-palette-exporter "java" _"J_ava map..." "java"
|
(register-palette-exporter "java" _"J_ava map..." "java"
|
||||||
_"Export the active palette as a java.util.Hashtable<String,Color>"
|
_"Export the active palette as a java.util.Hashtable<String,Color>"
|
||||||
"Barak Itkin <lightningismyname@gmail.com>"
|
"Barak Itkin" "Barak Itkin" "May 15, 2009")
|
||||||
"Barak Itkin" "May 15th, 2009")
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue