本文整理汇总了C++中MEMCOPY函数的典型用法代码示例。如果您正苦于以下问题:C++ MEMCOPY函数的具体用法?C++ MEMCOPY怎么用?C++ MEMCOPY使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了MEMCOPY函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: output_data
output_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
{
j_lossless_d_ptr losslsd = (j_lossless_d_ptr) cinfo->codec;
d_diff_ptr diff = (d_diff_ptr) losslsd->diff_private;
JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
int ci, samp_rows, row;
JSAMPARRAY buffer;
jpeg_component_info *compptr;
/* Force some input to be done if we are getting ahead of the input. */
while (cinfo->input_scan_number < cinfo->output_scan_number ||
(cinfo->input_scan_number == cinfo->output_scan_number &&
cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED)
return JPEG_SUSPENDED;
}
/* OK, output from the virtual arrays. */
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
ci++, compptr++) {
/* Align the virtual buffer for this component. */
buffer = (*cinfo->mem->access_virt_sarray)
((j_common_ptr) cinfo, diff->whole_image[ci],
cinfo->output_iMCU_row * compptr->v_samp_factor,
(JDIMENSION) compptr->v_samp_factor, FALSE);
if (cinfo->output_iMCU_row < last_iMCU_row)
samp_rows = compptr->v_samp_factor;
else {
/* NB: can't use last_row_height here; it is input-side-dependent! */
samp_rows = (int) (compptr->height_in_data_units % compptr->v_samp_factor);
if (samp_rows == 0) samp_rows = compptr->v_samp_factor;
}
for (row = 0; row < samp_rows; row++) {
MEMCOPY(output_buf[ci][row], buffer[row],
compptr->width_in_data_units * SIZEOF(JSAMPLE));
}
}
if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
return JPEG_ROW_COMPLETED;
return JPEG_SCAN_COMPLETED;
}
示例2: vecPushBack
int vecPushBack(S_Vector *pVec, void *pElem)
{
static const int blockSize = 512;
IZG_ASSERT(pVec && pElem);
if( pVec->size >= pVec->reserved )
{
char *p = (char *)realloc(pVec->data, (pVec->size + blockSize) * pVec->elemSize);
IZG_CHECK(p, "Cannot allocate enough memory");
pVec->data = p;
pVec->reserved = pVec->size + blockSize;
}
MEMCOPY(pVec->data + pVec->size * pVec->elemSize, pElem, pVec->elemSize);
++pVec->size;
return (pVec->size - 1);
}
示例3: rr_canonize_nsec3param
static void
rr_canonize_nsec3param(zdb_packed_ttlrdata* rr, ptr_vector* v)
{
while(rr != NULL)
{
zdb_canonized_packed_ttlrdata* c_rr;
u32 c_rr_size = sizeof (zdb_canonized_packed_ttlrdata) - 1 + ZDB_PACKEDRECORD_PTR_RDATASIZE(rr);
MALLOC_OR_DIE(zdb_canonized_packed_ttlrdata*, c_rr, c_rr_size, RR_CANONIZE_NOP_TAG);
ZDB_PACKEDRECORD_PTR_RDATASIZE(c_rr) = ZDB_PACKEDRECORD_PTR_RDATASIZE(rr);
c_rr->rdata_canonized_size = htons(ZDB_PACKEDRECORD_PTR_RDATASIZE(rr));
MEMCOPY(&c_rr->rdata_start[0], ZDB_PACKEDRECORD_PTR_RDATAPTR(rr), ZDB_PACKEDRECORD_PTR_RDATASIZE(rr));
c_rr->rdata_start[1] = 0; /* The signed NSEC3PARAM has its flags to 0 */
ptr_vector_append(v, c_rr);
rr = rr->next;
}
}
示例4: emAfPluginCommsHubFunctionTunnelCreate
// This should be called after CBKE.
bool emAfPluginCommsHubFunctionTunnelCreate(EmberEUI64 remoteDeviceId,
uint8_t remoteEndpoint)
{
uint8_t tunnelIndex;
emberAfDebugPrint("CHF: TunnelCreate ");
emberAfDebugDebugExec(emberAfPrintBigEndianEui64(remoteDeviceId));
emberAfDebugPrintln(" 0x%x", remoteEndpoint);
// We only support one tunnel to a given remote device/endpoint so if we
// already have a tunnel lets work with it.
tunnelIndex = findTunnelByDeviceId(remoteDeviceId);
if (tunnelIndex != EM_AF_PLUGIN_COMMS_HUB_FUNCTION_NULL_TUNNEL_INDEX) {
if (tunnels[tunnelIndex].state == CLOSED_TUNNEL) {
return requestTunnel(tunnelIndex);
}
return true;
}
// Find a slot in the tunnels table for the new tunnel
tunnelIndex = findUnusedTunnel();
if (tunnelIndex != EM_AF_PLUGIN_COMMS_HUB_FUNCTION_NULL_TUNNEL_INDEX) {
MEMCOPY(tunnels[tunnelIndex].remoteDeviceId, remoteDeviceId, EUI64_SIZE);
tunnels[tunnelIndex].remoteNodeId = emberLookupNodeIdByEui64(remoteDeviceId);
tunnels[tunnelIndex].remoteEndpoint = remoteEndpoint;
tunnels[tunnelIndex].type = CLIENT_TUNNEL;
tunnels[tunnelIndex].state = CLOSED_TUNNEL;
tunnels[tunnelIndex].tunnelId = 0xFF;
tunnels[tunnelIndex].timeoutMSec = 0;
return requestTunnel(tunnelIndex);
}
// This is a misconfiguration or a bug in the code calling this API. Either
// the tunnel client plugin limit is set too low for the number of tunnels
// required or the code that is calling this function is in error. Either way,
// we'll print the error and return false indicating that the tunnel was
// not created.
emberAfPluginCommsHubFunctionPrintln("%p%p%p",
"Error: ",
"Tunnel Create failed: ",
"Too many tunnels");
return false;
}
示例5: create_context_buffer
create_context_buffer( j_compress_ptr cinfo )
{
my_prep_ptr prep = ( my_prep_ptr ) cinfo->prep;
int rgroup_height = cinfo->max_v_samp_factor;
int ci, i;
jpeg_component_info *compptr;
JSAMPARRAY true_buffer, fake_buffer;
/* Grab enough space for fake row pointers for all the components;
* we need five row groups' worth of pointers for each component.
*/
fake_buffer = ( JSAMPARRAY )
( *cinfo->mem->alloc_small )( ( j_common_ptr ) cinfo, JPOOL_IMAGE,
( cinfo->num_components * 5 * rgroup_height ) *
SIZEOF( JSAMPROW ) );
for( ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
ci++, compptr++ )
{
/* Allocate the actual buffer space (3 row groups) for this component.
* We make the buffer wide enough to allow the downsampler to edge-expand
* horizontally within the buffer, if it so chooses.
*/
true_buffer = ( *cinfo->mem->alloc_sarray )
( ( j_common_ptr ) cinfo, JPOOL_IMAGE,
( JDIMENSION )( ( ( long ) compptr->width_in_blocks *
cinfo->min_DCT_h_scaled_size *
cinfo->max_h_samp_factor ) / compptr->h_samp_factor ),
( JDIMENSION )( 3 * rgroup_height ) );
/* Copy true buffer row pointers into the middle of the fake row array */
MEMCOPY( fake_buffer + rgroup_height, true_buffer,
3 * rgroup_height * SIZEOF( JSAMPROW ) );
/* Fill in the above and below wraparound pointers */
for( i = 0; i < rgroup_height; i++ )
{
fake_buffer[i] = true_buffer[2 * rgroup_height + i];
fake_buffer[4 * rgroup_height + i] = true_buffer[i];
}
prep->color_buf[ci] = fake_buffer + rgroup_height;
fake_buffer += 5 * rgroup_height; /* point to space for next component */
}
}
示例6: copy_pixel_rows
copy_pixel_rows(j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,
JDIMENSION rows_supplied)
{
ppm_dest_ptr dest = (ppm_dest_ptr)dinfo;
register char *bufferptr;
register JSAMPROW ptr;
#if BITS_IN_JSAMPLE != 8 || (!defined(HAVE_UNSIGNED_CHAR) && !defined(__CHAR_UNSIGNED__))
register JDIMENSION col;
#endif
ptr = dest->pub.buffer[0];
bufferptr = dest->iobuffer;
#if BITS_IN_JSAMPLE == 8 && (defined(HAVE_UNSIGNED_CHAR) || defined(__CHAR_UNSIGNED__))
MEMCOPY(bufferptr, ptr, dest->samples_per_row);
#else
for (col = dest->samples_per_row; col > 0; col--) {
PUTPPMSAMPLE(bufferptr, GETJSAMPLE(*ptr++));
}
#endif
(void)JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width);
}
示例7: rr_canonize_nop
static void
rr_canonize_nop(zdb_packed_ttlrdata* rr, ptr_vector* v)
{
while(rr != NULL)
{
zdb_canonized_packed_ttlrdata* c_rr;
u32 c_rr_size = sizeof (zdb_canonized_packed_ttlrdata) - 1 + ZDB_PACKEDRECORD_PTR_RDATASIZE(rr);
MALLOC_OR_DIE(zdb_canonized_packed_ttlrdata*, c_rr, c_rr_size, RR_CANONIZE_NOP_TAG);
ZDB_PACKEDRECORD_PTR_RDATASIZE(c_rr) = ZDB_PACKEDRECORD_PTR_RDATASIZE(rr);
c_rr->rdata_canonized_size = htons(ZDB_PACKEDRECORD_PTR_RDATASIZE(rr));
/** @todo CHECK: If we don't lo-case anymore maybe I could grab some
* more cycles here. Not for the A-records on a 64bits arch,
* but for any case where the rdata is (much) bigger than 8 bytes
*/
MEMCOPY(&c_rr->rdata_start[0], ZDB_PACKEDRECORD_PTR_RDATAPTR(rr), ZDB_PACKEDRECORD_PTR_RDATASIZE(rr));
ptr_vector_append(v, c_rr);
rr = rr->next;
}
}
示例8: LUSOL_ftran
int LUSOL_ftran(LUSOLrec *LUSOL, REAL b[], int NZidx[], MYBOOL prepareupdate)
{
int inform;
REAL *vector;
if(prepareupdate)
vector = LUSOL->vLU6L;
else
vector = LUSOL->w;
/* Copy RHS vector, but make adjustment for offset since this
can create a memory error when the calling program uses
a 0-base vector offset back to comply with LUSOL. */
MEMCOPY(vector+1, b+1, LUSOL->n);
if (vector != NULL)
vector[0] = 0;
LU6SOL(LUSOL, LUSOL_SOLVE_Aw_v, vector, b, NZidx, &inform);
LUSOL->luparm[LUSOL_IP_FTRANCOUNT]++;
return(inform);
}
示例9: ptr_vector_resize
void
ptr_vector_resize(ptr_vector*v, s32 newsize)
{
void** data;
zassert(newsize >= v->offset + 1);
/* Only the data up to v->offset (included) is relevant */
MALLOC_OR_DIE(void**, data, newsize * sizeof (void*), PTR_VECTOR_TAG);
MEMCOPY(data, v->data, (v->offset + 1) * sizeof (void*));
#ifndef NDEBUG
if(v->data != NULL)
{
memset(v->data, 0xff, v->size * sizeof (void*));
}
#endif
free(v->data);
v->data = data;
v->size = newsize;
}
示例10: vorbis_read
size_t vorbis_read(void *ptr, size_t byteSize, size_t sizeToRead, void *datasource)
{
size_t spaceToEOF;
size_t actualSizeToRead;
sOggFile *vorbisData;
vorbisData = (sOggFile *)datasource;
spaceToEOF = static_cast<size_t>(vorbisData->dataSize - vorbisData->dataRead);
if ((sizeToRead*byteSize) < spaceToEOF)
actualSizeToRead = (sizeToRead*byteSize);
else
actualSizeToRead = spaceToEOF;
if (actualSizeToRead)
{
MEMCOPY(ptr, (char*)vorbisData->dataPtr + vorbisData->dataRead, actualSizeToRead);
vorbisData->dataRead += (actualSizeToRead);
}
return actualSizeToRead;
}
示例11: latch_quant_tables
latch_quant_tables(j_decompress_ptr cinfo)
{
int ci, qtblno;
jpeg_component_info* compptr;
JQUANT_TBL* qtbl;
for (ci = 0; ci < cinfo->comps_in_scan; ci++)
{
compptr = cinfo->cur_comp_info[ci];
/* No work if we already saved Q-table for this component */
if (compptr->quant_table != nullptr) continue;
/* Make sure specified quantization table is present */
qtblno = compptr->quant_tbl_no;
if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||
cinfo->quant_tbl_ptrs[qtblno] == nullptr)
ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
/* OK, save away the quantization table */
qtbl = (JQUANT_TBL*)(*cinfo->mem->alloc_small)(
(j_common_ptr)cinfo, JPOOL_IMAGE, SIZEOF(JQUANT_TBL));
MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], SIZEOF(JQUANT_TBL));
compptr->quant_table = qtbl;
}
}
示例12: emberSendUdp
EmberStatus emberSendUdp(uint8_t options,
const uint8_t *destination,
uint8_t hopLimit,
uint16_t sourcePort,
uint16_t destinationPort,
uint8_t *payload,
uint16_t payloadLength)
{
uint8_t source[16];
if (! emStoreIpSourceAddress(source, destination)) {
return EMBER_BAD_ARGUMENT;
}
HostListener *listener = emberFindListener(sourcePort, source);
if (listener != NULL) {
struct sockaddr_in6 outSock = {0};
outSock.sin6_family = AF_INET6;
outSock.sin6_port = htons(destinationPort);
MEMCOPY(outSock.sin6_addr.s6_addr, destination, 16);
int interfaceIndex = if_nametoindex(emUnixInterface);
outSock.sin6_scope_id = interfaceIndex;
nativeWrite(listener->socket,
payload,
payloadLength,
(struct sockaddr *)&outSock,
sizeof(outSock));
emberCounterHandler(EMBER_COUNTER_UDP_OUT, 1);
return EMBER_SUCCESS;
} else {
fprintf(stderr, "No listener on sourcePort:%d\n",
sourcePort);
return EMBER_INVALID_CALL;
}
}
示例13: emberAfPluginTunnelingServerTunnelOpenedCallback
/** @brief Tunnel Opened
*
* This function is called by the Tunneling server plugin whenever a tunnel is
* opened. Clients may open tunnels by sending a Request Tunnel command.
*
* @param tunnelId The identifier of the tunnel that has been opened. Ver.:
* always
* @param protocolId The identifier of the metering communication protocol for
* the tunnel. Ver.: always
* @param manufacturerCode The manufacturer code for manufacturer-defined
* protocols or 0xFFFF in unused. Ver.: always
* @param flowControlSupport true is flow control support is requested or false
* if it is not. Ver.: always
* @param maximumIncomingTransferSize The maximum incoming transfer size of the
* client. Ver.: always
*/
void emberAfPluginTunnelingServerTunnelOpenedCallback(uint16_t tunnelId,
uint8_t protocolId,
uint16_t manufacturerCode,
bool flowControlSupport,
uint16_t maximumIncomingTransferSize)
{
EmberEUI64 remoteDeviceId;
EmberNodeId remoteNodeId;
uint8_t tunnelIndex;
emberAfDebugPrintln("CHF: ServerTunnelOpened:0x%x,0x%2x", tunnelId, maximumIncomingTransferSize);
// Since the tunneling cluster server code does not pass the EUI64 or the
// node ID of the remote end of the tunnel so we need to look them up.
// Luckily this callback is called in the context of the RequestTunnel
// command processing and we look into the command for this info.
remoteNodeId = emberAfCurrentCommand()->source;
emberLookupEui64ByNodeId(emberAfCurrentCommand()->source, remoteDeviceId);
// We only support one tunnel to a given remote device/endpoint so if we
// already have a tunnel lets work with it.
tunnelIndex = findTunnelByDeviceId(remoteDeviceId);
if (tunnelIndex == EM_AF_PLUGIN_COMMS_HUB_FUNCTION_NULL_TUNNEL_INDEX) {
// Find a slot in the tunnels table for the new tunnel
tunnelIndex = findUnusedTunnel();
}
if (tunnelIndex != EM_AF_PLUGIN_COMMS_HUB_FUNCTION_NULL_TUNNEL_INDEX) {
MEMCOPY(tunnels[tunnelIndex].remoteDeviceId, remoteDeviceId, EUI64_SIZE);
tunnels[tunnelIndex].remoteNodeId = remoteNodeId;
tunnels[tunnelIndex].remoteEndpoint = emberAfCurrentCommand()->apsFrame->sourceEndpoint;
tunnels[tunnelIndex].type = SERVER_TUNNEL;
tunnels[tunnelIndex].state = ACTIVE_TUNNEL;
tunnels[tunnelIndex].tunnelId = tunnelId;
tunnels[tunnelIndex].timeoutMSec = 0;
// Per GBCS v0.8 section 10.2.2, Devices supporting the Tunneling Cluster
// as a Server shall have a MaximumIncomingTransferSize set to 1500 octets,
// in line with the ZSE default. All Devices supporting the Tunneling
// Cluster shall use this value in any RequestTunnelResponse command and
// any RequestTunnel command.
//
// So rather than bring down the tunnel in the case when the maximumIncomingTransferSize
// is less than 1500 we'll just log a warning message.
if (maximumIncomingTransferSize < 1500) {
emberAfPluginCommsHubFunctionPrintln("Warning: tunnel opened but MaximumIncomingTransferSize of client is %d but should be 1500",
maximumIncomingTransferSize);
}
return;
}
// This is a misconfiguration or a bug in the code calling this API. Either
// the tunnel client plugin limit is set too low for the number of tunnels
// required or the code that is calling this function is in error. Either way,
// we'll print the error and return false indicating that the tunnel was
// not created.
emberAfPluginCommsHubFunctionPrintln("%p%p%p",
"Error: ",
"Tunnel Opened failed: ",
"Too many tunnels");
}
示例14: emberUdpListen
EmberStatus emberUdpListen(uint16_t port, const uint8_t *localAddress)
{
if (emIsUnspecifiedAddress(localAddress)) {
return EMBER_ERR_FATAL;
}
if (emberFindListener(port, localAddress) != NULL) {
return EMBER_SUCCESS;
}
// The localAddress variable is used to glean the source address
// associated with a particular listener. For multicast listeners,
// we use the mesh local address as source.
bool isMulticast = emIsMulticastAddress(localAddress);
EmberIpv6Address meshLocalAddress;
emberGetLocalIpAddress(0, &meshLocalAddress);
HostListener *listener = emberAddListener(port,
(isMulticast
? meshLocalAddress.bytes
: localAddress),
SOCK_DGRAM, 0); // UDP
if (listener == NULL) {
return EMBER_TABLE_FULL;
}
if (listener->socket == INVALID_SOCKET) {
return EMBER_ERR_FATAL;
}
int interfaceIndex = if_nametoindex(emUnixInterface);
struct ipv6_mreq mreq6 = {0};
MEMCOPY(&mreq6.ipv6mr_multiaddr.s6_addr, localAddress, 16);
mreq6.ipv6mr_interface = interfaceIndex;
int mcastTTL = 10;
int loopBack = 1;
if (setsockopt(listener->socket,
IPPROTO_IPV6,
IPV6_MULTICAST_IF,
&interfaceIndex,
sizeof(interfaceIndex))
< 0) {
perror("setsockopt:: IPV6_MULTICAST_IF:: ");
return EMBER_ERR_FATAL;
}
if (setsockopt(listener->socket,
IPPROTO_IPV6,
IPV6_MULTICAST_LOOP,
&loopBack,
sizeof(loopBack))
< 0) {
perror("setsockopt:: IPV6_MULTICAST_LOOP:: ");
return EMBER_ERR_FATAL;
}
if (setsockopt(listener->socket,
IPPROTO_IPV6,
IPV6_MULTICAST_HOPS,
&mcastTTL,
sizeof(mcastTTL))
< 0) {
perror("setsockopt:: IPV6_MULTICAST_HOPS:: ");
return EMBER_ERR_FATAL;
}
if (isMulticast) {
if (setsockopt(listener->socket,
IPPROTO_IPV6,
IPV6_JOIN_GROUP,
&mreq6,
sizeof(mreq6))
< 0) {
perror("setsockopt:: IPV6_JOIN_GROUP:: ");
return EMBER_ERR_FATAL;
}
}
return EMBER_SUCCESS;
}
示例15: read_scan_script
read_scan_script (j_compress_ptr cinfo, char * filename)
/* Read a scan script from the specified text file.
* Each entry in the file defines one scan to be emitted.
* Entries are separated by semicolons ';'.
* An entry contains one to four component indexes,
* optionally followed by a colon ':' and four progressive-JPEG parameters.
* The component indexes denote which component(s) are to be transmitted
* in the current scan. The first component has index 0.
* Sequential JPEG is used if the progressive-JPEG parameters are omitted.
* The file is free format text: any whitespace may appear between numbers
* and the ':' and ';' punctuation marks. Also, other punctuation (such
* as commas or dashes) can be placed between numbers if desired.
* Comments preceded by '#' may be included in the file.
* Note: we do very little validity checking here;
* jcmaster.c will validate the script parameters.
*/
{
FILE * fp;
int scanno, ncomps, termchar;
long val;
jpeg_scan_info * scanptr;
#define MAX_SCANS 100 /* quite arbitrary limit */
jpeg_scan_info scans[MAX_SCANS];
if ((fp = fopen(filename, "r")) == NULL) {
fprintf(stderr, "Can't open scan definition file %s\n", filename);
return FALSE;
}
scanptr = scans;
scanno = 0;
while (read_scan_integer(fp, &val, &termchar)) {
if (scanno >= MAX_SCANS) {
fprintf(stderr, "Too many scans defined in file %s\n", filename);
fclose(fp);
return FALSE;
}
scanptr->component_index[0] = (int) val;
ncomps = 1;
while (termchar == ' ') {
if (ncomps >= MAX_COMPS_IN_SCAN) {
fprintf(stderr, "Too many components in one scan in file %s\n",
filename);
fclose(fp);
return FALSE;
}
if (! read_scan_integer(fp, &val, &termchar))
goto bogus;
scanptr->component_index[ncomps] = (int) val;
ncomps++;
}
scanptr->comps_in_scan = ncomps;
if (termchar == ':') {
if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ')
goto bogus;
scanptr->Ss = (int) val;
if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ')
goto bogus;
scanptr->Se = (int) val;
if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ')
goto bogus;
scanptr->Ah = (int) val;
if (! read_scan_integer(fp, &val, &termchar))
goto bogus;
scanptr->Al = (int) val;
} else {
/* set non-progressive parameters */
scanptr->Ss = 0;
scanptr->Se = DCTSIZE2-1;
scanptr->Ah = 0;
scanptr->Al = 0;
}
if (termchar != ';' && termchar != EOF) {
bogus:
fprintf(stderr, "Invalid scan entry format in file %s\n", filename);
fclose(fp);
return FALSE;
}
scanptr++, scanno++;
}
if (termchar != EOF) {
fprintf(stderr, "Non-numeric data in file %s\n", filename);
fclose(fp);
return FALSE;
}
if (scanno > 0) {
/* Stash completed scan list in cinfo structure.
* NOTE: for cjpeg's use, JPOOL_IMAGE is the right lifetime for this data,
* but if you want to compress multiple images you'd want JPOOL_PERMANENT.
*/
scanptr = (jpeg_scan_info *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
scanno * SIZEOF(jpeg_scan_info));
MEMCOPY(scanptr, scans, scanno * SIZEOF(jpeg_scan_info));
cinfo->scan_info = scanptr;
cinfo->num_scans = scanno;
}
//.........这里部分代码省略.........