mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-04 18:06:22 +03:00
0030182: Visualization, Image_AlienPixMap - support reading encoded image from memory buffer
Added two new Image_AlienPixMap::Load() methods, taking std::istream and memory buffer (pointer, length) arguments. This allows reading image from application memory or from file with non-zero offset. Added Image_AlienPixMap::IsTopDownDefault() static property allowing to query rows order used by linked image library, so that application might generate UV texture coordinates accordingly. Added missing Release() to IWICImagingFactory instance.
This commit is contained in:
parent
7b93ae3c5e
commit
88b12b7c05
@ -34,6 +34,8 @@
|
||||
#include <gp.hxx>
|
||||
#include <Message.hxx>
|
||||
#include <Message_Messenger.hxx>
|
||||
#include <NCollection_Array1.hxx>
|
||||
#include <Standard_ArrayStreamBuffer.hxx>
|
||||
#include <TCollection_AsciiString.hxx>
|
||||
#include <TCollection_ExtendedString.hxx>
|
||||
#include <OSD_OpenFile.hxx>
|
||||
@ -110,6 +112,109 @@ namespace
|
||||
return FIT_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
//! Wrapper for accessing C++ stream from FreeImage.
|
||||
class Image_FreeImageStream
|
||||
{
|
||||
public:
|
||||
//! Construct wrapper over input stream.
|
||||
Image_FreeImageStream (std::istream& theStream)
|
||||
: myIStream (&theStream), myOStream (NULL), myInitPos (theStream.tellg()) {}
|
||||
|
||||
//! Get io object.
|
||||
FreeImageIO GetFiIO() const
|
||||
{
|
||||
FreeImageIO anIo;
|
||||
memset (&anIo, 0, sizeof(anIo));
|
||||
if (myIStream != NULL)
|
||||
{
|
||||
anIo.read_proc = readProc;
|
||||
anIo.seek_proc = seekProc;
|
||||
anIo.tell_proc = tellProc;
|
||||
}
|
||||
if (myOStream != NULL)
|
||||
{
|
||||
anIo.write_proc = writeProc;
|
||||
}
|
||||
return anIo;
|
||||
}
|
||||
public:
|
||||
//! Simulate fread().
|
||||
static unsigned int DLL_CALLCONV readProc (void* theBuffer, unsigned int theSize, unsigned int theCount, fi_handle theHandle)
|
||||
{
|
||||
Image_FreeImageStream* aThis = (Image_FreeImageStream* )theHandle;
|
||||
if (aThis->myIStream == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!aThis->myIStream->read ((char* )theBuffer, std::streamsize(theSize) * std::streamsize(theCount)))
|
||||
{
|
||||
//aThis->myIStream->clear();
|
||||
}
|
||||
const std::streamsize aNbRead = aThis->myIStream->gcount();
|
||||
return (unsigned int )(aNbRead / theSize);
|
||||
}
|
||||
|
||||
//! Simulate fwrite().
|
||||
static unsigned int DLL_CALLCONV writeProc (void* theBuffer, unsigned int theSize, unsigned int theCount, fi_handle theHandle)
|
||||
{
|
||||
Image_FreeImageStream* aThis = (Image_FreeImageStream* )theHandle;
|
||||
if (aThis->myOStream != NULL
|
||||
&& aThis->myOStream->write ((const char* )theBuffer, std::streamsize(theSize) * std::streamsize(theCount)))
|
||||
{
|
||||
return theCount;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//! Simulate fseek().
|
||||
static int DLL_CALLCONV seekProc (fi_handle theHandle, long theOffset, int theOrigin)
|
||||
{
|
||||
Image_FreeImageStream* aThis = (Image_FreeImageStream* )theHandle;
|
||||
if (aThis->myIStream == NULL)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
bool isSeekDone = false;
|
||||
switch (theOrigin)
|
||||
{
|
||||
case SEEK_SET:
|
||||
if (aThis->myIStream->seekg ((std::streamoff )aThis->myInitPos + theOffset, std::ios::beg))
|
||||
{
|
||||
isSeekDone = true;
|
||||
}
|
||||
break;
|
||||
case SEEK_CUR:
|
||||
if (aThis->myIStream->seekg (theOffset, std::ios::cur))
|
||||
{
|
||||
isSeekDone = true;
|
||||
}
|
||||
break;
|
||||
case SEEK_END:
|
||||
if (aThis->myIStream->seekg (theOffset, std::ios::end))
|
||||
{
|
||||
isSeekDone = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return isSeekDone ? 0 : -1;
|
||||
}
|
||||
|
||||
//! Simulate ftell().
|
||||
static long DLL_CALLCONV tellProc (fi_handle theHandle)
|
||||
{
|
||||
Image_FreeImageStream* aThis = (Image_FreeImageStream* )theHandle;
|
||||
const long aPos = aThis->myIStream != NULL ? (long )(aThis->myIStream->tellg() - aThis->myInitPos) : 0;
|
||||
return aPos;
|
||||
}
|
||||
private:
|
||||
std::istream* myIStream;
|
||||
std::ostream* myOStream;
|
||||
std::streampos myInitPos;
|
||||
};
|
||||
|
||||
#elif defined(HAVE_WINCODEC)
|
||||
|
||||
//! Return a zero GUID
|
||||
@ -384,21 +489,50 @@ void Image_AlienPixMap::Clear()
|
||||
#endif
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : IsTopDownDefault
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
bool Image_AlienPixMap::IsTopDownDefault()
|
||||
{
|
||||
#ifdef HAVE_FREEIMAGE
|
||||
return false;
|
||||
#elif defined(HAVE_WINCODEC)
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : Load
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
#ifdef HAVE_FREEIMAGE
|
||||
bool Image_AlienPixMap::Load (const TCollection_AsciiString& theImagePath)
|
||||
bool Image_AlienPixMap::Load (const Standard_Byte* theData,
|
||||
Standard_Size theLength,
|
||||
const TCollection_AsciiString& theImagePath)
|
||||
{
|
||||
Clear();
|
||||
|
||||
#ifdef _WIN32
|
||||
const TCollection_ExtendedString aFileNameW (theImagePath);
|
||||
FREE_IMAGE_FORMAT aFIF = FreeImage_GetFileTypeU (aFileNameW.ToWideString(), 0);
|
||||
#else
|
||||
FREE_IMAGE_FORMAT aFIF = FreeImage_GetFileType (theImagePath.ToCString(), 0);
|
||||
#endif
|
||||
FREE_IMAGE_FORMAT aFIF = FIF_UNKNOWN;
|
||||
FIMEMORY* aFiMem = NULL;
|
||||
if (theData != NULL)
|
||||
{
|
||||
aFiMem = FreeImage_OpenMemory ((BYTE* )theData, (DWORD )theLength);
|
||||
aFIF = FreeImage_GetFileTypeFromMemory (aFiMem, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef _WIN32
|
||||
aFIF = FreeImage_GetFileTypeU (aFileNameW.ToWideString(), 0);
|
||||
#else
|
||||
aFIF = FreeImage_GetFileType (theImagePath.ToCString(), 0);
|
||||
#endif
|
||||
}
|
||||
if (aFIF == FIF_UNKNOWN)
|
||||
{
|
||||
// no signature? try to guess the file format from the file extension
|
||||
@ -406,10 +540,12 @@ bool Image_AlienPixMap::Load (const TCollection_AsciiString& theImagePath)
|
||||
}
|
||||
if ((aFIF == FIF_UNKNOWN) || !FreeImage_FIFSupportsReading (aFIF))
|
||||
{
|
||||
TCollection_AsciiString aMessage = "Error: image file '";
|
||||
aMessage.AssignCat (theImagePath);
|
||||
aMessage.AssignCat ("' has unsupported file format.");
|
||||
::Message::DefaultMessenger()->Send (aMessage, Message_Fail);
|
||||
::Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: image '") + theImagePath + "' has unsupported file format.",
|
||||
Message_Fail);
|
||||
if (aFiMem != NULL)
|
||||
{
|
||||
FreeImage_CloseMemory (aFiMem);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -425,11 +561,21 @@ bool Image_AlienPixMap::Load (const TCollection_AsciiString& theImagePath)
|
||||
aLoadFlags = ICO_MAKEALPHA;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
FIBITMAP* anImage = FreeImage_LoadU (aFIF, aFileNameW.ToWideString(), aLoadFlags);
|
||||
#else
|
||||
FIBITMAP* anImage = FreeImage_Load (aFIF, theImagePath.ToCString(), aLoadFlags);
|
||||
#endif
|
||||
FIBITMAP* anImage = NULL;
|
||||
if (theData != NULL)
|
||||
{
|
||||
anImage = FreeImage_LoadFromMemory (aFIF, aFiMem, aLoadFlags);
|
||||
FreeImage_CloseMemory (aFiMem);
|
||||
aFiMem = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef _WIN32
|
||||
anImage = FreeImage_LoadU (aFIF, aFileNameW.ToWideString(), aLoadFlags);
|
||||
#else
|
||||
anImage = FreeImage_Load (aFIF, theImagePath.ToCString(), aLoadFlags);
|
||||
#endif
|
||||
}
|
||||
if (anImage == NULL)
|
||||
{
|
||||
TCollection_AsciiString aMessage = "Error: image file '";
|
||||
@ -445,10 +591,8 @@ bool Image_AlienPixMap::Load (const TCollection_AsciiString& theImagePath)
|
||||
if (aFormat == Image_Format_UNKNOWN)
|
||||
{
|
||||
//anImage = FreeImage_ConvertTo24Bits (anImage);
|
||||
TCollection_AsciiString aMessage = "Error: image file '";
|
||||
aMessage.AssignCat (theImagePath);
|
||||
aMessage.AssignCat ("' has unsupported pixel format.");
|
||||
::Message::DefaultMessenger()->Send (aMessage, Message_Fail);
|
||||
::Message::DefaultMessenger()->Send ( TCollection_AsciiString ("Error: image '") + theImagePath + "' has unsupported pixel format.",
|
||||
Message_Fail);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -460,25 +604,106 @@ bool Image_AlienPixMap::Load (const TCollection_AsciiString& theImagePath)
|
||||
myLibImage = anImage;
|
||||
return true;
|
||||
}
|
||||
#elif defined(HAVE_WINCODEC)
|
||||
bool Image_AlienPixMap::Load (const TCollection_AsciiString& theImagePath)
|
||||
|
||||
bool Image_AlienPixMap::Load (std::istream& theStream,
|
||||
const TCollection_AsciiString& theFileName)
|
||||
{
|
||||
Clear();
|
||||
|
||||
IWICImagingFactory* aWicImgFactory = NULL;
|
||||
Image_FreeImageStream aStream (theStream);
|
||||
FreeImageIO aFiIO = aStream.GetFiIO();
|
||||
|
||||
FREE_IMAGE_FORMAT aFIF = FreeImage_GetFileTypeFromHandle (&aFiIO, &aStream, 0);
|
||||
if (aFIF == FIF_UNKNOWN)
|
||||
{
|
||||
// no signature? try to guess the file format from the file extension
|
||||
aFIF = FreeImage_GetFIFFromFilename (theFileName.ToCString());
|
||||
}
|
||||
if ((aFIF == FIF_UNKNOWN) || !FreeImage_FIFSupportsReading (aFIF))
|
||||
{
|
||||
::Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: image stream '") + theFileName + "' has unsupported file format.",
|
||||
Message_Fail);
|
||||
return false;
|
||||
}
|
||||
|
||||
int aLoadFlags = 0;
|
||||
if (aFIF == FIF_GIF)
|
||||
{
|
||||
// 'Play' the GIF to generate each frame (as 32bpp) instead of returning raw frame data when loading
|
||||
aLoadFlags = GIF_PLAYBACK;
|
||||
}
|
||||
else if (aFIF == FIF_ICO)
|
||||
{
|
||||
// convert to 32bpp and create an alpha channel from the AND-mask when loading
|
||||
aLoadFlags = ICO_MAKEALPHA;
|
||||
}
|
||||
|
||||
FIBITMAP* anImage = FreeImage_LoadFromHandle (aFIF, &aFiIO, &aStream, aLoadFlags);
|
||||
if (anImage == NULL)
|
||||
{
|
||||
::Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: image stream '") + theFileName + "' is missing or invalid.",
|
||||
Message_Fail);
|
||||
return false;
|
||||
}
|
||||
|
||||
Image_Format aFormat = convertFromFreeFormat (FreeImage_GetImageType(anImage),
|
||||
FreeImage_GetColorType(anImage),
|
||||
FreeImage_GetBPP (anImage));
|
||||
if (aFormat == Image_Format_UNKNOWN)
|
||||
{
|
||||
::Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: image stream '") + theFileName + "' has unsupported pixel format.",
|
||||
Message_Fail);
|
||||
return false;
|
||||
}
|
||||
|
||||
Image_PixMap::InitWrapper (aFormat, FreeImage_GetBits (anImage),
|
||||
FreeImage_GetWidth (anImage), FreeImage_GetHeight (anImage), FreeImage_GetPitch (anImage));
|
||||
SetTopDown (false);
|
||||
|
||||
// assign image after wrapper initialization (virtual Clear() called inside)
|
||||
myLibImage = anImage;
|
||||
return true;
|
||||
}
|
||||
|
||||
#elif defined(HAVE_WINCODEC)
|
||||
bool Image_AlienPixMap::Load (const Standard_Byte* theData,
|
||||
Standard_Size theLength,
|
||||
const TCollection_AsciiString& theFileName)
|
||||
{
|
||||
Clear();
|
||||
|
||||
Image_ComPtr<IWICImagingFactory> aWicImgFactory;
|
||||
CoInitializeEx (NULL, COINIT_MULTITHREADED);
|
||||
if (CoCreateInstance (CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&aWicImgFactory)) != S_OK)
|
||||
if (CoCreateInstance (CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&aWicImgFactory.ChangePtr())) != S_OK)
|
||||
{
|
||||
Message::DefaultMessenger()->Send ("Error: cannot initialize WIC Imaging Factory", Message_Fail);
|
||||
return false;
|
||||
}
|
||||
|
||||
Image_ComPtr<IWICBitmapDecoder> aWicDecoder;
|
||||
const TCollection_ExtendedString aFileNameW (theImagePath);
|
||||
if (aWicImgFactory->CreateDecoderFromFilename (aFileNameW.ToWideString(), NULL, GENERIC_READ, WICDecodeMetadataCacheOnDemand, &aWicDecoder.ChangePtr()) != S_OK)
|
||||
Image_ComPtr<IWICStream> aWicStream;
|
||||
if (theData != NULL)
|
||||
{
|
||||
Message::DefaultMessenger()->Send ("Error: cannot create WIC Image Decoder", Message_Fail);
|
||||
return false;
|
||||
if (aWicImgFactory->CreateStream (&aWicStream.ChangePtr()) != S_OK
|
||||
|| aWicStream->InitializeFromMemory ((BYTE* )theData, (DWORD )theLength) != S_OK)
|
||||
{
|
||||
Message::DefaultMessenger()->Send ("Error: cannot initialize WIC Stream", Message_Fail);
|
||||
return false;
|
||||
}
|
||||
if (aWicImgFactory->CreateDecoderFromStream (aWicStream.get(), NULL, WICDecodeMetadataCacheOnDemand, &aWicDecoder.ChangePtr()) != S_OK)
|
||||
{
|
||||
Message::DefaultMessenger()->Send ("Error: cannot create WIC Image Decoder", Message_Fail);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
const TCollection_ExtendedString aFileNameW (theFileName);
|
||||
if (aWicImgFactory->CreateDecoderFromFilename (aFileNameW.ToWideString(), NULL, GENERIC_READ, WICDecodeMetadataCacheOnDemand, &aWicDecoder.ChangePtr()) != S_OK)
|
||||
{
|
||||
Message::DefaultMessenger()->Send ("Error: cannot create WIC Image Decoder", Message_Fail);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
UINT aFrameCount = 0, aFrameSizeX = 0, aFrameSizeY = 0;
|
||||
@ -527,10 +752,45 @@ bool Image_AlienPixMap::Load (const TCollection_AsciiString& theImagePath)
|
||||
SetTopDown (true);
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
bool Image_AlienPixMap::Load (const TCollection_AsciiString&)
|
||||
bool Image_AlienPixMap::Load (std::istream& theStream,
|
||||
const TCollection_AsciiString& theFilePath)
|
||||
{
|
||||
Clear();
|
||||
|
||||
// fallback copying stream data into transient buffer
|
||||
const std::streamoff aStart = theStream.tellg();
|
||||
theStream.seekg (0, std::ios::end);
|
||||
const Standard_Integer aLen = Standard_Integer(theStream.tellg() - aStart);
|
||||
theStream.seekg (aStart);
|
||||
if (aLen <= 0)
|
||||
{
|
||||
Message::DefaultMessenger()->Send ("Error: empty stream", Message_Fail);
|
||||
return false;
|
||||
}
|
||||
|
||||
NCollection_Array1<Standard_Byte> aBuff (1, aLen);
|
||||
if (!theStream.read ((char* )&aBuff.ChangeFirst(), aBuff.Size()))
|
||||
{
|
||||
Message::DefaultMessenger()->Send ("Error: unable to read stream", Message_Fail);
|
||||
return false;
|
||||
}
|
||||
|
||||
return Load (&aBuff.ChangeFirst(), aBuff.Size(), theFilePath);
|
||||
}
|
||||
#else
|
||||
bool Image_AlienPixMap::Load (std::istream& ,
|
||||
const TCollection_AsciiString& )
|
||||
{
|
||||
Clear();
|
||||
Message::DefaultMessenger()->Send ("Error: no image library available", Message_Fail);
|
||||
return false;
|
||||
}
|
||||
bool Image_AlienPixMap::Load (const Standard_Byte* ,
|
||||
Standard_Size ,
|
||||
const TCollection_AsciiString& )
|
||||
{
|
||||
Clear();
|
||||
Message::DefaultMessenger()->Send ("Error: no image library available", Message_Fail);
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
@ -774,9 +1034,9 @@ bool Image_AlienPixMap::Save (const TCollection_AsciiString& theFileName)
|
||||
return false;
|
||||
}
|
||||
|
||||
IWICImagingFactory* aWicImgFactory = NULL;
|
||||
Image_ComPtr<IWICImagingFactory> aWicImgFactory;
|
||||
CoInitializeEx (NULL, COINIT_MULTITHREADED);
|
||||
if (CoCreateInstance (CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&aWicImgFactory)) != S_OK)
|
||||
if (CoCreateInstance (CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&aWicImgFactory.ChangePtr())) != S_OK)
|
||||
{
|
||||
Message::DefaultMessenger()->Send ("Error: cannot initialize WIC Imaging Factory", Message_Fail);
|
||||
return false;
|
||||
|
@ -36,6 +36,10 @@ class Image_AlienPixMap : public Image_PixMap
|
||||
DEFINE_STANDARD_RTTIEXT(Image_AlienPixMap, Image_PixMap)
|
||||
public:
|
||||
|
||||
//! Return default rows order used by underlying image library.
|
||||
Standard_EXPORT static bool IsTopDownDefault();
|
||||
public:
|
||||
|
||||
//! Empty constructor.
|
||||
Standard_EXPORT Image_AlienPixMap();
|
||||
|
||||
@ -43,7 +47,23 @@ public:
|
||||
Standard_EXPORT virtual ~Image_AlienPixMap();
|
||||
|
||||
//! Read image data from file.
|
||||
Standard_EXPORT bool Load (const TCollection_AsciiString& theFileName);
|
||||
bool Load (const TCollection_AsciiString& theFileName)
|
||||
{
|
||||
return Load (NULL, 0, theFileName);
|
||||
}
|
||||
|
||||
//! Read image data from stream.
|
||||
Standard_EXPORT bool Load (std::istream& theStream,
|
||||
const TCollection_AsciiString& theFileName);
|
||||
|
||||
//! Read image data from memory buffer.
|
||||
//! @param theData memory pointer to read from;
|
||||
//! when NULL, function will attempt to open theFileName file
|
||||
//! @param theLength memory buffer length
|
||||
//! @param theFileName optional file name
|
||||
Standard_EXPORT bool Load (const Standard_Byte* theData,
|
||||
Standard_Size theLength,
|
||||
const TCollection_AsciiString& theFileName);
|
||||
|
||||
//! Write image data to file using file extension to determine compression format.
|
||||
Standard_EXPORT bool Save (const TCollection_AsciiString& theFileName);
|
||||
|
@ -386,6 +386,139 @@ static Standard_Integer OCC361bug (Draw_Interpretor& di, Standard_Integer nb, co
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include <Graphic3d_Texture2Dmanual.hxx>
|
||||
#include <Image_AlienPixMap.hxx>
|
||||
#include <OSD_OpenFile.hxx>
|
||||
#include <Prs3d_ShadingAspect.hxx>
|
||||
#include <Standard_ArrayStreamBuffer.hxx>
|
||||
//=======================================================================
|
||||
//function : OCC30182
|
||||
//purpose : Testing different interfaces of Image_AlienPixMap::Load()
|
||||
//=======================================================================
|
||||
static Standard_Integer OCC30182 (Draw_Interpretor& , Standard_Integer theNbArgs, const char** theArgVec)
|
||||
{
|
||||
if (ViewerTest::CurrentView().IsNull())
|
||||
{
|
||||
std::cout << "Error: no active view\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
TCollection_AsciiString aPrsName, anImgPath;
|
||||
Standard_Integer anOffset = 0;
|
||||
Standard_Integer aSrc = 0; // 0 - file name, 1 - file stream, 2 - memory buffer
|
||||
for (Standard_Integer anArgIter = 1; anArgIter < theNbArgs; ++anArgIter)
|
||||
{
|
||||
TCollection_AsciiString anArg (theArgVec[anArgIter]);
|
||||
anArg.LowerCase();
|
||||
if (anArg == "-offset"
|
||||
&& anArgIter + 1 < theNbArgs)
|
||||
{
|
||||
anOffset = Draw::Atoi (theArgVec[++anArgIter]);
|
||||
}
|
||||
else if (anArg == "-filename")
|
||||
{
|
||||
aSrc = 0;
|
||||
}
|
||||
else if (anArg == "-stream")
|
||||
{
|
||||
aSrc = 1;
|
||||
}
|
||||
else if (anArg == "-mem"
|
||||
|| anArg == "-memory")
|
||||
{
|
||||
aSrc = 2;
|
||||
}
|
||||
else if (aPrsName.IsEmpty())
|
||||
{
|
||||
aPrsName = theArgVec[anArgIter];
|
||||
}
|
||||
else if (anImgPath.IsEmpty())
|
||||
{
|
||||
anImgPath = theArgVec[anArgIter];
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Syntax error at '" << anArg << "'\n";
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if (anImgPath.IsEmpty())
|
||||
{
|
||||
std::cout << "Syntax error: wrong number of arguments\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
Handle(Image_AlienPixMap) anImage = new Image_AlienPixMap();
|
||||
if (aSrc == 0)
|
||||
{
|
||||
if (!anImage->Load (anImgPath))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::ifstream aFile;
|
||||
OSD_OpenStream (aFile, anImgPath.ToCString(), std::ios::in | std::ios::binary);
|
||||
if (!aFile.is_open())
|
||||
{
|
||||
std::cout << "Syntax error: image file '" << anImgPath << "' cannot be found\n";
|
||||
return 1;
|
||||
}
|
||||
if (anOffset != 0)
|
||||
{
|
||||
aFile.seekg (anOffset);
|
||||
}
|
||||
|
||||
if (aSrc == 2)
|
||||
{
|
||||
aFile.seekg (0, std::ios::end);
|
||||
Standard_Integer aLen = (Standard_Integer )aFile.tellg() - anOffset;
|
||||
aFile.seekg (anOffset);
|
||||
if (aLen <= 0)
|
||||
{
|
||||
std::cout << "Syntax error: wrong offset\n";
|
||||
return 1;
|
||||
}
|
||||
NCollection_Array1<Standard_Byte> aBuff (1, aLen);
|
||||
if (!aFile.read ((char* )&aBuff.ChangeFirst(), aBuff.Size()))
|
||||
{
|
||||
std::cout << "Error: unable to read file\n";
|
||||
return 1;
|
||||
}
|
||||
aFile.close();
|
||||
if (!anImage->Load (&aBuff.ChangeFirst(), aBuff.Size(), anImgPath))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!anImage->Load (aFile, anImgPath))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TopoDS_Shape aShape = BRepPrimAPI_MakeBox (100.0 * anImage->Ratio(), 100.0, 1.0).Shape();
|
||||
Handle(AIS_Shape) aPrs = new AIS_Shape (aShape);
|
||||
aPrs->SetDisplayMode (AIS_Shaded);
|
||||
aPrs->Attributes()->SetupOwnShadingAspect();
|
||||
const Handle(Graphic3d_AspectFillArea3d)& anAspect = aPrs->Attributes()->ShadingAspect()->Aspect();
|
||||
anAspect->SetShadingModel (Graphic3d_TOSM_UNLIT);
|
||||
anAspect->SetTextureMapOn (true);
|
||||
anAspect->SetTextureMap (new Graphic3d_Texture2Dmanual (anImage));
|
||||
if (anImage->IsTopDown())
|
||||
{
|
||||
anAspect->TextureMap()->GetParams()->SetTranslation(Graphic3d_Vec2 (0.0f, -1.0f));
|
||||
anAspect->TextureMap()->GetParams()->SetScale (Graphic3d_Vec2 (1.0f, -1.0f));
|
||||
}
|
||||
|
||||
ViewerTest::Display (aPrsName, aPrs, true, true);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void QABugs::Commands_1(Draw_Interpretor& theCommands) {
|
||||
const char *group = "QABugs";
|
||||
|
||||
@ -399,7 +532,9 @@ void QABugs::Commands_1(Draw_Interpretor& theCommands) {
|
||||
theCommands.Add ("OCC74_set", "OCC74_set shape mode; set selection mode", __FILE__, OCC74bug_set, group);
|
||||
theCommands.Add ("OCC74_get", "OCC74_get shape; get selection mode", __FILE__, OCC74bug_get, group);
|
||||
|
||||
theCommands.Add("OCC361", "OCC361 Doc ", __FILE__, OCC361bug, group);
|
||||
|
||||
theCommands.Add ("OCC361", "OCC361 Doc ", __FILE__, OCC361bug, group);
|
||||
theCommands.Add ("OCC30182",
|
||||
"OCC30182 name image [-offset Start] [-fileName] [-stream] [-memory]\n"
|
||||
"Decodes image either by passing file name, file stream or memory stream", __FILE__, OCC30182, group);
|
||||
return;
|
||||
}
|
||||
|
@ -1078,48 +1078,6 @@ static Standard_Integer OCC884 (Draw_Interpretor& di, Standard_Integer argc, con
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include <Aspect_FillMethod.hxx>
|
||||
//=======================================================================
|
||||
//function : OCC1188
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
static Standard_Integer OCC1188 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv)
|
||||
{
|
||||
if (argc < 2 || argc > 3)
|
||||
{
|
||||
di << "Usage : " << argv[0] << " imagefile [filltype] : Load image as background\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
Handle(AIS_InteractiveContext) AISContext = ViewerTest::GetAISContext();
|
||||
if(AISContext.IsNull())
|
||||
{
|
||||
di << "use 'vinit' command before " << argv[0] << "\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
Aspect_FillMethod aFillType = Aspect_FM_CENTERED;
|
||||
if (argc == 3)
|
||||
{
|
||||
const char* szType = argv[2];
|
||||
if (strcmp(szType, "NONE" ) == 0) aFillType = Aspect_FM_NONE;
|
||||
else if (strcmp(szType, "CENTERED") == 0) aFillType = Aspect_FM_CENTERED;
|
||||
else if (strcmp(szType, "TILED" ) == 0) aFillType = Aspect_FM_TILED;
|
||||
else if (strcmp(szType, "STRETCH" ) == 0) aFillType = Aspect_FM_STRETCH;
|
||||
else
|
||||
{
|
||||
di << "Wrong fill type : " << szType << "\n";
|
||||
di << "Must be one of CENTERED, TILED, STRETCH, NONE\n";
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
Handle(V3d_View) V3dView = ViewerTest::CurrentView();
|
||||
V3dView->SetBackgroundImage(argv[1], aFillType, Standard_True);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include <Graphic3d_MaterialAspect.hxx>
|
||||
#include <Prs3d_Drawer.hxx>
|
||||
#include <Prs3d_ShadingAspect.hxx>
|
||||
@ -1590,7 +1548,6 @@ void QABugs::Commands_17(Draw_Interpretor& theCommands) {
|
||||
theCommands.Add ("OCC813", "OCC813 U V", __FILE__, OCC813, group);
|
||||
theCommands.Add ("OCC814", "OCC814", __FILE__, OCC814, group);
|
||||
theCommands.Add ("OCC884", "OCC884 result shape [toler [maxtoler]]", __FILE__, OCC884, group);
|
||||
theCommands.Add ("OCC1188", "OCC1188 imagefile [filltype] : Load image as background", __FILE__, OCC1188, group);
|
||||
|
||||
theCommands.Add ("OCC1174_1", "OCC1174_1 shape", __FILE__, OCC1174_1, group);
|
||||
theCommands.Add ("OCC1174_2", "OCC1174_2 shape", __FILE__, OCC1174_2, group);
|
||||
|
@ -1,19 +1,11 @@
|
||||
puts "================"
|
||||
puts "OCC1188"
|
||||
puts "Impossible to set background image for V3d_View"
|
||||
puts "0001188: Impossible to set background image for V3d_View"
|
||||
puts "================"
|
||||
puts ""
|
||||
|
||||
set x 200
|
||||
set y 200
|
||||
vinit View1
|
||||
|
||||
vinit
|
||||
vsetbg [locate_data_file OCC1188.gif]
|
||||
if { [vreadpixel 200 200 rgb name] != "WHITE" } { puts "Error: image background is not set" }
|
||||
|
||||
OCC1188 [locate_data_file OCC1188.gif]
|
||||
|
||||
checkcolor $x $y 0.99 0.99 0.99
|
||||
if { ${stat} != 1} {
|
||||
puts "OCC1188: Error"
|
||||
}
|
||||
|
||||
checkview -screenshot -3d -path ${imagedir}/${test_image}.png
|
||||
vdump $imagedir/${casename}.png
|
||||
|
@ -1,30 +1,24 @@
|
||||
puts "============"
|
||||
puts "OCC25475"
|
||||
puts "0025475: Visualization, TKOpenGl - draw background using primitive arrays"
|
||||
puts "Tests textured background"
|
||||
puts "============"
|
||||
puts ""
|
||||
#######################################################################
|
||||
puts "Tests textured background"
|
||||
#######################################################################
|
||||
|
||||
set aTextureFile [locate_data_file hatch_1.png]
|
||||
set anImage1 $imagedir/${casename}_1.png
|
||||
set anImage2 $imagedir/${casename}_2.png
|
||||
set anImage3 $imagedir/${casename}_3.png
|
||||
set anImage4 $imagedir/${casename}_4.png
|
||||
|
||||
pload VISUALIZATION
|
||||
vinit
|
||||
vinit View1
|
||||
|
||||
vsetbg $aTextureFile STRETCH
|
||||
vdump $anImage1
|
||||
vdump $imagedir/${casename}_1.png
|
||||
|
||||
vsetbg $aTextureFile NONE
|
||||
vsetbg $aTextureFile TILED
|
||||
vdump $anImage2
|
||||
vdump $imagedir/${casename}_2.png
|
||||
|
||||
vsetgradientbg 255 0 0 0 0 255 1
|
||||
vsetbg $aTextureFile CENTERED
|
||||
vdump $anImage3
|
||||
vdump $imagedir/${casename}_3.png
|
||||
|
||||
vsetbg $aTextureFile NONE
|
||||
vdump $anImage4
|
||||
vdump $imagedir/${casename}_4.png
|
||||
|
64
tests/bugs/vis/bug30182
Normal file
64
tests/bugs/vis/bug30182
Normal file
@ -0,0 +1,64 @@
|
||||
puts "============"
|
||||
puts "0030182: Visualization, Image_AlienPixMap - support reading encoded image from memory buffer"
|
||||
puts "============"
|
||||
puts ""
|
||||
|
||||
set anImg1 [locate_data_file hatch_1.png]
|
||||
set anImg2 [locate_data_file OCC1188.gif]
|
||||
set anImgTmp "$imagedir/${casename}_img.bin"
|
||||
|
||||
set aTmpOut [open "$anImgTmp" w]
|
||||
fconfigure $aTmpOut -translation binary
|
||||
foreach aFileIter {anImg1 anImg2} {
|
||||
set aFileName [set $aFileIter]
|
||||
set aFileIn [open $aFileName]
|
||||
fconfigure $aFileIn -translation binary
|
||||
fcopy $aFileIn $aTmpOut
|
||||
close $aFileIn
|
||||
}
|
||||
close $aTmpOut
|
||||
|
||||
pload VISUALIZATION QAcommands
|
||||
vclear
|
||||
vinit View1
|
||||
vtop
|
||||
|
||||
OCC30182 t $anImg1 -fileName; vfit
|
||||
vdump $imagedir/${casename}_1.png
|
||||
|
||||
OCC30182 t $anImg1 -stream; vfit
|
||||
vdump $imagedir/${casename}_1s1.png
|
||||
|
||||
OCC30182 t $anImg1 -memory; vfit
|
||||
vdump $imagedir/${casename}_1m1.png
|
||||
|
||||
OCC30182 t $anImg2 -fileName; vfit
|
||||
vdump $imagedir/${casename}_2.png
|
||||
|
||||
OCC30182 t $anImg2 -stream; vfit
|
||||
vdump $imagedir/${casename}_2s1.png
|
||||
|
||||
OCC30182 t $anImg2 -memory; vfit
|
||||
vdump $imagedir/${casename}_2m1.png
|
||||
|
||||
OCC30182 t $anImgTmp -stream -offset 0; vfit
|
||||
vdump $imagedir/${casename}_1s2.png
|
||||
|
||||
OCC30182 t $anImgTmp -memory -offset 0; vfit
|
||||
vdump $imagedir/${casename}_1m2.png
|
||||
|
||||
OCC30182 t $anImgTmp -stream -offset [file size $anImg1]; vfit
|
||||
vdump $imagedir/${casename}_2s2.png
|
||||
|
||||
OCC30182 t $anImgTmp -memory -offset [file size $anImg1]; vfit
|
||||
vdump $imagedir/${casename}_2m2.png
|
||||
|
||||
if { [diffimage $imagedir/${casename}_1s1.png $imagedir/${casename}_1.png] != 0 } { puts "Error 1s1" }
|
||||
if { [diffimage $imagedir/${casename}_1m1.png $imagedir/${casename}_1.png] != 0 } { puts "Error 1m1" }
|
||||
if { [diffimage $imagedir/${casename}_1s2.png $imagedir/${casename}_1.png] != 0 } { puts "Error 1s2" }
|
||||
if { [diffimage $imagedir/${casename}_1m2.png $imagedir/${casename}_1.png] != 0 } { puts "Error 1m2" }
|
||||
|
||||
if { [diffimage $imagedir/${casename}_2s1.png $imagedir/${casename}_2.png] != 0 } { puts "Error 2s1" }
|
||||
if { [diffimage $imagedir/${casename}_2m1.png $imagedir/${casename}_2.png] != 0 } { puts "Error 2m1" }
|
||||
if { [diffimage $imagedir/${casename}_2s2.png $imagedir/${casename}_2.png] != 0 } { puts "Error 2s2" }
|
||||
if { [diffimage $imagedir/${casename}_2m2.png $imagedir/${casename}_2.png] != 0 } { puts "Error 2m2" }
|
Loading…
x
Reference in New Issue
Block a user