int load_ppm(char *filename, image *aPic) { FILE *file; char buf[256]; int width, height, depth; int i; byte *data; if (!(file = fopen(filename, "r"))) return PICERR_CANTOPEN; fgets(buf, sizeof(buf), file); if (strcmp(buf, "P6\n")) return PICERR_BADFORMAT; fscanf(file, "%i %i\n%i\n", &width, &height, &depth); for (i = 1; (1 << i) < depth; i++); data = malloc(width * height * 3); fread(data, width * height * 3, 1, file); fclose(file); constructImage(aPic, COLORMASK, MESHED, width, height, i, data, NULL); free(data); return PICERR_NOERR; }
void KisNodeModelTest::testSetImage() { constructImage(); m_shapeController->setImage(m_image); m_nodeModel->setDummiesFacade(m_shapeController, m_image, 0); new ModelTest(m_nodeModel, this); }
void KisNodeModelTest::testRemoveAllNodes() { constructImage(); m_shapeController->setImage(m_image); m_nodeModel->setDummiesFacade(m_shapeController, m_image, 0); new ModelTest(m_nodeModel, this); m_image->removeNode(m_layer4); m_image->removeNode(m_layer3); m_image->removeNode(m_layer2); m_image->removeNode(m_layer1); }
void KisNodeViewTest::testLayers() { QDialog dlg; QFont font; font.setPointSizeF(8); dlg.setFont(font); KisNodeModel *model = new KisNodeModel(this); KisNodeView *view = new KisNodeView(&dlg); view->setModel(model); constructImage(); addSelectionMasks(); m_shapeController->setImage(m_image); model->setDummiesFacade(m_shapeController, m_image, m_shapeController, 0, 0); QVBoxLayout *layout = new QVBoxLayout(&dlg); KisColorFilterCombo *cb = new KisColorFilterCombo(&dlg); QSet<int> labels; for (int i = 0; i < 6; i++) { labels.insert(i); } cb->updateAvailableLabels(labels); QHBoxLayout *hbox = new QHBoxLayout(&dlg); hbox->addStretch(1); hbox->addWidget(cb); layout->addLayout(hbox); layout->addWidget(view); dlg.resize(280, 400); view->expandAll(); dlg.exec(); }
int load_clip(char *filename, image *aPic) { unsigned char buf[32]; unsigned char cmap[256*3]; int hascmap; int i, j, r, c, maxc=0; int width, height, bpp; unsigned char* img; unsigned char* p; FILE *file; curlen = 0; if (!(file = fopen(filename, "r"))) return PICERR_CANTOPEN; if (!rd(file, buf, 17)) return PICERR_BADFORMAT; if (buf[15] != 0) if (!rd(file, buf + 17, 2)) return PICERR_BADFORMAT; if (buf[0] != 0x34 || buf[1] != 0x12) return PICERR_BADFORMAT; if (buf[12] != 'L' && buf[12] != 'C') fprintf(stderr, "I may not do the right thing...\n"); hascmap = buf[13] & 4; width = buf[2] + buf[3] * 256; height = buf[4] + buf[5] * 256; bpp = buf[10]; /* I'm not real sure about the bits-per-pixel, above */ /* allocation equation depends on 8 | width (| = divides) */ if (!(img = malloc(bytesleft = width * height * bpp / 8))) return PICERR_CANTALLOC; p = img; if (hascmap) { if (!rd(file, cmap, 256 * 3)) return PICERR_BADFORMAT; for (i = 0; i < 256 * 3; i++) cmap[i] *= 4; } if (!rd(file, buf, 2)) return PICERR_BADFORMAT; blocksleft = buf[0] + buf[1] * 256; while (brd(file, buf, 1)) { c = buf[0]; if (c == spec) { brd(file, buf, 1); r = buf[0]; if (r == 0) { brd(file, buf, 3); r = buf[1] * 256 + buf[0]; c = buf[2]; } else { brd(file, buf, 1); c = buf[0]; } } else { r = 1; } while (r-- > 0) { if (--bytesleft < 0) { fprintf(stderr, "file too long, ignoring extra\n"); goto dump; } *p++ = c; } if (c>maxc) maxc=c; if (bytesleft == 0) break; } if (!hascmap) { for (i = 0; i < 255 * 3; i++) cmap[i] = (255.0/maxc)*(i/3); } dump: for (i = 0; i < height / 2; i++) for (j = 0; j < width; j++) { c = img[i * width + j]; img[i * width + j] = img[((height - 1) - i) * width + j]; img[((height - 1) - i) * width + j] = c; } if (bpp == 8) { constructImage(aPic, COLORMASK | PALETTEMASK, PLANAR, width, height, bpp, img, cmap); } else { constructImage(aPic, COLORMASK, PLANAR, width, height, bpp, img, NULL); } free(img); return PICERR_NOERR; }
void PhotoMosaic::run(QVector<QString> vec) { QString subImageDir = vec.value(6); QString mainImagePath = vec.value(5); int mainWidth = vec.value(0).toInt(); int mainHeight = vec.value(1).toInt(); int subWidth = m_subImageWidth; int subHeight = m_subImageHeight; int numOfSubImages = vec.value(4).toInt(); mainImagePath = resizeImage(mainImagePath,mainWidth,mainHeight); QDir directory(subImageDir); int precision = vec.value(7).toInt(); FindAvgColorsInDirectory *avgDir = new FindAvgColorsInDirectory(directory, subWidth, subHeight, "jpeg",precision); FindAvgColorsInMain *avgMain = new FindAvgColorsInMain(mainImagePath,subWidth,subHeight,numOfSubImages,precision); //QFuture carries the result of a running thread. QFuture<void> avgDirThread = QtConcurrent::run(avgDir,&FindAvgColorsInDirectory::calculateAllAverages); QFuture<void> avgMainThread = QtConcurrent::run(avgMain,&FindAvgColorsInMain::calculateAllAverages); qDebug() << "waiting to finish threads"; //wait until both threads finished. avgMainThread.waitForFinished(); avgDirThread.waitForFinished(); RGB *dirStruct = avgDir->getAverageRGBArr(); RGB *mainStruct = avgMain->getAverageRGBArr(); //This is how it could be computed without using extra threads. // FindAvgColorsInDirectory *avgDir = new FindAvgColorsInDirectory(directory, subWidth, subHeight, "jpeg",precision); // avgDir->calculateAllAverages(); // RGB *dirStruct = avgDir->getAverageRGBArr(); // FindAvgColorsInMain *avgMain = new FindAvgColorsInMain(mainImagePath,subWidth,subHeight,numOfSubImages,precision); // avgMain->calculateAllAverages(); // RGB *mainStruct = avgMain->getAverageRGBArr(); QStringList *listRepeat = colorDifference(dirStruct, avgDir->getArraySize(), mainStruct, avgMain->getArraySize(),(precision * precision)); QImage base; base.load(mainImagePath); QImage* img2 = new QImage(mainWidth,mainHeight, base.format()); constructImage(listRepeat,img2, subImageDir); QString saveName = QString("%1(%2)%3") .arg("Photo Mosaic RGB ") .arg(QString::number(precision)) .arg(".jpg"); qDebug() << saveName; img2->save(saveName); //free unused memmory. delete listRepeat; delete img2; delete avgMain; delete avgDir; }
static inline int readGifImage(FILE *giffile, image *aPic) { unsigned char buf[9]; int top, width, height; int local, interleaved; int localbits; int row; int *interleavetable = NULL; unsigned char *rasterfix = NULL; unsigned char *cmap = NULL, *raster = NULL; unsigned char colormap[256][3]; int i, cbits; int err; fread(buf, 1, 9, giffile); top = buf[2] + (buf[3] << 8); width = buf[4] + (buf[5] << 8); height = buf[6] + (buf[7] << 8); local = buf[8] & 0x80; interleaved = buf[8] & 0x40; if (local) { localbits = (buf[8] & 0x07) + 1; fread(colormap, 3, 1 << localbits, giffile); cmap = (unsigned char *) colormap; cbits = 1 << localbits; } else if (global) { cmap = (unsigned char *) globalmap; cbits = 1 << globalbits; } else { fprintf(stderr, "No color map present.\n"); return PICERR_BADFORMAT; } if (!(raster = malloc(width * height))) return PICERR_CANTALLOC; err = readGifRaster(width, height, raster, giffile); if (interleaved) { if (!(interleavetable = malloc(height * sizeof(int)))) return PICERR_CANTALLOC; if (!(rasterfix = malloc(width * height))) return PICERR_CANTALLOC; row = 0; for (i = top; i < top + height; i += 8) interleavetable[i] = row++; for (i = top + 4; i < top + height; i += 8) interleavetable[i] = row++; for (i = top + 2; i < top + height; i += 4) interleavetable[i] = row++; for (i = top + 1; i < top + height; i += 2) interleavetable[i] = row++; for (row = top; row < top + height; row++) for (i = 0; i < width; i++) rasterfix[i + row * width] = raster[i + interleavetable[row] * width]; free(raster); raster = rasterfix; free(interleavetable); } constructImage(aPic, COLORMASK | PALETTEMASK, PLANAR, width, height, 8, raster, cmap); free(raster); for (i = 0, row = 0; i < cbits; i++) if (cmap[i * 3] == cmap[i * 3 + 1] && cmap[i * 3] == cmap[i * 3 + 2]) row++; if (row == cbits) makeMono(aPic); return err; }