summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'leptonica/prog/binmorph1_reg.c')
-rw-r--r--leptonica/prog/binmorph1_reg.c578
1 files changed, 578 insertions, 0 deletions
diff --git a/leptonica/prog/binmorph1_reg.c b/leptonica/prog/binmorph1_reg.c
new file mode 100644
index 00000000..1df62f3a
--- /dev/null
+++ b/leptonica/prog/binmorph1_reg.c
@@ -0,0 +1,578 @@
+/*====================================================================*
+ - Copyright (C) 2001 Leptonica. All rights reserved.
+ -
+ - Redistribution and use in source and binary forms, with or without
+ - modification, are permitted provided that the following conditions
+ - are met:
+ - 1. Redistributions of source code must retain the above copyright
+ - notice, this list of conditions and the following disclaimer.
+ - 2. Redistributions in binary form must reproduce the above
+ - copyright notice, this list of conditions and the following
+ - disclaimer in the documentation and/or other materials
+ - provided with the distribution.
+ -
+ - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY
+ - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *====================================================================*/
+
+/*
+ * binmorph1_reg.c
+ *
+ * This is a thorough regression test of different methods for
+ * doing binary morphology. It should always be run if changes
+ * are made to the low-level morphology code.
+ *
+ * Some things to note:
+ *
+ * (1) We add a white border to guarantee safe closing; i.e., that
+ * closing is extensive for ASYMMETRIC_MORPH_BC. The separable
+ * sequence for closing is not safe, so if we didn't add the border
+ * ab initio, we would get different results for the atomic sequence
+ * closing (which is safe) and the separable one.
+ *
+ * (2) There are no differences in any of the operations:
+ * rasterop general
+ * rasterop brick
+ * morph sequence rasterop brick
+ * dwa brick
+ * morph sequence dwa brick
+ * morph sequence dwa composite brick
+ * when using ASYMMETRIC_MORPH_BC.
+ * However, when using SYMMETRIC_MORPH_BC, there are differences
+ * in two of the safe closing operations. These differences
+ * are in pix numbers 4 and 5. These differences are
+ * all due to the fact that for SYMMETRIC_MORPH_BC, we don't need
+ * to add any borders to get the correct answer. When we do
+ * add a border of 0 pixels, we naturally get a different result.
+ *
+ * (3) The 2-way Sel decomposition functions, implemented with the
+ * separable brick interface, are tested separately against
+ * the rasterop brick. See binmorph2_reg.c.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config_auto.h>
+#endif /* HAVE_CONFIG_H */
+
+#include "allheaders.h"
+
+ /* set these ad lib. */
+#define WIDTH 21 /* brick sel width */
+#define HEIGHT 15 /* brick sel height */
+
+void TestAll(L_REGPARAMS *rp, PIX *pix, l_int32 symmetric);
+
+int main(int argc,
+ char **argv)
+{
+PIX *pixs;
+L_REGPARAMS *rp;
+
+ if (regTestSetup(argc, argv, &rp))
+ return 1;
+
+ pixs = pixRead("feyn-fract.tif");
+
+ TestAll(rp, pixs, FALSE);
+ TestAll(rp, pixs, TRUE);
+ pixDestroy(&pixs);
+ return regTestCleanup(rp);
+}
+
+
+void
+TestAll(L_REGPARAMS *rp,
+ PIX *pixs,
+ l_int32 symmetric)
+{
+l_int32 ok, same;
+char sequence[512];
+PIX *pixref;
+PIX *pix1, *pix2, *pix3, *pix4, *pix5, *pix6;
+PIX *pix7, *pix8, *pix9, *pix10, *pix11;
+PIX *pix12, *pix13, *pix14;
+SEL *sel;
+
+ if (symmetric) {
+ /* This works properly if there is an added border */
+ resetMorphBoundaryCondition(SYMMETRIC_MORPH_BC);
+#if 1
+ pix1 = pixAddBorder(pixs, 32, 0);
+ pixTransferAllData(pixs, &pix1, 0, 0);
+#endif
+ lept_stderr("Testing with symmetric boundary conditions\n");
+ } else {
+ resetMorphBoundaryCondition(ASYMMETRIC_MORPH_BC);
+ lept_stderr("Testing with asymmetric boundary conditions\n");
+ }
+
+ /* This is our test sel */
+ sel = selCreateBrick(HEIGHT, WIDTH, HEIGHT / 2, WIDTH / 2, SEL_HIT);
+
+ /* Dilation */
+ lept_stderr(" Testing dilation\n");
+ ok = TRUE;
+ pixref = pixDilate(NULL, pixs, sel); /* new one */
+ pix1 = pixCreateTemplate(pixs);
+ pixDilate(pix1, pixs, sel); /* existing one */
+ pixEqual(pixref, pix1, &same);
+ if (!same) {
+ lept_stderr("pixref != pix1 !\n"); ok = FALSE;
+ }
+ pix2 = pixCopy(NULL, pixs);
+ pixDilate(pix2, pix2, sel); /* in-place */
+ pixEqual(pixref, pix2, &same);
+ if (!same) {
+ lept_stderr("pixref != pix2 !\n"); ok = FALSE;
+ }
+ snprintf(sequence, sizeof(sequence), "d%d.%d", WIDTH, HEIGHT);
+ pix3 = pixMorphSequence(pixs, sequence, 0); /* sequence, atomic */
+ pixEqual(pixref, pix3, &same);
+ if (!same) {
+ lept_stderr("pixref != pix3 !\n"); ok = FALSE;
+ }
+ snprintf(sequence, sizeof(sequence), "d%d.1 + d1.%d", WIDTH, HEIGHT);
+ pix4 = pixMorphSequence(pixs, sequence, 0); /* sequence, separable */
+ pixEqual(pixref, pix4, &same);
+ if (!same) {
+ lept_stderr("pixref != pix4 !\n"); ok = FALSE;
+ }
+ pix5 = pixDilateBrick(NULL, pixs, WIDTH, HEIGHT); /* new one */
+ pixEqual(pixref, pix5, &same);
+ if (!same) {
+ lept_stderr("pixref != pix5 !\n"); ok = FALSE;
+ }
+ pix6 = pixCreateTemplate(pixs);
+ pixDilateBrick(pix6, pixs, WIDTH, HEIGHT); /* existing one */
+ pixEqual(pixref, pix6, &same);
+ if (!same) {
+ lept_stderr("pixref != pix6 !\n"); ok = FALSE;
+ }
+ pix7 = pixCopy(NULL, pixs);
+ pixDilateBrick(pix7, pix7, WIDTH, HEIGHT); /* in-place */
+ pixEqual(pixref, pix7, &same);
+ if (!same) {
+ lept_stderr("pixref != pix7 !\n"); ok = FALSE;
+ }
+ pix8 = pixDilateBrickDwa(NULL, pixs, WIDTH, HEIGHT); /* new one */
+ pixEqual(pixref, pix8, &same);
+ if (!same) {
+ lept_stderr("pixref != pix8 !\n"); ok = FALSE;
+ }
+ pix9 = pixCreateTemplate(pixs);
+ pixDilateBrickDwa(pix9, pixs, WIDTH, HEIGHT); /* existing one */
+ pixEqual(pixref, pix9, &same);
+ if (!same) {
+ lept_stderr("pixref != pix9 !\n"); ok = FALSE;
+ }
+ pix10 = pixCopy(NULL, pixs);
+ pixDilateBrickDwa(pix10, pix10, WIDTH, HEIGHT); /* in-place */
+ pixEqual(pixref, pix10, &same);
+ if (!same) {
+ lept_stderr("pixref != pix10 !\n"); ok = FALSE;
+ }
+ pix11 = pixCreateTemplate(pixs);
+ pixDilateCompBrickDwa(pix11, pixs, WIDTH, HEIGHT); /* existing one */
+ pixEqual(pixref, pix11, &same);
+ if (!same) {
+ lept_stderr("pixref != pix11 !\n"); ok = FALSE;
+ }
+ snprintf(sequence, sizeof(sequence), "d%d.%d", WIDTH, HEIGHT);
+ pix12 = pixMorphCompSequence(pixs, sequence, 0); /* comp sequence */
+ pixEqual(pixref, pix12, &same);
+ if (!same) {
+ lept_stderr("pixref != pix12!\n"); ok = FALSE;
+ }
+ pix13 = pixMorphSequenceDwa(pixs, sequence, 0); /* dwa sequence */
+ pixEqual(pixref, pix13, &same);
+ if (!same) {
+ lept_stderr("pixref != pix13!\n"); ok = FALSE;
+ }
+ pixDestroy(&pixref);
+ pixDestroy(&pix1);
+ pixDestroy(&pix2);
+ pixDestroy(&pix3);
+ pixDestroy(&pix4);
+ pixDestroy(&pix5);
+ pixDestroy(&pix6);
+ pixDestroy(&pix7);
+ pixDestroy(&pix8);
+ pixDestroy(&pix9);
+ pixDestroy(&pix10);
+ pixDestroy(&pix11);
+ pixDestroy(&pix12);
+ pixDestroy(&pix13);
+
+ /* Erosion */
+ lept_stderr(" Testing erosion\n");
+ pixref = pixErode(NULL, pixs, sel); /* new one */
+ pix1 = pixCreateTemplate(pixs);
+ pixErode(pix1, pixs, sel); /* existing one */
+ pixEqual(pixref, pix1, &same);
+ if (!same) {
+ lept_stderr("pixref != pix1 !\n"); ok = FALSE;
+ }
+ pix2 = pixCopy(NULL, pixs);
+ pixErode(pix2, pix2, sel); /* in-place */
+ pixEqual(pixref, pix2, &same);
+ if (!same) {
+ lept_stderr("pixref != pix2 !\n"); ok = FALSE;
+ }
+ snprintf(sequence, sizeof(sequence), "e%d.%d", WIDTH, HEIGHT);
+ pix3 = pixMorphSequence(pixs, sequence, 0); /* sequence, atomic */
+ pixEqual(pixref, pix3, &same);
+ if (!same) {
+ lept_stderr("pixref != pix3 !\n"); ok = FALSE;
+ }
+ snprintf(sequence, sizeof(sequence), "e%d.1 + e1.%d", WIDTH, HEIGHT);
+ pix4 = pixMorphSequence(pixs, sequence, 0); /* sequence, separable */
+ pixEqual(pixref, pix4, &same);
+ if (!same) {
+ lept_stderr("pixref != pix4 !\n"); ok = FALSE;
+ }
+ pix5 = pixErodeBrick(NULL, pixs, WIDTH, HEIGHT); /* new one */
+ pixEqual(pixref, pix5, &same);
+ if (!same) {
+ lept_stderr("pixref != pix5 !\n"); ok = FALSE;
+ }
+ pix6 = pixCreateTemplate(pixs);
+ pixErodeBrick(pix6, pixs, WIDTH, HEIGHT); /* existing one */
+ pixEqual(pixref, pix6, &same);
+ if (!same) {
+ lept_stderr("pixref != pix6 !\n"); ok = FALSE;
+ }
+ pix7 = pixCopy(NULL, pixs);
+ pixErodeBrick(pix7, pix7, WIDTH, HEIGHT); /* in-place */
+ pixEqual(pixref, pix7, &same);
+ if (!same) {
+ lept_stderr("pixref != pix7 !\n"); ok = FALSE;
+ }
+ pix8 = pixErodeBrickDwa(NULL, pixs, WIDTH, HEIGHT); /* new one */
+ pixEqual(pixref, pix8, &same);
+ if (!same) {
+ lept_stderr("pixref != pix8 !\n"); ok = FALSE;
+ }
+ pix9 = pixCreateTemplate(pixs);
+ pixErodeBrickDwa(pix9, pixs, WIDTH, HEIGHT); /* existing one */
+ pixEqual(pixref, pix9, &same);
+ if (!same) {
+ lept_stderr("pixref != pix9 !\n"); ok = FALSE;
+ }
+ pix10 = pixCopy(NULL, pixs);
+ pixErodeBrickDwa(pix10, pix10, WIDTH, HEIGHT); /* in-place */
+ pixEqual(pixref, pix10, &same);
+ if (!same) {
+ lept_stderr("pixref != pix10 !\n"); ok = FALSE;
+ }
+ pix11 = pixCreateTemplate(pixs);
+ pixErodeCompBrickDwa(pix11, pixs, WIDTH, HEIGHT); /* existing one */
+ pixEqual(pixref, pix11, &same);
+ if (!same) {
+ lept_stderr("pixref != pix11 !\n"); ok = FALSE;
+ }
+
+ snprintf(sequence, sizeof(sequence), "e%d.%d", WIDTH, HEIGHT);
+ pix12 = pixMorphCompSequence(pixs, sequence, 0); /* comp sequence */
+ pixEqual(pixref, pix12, &same);
+ if (!same) {
+ lept_stderr("pixref != pix12!\n"); ok = FALSE;
+ }
+ pix13 = pixMorphSequenceDwa(pixs, sequence, 0); /* dwa sequence */
+ pixEqual(pixref, pix13, &same);
+ if (!same) {
+ lept_stderr("pixref != pix13!\n"); ok = FALSE;
+ }
+ pixDestroy(&pixref);
+ pixDestroy(&pix1);
+ pixDestroy(&pix2);
+ pixDestroy(&pix3);
+ pixDestroy(&pix4);
+ pixDestroy(&pix5);
+ pixDestroy(&pix6);
+ pixDestroy(&pix7);
+ pixDestroy(&pix8);
+ pixDestroy(&pix9);
+ pixDestroy(&pix10);
+ pixDestroy(&pix11);
+ pixDestroy(&pix12);
+ pixDestroy(&pix13);
+
+ /* Opening */
+ lept_stderr(" Testing opening\n");
+ pixref = pixOpen(NULL, pixs, sel); /* new one */
+ pix1 = pixCreateTemplate(pixs);
+ pixOpen(pix1, pixs, sel); /* existing one */
+ pixEqual(pixref, pix1, &same);
+ if (!same) {
+ lept_stderr("pixref != pix1 !\n"); ok = FALSE;
+ }
+ pix2 = pixCopy(NULL, pixs);
+ pixOpen(pix2, pix2, sel); /* in-place */
+ pixEqual(pixref, pix2, &same);
+ if (!same) {
+ lept_stderr("pixref != pix2 !\n"); ok = FALSE;
+ }
+ snprintf(sequence, sizeof(sequence), "o%d.%d", WIDTH, HEIGHT);
+ pix3 = pixMorphSequence(pixs, sequence, 0); /* sequence, atomic */
+ pixEqual(pixref, pix3, &same);
+ if (!same) {
+ lept_stderr("pixref != pix3 !\n"); ok = FALSE;
+ }
+ snprintf(sequence, sizeof(sequence), "e%d.%d + d%d.%d",
+ WIDTH, HEIGHT, WIDTH, HEIGHT);
+ pix4 = pixMorphSequence(pixs, sequence, 0); /* sequence, separable */
+ pixEqual(pixref, pix4, &same);
+ if (!same) {
+ lept_stderr("pixref != pix4 !\n"); ok = FALSE;
+ }
+ snprintf(sequence, sizeof(sequence), "e%d.1 + e1.%d + d%d.1 + d1.%d",
+ WIDTH, HEIGHT, WIDTH, HEIGHT);
+ pix5 = pixMorphSequence(pixs, sequence, 0); /* sequence, separable^2 */
+ pixEqual(pixref, pix5, &same);
+ if (!same) {
+ lept_stderr("pixref != pix5 !\n"); ok = FALSE;
+ }
+ pix6 = pixOpenBrick(NULL, pixs, WIDTH, HEIGHT); /* new one */
+ pixEqual(pixref, pix6, &same);
+ if (!same) {
+ lept_stderr("pixref != pix6 !\n"); ok = FALSE;
+ }
+ pix7 = pixCreateTemplate(pixs);
+ pixOpenBrick(pix7, pixs, WIDTH, HEIGHT); /* existing one */
+ pixEqual(pixref, pix7, &same);
+ if (!same) {
+ lept_stderr("pixref != pix7 !\n"); ok = FALSE;
+ }
+ pix8 = pixCopy(NULL, pixs); /* in-place */
+ pixOpenBrick(pix8, pix8, WIDTH, HEIGHT); /* existing one */
+ pixEqual(pixref, pix8, &same);
+ if (!same) {
+ lept_stderr("pixref != pix8 !\n"); ok = FALSE;
+ }
+ pix9 = pixOpenBrickDwa(NULL, pixs, WIDTH, HEIGHT); /* new one */
+ pixEqual(pixref, pix9, &same);
+ if (!same) {
+ lept_stderr("pixref != pix9 !\n"); ok = FALSE;
+ }
+ pix10 = pixCreateTemplate(pixs);
+ pixOpenBrickDwa(pix10, pixs, WIDTH, HEIGHT); /* existing one */
+ pixEqual(pixref, pix10, &same);
+ if (!same) {
+ lept_stderr("pixref != pix10 !\n"); ok = FALSE;
+ }
+ pix11 = pixCopy(NULL, pixs);
+ pixOpenBrickDwa(pix11, pix11, WIDTH, HEIGHT); /* in-place */
+ pixEqual(pixref, pix11, &same);
+ if (!same) {
+ lept_stderr("pixref != pix11 !\n"); ok = FALSE;
+ }
+ snprintf(sequence, sizeof(sequence), "o%d.%d", WIDTH, HEIGHT);
+ pix12 = pixMorphCompSequence(pixs, sequence, 0); /* comp sequence */
+ pixEqual(pixref, pix12, &same);
+ if (!same) {
+ lept_stderr("pixref != pix12!\n"); ok = FALSE;
+ }
+
+ pix13 = pixMorphSequenceDwa(pixs, sequence, 0); /* dwa sequence */
+ pixEqual(pixref, pix13, &same);
+ if (!same) {
+ lept_stderr("pixref != pix13!\n"); ok = FALSE;
+ }
+ pix14 = pixCreateTemplate(pixs);
+ pixOpenCompBrickDwa(pix14, pixs, WIDTH, HEIGHT); /* existing one */
+ pixEqual(pixref, pix14, &same);
+ if (!same) {
+ lept_stderr("pixref != pix14 !\n"); ok = FALSE;
+ }
+
+ pixDestroy(&pixref);
+ pixDestroy(&pix1);
+ pixDestroy(&pix2);
+ pixDestroy(&pix3);
+ pixDestroy(&pix4);
+ pixDestroy(&pix5);
+ pixDestroy(&pix6);
+ pixDestroy(&pix7);
+ pixDestroy(&pix8);
+ pixDestroy(&pix9);
+ pixDestroy(&pix10);
+ pixDestroy(&pix11);
+ pixDestroy(&pix12);
+ pixDestroy(&pix13);
+ pixDestroy(&pix14);
+
+ /* Closing */
+ lept_stderr(" Testing closing\n");
+ pixref = pixClose(NULL, pixs, sel); /* new one */
+ pix1 = pixCreateTemplate(pixs);
+ pixClose(pix1, pixs, sel); /* existing one */
+ pixEqual(pixref, pix1, &same);
+ if (!same) {
+ lept_stderr("pixref != pix1 !\n"); ok = FALSE;
+ }
+ pix2 = pixCopy(NULL, pixs);
+ pixClose(pix2, pix2, sel); /* in-place */
+ pixEqual(pixref, pix2, &same);
+ if (!same) {
+ lept_stderr("pixref != pix2 !\n"); ok = FALSE;
+ }
+ snprintf(sequence, sizeof(sequence), "d%d.%d + e%d.%d",
+ WIDTH, HEIGHT, WIDTH, HEIGHT);
+ pix3 = pixMorphSequence(pixs, sequence, 0); /* sequence, separable */
+ pixEqual(pixref, pix3, &same);
+ if (!same) {
+ lept_stderr("pixref != pix3 !\n"); ok = FALSE;
+ }
+ snprintf(sequence, sizeof(sequence), "d%d.1 + d1.%d + e%d.1 + e1.%d",
+ WIDTH, HEIGHT, WIDTH, HEIGHT);
+ pix4 = pixMorphSequence(pixs, sequence, 0); /* sequence, separable^2 */
+ pixEqual(pixref, pix4, &same);
+ if (!same) {
+ lept_stderr("pixref != pix4 !\n"); ok = FALSE;
+ }
+ pix5 = pixCloseBrick(NULL, pixs, WIDTH, HEIGHT); /* new one */
+ pixEqual(pixref, pix5, &same);
+ if (!same) {
+ lept_stderr("pixref != pix5 !\n"); ok = FALSE;
+ }
+ pix6 = pixCreateTemplate(pixs);
+ pixCloseBrick(pix6, pixs, WIDTH, HEIGHT); /* existing one */
+ pixEqual(pixref, pix6, &same);
+ if (!same) {
+ lept_stderr("pixref != pix6 !\n"); ok = FALSE;
+ }
+ pix7 = pixCopy(NULL, pixs); /* in-place */
+ pixCloseBrick(pix7, pix7, WIDTH, HEIGHT); /* existing one */
+ pixEqual(pixref, pix7, &same);
+ if (!same) {
+ lept_stderr("pixref != pix7 !\n"); ok = FALSE;
+ }
+ pixDestroy(&pixref);
+ pixDestroy(&pix1);
+ pixDestroy(&pix2);
+ pixDestroy(&pix3);
+ pixDestroy(&pix4);
+ pixDestroy(&pix5);
+ pixDestroy(&pix6);
+ pixDestroy(&pix7);
+
+ /* Safe closing (using pix, not pixs) */
+ lept_stderr(" Testing safe closing\n");
+ pixref = pixCloseSafe(NULL, pixs, sel); /* new one */
+ pix1 = pixCreateTemplate(pixs);
+ pixCloseSafe(pix1, pixs, sel); /* existing one */
+ pixEqual(pixref, pix1, &same);
+ if (!same) {
+ lept_stderr("pixref != pix1 !\n"); ok = FALSE;
+ }
+ pix2 = pixCopy(NULL, pixs);
+ pixCloseSafe(pix2, pix2, sel); /* in-place */
+ pixEqual(pixref, pix2, &same);
+ if (!same) {
+ lept_stderr("pixref != pix2 !\n"); ok = FALSE;
+ }
+ snprintf(sequence, sizeof(sequence), "c%d.%d", WIDTH, HEIGHT);
+ pix3 = pixMorphSequence(pixs, sequence, 0); /* sequence, atomic */
+ pixEqual(pixref, pix3, &same);
+ if (!same) {
+ lept_stderr("pixref != pix3 !\n"); ok = FALSE;
+ }
+ snprintf(sequence, sizeof(sequence), "b32 + d%d.%d + e%d.%d",
+ WIDTH, HEIGHT, WIDTH, HEIGHT);
+ pix4 = pixMorphSequence(pixs, sequence, 0); /* sequence, separable */
+ pixEqual(pixref, pix4, &same);
+ if (!same) {
+ lept_stderr("pixref != pix4 !\n"); ok = FALSE;
+ }
+ snprintf(sequence, sizeof(sequence), "b32 + d%d.1 + d1.%d + e%d.1 + e1.%d",
+ WIDTH, HEIGHT, WIDTH, HEIGHT);
+ pix5 = pixMorphSequence(pixs, sequence, 0); /* sequence, separable^2 */
+ pixEqual(pixref, pix5, &same);
+ if (!same) {
+ lept_stderr("pixref != pix5 !\n"); ok = FALSE;
+ }
+ pix6 = pixCloseSafeBrick(NULL, pixs, WIDTH, HEIGHT); /* new one */
+ pixEqual(pixref, pix6, &same);
+ if (!same) {
+ lept_stderr("pixref != pix6 !\n"); ok = FALSE;
+ }
+ pix7 = pixCreateTemplate(pixs);
+ pixCloseSafeBrick(pix7, pixs, WIDTH, HEIGHT); /* existing one */
+ pixEqual(pixref, pix7, &same);
+ if (!same) {
+ lept_stderr("pixref != pix7 !\n"); ok = FALSE;
+ }
+ pix8 = pixCopy(NULL, pixs); /* in-place */
+ pixCloseSafeBrick(pix8, pix8, WIDTH, HEIGHT); /* existing one */
+ pixEqual(pixref, pix8, &same);
+ if (!same) {
+ lept_stderr("pixref != pix8 !\n"); ok = FALSE;
+ }
+ pix9 = pixCloseBrickDwa(NULL, pixs, WIDTH, HEIGHT); /* new one */
+ pixEqual(pixref, pix9, &same);
+ if (!same) {
+ lept_stderr("pixref != pix9 !\n"); ok = FALSE;
+ }
+ pix10 = pixCreateTemplate(pixs);
+ pixCloseBrickDwa(pix10, pixs, WIDTH, HEIGHT); /* existing one */
+ pixEqual(pixref, pix10, &same);
+ if (!same) {
+ lept_stderr("pixref != pix10 !\n"); ok = FALSE;
+ }
+ pix11 = pixCopy(NULL, pixs);
+ pixCloseBrickDwa(pix11, pix11, WIDTH, HEIGHT); /* in-place */
+ pixEqual(pixref, pix11, &same);
+ if (!same) {
+ lept_stderr("pixref != pix11 !\n"); ok = FALSE;
+ }
+ snprintf(sequence, sizeof(sequence), "c%d.%d", WIDTH, HEIGHT);
+ pix12 = pixMorphCompSequence(pixs, sequence, 0); /* comp sequence */
+ pixEqual(pixref, pix12, &same);
+ if (!same) {
+ lept_stderr("pixref != pix12!\n"); ok = FALSE;
+ }
+ pix13 = pixMorphSequenceDwa(pixs, sequence, 0); /* dwa sequence */
+ pixEqual(pixref, pix13, &same);
+ if (!same) {
+ lept_stderr("pixref != pix13!\n"); ok = FALSE;
+ }
+ pix14 = pixCreateTemplate(pixs);
+ pixCloseCompBrickDwa(pix14, pixs, WIDTH, HEIGHT); /* existing one */
+ pixEqual(pixref, pix14, &same);
+ if (!same) {
+ lept_stderr("pixref != pix14 !\n"); ok = FALSE;
+ }
+
+ pixDestroy(&pixref);
+ pixDestroy(&pix1);
+ pixDestroy(&pix2);
+ pixDestroy(&pix3);
+ pixDestroy(&pix4);
+ pixDestroy(&pix5);
+ pixDestroy(&pix6);
+ pixDestroy(&pix7);
+ pixDestroy(&pix8);
+ pixDestroy(&pix9);
+ pixDestroy(&pix10);
+ pixDestroy(&pix11);
+ pixDestroy(&pix12);
+ pixDestroy(&pix13);
+ pixDestroy(&pix14);
+
+ regTestCompareValues(rp, TRUE, ok, 0);
+ if (ok)
+ lept_stderr(" All morph tests OK!\n");
+ else
+ lept_stderr(" Some morph tests failed!\n");
+ selDestroy(&sel);
+}
+