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