Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tsystem.h"
Toshihiro Shimizu 890ddd
#include "timage_io.h"
Toshihiro Shimizu 890ddd
#include "trop.h"
Toshihiro Shimizu 890ddd
#include "tconvert.h"
Toshihiro Shimizu 890ddd
#include "tvectorimage.h"
Toshihiro Shimizu 890ddd
#include "ttoonzimage.h"
Toshihiro Shimizu 890ddd
#include "tproperty.h"
Toshihiro Shimizu 890ddd
#include "trasterimage.h"
Toshihiro Shimizu 890ddd
#include "tiio.h"
Toshihiro Shimizu 890ddd
#include "tfilepath_io.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// boost includes
Toshihiro Shimizu 890ddd
#include <boost range.hpp=""></boost>
Toshihiro Shimizu 890ddd
e280ae
#ifdef _MSC_VER
e280ae
#pragma warning(disable : 4996)
e280ae
#endif
e280ae
Toshihiro Shimizu 890ddd
// OS-specific includes
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
#include <io.h></io.h>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
#ifdef LINUX
Toshihiro Shimizu 890ddd
#include <unistd.h></unistd.h>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// System V includes
Shinya Kitaoka 120a6e
#include <fcntl.h>     // didn't even know Windows had them  :D</fcntl.h>
Shinya Kitaoka 120a6e
#include <sys stat.h="">  // btw, why are they here?</sys>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
DEFINE_CLASS_CODE(TImageReader, 5)
Toshihiro Shimizu 890ddd
DEFINE_CLASS_CODE(TImageWriter, 6)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
std::map<qstring, *="" timagereadercreateproc=""> ImageReaderTable;</qstring,>
Toshihiro Shimizu 890ddd
std::map<qstring, *,="" bool="" std::pair<timagewritercreateproc="">> ImageWriterTable;</qstring,>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool TImageReader::m_safeMode = false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TImageReader::TImageReader(const TFilePath &path)
Shinya Kitaoka 120a6e
    : TSmartObject(m_classCode)
Shinya Kitaoka 120a6e
    , m_path(path)
Shinya Kitaoka 120a6e
    , m_reader(0)
Shinya Kitaoka 120a6e
    , m_vectorReader(0)
Shinya Kitaoka 120a6e
    , m_readGreytones(true)
Shinya Kitaoka 120a6e
    , m_file(NULL)
Shinya Kitaoka 120a6e
    , m_is64BitEnabled(false)
Shinya Kitaoka 120a6e
    , m_shrink(1)
Shinya Kitaoka 120a6e
    , m_region(TRect()) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TImageReader::doReadGraytones(bool readThem) {
Shinya Kitaoka 120a6e
  m_readGreytones = readThem;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TImageReader::~TImageReader() { close(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
bool TImageReader::isOpen() const { return m_file != NULL; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TImageReader::close() {
Shinya Kitaoka 120a6e
  delete m_reader;
Shinya Kitaoka 120a6e
  delete m_vectorReader;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (m_file != NULL) {
Shinya Kitaoka 120a6e
    int err = 0;
Shinya Kitaoka 120a6e
    err     = fclose(m_file);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    assert(err == 0);  // il file e' stato chiuso senza errori
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_file         = NULL;
Shinya Kitaoka 120a6e
  m_reader       = 0;
Shinya Kitaoka 120a6e
  m_vectorReader = 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  Opens for reading using \b fopen().
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void TImageReader::getTzpPaletteColorNames(
Shinya Kitaoka 120a6e
    std::map<int, std::pair<std::string,="" std::string="">> &pltColorNames) {</int,>
Shinya Kitaoka 120a6e
  if (!m_file) open();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (!m_file) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  assert(m_reader);
Shinya Kitaoka 120a6e
  m_reader->getTzpPaletteColorNames(pltColorNames);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TImageReader::open() {
Shinya Kitaoka 120a6e
  assert(m_file == NULL);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  std::string type = toLower(m_path.getType());
Shinya Kitaoka 38fd86
  m_file = fopen(m_path, "rb");  // Opens for reading. If the file does not
Shinya Kitaoka 120a6e
                                 // exist or cannot be found, the fopen_s call
Shinya Kitaoka 120a6e
                                 // fails
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_file == NULL)  // Non dovrebbe mai andarci!
Shinya Kitaoka 120a6e
    close();  // close() chiude il file se e' aperto e setta m_file a NULL.
Shinya Kitaoka 120a6e
  else {
Shinya Kitaoka 120a6e
    try {
Shinya Kitaoka 120a6e
      m_reader = Tiio::makeReader(type);
Shinya Kitaoka 120a6e
      if (m_reader)
Shinya Kitaoka 120a6e
        m_reader->open(m_file);
Shinya Kitaoka 120a6e
      else {
Shinya Kitaoka 120a6e
        m_vectorReader = Tiio::makeVectorReader(type);
Shinya Kitaoka 120a6e
        if (m_vectorReader)
Shinya Kitaoka 120a6e
          m_vectorReader->open(m_file);
Shinya Kitaoka 120a6e
        else
Shinya Kitaoka 120a6e
          throw TImageException(m_path, "Image format not supported");
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    } catch (TException &e) {
Shinya Kitaoka 120a6e
      close();  // close() chiude il file e setta m_file a NULL.
Shinya Kitaoka 120a6e
      QString msg = QString::fromStdWString(e.getMessage());
Shinya Kitaoka 120a6e
      if (msg == QString("Old 4.1 Palette")) throw e;
Shinya Kitaoka 120a6e
    } catch (std::string str) {
Shinya Kitaoka 120a6e
      if (str == "Tiff file closed") m_file = NULL;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===========================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TImageReader::setShrink(int shrink) { m_shrink = shrink; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TImageReaderP::TImageReaderP(const TFilePath &path) {
Shinya Kitaoka 120a6e
  m_pointer = new TImageReader(path);
Shinya Kitaoka 120a6e
  m_pointer->addRef();
Shinya Kitaoka 120a6e
  m_pointer->open();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TImageP TImageReader::load() {
Shinya Kitaoka 120a6e
  TImageP image = load0();
Shinya Kitaoka 120a6e
  if (!image) return TImageP();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TImageInfo info = m_reader->getImageInfo();
Shinya Kitaoka 120a6e
  if (info.m_lx <= 0 || info.m_ly <= 0) return TImageP();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  return image;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//============================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename pix=""></typename>
Shinya Kitaoka 120a6e
struct pixel_traits {};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
struct pixel_traits<tpixel32> {</tpixel32>
Shinya Kitaoka 120a6e
  typedef TPixel32 rgbm_pixel_type;
Shinya Kitaoka 120a6e
  typedef char buffer_type;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
struct pixel_traits<tpixel64> {</tpixel64>
Shinya Kitaoka 120a6e
  typedef TPixel64 rgbm_pixel_type;
Shinya Kitaoka 120a6e
  typedef short buffer_type;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
struct pixel_traits<tpixelgr8> {</tpixelgr8>
Shinya Kitaoka 120a6e
  typedef TPixel32 rgbm_pixel_type;
Shinya Kitaoka 120a6e
  typedef char buffer_type;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
struct pixel_traits<tpixelgr16> {</tpixelgr16>
Shinya Kitaoka 120a6e
  typedef TPixel64 rgbm_pixel_type;
Shinya Kitaoka 120a6e
  typedef short buffer_type;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
struct pixel_traits<tpixelcm32> {</tpixelcm32>
Shinya Kitaoka 120a6e
  typedef TPixel32 rgbm_pixel_type;
Shinya Kitaoka 120a6e
  typedef char buffer_type;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename pix=""></typename>
Shinya Kitaoka 120a6e
void copyLine(typename pixel_traits<pix>::rgbm_pixel_type *lineIn, Pix *lineOut,</pix>
Shinya Kitaoka 120a6e
              int x0, int length, int shrink) {
Shinya Kitaoka 120a6e
  lineIn += x0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  for (int i = 0; i < length; ++i, lineIn += shrink, ++lineOut)
Shinya Kitaoka 120a6e
    memcpy(lineOut, lineIn, sizeof(Pix));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Shinya Kitaoka 120a6e
void copyLine<tpixelgr8>(TPixel32 *lineIn, TPixelGR8 *lineOut, int x0,</tpixelgr8>
Shinya Kitaoka 120a6e
                         int length, int shrink) {
Shinya Kitaoka 120a6e
  lineIn += x0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  for (int i = 0; i < length; ++i, lineIn += shrink, ++lineOut)
Shinya Kitaoka 120a6e
    lineOut->value = lineIn->r;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Shinya Kitaoka 120a6e
void copyLine<tpixelgr16>(TPixel64 *lineIn, TPixelGR16 *lineOut, int x0,</tpixelgr16>
Shinya Kitaoka 120a6e
                          int length, int shrink) {
Shinya Kitaoka 120a6e
  lineIn += x0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  for (int i = 0; i < length; ++i, lineIn += shrink, ++lineOut)
Shinya Kitaoka 120a6e
    lineOut->value = lineIn->r;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename pix=""></typename>
Toshihiro Shimizu 890ddd
void readRaster_copyLines(const TRasterPT<pix> &ras, Tiio::Reader *reader,</pix>
Shinya Kitaoka 120a6e
                          int x0, int y0, int x1, int y1, int inLx, int inLy,
Shinya Kitaoka 120a6e
                          int shrink) {
Shinya Kitaoka 120a6e
  typedef typename pixel_traits<pix>::buffer_type buffer_type;</pix>
Shinya Kitaoka 120a6e
  typedef typename pixel_traits<pix>::rgbm_pixel_type rgbm_pixel_type;</pix>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int linesToSkip = shrink - 1;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  buffer_type *lineBuffer =
Shinya Kitaoka 120a6e
      (buffer_type *)malloc(inLx * sizeof(rgbm_pixel_type));
Shinya Kitaoka 120a6e
  if (!lineBuffer) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  rgbm_pixel_type *lineIn = (rgbm_pixel_type *)lineBuffer;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (reader->getRowOrder() == Tiio::BOTTOM2TOP) {
Shinya Kitaoka 120a6e
    int start = reader->skipLines(y0);
Shinya Kitaoka 120a6e
    int stop  = y1 + 1;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    for (int y = start; y < stop; ++y) {
Shinya Kitaoka 120a6e
      reader->readLine(lineBuffer, x0, x1, shrink);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      if (y >= y0 && y <= y1 && (y - y0) % shrink == 0) {
Shinya Kitaoka 120a6e
        Pix *line = (Pix *)ras->getRawData(0, (y - y0) / shrink);
Shinya Kitaoka 120a6e
        copyLine<pix>(lineIn, line, x0, ras->getLx(), shrink);</pix>
Shinya Kitaoka 120a6e
      }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      if (linesToSkip > 0 && y + linesToSkip < inLy)
Shinya Kitaoka 120a6e
        y += reader->skipLines(linesToSkip);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else  // TOP2BOTTOM
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    reader->skipLines(inLy - y1 - 1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    for (int y = y1; y >= y0; --y) {
Shinya Kitaoka 120a6e
      reader->readLine(lineBuffer, x0, x1, shrink);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      if ((y - y0) % shrink == 0) {
Shinya Kitaoka 120a6e
        Pix *line = (Pix *)ras->getRawData(0, (y - y0) / shrink);
Shinya Kitaoka 120a6e
        copyLine<pix>(lineIn, line, x0, ras->getLx(), shrink);</pix>
Shinya Kitaoka 120a6e
      }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      if (linesToSkip > 0 && y - linesToSkip > 0)
Shinya Kitaoka 120a6e
        y -= reader->skipLines(linesToSkip);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  free(lineBuffer);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename pix=""></typename>
Shinya Kitaoka 120a6e
void readRaster(const TRasterPT<pix> &ras, Tiio::Reader *reader, int x0, int y0,</pix>
Shinya Kitaoka 120a6e
                int x1, int y1, int inLx, int inLy, int shrink) {
Shinya Kitaoka 120a6e
  typedef typename pixel_traits<pix>::buffer_type buffer_type;</pix>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (shrink == 1) {
Shinya Kitaoka 120a6e
    // Direct read
Shinya Kitaoka 120a6e
    ras->lock();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    ptrdiff_t linePad = -x0 * ras->getPixelSize();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (reader->getRowOrder() == Tiio::BOTTOM2TOP) {
Shinya Kitaoka 120a6e
      int start = reader->skipLines(y0);
Shinya Kitaoka 120a6e
      int stop  = y1 + 1;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      for (int y = start; y < stop; ++y)
Shinya Kitaoka 120a6e
        if (y >= y0 && y <= y1) {
Shinya Kitaoka 120a6e
          buffer_type *line =
Shinya Kitaoka 120a6e
              (buffer_type *)(ras->getRawData(0, y - y0) + linePad);
Shinya Kitaoka 120a6e
          reader->readLine(line, x0, x1, 1);
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
    } else  // TOP2BOTTOM
Shinya Kitaoka 120a6e
    {
Shinya Kitaoka 120a6e
      reader->skipLines(inLy - y1 - 1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      for (int y = y1; y >= y0; --y) {
Shinya Kitaoka 120a6e
        buffer_type *line =
Shinya Kitaoka 120a6e
            (buffer_type *)(ras->getRawData(0, y - y0) + linePad);
Shinya Kitaoka 120a6e
        reader->readLine(line, x0, x1, 1);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    ras->unlock();
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    readRaster_copyLines(ras, reader, x0, y0, x1, y1, inLx, inLy, shrink);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TImageP TImageReader::load0() {
Shinya Kitaoka 120a6e
  if (!m_reader && !m_vectorReader) open();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_reader) {
Shinya Kitaoka 120a6e
    TImageInfo info = m_reader->getImageInfo();
Shinya Kitaoka 120a6e
    if (info.m_lx <= 0 || info.m_ly <= 0) return TImageP();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Initialize raster info
Shinya Kitaoka 120a6e
    assert(m_shrink > 0);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    // Build loading rect
Shinya Kitaoka 120a6e
    int x0 = 0;
Shinya Kitaoka 120a6e
    int x1 = info.m_lx - 1;
Shinya Kitaoka 120a6e
    int y0 = 0;
Shinya Kitaoka 120a6e
    int y1 = info.m_ly - 1;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (!m_region.isEmpty()) {
Shinya Kitaoka 120a6e
      // Intersect with the externally specified loading region
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      x0 = std::max(x0, m_region.x0);
Shinya Kitaoka 120a6e
      y0 = std::max(y0, m_region.y0);
Shinya Kitaoka 120a6e
      x1 = std::min(x1, m_region.x1);
Shinya Kitaoka 120a6e
      y1 = std::min(y1, m_region.y1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      if (x0 >= x1 || y0 >= y1) return TImageP();
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (m_shrink > 1) {
Shinya Kitaoka 120a6e
      // Crop to shrink multiples
Shinya Kitaoka 120a6e
      x1 -= (x1 - x0) % m_shrink;
Shinya Kitaoka 120a6e
      y1 -= (y1 - y0) % m_shrink;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    assert(x0 <= x1 && y0 <= y1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    TDimension imageDimension =
Shinya Kitaoka 120a6e
        TDimension((x1 - x0) / m_shrink + 1, (y1 - y0) / m_shrink + 1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (m_path.getType() == "tzp" || m_path.getType() == "tzu") {
Shinya Kitaoka 120a6e
      // Colormap case
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      TRasterCM32P ras(imageDimension);
Shinya Kitaoka 120a6e
      readRaster(ras, m_reader, x0, y0, x1, y1, info.m_lx, info.m_ly, m_shrink);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // Build the savebox
Shinya Kitaoka 120a6e
      TRect saveBox(info.m_x0, info.m_y0, info.m_x1, info.m_y1);
Shinya Kitaoka 120a6e
      if (!m_region.isEmpty()) {
Shinya Kitaoka 120a6e
        // Intersect with the loading rect
Shinya Kitaoka 120a6e
        if (m_region.overlaps(saveBox)) {
Shinya Kitaoka 120a6e
          saveBox *= m_region;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
          int sbx0 = saveBox.x0 - m_region.x0;
Shinya Kitaoka 120a6e
          int sby0 = saveBox.y0 - m_region.y0;
Shinya Kitaoka 120a6e
          int sbx1 = sbx0 + saveBox.getLx() - 1;
Shinya Kitaoka 120a6e
          int sby1 = sby0 + saveBox.getLy() - 1;
Shinya Kitaoka 120a6e
          assert(sbx0 >= 0);
Shinya Kitaoka 120a6e
          assert(sby0 >= 0);
Shinya Kitaoka 120a6e
          assert(sbx1 >= 0);
Shinya Kitaoka 120a6e
          assert(sby1 >= 0);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
          saveBox = TRect(sbx0, sby0, sbx1, sby1);
Shinya Kitaoka 120a6e
        } else
Shinya Kitaoka 120a6e
          saveBox = TRect(0, 0, 1, 1);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      if (m_shrink > 1) {
Shinya Kitaoka 120a6e
        saveBox.x0 = saveBox.x0 / m_shrink;
Shinya Kitaoka 120a6e
        saveBox.y0 = saveBox.y0 / m_shrink;
Shinya Kitaoka 120a6e
        saveBox.x1 = saveBox.x1 / m_shrink;
Shinya Kitaoka 120a6e
        saveBox.y1 = saveBox.y1 / m_shrink;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      TToonzImageP ti(ras, ras->getBounds() * saveBox);
Shinya Kitaoka 120a6e
      ti->setDpi(info.m_dpix, info.m_dpiy);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      return ti;
Shinya Kitaoka 120a6e
    } else if (info.m_bitsPerSample >= 8) {
Shinya Kitaoka 120a6e
      // Common byte-based rasters (see below, we have black-and-white bit-based
Shinya Kitaoka 120a6e
      // images too)
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      if (info.m_samplePerPixel == 1 && m_readGreytones) {
Shinya Kitaoka 120a6e
        //  Greymap case
Shinya Kitaoka 120a6e
        // NOTE: Uses a full 32-bit raster first, and then copies down to the
Shinya Kitaoka 120a6e
        // GR8
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        // Observe that GR16 file images get immediately down-cast to GR8...
Shinya Kitaoka 120a6e
        // Should we implement that too?
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        TRasterGR8P ras(imageDimension);
Shinya Kitaoka 120a6e
        readRaster_copyLines(ras, m_reader, x0, y0, x1, y1, info.m_lx,
Shinya Kitaoka 120a6e
                             info.m_ly, m_shrink);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        TRasterImageP ri(ras);
Shinya Kitaoka 120a6e
        ri->setDpi(info.m_dpix, info.m_dpiy);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        return ri;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // assert(info.m_samplePerPixel == 3 || info.m_samplePerPixel == 4);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      TRasterP _ras;
Shinya Kitaoka 120a6e
      if (info.m_bitsPerSample == 16) {
Shinya Kitaoka 120a6e
        if (m_is64BitEnabled || m_path.getType() != "tif") {
Shinya Kitaoka 120a6e
          //  Standard 64-bit case.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
          // Also covers down-casting to 32-bit from a 64-bit image file
Shinya Kitaoka 120a6e
          // whenever
Shinya Kitaoka 120a6e
          // not a tif file (see below).
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
          TRaster64P ras(imageDimension);
Shinya Kitaoka 120a6e
          readRaster(ras, m_reader, x0, y0, x1, y1, info.m_lx, info.m_ly,
Shinya Kitaoka 120a6e
                     m_shrink);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
          _ras = ras;
Shinya Kitaoka 120a6e
        } else {
Shinya Kitaoka 120a6e
          // The Tif reader has got an automatically down-casting
Shinya Kitaoka 120a6e
          // readLine(char*, ...)
Shinya Kitaoka 120a6e
          // in case the input file is 64-bit. The advantage is that no
Shinya Kitaoka 120a6e
          // intermediate
Shinya Kitaoka 120a6e
          // 64-bit raster is required in this case.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
          TRaster32P ras(imageDimension);
Shinya Kitaoka 120a6e
          readRaster(ras, m_reader, x0, y0, x1, y1, info.m_lx, info.m_ly,
Shinya Kitaoka 120a6e
                     m_shrink);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
          _ras = ras;
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      } else if (info.m_bitsPerSample == 8) {
Shinya Kitaoka 120a6e
        //  Standard 32-bit case
Shinya Kitaoka 120a6e
        TRaster32P ras(imageDimension);
Shinya Kitaoka 120a6e
        readRaster(ras, m_reader, x0, y0, x1, y1, info.m_lx, info.m_ly,
Shinya Kitaoka 120a6e
                   m_shrink);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        _ras = ras;
Shinya Kitaoka 120a6e
      } else
Shinya Kitaoka 120a6e
        throw TImageException(m_path, "Image format not supported");
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // 64-bit to 32-bit conversions if necessary  (64 bit images not allowed)
Shinya Kitaoka 120a6e
      if (!m_is64BitEnabled && (TRaster64P)_ras) {
Shinya Kitaoka 120a6e
        TRaster32P raux(_ras->getLx(), _ras->getLy());
Shinya Kitaoka 120a6e
        TRop::convert(raux, _ras);
Shinya Kitaoka 120a6e
        _ras = raux;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // Return the image
Shinya Kitaoka 120a6e
      TRasterImageP ri(_ras);
Shinya Kitaoka 120a6e
      ri->setDpi(info.m_dpix, info.m_dpiy);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      return ri;
Shinya Kitaoka 120a6e
    } else if (info.m_samplePerPixel == 1 && info.m_valid == true) {
Shinya Kitaoka 120a6e
      //  Previously dubbed as 'Palette cases'. No clue about what is this... :|
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      TRaster32P ras(imageDimension);
Shinya Kitaoka 120a6e
      readRaster(ras, m_reader, x0, y0, x1, y1, info.m_lx, info.m_ly, m_shrink);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      TRasterImageP ri(ras);
Shinya Kitaoka 120a6e
      ri->setDpi(info.m_dpix, info.m_dpiy);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      return ri;
Shinya Kitaoka 120a6e
    } else if (info.m_samplePerPixel == 1 && m_readGreytones) {
Shinya Kitaoka 120a6e
      //  Black-and-White case, I guess. Standard greymaps were considered
Shinya Kitaoka 120a6e
      //  above...
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      TRasterGR8P ras(imageDimension);
Shinya Kitaoka 120a6e
      readRaster_copyLines(ras, m_reader, x0, y0, x1, y1, info.m_lx, info.m_ly,
Shinya Kitaoka 120a6e
                           m_shrink);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      TRasterImageP ri(ras);
Shinya Kitaoka 120a6e
      ri->setDpi(info.m_dpix, info.m_dpiy);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      if (info.m_bitsPerSample == 1)  // I suspect this always evaluates true...
Shinya Kitaoka 120a6e
        ri->setScanBWFlag(true);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      return ri;
Shinya Kitaoka 120a6e
    } else
Shinya Kitaoka 120a6e
      return TImageP();
Shinya Kitaoka 120a6e
  } else if (m_vectorReader) {
Shinya Kitaoka 120a6e
    TVectorImage *vi = m_vectorReader->read();
Shinya Kitaoka 120a6e
    return TVectorImageP(vi);
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    return TImageP();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TImageWriter::TImageWriter(const TFilePath &path)
Shinya Kitaoka 120a6e
    : TSmartObject(m_classCode)
Shinya Kitaoka 120a6e
    , m_path(path)
Shinya Kitaoka 120a6e
    , m_writer(0)
Shinya Kitaoka 120a6e
    , m_vectorWriter(0)
Shinya Kitaoka 120a6e
    , m_properties(0) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TImageWriter::~TImageWriter() {
Shinya Kitaoka 120a6e
  delete m_writer;
Shinya Kitaoka 120a6e
  delete m_vectorWriter;
Shinya Kitaoka 120a6e
  delete m_properties;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TImageWriter::setProperties(const TPropertyGroup *g) {
Shinya Kitaoka 120a6e
  if (m_properties) {
Shinya Kitaoka 120a6e
    assert(m_properties != g);
Shinya Kitaoka 120a6e
    delete m_properties;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  m_properties = g ? g->clone() : 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Campbell Barton 8c6c57
static void convertForWriting(TRasterP &ras, const TRasterP &rin, int bpp) {
Shinya Kitaoka 120a6e
  switch (bpp) {
Shinya Kitaoka 120a6e
  case 1:
Shinya Kitaoka 120a6e
  case 8:
Shinya Kitaoka 120a6e
    ras = TRasterGR8P(rin->getSize());
Shinya Kitaoka 120a6e
    TRop::convert(ras, rin);
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  case 24:
Shinya Kitaoka 120a6e
  case 32:
Shinya Kitaoka 120a6e
    ras = TRaster32P(rin->getSize());
Shinya Kitaoka 120a6e
    TRop::convert(ras, rin);
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  case 48:
Shinya Kitaoka 120a6e
  case 64:
Shinya Kitaoka 120a6e
    ras = TRaster64P(rin->getSize());
Shinya Kitaoka 120a6e
    TRop::convert(ras, rin);
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  default:
Shinya Kitaoka 120a6e
    assert(false);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TImageWriter::save(const TImageP &img) {
Shinya Kitaoka 120a6e
  const std::string &type = toLower(m_path.getType());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  Tiio::Writer *writer = Tiio::makeWriter(type);
Shinya Kitaoka 120a6e
  if (!writer)
Shinya Kitaoka 120a6e
    throw TImageException(m_path, "unsupported format for raster images");
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  writer->setProperties(m_properties);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  FILE *file = fopen(m_path, "wb");
Shinya Kitaoka 120a6e
  if (file == NULL) throw TImageException(m_path, "Can't write file");
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (TRasterImageP ri = img) {
Shinya Kitaoka 120a6e
    TImageInfo info;
Shinya Kitaoka 120a6e
    TRasterP ras;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    TRasterGR8P rasGr = ri->getRaster();
Shinya Kitaoka 120a6e
    TRaster32P ras32  = ri->getRaster();
Shinya Kitaoka 120a6e
    TRaster64P ras64  = ri->getRaster();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    TEnumProperty *p =
Shinya Kitaoka 120a6e
        m_properties
Shinya Kitaoka 120a6e
            ? (TEnumProperty *)m_properties->getProperty("Bits Per Pixel")
Shinya Kitaoka 120a6e
            : 0;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (p && ri->isScanBW()) {
Shinya Kitaoka 120a6e
      const std::vector<std::wstring> &range = p->getRange();</std::wstring>
Shinya Kitaoka 120a6e
      p->setValue(range[2]);  // Horrible. See tiio_tif.cpp (732 or near) -.-'
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    int bpp = p ? std::stoi(p->getValue()) : 32;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    //  bpp       1  8  16 24 32 40  48 56  64
Shinya Kitaoka 120a6e
    int spp[] = {
Shinya Kitaoka 120a6e
        1, 1, 1, 4, 4,
Shinya Kitaoka 120a6e
        0, 4, 0, 4};  // 0s are for pixel sizes which are normally unsupported
Shinya Kitaoka 120a6e
    int bps[] = {
Shinya Kitaoka 120a6e
        1, 8,  16, 8, 8,
Shinya Kitaoka 120a6e
        0, 16, 0,  16};  // by image formats, let alone by Toonz raster ones.
Shinya Kitaoka 120a6e
    // The 24 and 48 cases get automatically promoted to 32 and 64.
Shinya Kitaoka 120a6e
    int bypp = bpp / 8;
Shinya Kitaoka 120a6e
    assert(bypp < boost::size(spp) && spp[bypp] && bps[bypp]);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    info.m_samplePerPixel = spp[bypp];
Shinya Kitaoka 120a6e
    info.m_bitsPerSample  = bps[bypp];
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (rasGr) {
Shinya Kitaoka 120a6e
      if (bypp < 2)   // Seems 16 bit greymaps are not handled... why?
Shinya Kitaoka 120a6e
        ras = rasGr;  // we do have a Toonz raster for those...    >:|
Shinya Kitaoka 120a6e
      else
Shinya Kitaoka 120a6e
        convertForWriting(ras, rasGr, bpp);
Shinya Kitaoka 120a6e
    } else if (ras32) {
Shinya Kitaoka 120a6e
      if (bpp == 32 || bpp == 24)
Shinya Kitaoka 120a6e
        ras = ras32;
Shinya Kitaoka 120a6e
      else
Shinya Kitaoka 120a6e
        convertForWriting(ras, ras32, bpp);
Shinya Kitaoka 120a6e
    } else if (ras64) {
Shinya Kitaoka 120a6e
      if (bpp == 64 || bpp == 48)
Shinya Kitaoka 120a6e
        ras = ras64;
Shinya Kitaoka 120a6e
      else
Shinya Kitaoka 120a6e
        convertForWriting(ras, ras64, bpp);
Shinya Kitaoka 120a6e
    } else {
Shinya Kitaoka 120a6e
      fclose(file);
Shinya Kitaoka 120a6e
      throw TImageException(m_path, "unsupported raster type");
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    info.m_lx = ras->getLx();
Shinya Kitaoka 120a6e
    info.m_ly = ras->getLy();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    ri->getDpi(info.m_dpix, info.m_dpiy);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (writer->getProperties() && m_properties)
Shinya Kitaoka 120a6e
      writer->getProperties()->setProperties(m_properties);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    writer->open(file, info);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    ras->lock();
Shinya Kitaoka 120a6e
    if (writer->getRowOrder() == Tiio::BOTTOM2TOP) {
Shinya Kitaoka 120a6e
      if (bpp == 1 || bpp == 8 || bpp == 24 || bpp == 32 || bpp == 16)
Shinya Kitaoka 120a6e
        for (int i = 0; i < ras->getLy(); i++)
Shinya Kitaoka 120a6e
          writer->writeLine((char *)ras->getRawData(0, i));
Shinya Kitaoka 120a6e
      else
Shinya Kitaoka 120a6e
        for (int i = 0; i < ras->getLy(); i++)
Shinya Kitaoka 120a6e
          writer->writeLine((short *)ras->getRawData(0, i));
Shinya Kitaoka 120a6e
    } else {
Shinya Kitaoka 120a6e
      if (bpp == 1 || bpp == 8 || bpp == 24 || bpp == 32 || bpp == 16)
Shinya Kitaoka 120a6e
        for (int i = ras->getLy() - 1; i >= 0; i--)
Shinya Kitaoka 120a6e
          writer->writeLine((char *)ras->getRawData(0, i));
Shinya Kitaoka 120a6e
      else
Shinya Kitaoka 120a6e
        for (int i = ras->getLy() - 1; i >= 0; i--)
Shinya Kitaoka 120a6e
          writer->writeLine((short *)ras->getRawData(0, i));
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    ras->unlock();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    writer->flush();
Shinya Kitaoka 120a6e
    delete writer;
Shinya Kitaoka 120a6e
  } else if (TVectorImageP vi = img) {
Shinya Kitaoka 120a6e
    Tiio::VectorWriter *writer = Tiio::makeVectorWriter(type);
Shinya Kitaoka 120a6e
    if (!writer) {
Shinya Kitaoka 120a6e
      fclose(file);
Shinya Kitaoka 120a6e
      throw TImageException(m_path, "unsupported format for vector images");
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    writer->open(file);
Shinya Kitaoka 120a6e
    writer->write(vi.getPointer());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    delete writer;
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    fclose(file);
Shinya Kitaoka 120a6e
    throw TImageException(m_path, "Can't write file");
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  fclose(file);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TImageWriterP::TImageWriterP(const TFilePath &path) {
Shinya Kitaoka 120a6e
  m_pointer = new TImageWriter(path);
Shinya Kitaoka 120a6e
  m_pointer->addRef();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//============================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// Helper functions statiche
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//============================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
bool TImageReader::load(const TFilePath &path, TRasterP &raster) {
Shinya Kitaoka 120a6e
  raster = TRasterP();
Shinya Kitaoka 120a6e
  TImageReaderP ir(path);
Shinya Kitaoka 120a6e
  if (!ir) return false;
Shinya Kitaoka 120a6e
  TImageP img = ir->load();
Shinya Kitaoka 120a6e
  if (!img) return false;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TRasterImageP ri(img);
Shinya Kitaoka 120a6e
  if (!ri) return false;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  raster = ri->getRaster();
Shinya Kitaoka 120a6e
  return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TImageReader::load(const TRasterP &ras, const TPoint &pos, int shrinkX,
Shinya Kitaoka 120a6e
                        int shrinkY) {
Shinya Kitaoka 120a6e
  TImageP srcImage          = load();
Shinya Kitaoka 120a6e
  TRasterImageP srcRasImage = srcImage;
Shinya Kitaoka 120a6e
  TRaster32P srcRaster      = srcRasImage->getRaster();
Shinya Kitaoka 120a6e
  /*
Toshihiro Shimizu 890ddd
TRaster32P clippedRas = srcRaster->extractT
Shinya Kitaoka 120a6e
  (shrinkX*pos.x, shrinkY*pos.y,
Shinya Kitaoka 120a6e
  (pos.x + ras->getLx()) * shrinkX - 1, (pos.y + ras->getLy()) * shrinkY - 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
if (shrinkX != 1 || shrinkY != 1)
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 120a6e
TRaster32P ras32 = ras;
Shinya Kitaoka 120a6e
if (ras32)
Shinya Kitaoka 120a6e
ras32->fill(TPixel32::Transparent);
Shinya Kitaoka 120a6e
TRop::resample(ras, clippedRas, TScale(1./shrinkX, 1./shrinkY),
Shinya Kitaoka 120a6e
TRop::ClosestPixel);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
else*/
Shinya Kitaoka 120a6e
  ras->copy(srcRaster);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
bool TImageReader::load(const TFilePath &path, TImageP &image) {
Shinya Kitaoka 120a6e
  image = TImageReaderP(path)->load();
Shinya Kitaoka 120a6e
  return image;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TImageWriter::save(const TFilePath &path, TRasterP raster) {
Shinya Kitaoka 120a6e
  TRasterImageP rasImage(raster);
Shinya Kitaoka 120a6e
  TImageWriterP(path)->save(TImageP(rasImage));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TImageWriter::save(const TFilePath &path, const TImageP &image) {
Shinya Kitaoka 120a6e
  TImageWriterP(path)->save(image);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===========================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// funzioni per la registrazione dei formati (chiamate dal Plugin)
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//===========================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TImageReader::define(QString extension, TImageReaderCreateProc *proc) {
Shinya Kitaoka 120a6e
  ImageReaderTable[extension] = proc;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TImageWriter::define(QString extension, TImageWriterCreateProc *proc,
Shinya Kitaoka 120a6e
                          bool isRenderFormat) {
Shinya Kitaoka 120a6e
  ImageWriterTable[extension] =
Shinya Kitaoka 120a6e
      std::pair<timagewritercreateproc *,="" bool="">(proc, isRenderFormat);</timagewritercreateproc>
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TImageReader::getSupportedFormats(QStringList &names) {
Shinya Kitaoka 120a6e
  for (std::map<qstring, *="" timagereadercreateproc="">::iterator it =</qstring,>
Shinya Kitaoka 120a6e
           ImageReaderTable.begin();
Shinya Kitaoka 120a6e
       it != ImageReaderTable.end(); ++it) {
Shinya Kitaoka 120a6e
    names.push_back(it->first);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TImageWriter::getSupportedFormats(QStringList &names,
Shinya Kitaoka 120a6e
                                       bool onlyRenderFormat) {
Shinya Kitaoka 120a6e
  for (std::map<qstring, *,="" bool="" std::pair<timagewritercreateproc="">>::iterator</qstring,>
Shinya Kitaoka 120a6e
           it = ImageWriterTable.begin();
Shinya Kitaoka 120a6e
       it != ImageWriterTable.end(); ++it) {
Shinya Kitaoka 120a6e
    if (!onlyRenderFormat || it->second.second) names.push_back(it->first);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
const TImageInfo *TImageReader::getImageInfo() const {
Shinya Kitaoka 120a6e
  if (m_reader)
Shinya Kitaoka 120a6e
    return &(m_reader->getImageInfo());
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===========================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// Eccezioni
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//===========================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
TImageException::TImageException(const TFilePath &fp, const std::string &msg)
Shinya Kitaoka 120a6e
    : TException(msg), m_fp(fp) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TString TImageException::getMessage() const {
Shinya Kitaoka 120a6e
  return m_fp.getWideString() + L": " + TException::getMessage();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===========================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TImageVersionException::TImageVersionException(const TFilePath &fp, int major,
Shinya Kitaoka 120a6e
                                               int minor)
Shinya Kitaoka 120a6e
    : TException(
Shinya Kitaoka 120a6e
          L"The file " + fp.getWideString() +
Shinya Kitaoka 120a6e
          L" was generated by a newer version of Toonz and cannot be loaded.")
Shinya Kitaoka 120a6e
    , m_fp(fp)
Shinya Kitaoka 120a6e
    , m_major(major)
Shinya Kitaoka 120a6e
    , m_minor(minor) {}