Memoryfile



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 26/09/2011 at 12:28, xxxxxxxx wrote:

    User Information:
    Cinema 4D Version:   12/13 
    Platform:   Windows  ;   Mac OSX  ; 
    Language(s) :     C++  ;

    ---------
    Hi,

    I have a base bitmap (jpeg) and a valid pointer to the memory to store.
    How would one use "MemoryFileStruct" and "SetMemoryWriteMode" or should this be done differently?

    Jan



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 27/09/2011 at 06:00, xxxxxxxx wrote:

    The MemoryFileStruct class is is only used to write/read to memory instead of files. It basically replaces a filename.

    here an example that writes a line of characters and prints the retrieved data.

      
    Bool MenuTest::Execute(BaseDocument *doc)  
    {  
      AutoAlloc<MemoryFileStruct> mfs;  
      if (!mfs) return FALSE;  
      
      Filename fn;  
      fn.SetMemoryWriteMode(mfs);  
      
      AutoAlloc<BaseFile> file;  
      if (!file) return FALSE;  
      
      if (!file->Open(fn, FILEOPEN_WRITE, FILEDIALOG_IGNOREOPEN, BYTEORDER_INTEL)) return FALSE;  
      
      CHAR *line = "hello world!";  
      
      //write something to the memory file  
      if (!file->WriteBytes(line, strlen(line))) return FALSE;  
      
      void *testline = NULL;  
      VLONG length = 0;  
      
      //get the written data  
      mfs->GetData(testline, length, FALSE);  
      
      if (!testline) return FALSE;  
      
      String str((CHAR* )testline);  
      
      GePrint(str);  
      
      return TRUE;  
    }  
    

    cheers,
    Matthias



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 27/09/2011 at 08:55, xxxxxxxx wrote:

    I see.
    But my target is to save a freshly rendered preview in a base bitmap (jpeg) to an already initialized pointer in memory.
    It seems to me that i cannot use the basefile in this case.

    What are my options? What is possible?
    I need to do this in realtime and as fast as possible. A preview is good enough.

    1.Render directly in the memory already initialized?
    2.Maybe by getting a handle to the jpeg data in the base bitmap? Can that be done?
    3.Or a handle to the offscreen rendered preview? That is also a lot more efficient, because I would not need to force an extra render. .

    Jan



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 28/09/2011 at 02:53, xxxxxxxx wrote:

    Do you mean viewport rendering?

    Anyways, saving a JPG to memory seems to work as follows:

      
    Bool MenuTest::Execute(BaseDocument *doc)  
    {  
      AutoAlloc<MemoryFileStruct> mfs;  
      if (!mfs) return FALSE;  
      
      Filename fn;  
      fn.SetMemoryWriteMode(mfs);  
      
      BaseBitmap *bmp = NULL;  
      bmp = BaseBitmap::Alloc();  
      if (!bmp) return FALSE;  
      
      BaseContainer bc;  
      bc.SetLong(JPGSAVER_QUALITY, 80);  
      
      void *mbmp = NULL;  
      VLONG length = 0;  
      
      if (bmp->Init(1024,512) != IMAGERESULT_OK) goto Error;  
      
      bmp->Clear(255,0,0);  
      
      if (bmp->Save(fn, FILTER_JPG, &bc, SAVEBIT_0) != IMAGERESULT_OK) goto Error;  
      
      GePrint("saved");  
      
      //get the written data  
      mfs->GetData(mbmp, length, FALSE);  
      if (!mbmp) goto Error;  
      
      // mbmp is the pointer to the JPG data  
      
      GePrint(LongToString(length));  
      
      return TRUE;  
      
    Error:  
      BaseBitmap::Free(bmp);  
      return FALSE;  
    }  
    

    Hope that helps.

    cheers,
    Matthias


Log in to reply