diff options
| author | Krzysztof Kosi??ski <tweenk.pl@gmail.com> | 2010-08-08 17:27:51 +0000 |
|---|---|---|
| committer | Krzysztof KosiĆski <tweenk.pl@gmail.com> | 2010-08-08 17:27:51 +0000 |
| commit | 60d3113d1f022a3de7cf04c7979d4751b3fe21f6 (patch) | |
| tree | ca33e2a9a1af6b5911598fa1c6a1d77087b71dd2 /src/trace/quantize.cpp | |
| parent | Minor cleanups (diff) | |
| parent | Add a constrained snap method that takes multiple constraints. This reduces t... (diff) | |
| download | inkscape-60d3113d1f022a3de7cf04c7979d4751b3fe21f6.tar.gz inkscape-60d3113d1f022a3de7cf04c7979d4751b3fe21f6.zip | |
merge from trunk
(bzr r9508.1.52)
Diffstat (limited to 'src/trace/quantize.cpp')
| -rw-r--r-- | src/trace/quantize.cpp | 58 |
1 files changed, 31 insertions, 27 deletions
diff --git a/src/trace/quantize.cpp b/src/trace/quantize.cpp index 8acfe0c34..2db1bbf34 100644 --- a/src/trace/quantize.cpp +++ b/src/trace/quantize.cpp @@ -545,44 +545,48 @@ IndexedMap *rgbMapQuantize(RgbMap *rgbmap, int ncolor) assert(rgbmap); assert(ncolor > 0); + IndexedMap *newmap = 0; + pool<Ocnode> pool; - Ocnode *tree; + Ocnode *tree = 0; try { - tree = octreeBuild(&pool, rgbmap, ncolor); + tree = octreeBuild(&pool, rgbmap, ncolor); } - catch (std::bad_alloc& ex) { - return NULL; //should do smthg else? + catch (std::bad_alloc &ex) { + //should do smthg else? } - RGB *rgbpal = new RGB[ncolor]; - int indexes = 0; - octreeIndex(tree, rgbpal, &indexes); - - octreeDelete(&pool, tree); + if ( tree ) { + RGB *rgbpal = new RGB[ncolor]; + int indexes = 0; + octreeIndex(tree, rgbpal, &indexes); - // stacking with increasing contrasts - qsort((void *)rgbpal, indexes, sizeof(RGB), compRGB); + octreeDelete(&pool, tree); - // make the new map - IndexedMap *newmap = IndexedMapCreate(rgbmap->width, rgbmap->height); - if (!newmap) { delete rgbpal; return NULL; } + // stacking with increasing contrasts + qsort((void *)rgbpal, indexes, sizeof(RGB), compRGB); - // fill in the color lookup table - for (int i = 0; i < indexes; i++) newmap->clut[i] = rgbpal[i]; - newmap->nrColors = indexes; - - // fill in new map pixels - for (int y = 0; y < rgbmap->height; y++) - { - for (int x = 0; x < rgbmap->width; x++) - { - RGB rgb = rgbmap->getPixel(rgbmap, x, y); - int index = findRGB(rgbpal, ncolor, rgb); - newmap->setPixel(newmap, x, y, index); + // make the new map + newmap = IndexedMapCreate(rgbmap->width, rgbmap->height); + if (newmap) { + // fill in the color lookup table + for (int i = 0; i < indexes; i++) { + newmap->clut[i] = rgbpal[i]; + } + newmap->nrColors = indexes; + + // fill in new map pixels + for (int y = 0; y < rgbmap->height; y++) { + for (int x = 0; x < rgbmap->width; x++) { + RGB rgb = rgbmap->getPixel(rgbmap, x, y); + int index = findRGB(rgbpal, ncolor, rgb); + newmap->setPixel(newmap, x, y, index); + } } } + delete[] rgbpal; + } - delete rgbpal; return newmap; } |
