void ImagePainter::paintImage(const TImageP &image, const TDimension &imageSize, const TDimension &viewerSize, const TAffine &aff, const VisualSettings &visualSettings, const CompareSettings &compareSettings, const TRect &loadbox) { glDisable(GL_DEPTH_TEST); if (visualSettings.m_drawExternalBG) { glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); } GLenum error = glGetError(); // assert(error==GL_NO_ERROR); if (error != GL_NO_ERROR) { printf("ImagePainter::paintImage() gl_error:%d\n", error); } if (!image) return; TRasterImageP rimg = (TRasterImageP)image; TVectorImageP vimg = (TVectorImageP)image; TToonzImageP timg = (TToonzImageP)image; TRect clipRect(viewerSize); clipRect -= TPoint(viewerSize.lx * 0.5, viewerSize.ly * 0.5); Painter painter(viewerSize, imageSize, aff, image->getPalette(), visualSettings); if (rimg) painter.onRasterImage(rimg.getPointer()); else if (vimg) painter.onVectorImage(vimg.getPointer()); else if (timg) painter.onToonzImage(timg.getPointer()); if (visualSettings.m_blankColor != TPixel::Transparent) { painter.drawBlank(); return; } // if I have a color filter applied using a glmask, , drawing of images must // be done on black bg! if (!vimg) painter.flushRasterImages( loadbox, visualSettings.m_doCompare ? compareSettings.m_compareX : DefaultCompareValue, visualSettings.m_doCompare ? compareSettings.m_compareY : DefaultCompareValue, compareSettings.m_swapCompared); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); if (visualSettings.m_doCompare) drawCompareLines(viewerSize, compareSettings.m_compareX, compareSettings.m_compareY); }
StylePicker::StylePicker(const TImageP &image) : m_image(image), m_palette(image->getPalette()) { }
QString ImageBuilder::add(const TImageP &img, const TAffine &aff) { if (fabs(aff.det()) < 0.001) return ""; if (m_img && (m_img->getType() != img->getType())) return "Image type mismatch"; if (!m_img && img->getType() != TImage::VECTOR && m_width > 0 && m_height > 0) { TRasterP ras = img->raster()->create(m_width, m_height); if (img->getType() == TImage::RASTER) m_img = TRasterImageP(ras); else if (img->getType() == TImage::TOONZ_RASTER) { m_img = TToonzImageP(ras, ras->getBounds()); m_img->setPalette(img->getPalette()); } else return "Bad image type"; } if (!m_img && aff.isIdentity()) { m_img = img->cloneImage(); } else if (img->getType() == TImage::VECTOR) { // vector image if (!m_img) { // transform TVectorImageP vi = img->cloneImage(); vi->transform(aff); m_img = vi; } else { // merge TVectorImageP up = img; TVectorImageP dn = m_img; dn->mergeImage(up, aff); } } else { if (img->getType() != TImage::TOONZ_RASTER && img->getType() != TImage::RASTER) { // this should not ever happen return "Bad image type"; } TRasterP up = img->raster(); if (!m_img) { // create an empty bg TRasterP ras = up->create(); ras->clear(); if (img->getType() == TImage::TOONZ_RASTER) { TRasterCM32P rasCm = ras; m_img = TToonzImageP(rasCm, TRect(0, 0, ras->getLx() - 1, ras->getLy() - 1)); m_img->setPalette(img->getPalette()); } else { m_img = TRasterImageP(ras); } } TRasterP dn = m_img->raster(); if (aff.isTranslation() && aff.a13 == floor(aff.a13) && aff.a23 == floor(aff.a23)) { // just a integer coord translation TPoint delta = -up->getCenter() + dn->getCenter() + TPoint((int)aff.a13, (int)aff.a23); TRop::over(dn, up, delta); } else { TAffine aff1 = TTranslation(dn->getCenterD()) * aff * TTranslation(-up->getCenterD()); TRop::over(dn, up, aff1, TRop::Mitchell); } } return ""; }