diff options
| author | Bob Jamison <ishmalius@gmail.com> | 2006-03-30 12:13:29 +0000 |
|---|---|---|
| committer | ishmal <ishmal@users.sourceforge.net> | 2006-03-30 12:13:29 +0000 |
| commit | c3ae9e6f2d776c43898172486b4d13c9ca6e1ead (patch) | |
| tree | 8b5a8b0972e1bfb43aa0499944b5d3235c7fb3e5 /src/trace/trace.cpp | |
| parent | r11257@tres: ted | 2006-03-29 21:29:33 -0800 (diff) | |
| download | inkscape-c3ae9e6f2d776c43898172486b4d13c9ca6e1ead.tar.gz inkscape-c3ae9e6f2d776c43898172486b4d13c9ca6e1ead.zip | |
WIP. siox election progress. fix api a bit.
(bzr r372)
Diffstat (limited to 'src/trace/trace.cpp')
| -rw-r--r-- | src/trace/trace.cpp | 179 |
1 files changed, 162 insertions, 17 deletions
diff --git a/src/trace/trace.cpp b/src/trace/trace.cpp index 2e46dd854..a0dbad9fd 100644 --- a/src/trace/trace.cpp +++ b/src/trace/trace.cpp @@ -26,7 +26,9 @@ #include <sp-item.h> #include <sp-shape.h> #include <sp-image.h> -#include <splivarot.h> //for intersection boolop + +#include <display/nr-arena.h> +#include <display/nr-arena-shape.h> #include "siox.h" #include "imagemap-gdk.h" @@ -35,6 +37,100 @@ namespace Inkscape { namespace Trace { + + +/* +static PackedPixelMap * +renderToPackedPixelMap(SPDocument *doc, std::vector<SPItem *> items) +{ + + double minX = 1.0e6; + double minY = 1.0e6; + double maxX = -1.0e6; + double maxY = -1.0e6; + for (int i=0 ; i<items.size() ; i++) + { + SPItem *item = items[i]; + if (item->bbox.x0 < minX) + minX = item->bbox.x0; + if (item->bbox.y0 < minY) + minY = item->bbox.y0; + if (item->bbox.x1 > maxX) + maxX = item->bbox.x1; + if (item->bbox.y1 > maxY) + maxY = item->bbox.x1; + } + + double dwidth = maxX - minX; + double dheight = maxY - minY; + + NRRectL bbox; + bbox.x0 = 0; + bbox.y0 = 0; + bbox.x1 = 256; + bbox.y1 = (int) ( 256.0 * dwidth / dheight ); + + + NRArena *arena = NRArena::create(); + unsigned dkey = sp_item_display_key_new(1); + + // Create ArenaItems and set transform + NRArenaItem *root = sp_item_invoke_show(SP_ITEM(sp_document_root(doc)), + arena, dkey, SP_ITEM_SHOW_DISPLAY); + nr_arena_item_set_transform(root, NR::Matrix(&affine)); + + NRPixBlock pb; + nr_pixblock_setup(&pb, NR_PIXBLOCK_MODE_R8G8B8A8N, + minX, minY, maxX, maxY, true); + + //fill in background + for (int row = 0; row < bbox.y1; row++) + { + guchar *p = NR_PIXBLOCK_PX(&pb) + row * bbox.x1; + for (int col = 0; col < bbox.x1; col++) + { + *p++ = ebp->r; + *p++ = ebp->g; + *p++ = ebp->b; + *p++ = ebp->a; + } + } + + // Render + nr_arena_item_invoke_render(root, &bbox, &pb, 0); + + for (int r = 0; r < num_rows; r++) { + rows[r] = NR_PIXBLOCK_PX(&pb) + r * pb.rs; + } + + //## Make an packed pixel map + PackedPixelMap *ppMap = PackedPixelMapCreate(bbox.x1, bbox.y1); + for (int row = 0; row < bbox.y1; row++) + { + guchar *p = NR_PIXBLOCK_PX(&pb) + row * bbox.x1; + for (int col = 0; col < bbox.x1; col++) + { + int r = *p++; + int g = *p++; + int b = *p++; + int a = *p++; + ppMap->setPixelValue(ppMap, col, row, r, g, b); + } + } + + //## Free allocated things + nr_pixblock_release(&pb); + nr_arena_item_unref(root); + nr_object_unref((NRObject *) arena); + + + return ppMap; +} +*/ + + + + /** * */ @@ -92,7 +188,7 @@ Tracer::getSelectedSPImage() } img = SP_IMAGE(item); } - else if (img) //# items -after- the image in tree (above it in Z) + else // if (img) //# items -after- the image in tree (above it in Z) { if (SP_IS_SHAPE(item)) { @@ -160,6 +256,8 @@ GdkPixbuf * Tracer::sioxProcessImage(SPImage *img, GdkPixbuf *origPixbuf) { + //Convert from gdk, so a format we know. By design, the pixel + //format in PackedPixelMap is identical to what is needed by SIOX PackedPixelMap *ppMap = gdkPixbufToPackedPixelMap(origPixbuf); //We need to create two things: // 1. An array of long pixel values of ARGB @@ -167,6 +265,22 @@ Tracer::sioxProcessImage(SPImage *img, GdkPixbuf *origPixbuf) unsigned long *imgBuf = ppMap->pixels; float *confidenceMatrix = new float[ppMap->width * ppMap->height]; + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + if (!desktop) + { + g_warning("Trace: No active desktop\n"); + return NULL; + } + + Inkscape::Selection *sel = SP_DT_SELECTION(desktop); + if (!sel) + { + char *msg = _("Select an <b>image</b> to trace"); + SP_DT_MSGSTACK(desktop)->flash(Inkscape::ERROR_MESSAGE, msg); + //g_warning(msg); + return NULL; + } + Inkscape::XML::Node *imgRepr = SP_OBJECT(img)->repr; /* //## Make a Rect overlaying the image @@ -209,9 +323,26 @@ Tracer::sioxProcessImage(SPImage *img, GdkPixbuf *origPixbuf) double iwscale = width / iwidth; double ihscale = height / iheight; - SPDesktop *desktop = SP_ACTIVE_DESKTOP; - unsigned long cmIndex = 0; + + /* Create new arena */ + NRArena *arena = NRArena::create(); + unsigned dkey = sp_item_display_key_new(1); + + std::vector<NRArenaItem *> arenaItems; + std::vector<SPShape *>::iterator iter; + for (iter = sioxShapes.begin() ; iter!=sioxShapes.end() ; iter++) + { + /* Create ArenaItems and set transform */ + NRArenaItem *aItem = + sp_item_invoke_show(*iter, + arena, dkey, SP_ITEM_SHOW_DISPLAY); + nr_arena_item_set_transform(aItem, img->transform); + arenaItems.push_back(aItem); + } + + PackedPixelMap *dumpMap = PackedPixelMapCreate(ppMap->width, ppMap->height); + for (int row=0 ; row<ppMap->height ; row++) { double ypos = y + ihscale * (double) row; @@ -223,30 +354,35 @@ Tracer::sioxProcessImage(SPImage *img, GdkPixbuf *origPixbuf) point *= img->transform; point = desktop->doc2dt(point); std::vector<SPShape *>::iterator iter; - g_message("x:%f y:%f\n", point[0], point[1]); - SPItem *itemOverPoint = desktop->item_at_point(point, false, NULL); - int weHaveAHit = false; - if (itemOverPoint) + //g_message("x:%f y:%f\n", point[0], point[1]); + bool weHaveAHit = false; + std::vector<NRArenaItem *>::iterator aIter; + for (aIter = arenaItems.begin() ; aIter!=arenaItems.end() ; aIter++) { - printf("searching\n"); - for (iter = sioxShapes.begin() ; iter!=sioxShapes.end() ; iter++) + NRArenaItem *arenaItem = *aIter; + NRArenaItemClass *arenaClass = + (NRArenaItemClass *) NR_OBJECT_GET_CLASS (arenaItem); + if (arenaClass && arenaClass->pick) { - SPShape *shape = *iter; - if (shape == itemOverPoint) + if (arenaClass->pick(arenaItem, point, 0.0f, 0)) { weHaveAHit = true; break; } } } + if (weHaveAHit) { - g_message("hit!\n"); + //g_message("hit!\n"); + dumpMap->setPixelLong(dumpMap, col, row, 0L); confidenceMatrix[cmIndex] = org::siox::SioxSegmentator::CERTAIN_FOREGROUND_CONFIDENCE; } else { + dumpMap->setPixelLong(dumpMap, col, row, + ppMap->getPixel(ppMap, col, row)); confidenceMatrix[cmIndex] = org::siox::SioxSegmentator::CERTAIN_BACKGROUND_CONFIDENCE; } @@ -256,10 +392,19 @@ Tracer::sioxProcessImage(SPImage *img, GdkPixbuf *origPixbuf) //## ok we have our pixel buf org::siox::SioxSegmentator ss(ppMap->width, ppMap->height, NULL, 0); - ss.segmentate(imgBuf, ppMap->width * ppMap->height, - confidenceMatrix, ppMap->width * ppMap->height, - 0, 0.0); - + ss.segmentate(imgBuf, confidenceMatrix, 0, 0.0); + + dumpMap->writePPM(dumpMap, "siox.ppm"); + dumpMap->destroy(dumpMap); + + /* Free Arena and ArenaItem */ + std::vector<NRArenaItem *>::iterator aIter; + for (aIter = arenaItems.begin() ; aIter!=arenaItems.end() ; aIter++) + { + NRArenaItem *arenaItem = *aIter; + nr_arena_item_unref(arenaItem); + } + nr_object_unref((NRObject *) arena); GdkPixbuf *newPixbuf = packedPixelMapToGdkPixbuf(ppMap); |
