data/tips/gimp-tips.dtd data/tips/gimp-tips.xml.in reverted some of the

2008-03-28  Sven Neumann  <sven@gimp.org>

	* data/tips/gimp-tips.dtd
	* data/tips/gimp-tips.xml.in
	* app/dialogs/tips-parser.[ch]: reverted some of the changes 
from
	yesterday. The simplification went too far and we inadvertently
	lost an important feature.


svn path=/trunk/; revision=25269
This commit is contained in:
Sven Neumann 2008-03-28 07:34:38 +00:00 committed by Sven Neumann
parent cdb1dd1709
commit 848a3e197f
4 changed files with 321 additions and 251 deletions

View File

@ -1,7 +1,7 @@
/* GIMP - The GNU Image Manipulation Program /* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis * Copyright (C) 1995 Spencer Kimball and Peter Mattis
* *
* tips-parser.c -- Parse the gimp-tips.xml file. * tips-parser.c - Parse the gimp-tips.xml file.
* Copyright (C) 2002, 2008 Sven Neumann <sven@gimp.org> * Copyright (C) 2002, 2008 Sven Neumann <sven@gimp.org>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@ -38,50 +38,58 @@ typedef enum
TIPS_START, TIPS_START,
TIPS_IN_TIPS, TIPS_IN_TIPS,
TIPS_IN_TIP, TIPS_IN_TIP,
TIPS_IN_THETIP,
TIPS_IN_UNKNOWN TIPS_IN_UNKNOWN
} TipsParserState; } TipsParserState;
typedef enum
{
TIPS_LOCALE_NONE,
TIPS_LOCALE_MATCH,
TIPS_LOCALE_MISMATCH
} TipsParserLocaleState;
typedef struct typedef struct
{ {
TipsParserState state; TipsParserState state;
TipsParserState last_known_state; TipsParserState last_known_state;
const gchar *locale; const gchar *locale;
gboolean locale_match; TipsParserLocaleState locale_state;
gint markup_depth; gint markup_depth;
gint unknown_depth; gint unknown_depth;
GString *value; GString *value;
GimpTip *current_tip; GimpTip *current_tip;
GList *tips; GList *tips;
} TipsParser; } TipsParser;
static void tips_parser_start_element (GMarkupParseContext *context, static void tips_parser_start_element (GMarkupParseContext *context,
const gchar *element_name, const gchar *element_name,
const gchar **attribute_names, const gchar **attribute_names,
const gchar **attribute_values, const gchar **attribute_values,
gpointer user_data, gpointer user_data,
GError **error); GError **error);
static void tips_parser_end_element (GMarkupParseContext *context, static void tips_parser_end_element (GMarkupParseContext *context,
const gchar *element_name, const gchar *element_name,
gpointer user_data, gpointer user_data,
GError **error); GError **error);
static void tips_parser_characters (GMarkupParseContext *context, static void tips_parser_characters (GMarkupParseContext *context,
const gchar *text, const gchar *text,
gsize text_len, gsize text_len,
gpointer user_data, gpointer user_data,
GError **error); GError **error);
static void tips_parser_start_markup (TipsParser *parser, static void tips_parser_start_markup (TipsParser *parser,
const gchar *markup_name); const gchar *markup_name);
static void tips_parser_end_markup (TipsParser *parser, static void tips_parser_end_markup (TipsParser *parser,
const gchar *markup_name); const gchar *markup_name);
static void tips_parser_start_unknown (TipsParser *parser); static void tips_parser_start_unknown (TipsParser *parser);
static void tips_parser_end_unknown (TipsParser *parser); static void tips_parser_end_unknown (TipsParser *parser);
static void tips_parser_parse_locale (TipsParser *parser, static void tips_parser_parse_locale (TipsParser *parser,
const gchar **names, const gchar **names,
const gchar **values); const gchar **values);
static gboolean tips_parser_set_by_locale (TipsParser *parser, static void tips_parser_set_by_locale (TipsParser *parser,
gchar **dest); gchar **dest);
static const GMarkupParser markup_parser = static const GMarkupParser markup_parser =
@ -208,13 +216,9 @@ tips_parser_start_element (GMarkupParseContext *context,
{ {
case TIPS_START: case TIPS_START:
if (strcmp (element_name, "gimp-tips") == 0) if (strcmp (element_name, "gimp-tips") == 0)
{ parser->state = TIPS_IN_TIPS;
parser->state = TIPS_IN_TIPS;
}
else else
{ tips_parser_start_unknown (parser);
tips_parser_start_unknown (parser);
}
break; break;
case TIPS_IN_TIPS: case TIPS_IN_TIPS:
@ -222,26 +226,29 @@ tips_parser_start_element (GMarkupParseContext *context,
{ {
parser->state = TIPS_IN_TIP; parser->state = TIPS_IN_TIP;
parser->current_tip = g_slice_new0 (GimpTip); parser->current_tip = g_slice_new0 (GimpTip);
tips_parser_parse_locale (parser, attribute_names, attribute_values);
} }
else else
{ tips_parser_start_unknown (parser);
tips_parser_start_unknown (parser);
}
break; break;
case TIPS_IN_TIP: case TIPS_IN_TIP:
if (strcmp (element_name, "thetip") == 0)
{
parser->state = TIPS_IN_THETIP;
tips_parser_parse_locale (parser, attribute_names, attribute_values);
}
else
tips_parser_start_unknown (parser);
break;
case TIPS_IN_THETIP:
if (strcmp (element_name, "b" ) == 0 || if (strcmp (element_name, "b" ) == 0 ||
strcmp (element_name, "big") == 0 || strcmp (element_name, "big") == 0 ||
strcmp (element_name, "tt" ) == 0) strcmp (element_name, "tt" ) == 0)
{ tips_parser_start_markup (parser, element_name);
tips_parser_start_markup (parser, element_name);
}
else else
{ tips_parser_start_unknown (parser);
tips_parser_start_unknown (parser); break;
}
case TIPS_IN_UNKNOWN: case TIPS_IN_UNKNOWN:
tips_parser_start_unknown (parser); tips_parser_start_unknown (parser);
@ -268,21 +275,20 @@ tips_parser_end_element (GMarkupParseContext *context,
break; break;
case TIPS_IN_TIP: case TIPS_IN_TIP:
parser->tips = g_list_prepend (parser->tips, parser->current_tip);
parser->current_tip = NULL;
parser->state = TIPS_IN_TIPS;
break;
case TIPS_IN_THETIP:
if (parser->markup_depth == 0) if (parser->markup_depth == 0)
{ {
if (tips_parser_set_by_locale (parser, &parser->current_tip->thetip)) tips_parser_set_by_locale (parser, &parser->current_tip->thetip);
{
parser->tips = g_list_prepend (parser->tips, parser->current_tip);
parser->current_tip = NULL;
}
g_string_truncate (parser->value, 0); g_string_truncate (parser->value, 0);
parser->state = TIPS_IN_TIP;
parser->state = TIPS_IN_TIPS;
} }
else else
{ tips_parser_end_markup (parser, element_name);
tips_parser_end_markup (parser, element_name);
}
break; break;
case TIPS_IN_UNKNOWN: case TIPS_IN_UNKNOWN:
@ -302,8 +308,8 @@ tips_parser_characters (GMarkupParseContext *context,
switch (parser->state) switch (parser->state)
{ {
case TIPS_IN_TIP: case TIPS_IN_THETIP:
if (parser->locale_match) if (parser->locale_state != TIPS_LOCALE_MISMATCH)
{ {
gint i; gint i;
@ -323,7 +329,6 @@ tips_parser_characters (GMarkupParseContext *context,
} }
} }
break; break;
default: default:
break; break;
} }
@ -373,16 +378,15 @@ tips_parser_parse_locale (TipsParser *parser,
const gchar **names, const gchar **names,
const gchar **values) const gchar **values)
{ {
parser->locale_match = (parser->locale == NULL); parser->locale_state = TIPS_LOCALE_NONE;
while (*names && *values) while (*names && *values)
{ {
if (strcmp (*names, "xml:lang") == 0 && **values) if (strcmp (*names, "xml:lang") == 0 && **values)
{ {
if (parser->locale) parser->locale_state = (parser->locale &&
parser->locale_match = (strcmp (*values, parser->locale) == 0); strcmp (*values, parser->locale) == 0 ?
else TIPS_LOCALE_MATCH : TIPS_LOCALE_MISMATCH);
parser->locale_match = FALSE;
} }
names++; names++;
@ -390,16 +394,30 @@ tips_parser_parse_locale (TipsParser *parser,
} }
} }
static gboolean static void
tips_parser_set_by_locale (TipsParser *parser, tips_parser_set_by_locale (TipsParser *parser,
gchar **dest) gchar **dest)
{ {
if (parser->locale_match) switch (parser->locale_state)
{ {
case TIPS_LOCALE_NONE:
if (!parser->locale)
{
g_free (*dest);
*dest = g_strdup (parser->value->str);
}
else if (*dest == NULL)
{
*dest = g_strdup (parser->value->str);
}
break;
case TIPS_LOCALE_MATCH:
g_free (*dest); g_free (*dest);
*dest = g_strdup (parser->value->str); *dest = g_strdup (parser->value->str);
return TRUE; break;
}
return FALSE; case TIPS_LOCALE_MISMATCH:
break;
}
} }

View File

@ -1,7 +1,7 @@
/* GIMP - The GNU Image Manipulation Program /* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis * Copyright (C) 1995 Spencer Kimball and Peter Mattis
* *
* tips-parser.h -- Parse the gimp-tips.xml file. * tips-parser.h - Parse the gimp-tips.xml file.
* Copyright (C) 2002, 2008 Sven Neumann <sven@gimp.org> * Copyright (C) 2002, 2008 Sven Neumann <sven@gimp.org>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@ -33,9 +33,6 @@ struct _GimpTip
GimpTip * gimp_tip_new (const gchar *format, GimpTip * gimp_tip_new (const gchar *format,
...) G_GNUC_PRINTF(1, 2); ...) G_GNUC_PRINTF(1, 2);
void gimp_tip_set (GimpTip *tip,
const gchar *format,
...) G_GNUC_PRINTF(2, 3);
void gimp_tip_free (GimpTip *tip); void gimp_tip_free (GimpTip *tip);
GList * gimp_tips_from_file (const gchar *filename, GList * gimp_tips_from_file (const gchar *filename,

View File

@ -1,13 +1,15 @@
<!-- Simple DTD for GIMP tips --> <!-- Simple DTD for GIMP tips -->
<!ENTITY % markup "(#PCDATA|b|big|tt)*" > <!ELEMENT gimp-tips (tip+)>
<!ELEMENT gimp-tips (tip+) > <!ELEMENT tip (thetip+)>
<!ATTLIST tip level (start|beginner|intermediate|advanced) #REQUIRED>
<!ELEMENT tip %markup; > <!ENTITY % markup "(#PCDATA|b|big|tt)*">
<!ATTLIST tip level (start|beginner|intermediate|advanced) #REQUIRED
xml:lang CDATA #IMPLIED >
<!ELEMENT b %markup; > <!ELEMENT b %markup;>
<!ELEMENT big %markup; > <!ELEMENT big %markup;>
<!ELEMENT tt %markup; > <!ELEMENT tt %markup;>
<!ELEMENT thetip %markup;>
<!ATTLIST thetip xml:lang CDATA #IMPLIED>

View File

@ -1,191 +1,244 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE gimp-tips SYSTEM "gimp-tips.dtd"> <!DOCTYPE gimp-tips SYSTEM "gimp-tips.dtd">
<gimp-tips>
<!-- This is a list of tips for GIMP. --> <!-- This is a list of tips for GIMP. -->
<!-- --> <!-- -->
<!-- The tips parser supports a very basic markup language. You may use --> <!-- The tips parser supports a very basic markup language. You may use -->
<!-- the tag b to specify bold text, big to increase the font size and --> <!-- the tag b to specify bold text, big to increase the font size and -->
<!-- tt to switch to a monospace font. --> <!-- tt to switch to a monospace font. -->
<gimp-tips>
<!-- --> <!-- -->
<!-- Tips for beginners start here --> <!-- Tips for beginners start here -->
<!-- (for people who are not familiar yet with layers and image formats) --> <!-- (for people who are not familiar yet with layers and image formats) -->
<!-- --> <!-- -->
<_tip level="beginner"> <tip level="beginner">
You can get context-sensitive help for most of GIMP's features by <_thetip>
pressing the F1 key at any time. This also works inside the menus. You can get context-sensitive help for most of GIMP's features by
</_tip> pressing the F1 key at any time. This also works inside the menus.
<_tip level="beginner"> </_thetip>
GIMP uses layers to let you organize your image. Think of them </tip>
as a stack of slides or filters, such that looking through them you <tip level="beginner">
see a composite of their contents. <_thetip>
</_tip> GIMP uses layers to let you organize your image. Think of them
<_tip level="beginner"> as a stack of slides or filters, such that looking through them you
You can perform many layer operations by right-clicking on the text see a composite of their contents.
label of a layer in the Layers dialog. </_thetip>
</_tip> </tip>
<_tip level="beginner"> <tip level="beginner">
When you save an image to work on it again later, try using XCF, <_thetip>
GIMP's native file format (use the file extension <tt>.xcf</tt>). You can perform many layer operations by right-clicking on the text
This preserves the layers and every aspect of your work-in-progress. label of a layer in the Layers dialog.
Once a project is completed, you can save it as JPEG, PNG, GIF, ... </_thetip>
</_tip> </tip>
<_tip level="beginner"> <tip level="beginner">
Most plug-ins work on the current layer of the current image. In <_thetip>
some cases, you will have to merge all layers (Image→Flatten Image) When you save an image to work on it again later, try using XCF,
if you want the plug-in to work on the whole image. GIMP's native file format (use the file extension <tt>.xcf</tt>).
</_tip> This preserves the layers and every aspect of your work-in-progress.
<_tip level="beginner"> Once a project is completed, you can save it as JPEG, PNG, GIF, ...
If a layer's name in the Layers dialog is displayed in <b>bold</b>, </_thetip>
this layer doesn't have an alpha-channel. You can add an alpha-channel </tip>
using Layer→Transparency→Add Alpha Channel. <tip level="beginner">
</_tip> <_thetip>
<_tip level="beginner"> Most plug-ins work on the current layer of the current image. In
Not all effects can be applied to all kinds of images. This is some cases, you will have to merge all layers (Image→Flatten Image)
indicated by a grayed-out menu-entry. You may need to change if you want the plug-in to work on the whole image.
the image mode to RGB (Image→Mode→RGB), add an alpha-channel </_thetip>
(Layer→Transparency→Add Alpha Channel) or flatten it </tip>
(Image→Flatten Image). <tip level="beginner">
</_tip> <_thetip>
<_tip level="beginner"> If a layer's name in the Layers dialog is displayed in <b>bold</b>,
You can adjust or move a selection by using <tt>Alt</tt>-drag. this layer doesn't have an alpha-channel. You can add an alpha-channel
If this makes the window move, your window manager uses the using Layer→Transparency→Add Alpha Channel.
<tt>Alt</tt> key already. Most window managers can be </_thetip>
configured to ignore the <tt>Alt</tt> key or to use </tip>
the <tt>Super</tt> key (or "Windows logo") instead. <tip level="beginner">
</_tip> <_thetip>
Not all effects can be applied to all kinds of images. This is
indicated by a grayed-out menu-entry. You may need to change
the image mode to RGB (Image→Mode→RGB), add an alpha-channel
(Layer→Transparency→Add Alpha Channel) or flatten it
(Image→Flatten Image).
</_thetip>
</tip>
<tip level="beginner">
<_thetip>
You can adjust or move a selection by using <tt>Alt</tt>-drag.
If this makes the window move, your window manager uses the
<tt>Alt</tt> key already. Most window managers can be
configured to ignore the <tt>Alt</tt> key or to use
the <tt>Super</tt> key (or "Windows logo") instead.
</_thetip>
</tip>
<!-- --> <!-- -->
<!-- Tips for intermediate users start here --> <!-- Tips for intermediate users start here -->
<!-- --> <!-- -->
<_tip level="intermediate"> <tip level="intermediate">
You can drag and drop many things in GIMP. For example, dragging <_thetip>
a color from the toolbox or from a color palette and dropping it into You can drag and drop many things in GIMP. For example, dragging
an image will fill the current selection with that color. a color from the toolbox or from a color palette and dropping it into
</_tip> an image will fill the current selection with that color.
<_tip level="intermediate"> </_thetip>
You can use the middle mouse button to pan around the image </tip>
(or optionally hold <tt>Spacebar</tt> while you move the mouse). <tip level="intermediate">
</_tip> <_thetip>
<_tip level="intermediate"> You can use the middle mouse button to pan around the image
Click and drag on a ruler to place a guide on an image. All (or optionally hold <tt>Spacebar</tt> while you move the mouse).
dragged selections will snap to the guides. You can remove </_thetip>
guides by dragging them off the image with the Move tool. </tip>
</_tip> <tip level="intermediate">
<_tip level="intermediate"> <_thetip>
You can drag a layer from the Layers dialog and drop it onto the Click and drag on a ruler to place a guide on an image. All
toolbox. This will create a new image containing only that layer. dragged selections will snap to the guides. You can remove
</_tip> guides by dragging them off the image with the Move tool.
<_tip level="intermediate"> </_thetip>
A floating selection must be anchored to a new layer or to the last </tip>
active layer before doing other operations on the image. Click on the <tip level="intermediate">
&quot;New Layer&quot; or the &quot;Anchor Layer&quot; button in the <_thetip>
Layers dialog, or use the menus to do the same. You can drag a layer from the Layers dialog and drop it onto the
</_tip> toolbox. This will create a new image containing only that layer.
<_tip level="intermediate"> </_thetip>
GIMP supports gzip compression on the fly. Just add <tt>.gz</tt> </tip>
(or <tt>.bz2</tt>, if you have bzip2 installed) to the filename and <tip level="intermediate">
your image will be saved compressed. Of course loading compressed <_thetip>
images works too. A floating selection must be anchored to a new layer or to the last
</_tip> active layer before doing other operations on the image. Click on the
<_tip level="intermediate"> &quot;New Layer&quot; or the &quot;Anchor Layer&quot; button in the
Pressing and holding the <tt>Shift</tt> key before making a selection Layers dialog, or use the menus to do the same.
allows you to add to the current selection instead of replacing it. </_thetip>
Using <tt>Ctrl</tt> before making a selection subtracts from the </tip>
current one. <tip level="intermediate">
</_tip> <_thetip>
<_tip level="intermediate"> GIMP supports gzip compression on the fly. Just add <tt>.gz</tt>
You can draw simple squares or circles using Edit→Stroke Selection. (or <tt>.bz2</tt>, if you have bzip2 installed) to the filename and
It strokes the edge of your current selection. More complex shapes your image will be saved compressed. Of course loading compressed
can be drawn using the Path tool or with Filters→Render→Gfig. images works too.
</_tip> </_thetip>
<_tip level="intermediate"> </tip>
If you stroke a path (Edit→Stroke Path), the paint tools can <tip level="intermediate">
be used with their current settings. You can use the Paintbrush in <_thetip>
gradient mode or even the Eraser or the Smudge tool. Pressing and holding the <tt>Shift</tt> key before making a selection
</_tip> allows you to add to the current selection instead of replacing it.
<_tip level="intermediate"> Using <tt>Ctrl</tt> before making a selection subtracts from the
You can create and edit complex selections using the Path tool. current one.
The Paths dialog allows you to work on multiple paths and to convert </_thetip>
them to selections. </tip>
</_tip> <tip level="intermediate">
<_tip level="intermediate"> <_thetip>
You can use the paint tools to change the selection. Click on the You can draw simple squares or circles using Edit→Stroke Selection.
&quot;Quick Mask&quot; button at the bottom left of an image window. It strokes the edge of your current selection. More complex shapes
Change your selection by painting in the image and click on the button can be drawn using the Path tool or with Filters→Render→Gfig.
again to convert it back to a normal selection. </_thetip>
</_tip> </tip>
<_tip level="intermediate"> <tip level="intermediate">
You can save a selection to a channel (Select→Save to Channel) and <_thetip>
then modify this channel with any paint tools. Using the buttons in If you stroke a path (Edit→Stroke Path), the paint tools can
the Channels dialog, you can toggle the visibility of this new channel be used with their current settings. You can use the Paintbrush in
or convert it to a selection. gradient mode or even the Eraser or the Smudge tool.
</_tip> </_thetip>
</tip>
<tip level="intermediate">
<_thetip>
You can create and edit complex selections using the Path tool.
The Paths dialog allows you to work on multiple paths and to convert
them to selections.
</_thetip>
</tip>
<tip level="intermediate">
<_thetip>
You can use the paint tools to change the selection. Click on the
&quot;Quick Mask&quot; button at the bottom left of an image window.
Change your selection by painting in the image and click on the button
again to convert it back to a normal selection.
</_thetip>
</tip>
<tip level="intermediate">
<_thetip>
You can save a selection to a channel (Select→Save to Channel) and
then modify this channel with any paint tools. Using the buttons in
the Channels dialog, you can toggle the visibility of this new channel
or convert it to a selection.
</_thetip>
</tip>
<!-- --> <!-- -->
<!-- Tips for advanced users start here --> <!-- Tips for advanced users start here -->
<!-- (this is mostly for learning shortcut keys) --> <!-- (this is mostly for learning shortcut keys) -->
<!-- --> <!-- -->
<_tip level="advanced"> <tip level="advanced">
After you enabled &quot;Dynamic Keyboard Shortcuts&quot; in the <_thetip>
Preferences dialog, you can reassign shortcut keys. Do so by bringing After you enabled &quot;Dynamic Keyboard Shortcuts&quot; in the
up the menu, selecting a menu item, and pressing the desired key Preferences dialog, you can reassign shortcut keys. Do so by bringing
combination. If &quot;Save Keyboard Shortcuts&quot; is enabled, the up the menu, selecting a menu item, and pressing the desired key
key bindings are saved when you exit GIMP. combination. If &quot;Save Keyboard Shortcuts&quot; is enabled, the
You should probably disable &quot;Dynamic Keyboard Shortcuts&quot; key bindings are saved when you exit GIMP.
afterwards, to prevent accidentally assigning/reassigning shortcuts. You should probably disable &quot;Dynamic Keyboard Shortcuts&quot;
</_tip> afterwards, to prevent accidentally assigning/reassigning shortcuts.
<_tip level="advanced"> </_thetip>
If your screen is too cluttered, you can press <tt>Tab</tt> </tip>
in an image window to toggle the visibility of the toolbox <tip level="advanced">
and other dialogs. <_thetip>
</_tip> If your screen is too cluttered, you can press <tt>Tab</tt>
<_tip level="advanced"> in an image window to toggle the visibility of the toolbox
<tt>Shift</tt>-click on the eye icon in the Layers dialog to hide all and other dialogs.
layers but that one. <tt>Shift</tt>-click again to show all layers. </_thetip>
</_tip> </tip>
<_tip level="advanced"> <tip level="advanced">
<tt>Ctrl</tt>-clicking on the layer mask's preview in the Layers dialog <_thetip>
toggles the effect of the layer mask. <tt>Alt</tt>-clicking on the layer <tt>Shift</tt>-click on the eye icon in the Layers dialog to hide all
mask's preview in the Layers dialog toggles viewing the mask directly. layers but that one. <tt>Shift</tt>-click again to show all layers.
</_tip> </_thetip>
<_tip level="advanced"> </tip>
You can use <tt>Ctrl</tt>-<tt>Tab</tt> to cycle through all layers in <tip level="advanced">
an image (if your window manager doesn't trap those keys...). <_thetip>
</_tip> <tt>Ctrl</tt>-clicking on the layer mask's preview in the Layers dialog
<_tip level="advanced"> toggles the effect of the layer mask. <tt>Alt</tt>-clicking on the layer
<tt>Ctrl</tt>-click with the Bucket Fill tool to have it use mask's preview in the Layers dialog toggles viewing the mask directly.
the background color instead of the foreground color. </_thetip>
Similarly, <tt>Ctrl</tt>-clicking with the eyedropper tool </tip>
sets the background color instead of the foreground color. <tip level="advanced">
</_tip> <_thetip>
<_tip level="advanced"> You can use <tt>Ctrl</tt>-<tt>Tab</tt> to cycle through all layers in
<tt>Ctrl</tt>-drag with the Rotate tool will constrain the an image (if your window manager doesn't trap those keys...).
rotation to 15 degree angles. </_thetip>
</_tip> </tip>
<_tip level="advanced"> <tip level="advanced">
To create a circle-shaped selection, hold <tt>Shift</tt> while <_thetip>
doing an ellipse select. To place a circle precisely, drag <tt>Ctrl</tt>-click with the Bucket Fill tool to have it use
horizontal and vertical guides tangent to the circle you want to the background color instead of the foreground color.
select, place your cursor at the intersection of the guides, and Similarly, <tt>Ctrl</tt>-clicking with the eyedropper tool
the resulting selection will just touch the guides. sets the background color instead of the foreground color.
</_tip> </_thetip>
<_tip level="advanced"> </tip>
If some of your scanned photos do not look colorful enough, you <tip level="advanced">
can easily improve their tonal range with the &quot;Auto&quot; <_thetip>
button in the Levels tool (Colors→Levels). If there are any <tt>Ctrl</tt>-drag with the Rotate tool will constrain the
color casts, you can correct them with the Curves tool rotation to 15 degree angles.
(Colors→Curves). </_thetip>
</_tip> </tip>
<tip level="advanced">
<!-- --> <_thetip>
<!-- (end of tips) --> To create a circle-shaped selection, hold <tt>Shift</tt> while
<!-- --> doing an ellipse select. To place a circle precisely, drag
horizontal and vertical guides tangent to the circle you want to
select, place your cursor at the intersection of the guides, and
the resulting selection will just touch the guides.
</_thetip>
</tip>
<tip level="advanced">
<_thetip>
If some of your scanned photos do not look colorful enough, you
can easily improve their tonal range with the &quot;Auto&quot;
button in the Levels tool (Colors→Levels). If there are any
color casts, you can correct them with the Curves tool
(Colors→Curves).
</_thetip>
</tip>
</gimp-tips> </gimp-tips>