From: joncruz Date: Tue, 6 Jun 2006 04:37:22 +0000 (+0000) Subject: Applied patch #1501375 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=1b2fcf1acd5b2e03ea27497e258ba1810841671b;p=inkscape.git Applied patch #1501375 --- diff --git a/ChangeLog b/ChangeLog index f2db872f4..c2622d5e4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2006-06-05 Jon A. Cruz + + * trace/siox.cpp, trace/siox.h, trace/trace.cpp, + src/ui/dialog/tracedialog.cpp: + + Applied patch #1501375. + 2006-06-05 Jon A. Cruz * trace/siox.cpp, trace/trace.cpp: diff --git a/src/trace/siox.cpp b/src/trace/siox.cpp index 752a14460..b0632567c 100644 --- a/src/trace/siox.cpp +++ b/src/trace/siox.cpp @@ -655,9 +655,19 @@ const float Siox::CERTAIN_BACKGROUND_CONFIDENCE=0.0f; */ Siox::Siox() { + sioxObserver = NULL; init(); } +/** + * Construct a Siox engine + */ +Siox::Siox(SioxObserver *observer) +{ + init(); + sioxObserver = observer; +} + /** * @@ -704,6 +714,27 @@ void Siox::trace(char *fmt, ...) +/** + * Progress reporting + */ +bool Siox::progressReport(float percentCompleted) +{ + if (!sioxObserver) + return true; + + bool ret = sioxObserver->progress(percentCompleted); + + if (!ret) + { + trace("User selected abort"); + keepGoing = false; + } + + return ret; +} + + + /** * Extract the foreground of the original image, according @@ -713,6 +744,7 @@ SioxImage Siox::extractForeground(const SioxImage &originalImage, unsigned int backgroundFillColor) { init(); + keepGoing = true; SioxImage workImage = originalImage; @@ -729,17 +761,28 @@ SioxImage Siox::extractForeground(const SioxImage &originalImage, //#### create color signatures std::vector knownBg; std::vector knownFg; - for (int x = 0 ; x < workImage.getWidth() ; x++) - for (int y = 0 ; y < workImage.getHeight() ; y++) + std::vector imageClab; + for (int y = 0 ; y < workImage.getHeight() ; y++) + for (int x = 0 ; x < workImage.getWidth() ; x++) { float cm = workImage.getConfidence(x, y); unsigned int pix = workImage.getPixel(x, y); + CLAB lab(pix); + imageClab.push_back(lab); if (cm <= BACKGROUND_CONFIDENCE) - knownBg.push_back(pix); //note: uses CLAB(rgb) + knownBg.push_back(lab); //note: uses CLAB(rgb) else if (cm >= FOREGROUND_CONFIDENCE) - knownFg.push_back(pix); + knownFg.push_back(lab); } + if (!progressReport(10.0)) + { + error("User aborted"); + workImage.setValid(false); + delete[] labelField; + return workImage; + } + trace("knownBg:%d knownFg:%d", knownBg.size(), knownFg.size()); @@ -748,14 +791,25 @@ SioxImage Siox::extractForeground(const SioxImage &originalImage, { error("Could not create background signature"); workImage.setValid(false); + delete[] labelField; + return workImage; + } + + if (!progressReport(30.0)) + { + error("User aborted"); + workImage.setValid(false); + delete[] labelField; return workImage; } + + std::vector fgSignature ; if (!colorSignature(knownFg, fgSignature, 3)) { error("Could not create foreground signature"); - delete[] labelField; workImage.setValid(false); + delete[] labelField; return workImage; } @@ -765,17 +819,41 @@ SioxImage Siox::extractForeground(const SioxImage &originalImage, { // segmentation impossible error("Signature size is < 1. Segmentation is impossible"); + workImage.setValid(false); delete[] labelField; + return workImage; + } + + if (!progressReport(30.0)) + { + error("User aborted"); workImage.setValid(false); + delete[] labelField; return workImage; } + // classify using color signatures, // classification cached in hashmap for drb and speedup purposes std::map hs; + + unsigned int progressResolution = pixelCount / 10; for (unsigned int i=0; i= FOREGROUND_CONFIDENCE) { cm[i] = CERTAIN_FOREGROUND_CONFIDENCE; @@ -795,7 +873,7 @@ SioxImage Siox::extractForeground(const SioxImage &originalImage, } else { - CLAB lab(image[i]); + CLAB lab = imageClab[i]; float minBg = sqrEuclidianDist(lab, bgSignature[0]); int minIndex=0; for (unsigned int j=1; j #include #include +#include #include #include #include @@ -57,7 +58,7 @@ Tracer::getSelectedSPImage() SPDesktop *desktop = SP_ACTIVE_DESKTOP; if (!desktop) { - g_warning("Trace: No active desktop\n"); + g_warning("Trace: No active desktop"); return NULL; } @@ -155,8 +156,61 @@ Tracer::getSelectedSPImage() typedef org::siox::SioxImage SioxImage; +typedef org::siox::SioxObserver SioxObserver; typedef org::siox::Siox Siox; + +class TraceSioxObserver : public SioxObserver +{ +public: + + /** + * + */ + TraceSioxObserver (void *contextArg) : + SioxObserver(contextArg) + {} + + /** + * + */ + virtual ~TraceSioxObserver () + { } + + /** + * Informs the observer how much has been completed. + * Return false if the processing should be aborted. + */ + virtual bool progress(float percentCompleted) + { + //Tracer *tracer = (Tracer *)context; + //## Allow the GUI to update + Gtk::Main::iteration(false); //at least once, non-blocking + while( Gtk::Main::events_pending() ) + Gtk::Main::iteration(); + return true; + } + + /** + * Send an error string to the Observer. Processing will + * be halted. + */ + virtual void error(const std::string &msg) + { + //Tracer *tracer = (Tracer *)context; + } + + +}; + + + + + +/** + * Process a GdkPixbuf, according to which areas have been + * obscured in the GUI. + */ GdkPixbuf * Tracer::sioxProcessImage(SPImage *img, GdkPixbuf *origPixbuf) { @@ -213,8 +267,8 @@ Tracer::sioxProcessImage(SPImage *img, GdkPixbuf *origPixbuf) } //g_message("%d arena items\n", arenaItems.size()); - PackedPixelMap *dumpMap = PackedPixelMapCreate( - simage.getWidth(), simage.getHeight()); + //PackedPixelMap *dumpMap = PackedPixelMapCreate( + // simage.getWidth(), simage.getHeight()); for (int row=0 ; rowsetPixelLong(dumpMap, col, row, 0L); + //dumpMap->setPixelLong(dumpMap, col, row, 0L); simage.setConfidence(col, row, Siox::UNKNOWN_REGION_CONFIDENCE); } else { - dumpMap->setPixelLong(dumpMap, col, row, - simage.getPixel(col, row)); + //dumpMap->setPixelLong(dumpMap, col, row, + // simage.getPixel(col, row)); simage.setConfidence(col, row, Siox::CERTAIN_BACKGROUND_CONFIDENCE); } @@ -261,7 +315,7 @@ Tracer::sioxProcessImage(SPImage *img, GdkPixbuf *origPixbuf) } //dumpMap->writePPM(dumpMap, "siox1.ppm"); - dumpMap->destroy(dumpMap); + //dumpMap->destroy(dumpMap); //## ok we have our pixel buf org::siox::Siox sengine; diff --git a/src/ui/dialog/tracedialog.cpp b/src/ui/dialog/tracedialog.cpp index 4bfb66f3d..b79d0f0e6 100644 --- a/src/ui/dialog/tracedialog.cpp +++ b/src/ui/dialog/tracedialog.cpp @@ -343,7 +343,7 @@ TraceDialogImpl::TraceDialogImpl() /*#### SIOX ####*/ //# for now, put at the top of the potrace box. something better later - sioxButton.set_label(_("SIOX foreground selection")); + sioxButton.set_label(_("SIOX foreground selection (experimental)")); sioxBox.pack_start(sioxButton, false, false, MARGIN); tips.set_tip(sioxButton, _("Cover the area you want to select as the foreground"));