| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include "Image.h" |
| #include "Error.h" |
|
|
| |
| |
| |
|
|
| bool CShape::operator==(const CShape& ref) |
| { |
| |
| return (width == ref.width && |
| height == ref.height && |
| nBands == ref.nBands); |
| } |
|
|
| bool CShape::SameIgnoringNBands(const CShape& ref) |
| { |
| |
| return (width == ref.width && |
| height == ref.height); |
| } |
|
|
| bool CShape::operator!=(const CShape& ref) |
| { |
| |
| return ! ((*this) == ref); |
| } |
|
|
|
|
| |
| |
| |
|
|
| void CImage::SetDefaults() |
| { |
| |
| m_pTI = 0; |
| m_bandSize = 0; |
| m_pixSize = 0; |
| m_rowSize = 0; |
| m_memStart = 0; |
| alphaChannel = 3; |
|
|
| |
| alphaChannel = 3; |
| origin[0] = 0; |
| origin[1] = 0; |
| borderMode = eBorderReplicate; |
| } |
|
|
| CImage::CImage() |
| { |
| |
| SetDefaults(); |
| } |
|
|
| CImage::CImage(CShape s, const type_info& ti, int cS) |
| { |
| SetDefaults(); |
| ReAllocate(s, ti, cS, 0, true, 0); |
| } |
|
|
| void CImage::ReAllocate(CShape s, const type_info& ti, int bandSize, |
| bool evenIfSameShape) |
| { |
| if (! evenIfSameShape && s == m_shape && ti == *m_pTI && bandSize == m_bandSize) |
| return; |
| ReAllocate(s, ti, bandSize, 0, true, 0); |
| } |
|
|
| void CImage::ReAllocate(CShape s, const type_info& ti, int bandSize, |
| void *memory, bool deleteWhenDone, int rowSize) |
| { |
| |
| m_shape = s; |
| m_pTI = &ti; |
| m_bandSize = bandSize; |
| m_pixSize = m_bandSize * s.nBands; |
|
|
| |
| m_rowSize = (rowSize) ? rowSize : |
| (m_pixSize * s.width + 7) & -8; |
| int nBytes = m_rowSize * s.height; |
| if (memory == 0 && nBytes > 0) |
| { |
| memory = new double[(nBytes + 7)/ 8]; |
| if (memory == 0) |
| throw CError("CImage::Reallocate: could not allocate %d bytes", nBytes); |
| } |
| m_memStart = (char *) memory; |
| m_memory.ReAllocate(nBytes, memory, deleteWhenDone); |
| } |
|
|
| void CImage::DeAllocate() |
| { |
| |
| ReAllocate(CShape(), *(const type_info *) 0, 0, 0, false, 0); |
| SetDefaults(); |
| } |
|
|
|
|
| void CImage::SetSubImage(int x, int y, int width, int height) |
| { |
| |
| m_memStart = (char *) PixelAddress(x, y, 0); |
|
|
| |
| int x1 = __min(m_shape.width, x+width); |
| int y1 = __min(m_shape.height, y+height); |
| x = __max(0, __min(x, m_shape.width)); |
| y = __max(0, __min(y, m_shape.height)); |
| m_shape.width = x1 - x; |
| m_shape.height = y1 - y; |
| } |
|
|
| void CImage::SetPixels(void *val_ptr) |
| { |
| |
| uchar *vc = (uchar *) val_ptr; |
|
|
| |
| bool all_same = true; |
| for (int b = 0; b < m_bandSize; b++) |
| all_same = all_same && (vc[b] == vc[0]); |
|
|
| |
| int nC = m_shape.width * m_shape.nBands; |
| for (int y = 0; y < m_shape.height; y++) |
| { |
| uchar *rp = (uchar *) PixelAddress(0, y, 0); |
| if (all_same) |
| memset(rp, vc[0], nC * m_bandSize); |
| else if (m_bandSize == sizeof(int)) |
| { |
| int vi = *(int *) val_ptr; |
| int *ip = (int *) rp; |
| for (int c = 0; c < nC; c++) |
| ip[c] = vi; |
| } |
| else |
| { |
| for (int c = 0; c < nC; c++, rp += m_bandSize) |
| memcpy(rp, vc, m_bandSize); |
| } |
| } |
| } |
|
|
| |
| |
| |
|
|
| template <> uchar CImageOf<uchar>::MinVal(void) { return 0; } |
| template <> uchar CImageOf<uchar>::MaxVal(void) { return 255; } |
| template <> int CImageOf<int >::MinVal(void) { return 0x80000000; } |
| template <> int CImageOf<int >::MaxVal(void) { return 0x7fffffff; } |
| template <> float CImageOf<float>::MinVal(void) { return -FLT_MAX; } |
| template <> float CImageOf<float>::MaxVal(void) { return FLT_MAX; } |
|
|