Note: the buffer is only valid for the lifetime of the CScanIterator object. pBmFormat - Pointer to a BMFORMAT enumeration that recieves the format pcWidth - Pointer to storage that recieves the pixel width pcHeight - Pointer to storage that recieves the pixel height pcbStride - Pointer to storage that recieves the stride Return Value: HRESULT S_OK - On success E_* - On error --*/ HRESULT CScanIterator::GetScanBuffer( __deref_bcount(*pcbStride) PBYTE* ppData, __out BMFORMAT* pBmFormat, __out UINT* pcWidth, __out UINT* pcHeight, __out UINT* pcbStride ) { HRESULT hr = S_OK; if (SUCCEEDED(hr = CHECK_POINTER(ppData, E_POINTER)) && SUCCEEDED(hr = CHECK_POINTER(pBmFormat, E_POINTER)) && SUCCEEDED(hr = CHECK_POINTER(pcWidth, E_POINTER)) && SUCCEEDED(hr = CHECK_POINTER(pcHeight, E_POINTER)) && SUCCEEDED(hr = CHECK_POINTER(pcbStride, E_POINTER))) { *ppData = NULL;
this->GetBuffer(allocation, bytes, &buffer); if (!this->CommitBuffer(allocation, buffer, 0, /*sourceBuffer=*/ nullptr, /*alignPad=*/ bytes)) { return false; } #if DBG_DUMP this->totalBytesCode -= bytes; #endif } return true; } template <typename SyncObject> EmitBufferAllocation* EmitBufferManager<SyncObject>::GetBuffer(EmitBufferAllocation *allocation, __in size_t bytes, __deref_bcount(bytes) BYTE** ppBuffer) { Assert(this->criticalSection.IsLocked()); Assert(allocation->BytesFree() >= bytes); // In case of ThunkEmitter the script context would be null and we don't want to track that as code size. if (scriptContext && !allocation->recorded) { this->scriptContext->GetThreadContext()->AddCodeSize(allocation->bytesCommitted); allocation->recorded = true; } // The codegen buffer is beyond the alignment section - hence, we pass this pointer. *ppBuffer = allocation->GetUnused(); return allocation;
if (!this->CommitBuffer(allocation, allocation->bytesCommitted, dstBuffer, 0, /*sourceBuffer=*/ nullptr, /*alignPad=*/ bytes)) { return false; } #if DBG_DUMP this->totalBytesCode -= bytes; #endif } return true; } template <typename TAlloc, typename TPreReservedAlloc, class SyncObject> EmitBufferAllocation<TAlloc, TPreReservedAlloc>* EmitBufferManager<TAlloc, TPreReservedAlloc, SyncObject>::GetBuffer(TEmitBufferAllocation *allocation, __in size_t bytes, __deref_bcount(bytes) BYTE** ppBuffer) { Assert(this->criticalSection.IsLocked()); Assert(allocation->BytesFree() >= bytes); // In case of ThunkEmitter the script context would be null and we don't want to track that as code size. if (scriptContext && !allocation->recorded) { this->scriptContext->GetThreadContext()->AddCodeSize(allocation->bytesCommitted); allocation->recorded = true; } // The codegen buffer is beyond the alignment section - hence, we pass this pointer. *ppBuffer = allocation->GetUnused(); return allocation;