| |
| |
| #include "rasterstyles.h" |
| #include "trop.h" |
| #include "tvectorimage.h" |
| #include "traster.h" |
| #include "trastercm.h" |
| #include "tlevel_io.h" |
| #include "tenv.h" |
| |
| |
| |
| |
| |
| |
| void TAirbrushRasterStyle::loadData(TInputStreamInterface &is) { is >> m_blur; } |
| |
| |
| |
| void TAirbrushRasterStyle::saveData(TOutputStreamInterface &os) const { |
| os << m_blur; |
| } |
| |
| |
| |
| bool TAirbrushRasterStyle::compute(const Params ¶ms) const { |
| if (m_blur > 0.0) TRop::blur(params.m_r, params.m_r, m_blur, 0, 0, true); |
| |
| return true; |
| } |
| |
| |
| |
| TColorStyle *TAirbrushRasterStyle::clone() const { |
| TColorStyle *cs = new TAirbrushRasterStyle(*this); |
| cs->assignNames(this); |
| return cs; |
| } |
| |
| |
| |
| void TAirbrushRasterStyle::makeIcon(const TDimension &d) { |
| TFilePath dir = TEnv::getStuffDir() + "pixmaps"; |
| static TRasterP normalIc; |
| if (normalIc == TRasterP()) |
| TImageReader::load(dir + "airbrush.bmp", normalIc); |
| |
| arrangeIcon(d, normalIc); |
| } |
| |
| |
| |
| void TAirbrushRasterStyle::arrangeIcon(const TDimension &d, |
| const TRasterP &normalIc) { |
| if (normalIc == TRasterP()) { |
| m_icon = TRaster32P(d); |
| m_icon->fill(TPixel32::Red); |
| return; |
| } |
| |
| m_icon = TRasterP(); |
| |
| if (d == TDimension(52, 52)) |
| m_icon = normalIc->clone(); |
| else { |
| m_icon = TRaster32P(d); |
| TRop::resample(m_icon, normalIc, TScale(d.lx / 52.0, d.ly / 52.0)); |
| } |
| |
| m_icon->lock(); |
| TPixel *buf = (TPixel *)m_icon->getRawData(); |
| TPixel color = getMainColor(); |
| double rd = (color.r - color.m) / 255.0; |
| double gd = (color.g - color.m) / 255.0; |
| double bd = (color.b - color.m) / 255.0; |
| |
| assert(m_icon->getWrap() == m_icon->getSize().lx); |
| |
| for (int i = 0; i < m_icon->getSize().lx * m_icon->getSize().ly; i++, buf++) { |
| assert(buf->r == buf->g && buf->r == buf->b); |
| |
| if (buf->r < 255) { |
| if (buf->r == 0) |
| *buf = color; |
| else { |
| int val = 255 - buf->r; |
| buf->r = (UCHAR)(val * rd + 255); |
| buf->g = (UCHAR)(val * gd + 255); |
| buf->b = (UCHAR)(val * bd + 255); |
| } |
| } |
| } |
| m_icon->unlock(); |
| } |
| |
| |
| |
| |
| |
| TColorStyle *TBlendRasterStyle::clone() const { |
| return new TBlendRasterStyle(*this); |
| } |
| |
| |
| |
| bool TBlendRasterStyle::compute(const Params ¶ms) const { |
| int i, j; |
| TRasterGR8P r = (TRasterGR8P)params.m_r; |
| assert(r); |
| |
| double factor = computeFactor(params); |
| |
| if (m_blur > 0.0) TRop::blur(params.m_r, params.m_r, m_blur, 0, 0, true); |
| |
| r->lock(); |
| for (i = 0; i < r->getLy(); i++) { |
| TPixelGR8 *bufGr = r->pixels(i); |
| for (j = 0; j < r->getLx(); j++, bufGr++) |
| if (bufGr->value > 0) { |
| double val = bufGr->value * factor + 0.5; |
| bufGr->value = (UCHAR)((val > 255) ? 255 : val); |
| } |
| } |
| r->unlock(); |
| return true; |
| } |
| |
| |
| namespace { |
| bool inline doIsBorderPix(int index, TPixelCM32 *pix, TPixelGR8 *pixGr, |
| int paint) { |
| return (pix->getPaint() != paint && |
| (pix->isPurePaint() || pixGr->value != 0)); |
| } |
| |
| |
| |
| bool inline isBorderPix(int index, TPixelCM32 *pix, int wrap, TPixelGR8 *pixGr, |
| int wrapGr, int color) { |
| return doIsBorderPix(index, pix + 1, pixGr + 1, color) || |
| doIsBorderPix(index, pix - 1, pixGr - 1, color) || |
| doIsBorderPix(index, pix + wrap, pixGr + wrapGr, color) || |
| doIsBorderPix(index, pix - wrap, pixGr - wrapGr, color); |
| } |
| } |
| |
| |
| |
| void TBlendRasterStyle::makeIcon(const TDimension &d) { |
| TFilePath dir = TEnv::getStuffDir() + "pixmaps"; |
| static TRasterP normalIc; |
| if (normalIc == TRasterP()) TImageReader::load(dir + "blend.bmp", normalIc); |
| |
| arrangeIcon(d, normalIc); |
| } |
| |
| |
| double TBlendRasterStyle::computeFactor(const Params ¶ms) const { |
| TRasterCM32P rCm = (TRasterCM32P)params.m_rOrig; |
| TRasterGR8P rGr = (TRasterGR8P)params.m_r; |
| TPixelGR8 *bufGr; |
| TPixelCM32 *bufCmap; |
| int i, j; |
| int wr = params.m_rOrig->getWrap(); |
| int wrGr = params.m_r->getWrap(); |
| int num_lines = 0; |
| double tot_sum = 0; |
| |
| |
| |
| rGr->lock(); |
| rCm->lock(); |
| for (i = 1; i < params.m_r->getLy() - 1; i++) { |
| int line_sum = 0, num_points = 0; |
| bufGr = rGr->pixels(i) + 1; |
| bufCmap = rCm->pixels(i) + 1; |
| for (j = 1; j < rGr->getLx() - 1; j++, bufGr++, bufCmap++) { |
| if (bufGr->value > 0) { |
| int paint = bufCmap->getPaint(); |
| if ((bufCmap->isPurePaint() || bufGr->value != 0) && |
| isBorderPix(params.m_colorIndex, bufCmap, wr, bufGr, wrGr, paint)) { |
| line_sum += troundp(bufGr->value); |
| num_points++; |
| } |
| } |
| } |
| rGr->unlock(); |
| rCm->unlock(); |
| if (num_points != 0) { |
| tot_sum += ((float)line_sum / ((float)num_points * 255)); |
| num_lines++; |
| } |
| } |
| if (num_lines == 0) return 0; |
| |
| return num_lines / tot_sum; |
| } |
| |
| |
| |
| |
| |
| void TNoColorRasterStyle::makeIcon(const TDimension &d) { |
| TFilePath dir = TEnv::getStuffDir() + "pixmaps"; |
| static TRasterP normalIc; |
| if (normalIc == TRasterP()) TImageReader::load(dir + "markup.bmp", normalIc); |
| |
| if (normalIc == TRasterP()) { |
| m_icon = TRaster32P(d); |
| m_icon->fill(TPixel32::Red); |
| return; |
| } |
| |
| m_icon = TRasterP(); |
| if (d == TDimension(52, 52) && normalIc != TRasterP()) |
| m_icon = normalIc->clone(); |
| else { |
| m_icon = TRaster32P(d); |
| TRop::resample(m_icon, normalIc, TScale(d.lx / 52.0, d.ly / 52.0)); |
| } |
| } |
| |