bool CxImage::SelectionFlip() { if (!pSelection) return false; BYTE *buff = (BYTE*)cxalloc(head.biWidth);//malloc(head.biWidth); if (!buff) return false; BYTE *iSrc,*iDst; iSrc = pSelection + (head.biHeight-1)*head.biWidth; iDst = pSelection; for (long i=0; i<(head.biHeight/2); ++i) { memcpy(buff, iSrc, head.biWidth); memcpy(iSrc, iDst, head.biWidth); memcpy(iDst, buff, head.biWidth); iSrc-=head.biWidth; iDst+=head.biWidth; } cxfree(buff);//free(buff); long top = info.rSelectionBox.top; info.rSelectionBox.top = head.biHeight - info.rSelectionBox.bottom; info.rSelectionBox.bottom = head.biHeight - top; return true; }
/** * Creates the selection channel from a gray scale image. * black = unselected */ bool CxImage::SelectionSet(CxImage &from) { if (!from.IsGrayScale() || head.biWidth != from.head.biWidth || head.biHeight != from.head.biHeight){ strcpy(info.szLastError,"CxImage::SelectionSet: wrong width or height, or image is not gray scale"); return false; } if (pSelection==NULL) pSelection = (BYTE*)cxalloc(head.biWidth * head.biHeight);//malloc(head.biWidth * head.biHeight); BYTE* src = from.info.pImage; BYTE* dst = pSelection; if (src==NULL || dst==NULL){ strcpy(info.szLastError,"CxImage::SelectionSet: null pointer"); return false; } for (long y=0; y<head.biHeight; y++){ memcpy(dst,src,head.biWidth); dst += head.biWidth; src += from.info.dwEffWidth; } SelectionRebuildBox(); return true; }
/** * Allocates an empty (opaque) alpha channel. */ bool CxImage::AlphaCreate() { if (pAlpha==NULL) { pAlpha = (BYTE*)cxalloc(head.biWidth * head.biHeight);//malloc(head.biWidth * head.biHeight); if (pAlpha) memset(pAlpha,255,head.biWidth * head.biHeight); } return (pAlpha!=0); }
/** * Imports an existing alpa channel from another image with the same width and height. */ bool CxImage::AlphaCopy(CxImage &from) { if (from.pAlpha == NULL || head.biWidth != from.head.biWidth || head.biHeight != from.head.biHeight) return false; if (pAlpha==NULL) pAlpha = (BYTE*)cxalloc(head.biWidth * head.biHeight);//malloc(head.biWidth * head.biHeight); if (pAlpha==NULL) return false; memcpy(pAlpha,from.pAlpha,head.biWidth * head.biHeight); info.nAlphaMax=from.info.nAlphaMax; return true; }
/** * Imports an existing region from another image with the same width and height. */ bool CxImage::SelectionCopy(CxImage &from) { if (from.pSelection == NULL || head.biWidth != from.head.biWidth || head.biHeight != from.head.biHeight) return false; if (pSelection==NULL) pSelection = (BYTE*)cxalloc(head.biWidth * head.biHeight);//malloc(head.biWidth * head.biHeight); if (pSelection==NULL) return false; memcpy(pSelection,from.pSelection,head.biWidth * head.biHeight); memcpy(&info.rSelectionBox,&from.info.rSelectionBox,sizeof(RECT)); return true; }
/** * Creates the alpha channel from a gray scale image. */ bool CxImage::AlphaSet(CxImage &from) { if (!from.IsGrayScale() || head.biWidth != from.head.biWidth || head.biHeight != from.head.biHeight) return false; if (pAlpha==NULL) pAlpha = (BYTE*)cxalloc(head.biWidth * head.biHeight);//malloc(head.biWidth * head.biHeight); BYTE* src = from.info.pImage; BYTE* dst = pAlpha; if (src==NULL || dst==NULL) return false; for (long y=0; y<head.biHeight; y++){ memcpy(dst,src,head.biWidth); dst += head.biWidth; src += from.info.dwEffWidth; } return true; }
bool CxImage::SelectionMirror() { if (!pSelection) return false; BYTE* pSelection2 = (BYTE*)cxalloc(head.biWidth * head.biHeight);//malloc(head.biWidth * head.biHeight); if (!pSelection2) return false; BYTE *iSrc,*iDst; long wdt=head.biWidth-1; iSrc=pSelection + wdt; iDst=pSelection2; for(long y=0; y < head.biHeight; y++){ for(long x=0; x <= wdt; x++) *(iDst+x)=*(iSrc-x); iSrc+=head.biWidth; iDst+=head.biWidth; } cxfree(pSelection);//free(pSelection); pSelection=pSelection2; long left = info.rSelectionBox.left; info.rSelectionBox.left = head.biWidth - info.rSelectionBox.right; info.rSelectionBox.right = head.biWidth - left; return true; }
bool CxImageJPG::CxExifInfo::DecodeExif(CxFile * hFile, int nReadMode) { int a; int HaveCom = FALSE; a = hFile->GetC(); if (a != 0xff || hFile->GetC() != M_SOI){ return FALSE; } for(;;){ int itemlen; int marker = 0; int ll,lh, got; BYTE * Data; if (SectionsRead >= MAX_SECTIONS){ strcpy(m_szLastError,"Too many sections in jpg file"); return false; } for (a=0;a<7;a++){ marker = hFile->GetC(); if (marker != 0xff) break; if (a >= 6){ printf("too many padding bytes\n"); return false; } } if (marker == 0xff){ // 0xff is legal padding, but if we get that many, something's wrong. strcpy(m_szLastError,"too many padding bytes!"); return false; } Sections[SectionsRead].Type = marker; // Read the length of the section. lh = hFile->GetC(); ll = hFile->GetC(); itemlen = (lh << 8) | ll; if (itemlen < 2){ strcpy(m_szLastError,"invalid marker"); return false; } Sections[SectionsRead].Size = itemlen; Data = (BYTE *)cxalloc(itemlen);//malloc(itemlen); if (Data == NULL){ strcpy(m_szLastError,"Could not allocate memory"); return false; } Sections[SectionsRead].Data = Data; // Store first two pre-read bytes. Data[0] = (BYTE)lh; Data[1] = (BYTE)ll; got = hFile->Read(Data+2, 1, itemlen-2); // Read the whole section. if (got != itemlen-2){ strcpy(m_szLastError,"Premature end of file?"); return false; } SectionsRead += 1; switch(marker){ case M_SOS: // stop before hitting compressed data // If reading entire image is requested, read the rest of the data. if (nReadMode & EXIF_READ_IMAGE){ int cp, ep, size; // Determine how much file is left. cp = hFile->Tell(); hFile->Seek(0, SEEK_END); ep = hFile->Tell(); hFile->Seek(cp, SEEK_SET); size = ep-cp; Data = (BYTE *)cxalloc(size);//malloc(size); if (Data == NULL){ strcpy(m_szLastError,"could not allocate data for entire image"); return false; } got = hFile->Read(Data, 1, size); if (got != size){ strcpy(m_szLastError,"could not read the rest of the image"); return false; } Sections[SectionsRead].Data = Data; Sections[SectionsRead].Size = size; Sections[SectionsRead].Type = PSEUDO_IMAGE_MARKER; SectionsRead ++; } return true; case M_EOI: // in case it's a tables-only JPEG stream printf("No image in jpeg!\n"); return FALSE; case M_COM: // Comment section if (HaveCom || ((nReadMode & EXIF_READ_EXIF) == 0)){ // Discard this section. cxfree(Sections[--SectionsRead].Data);//free(Sections[--SectionsRead].Data); Sections[SectionsRead].Data=0; }else{ process_COM(Data, itemlen); HaveCom = TRUE; } break; case M_JFIF: // Regular jpegs always have this tag, exif images have the exif // marker instead, althogh ACDsee will write images with both markers. // this program will re-create this marker on absence of exif marker. // hence no need to keep the copy from the file. cxfree(Sections[--SectionsRead].Data);//free(Sections[--SectionsRead].Data); Sections[SectionsRead].Data=0; break; case M_EXIF: // Seen files from some 'U-lead' software with Vivitar scanner // that uses marker 31 for non exif stuff. Thus make sure // it says 'Exif' in the section before treating it as exif. if ((nReadMode & EXIF_READ_EXIF) && memcmp(Data+2, "Exif", 4) == 0){ m_exifinfo->IsExif = process_EXIF((BYTE *)Data+2, itemlen); }else{ // Discard this section. cxfree(Sections[--SectionsRead].Data);//free(Sections[--SectionsRead].Data); Sections[SectionsRead].Data=0; } break; case M_SOF0: case M_SOF1: case M_SOF2: case M_SOF3: case M_SOF5: case M_SOF6: case M_SOF7: case M_SOF9: case M_SOF10: case M_SOF11: case M_SOF13: case M_SOF14: case M_SOF15: process_SOFn(Data, marker); break; default: // Skip any other sections. //if (ShowTags) printf("Jpeg section marker 0x%02x size %d\n",marker, itemlen); break; } } return true; }
jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject) { return (void FAR *) cxalloc(sizeofobject);//malloc(sizeofobject); }
jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject) { return (void *) cxalloc(sizeofobject);//malloc(sizeofobject); }