[prev in list] [next in list] [prev in thread] [next in thread]
List: graphicsmagick-commit
Subject: [GM-commit] GraphicsMagick: More performance improvements to
From: GraphicsMagick Commits <graphicsmagick-commit () lists ! sourceforge ! net>
Date: 2011-11-19 23:41:33
Message-ID: hg.64bdd42c4b77.1321746093.-1602079902 () blade ! simplesystems ! org
[Download RAW message or body]
changeset 64bdd42c4b77 in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=64bdd42c4b77
summary: More performance improvements to AdaptiveThresholdImage().
diffstat:
ChangeLog | 5 +
VisualMagick/installer/inc/version.isx | 2 +-
doc/options.imdoc | 11 +
locale/C.mgk | 3 +
magick/effect.c | 171 ++--
magick/gm_messages.mc | 6 +
magick/locale_c.h | 1057 ++++++++++++++++---------------
magick/version.h | 2 +-
www/Changelog.html | 7 +
9 files changed, 646 insertions(+), 618 deletions(-)
diffs (truncated from 1444 to 300 lines):
diff -r ca127a171546 -r 64bdd42c4b77 ChangeLog
--- a/ChangeLog Sat Nov 12 14:50:13 2011 -0600
+++ b/ChangeLog Sat Nov 19 17:41:26 2011 -0600
@@ -1,3 +1,8 @@
+2011-11-19 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
+
+ * magick/effect.c (AdaptiveThresholdImage): More performance
+ improvements.
+
2011-11-06 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
* magick/analyze.c (GetImageBoundingBox): Add a special case to
diff -r ca127a171546 -r 64bdd42c4b77 VisualMagick/installer/inc/version.isx
--- a/VisualMagick/installer/inc/version.isx Sat Nov 12 14:50:13 2011 -0600
+++ b/VisualMagick/installer/inc/version.isx Sat Nov 19 17:41:26 2011 -0600
@@ -10,5 +10,5 @@
#define public MagickPackageName "GraphicsMagick"
#define public MagickPackageVersion "1.4"
-#define public MagickPackageVersionAddendum ".020111106"
+#define public MagickPackageVersionAddendum ".020111119"
#define public MagickPackageReleaseDate "unreleased"
diff -r ca127a171546 -r 64bdd42c4b77 doc/options.imdoc
--- a/doc/options.imdoc Sat Nov 12 14:50:13 2011 -0600
+++ b/doc/options.imdoc Sat Nov 19 17:41:26 2011 -0600
@@ -2854,6 +2854,17 @@
sensitive to pixel quantum depth.</pp>
<pp>
+For example,</pp>
+
+<pre>
+ -colorspace gray -lat "10x10-5%"
+</pre>
+
+<p>
+will help clarify a scanned grayscale or color document, producing a
+bi-level equivalent.</pp>
+
+<pp>
</pp>
</utils>
diff -r ca127a171546 -r 64bdd42c4b77 locale/C.mgk
--- a/locale/C.mgk Sat Nov 12 14:50:13 2011 -0600
+++ b/locale/C.mgk Sat Nov 19 17:41:26 2011 -0600
@@ -857,6 +857,9 @@
<Message name="MatrixIsNotSquare">
Matrix is not square (%s elements)
</Message>
+ <Message name="RegionAreaExceedsLimit">
+ Region area exceeds implementation limit
+ </Message>
<Message name="MissingAnImageFilename">
Missing an image filename
</Message>
diff -r ca127a171546 -r 64bdd42c4b77 magick/effect.c
--- a/magick/effect.c Sat Nov 12 14:50:13 2011 -0600
+++ b/magick/effect.c Sat Nov 19 17:41:26 2011 -0600
@@ -107,6 +107,10 @@
MagickPassFail
status;
+ const MagickBool
+ is_monochrome = image->is_monochrome,
+ is_grayscale = image->is_grayscale;
+
/*
Initialize thresholded image attributes.
*/
@@ -117,10 +121,15 @@
if ((image->columns < width) || (image->rows < height))
ThrowImageException3(OptionError,UnableToThresholdImage,
ImageSmallerThanRadius);
+ if (width*height > (unsigned long) ULONG_MAX/ScaleQuantumToMap(MaxRGB))
+ {
+ ThrowImageException3(OptionError,UnableToThresholdImage,
+ RegionAreaExceedsLimit);
+ }
threshold_image=CloneImage(image,0,0,True,exception);
if (threshold_image == (Image *) NULL)
return((Image *) NULL);
- if (image->is_monochrome)
+ if (is_monochrome)
return threshold_image;
(void) SetImageType(threshold_image,TrueColorType);
status=MagickPass;
@@ -131,26 +140,17 @@
unsigned long
row_count=0;
-#if QuantumDepth > 8
- const DoublePixelPacket
- double_zero = { 0.0, 0.0, 0.0, 0.0 };
-#endif /* QuantumDepth > 8 */
-
const LongPixelPacket
long_zero = { 0, 0, 0, 0 };
const MagickBool
matte=((threshold_image->matte) || (threshold_image->colorspace == CMYKColorspace));
-#if QuantumDepth == 8
const long
- long_offset = RoundDoubleToQuantum(offset);
-#endif /* QuantumDepth == 8 */
-
-#if QuantumDepth > 8
+ long_offset = offset + 0.5;
+
const unsigned long
- overflow_limit = (ULONG_MAX/MaxRGB);
-#endif /* QuantumDepth > 8 */
+ dimensions = width*height;
#if defined(HAVE_OPENMP)
# pragma omp parallel for schedule(dynamic) shared(row_count, status)
@@ -158,10 +158,10 @@
for (y=0; y < (long) image->rows; y++)
{
const PixelPacket
- *p;
+ * restrict p;
PixelPacket
- *q;
+ * restrict q;
long
x;
@@ -184,92 +184,85 @@
if (thread_status != MagickFail)
{
- for (x=0; x < (long) image->columns; x++)
- {
-#if QuantumDepth > 8
- DoublePixelPacket
- double_sum;
-#endif /* QuantumDepth > 8 */
-
+ for (x=0; x < (long) image->columns; x++)
+ {
LongPixelPacket
long_sum;
- const PixelPacket
- *r;
-
-#if QuantumDepth > 8
- unsigned long
- overflow;
-#endif /* QuantumDepth > 8 */
+ const PixelPacket
+ * restrict r;
unsigned long
u,
v;
r=p;
-#if QuantumDepth > 8
- double_sum=double_zero;
- overflow = overflow_limit;
-#endif /* QuantumDepth > 8 */
long_sum=long_zero;
- for (v=0; v < height; v++)
- {
- for (u=0; u < width; u++)
- {
- long_sum.red += r[u].red;
- long_sum.green += r[u].green;
- long_sum.blue += r[u].blue;
- if (matte)
- long_sum.opacity += r[u].opacity;
-
-#if QuantumDepth > 8
- overflow--;
- if (overflow == 0)
+
+ if (is_grayscale && !matte)
+ {
+ /* G */
+ for (v=0; v < height; v++)
+ {
+ for (u=0; u < width; u++)
+ long_sum.red += ScaleQuantumToMap(r[u].red);
+ r+=image->columns+width;
+ }
+ }
+ else if (!matte)
+ {
+ /* RGB */
+ for (v=0; v < height; v++)
+ {
+ for (u=0; u < width; u++)
{
- double_sum.red += long_sum.red;
- double_sum.green += long_sum.green;
- double_sum.blue += long_sum.blue;
- double_sum.opacity += long_sum.opacity;
- long_sum=long_zero;
- overflow = overflow_limit;
+ long_sum.red += ScaleQuantumToMap(r[u].red);
+ long_sum.green += ScaleQuantumToMap(r[u].green);
+ long_sum.blue += ScaleQuantumToMap(r[u].blue);
}
-#endif /* QuantumDepth > 8 */
+ r+=image->columns+width;
}
- r+=image->columns+width;
- }
-
-#if QuantumDepth > 8
- double_sum.red += long_sum.red;
- double_sum.green += long_sum.green;
- double_sum.blue += long_sum.blue;
- double_sum.opacity += long_sum.opacity;
-
- double_sum.red = double_sum.red/(width*height)+offset;
- double_sum.green = double_sum.green/(width*height)+offset;
- double_sum.blue = double_sum.blue/(width*height)+offset;
+ }
+ else
+ {
+ /* RGBA */
+ for (v=0; v < height; v++)
+ {
+ for (u=0; u < width; u++)
+ {
+ long_sum.red += ScaleQuantumToMap(r[u].red);
+ long_sum.green += ScaleQuantumToMap(r[u].green);
+ long_sum.blue += ScaleQuantumToMap(r[u].blue);
+ long_sum.opacity += ScaleQuantumToMap(r[u].opacity);
+ }
+ r+=image->columns+width;
+ }
+ }
+
+ long_sum.red = ScaleMapToQuantum(((long) long_sum.red/dimensions))+long_offset;
+ if (!is_grayscale)
+ {
+ long_sum.green = ScaleMapToQuantum(((long) long_sum.green/dimensions))+long_offset;
+ long_sum.blue = ScaleMapToQuantum(((long) long_sum.blue/dimensions))+long_offset;
+ }
if (matte)
- double_sum.opacity = double_sum.opacity/(width*height)+offset;
-
- long_sum.red = RoundDoubleToQuantum(double_sum.red);
- long_sum.green = RoundDoubleToQuantum(double_sum.green);
- long_sum.blue = RoundDoubleToQuantum(double_sum.blue);
+ long_sum.opacity = ScaleMapToQuantum(((long) long_sum.opacity/dimensions))+long_offset;
+
+ if (is_grayscale)
+ {
+ q->red=q->green=q->blue=(q->red <= long_sum.red ? 0 : MaxRGB);
+ }
+ else
+ {
+ q->red=(q->red <= long_sum.red ? 0 : MaxRGB);
+ q->green=(q->green <= long_sum.green ? 0 : MaxRGB);
+ q->blue=(q->blue <= long_sum.blue ? 0 : MaxRGB);
+ }
if (matte)
- long_sum.opacity = RoundDoubleToQuantum(double_sum.opacity);
-#else
- long_sum.red = long_sum.red/(width*height)+long_offset;
- long_sum.green = long_sum.green/(width*height)+long_offset;
- long_sum.blue = long_sum.blue/(width*height)+long_offset;
- if (matte)
- long_sum.opacity = long_sum.opacity/(width*height)+long_offset;
-#endif
- q->red=q->red <= long_sum.red ? 0 : MaxRGB;
- q->green=q->green <= long_sum.green ? 0 : MaxRGB;
- q->blue=q->blue <= long_sum.blue ? 0 : MaxRGB;
- if (matte)
- q->opacity=q->opacity <= long_sum.opacity ? 0 : MaxRGB;
- p++;
- q++;
- }
+ q->opacity=(q->opacity <= long_sum.opacity ? 0 : MaxRGB);
+ p++;
+ q++;
+ }
if (!SyncImagePixelsEx(threshold_image,exception))
thread_status=MagickFail;
}
@@ -294,10 +287,10 @@
DestroyImage(threshold_image);
threshold_image=(Image *) NULL;
}
- else
+ if (is_grayscale)
{
- threshold_image->is_monochrome=True;
- threshold_image->is_grayscale=True;
+ threshold_image->is_monochrome=MagickTrue;
+ threshold_image->is_grayscale=MagickTrue;
}
return(threshold_image);
------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure
contains a definitive record of customers, application performance,
security threats, fraudulent activity, and more. Splunk takes this
data and makes sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-novd2d
_______________________________________________
Graphicsmagick-commit mailing list
Graphicsmagick-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/graphicsmagick-commit
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic