本文整理汇总了C++中dng_stream类的典型用法代码示例。如果您正苦于以下问题:C++ dng_stream类的具体用法?C++ dng_stream怎么用?C++ dng_stream使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了dng_stream类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: PutStream
void dng_gain_map::PutStream (dng_stream &stream) const
{
stream.Put_uint32 (fPoints.v);
stream.Put_uint32 (fPoints.h);
stream.Put_real64 (fSpacing.v);
stream.Put_real64 (fSpacing.h);
stream.Put_real64 (fOrigin.v);
stream.Put_real64 (fOrigin.h);
stream.Put_uint32 (fPlanes);
for (int32 rowIndex = 0; rowIndex < fPoints.v; rowIndex++)
{
for (int32 colIndex = 0; colIndex < fPoints.h; colIndex++)
{
for (uint32 plane = 0; plane < fPlanes; plane++)
{
stream.Put_real32 (Entry (rowIndex,
colIndex,
plane));
}
}
}
}
开发者ID:F0x06,项目名称:Movie2DNG,代码行数:34,代码来源:dng_gain_map.cpp
示例2:
dng_opcode_GainMap::dng_opcode_GainMap (dng_host &host,
dng_stream &stream)
: dng_inplace_opcode (dngOpcode_GainMap,
stream,
"GainMap")
, fAreaSpec ()
, fGainMap ()
{
uint32 byteCount = stream.Get_uint32 ();
uint64 startPosition = stream.Position ();
fAreaSpec.GetData (stream);
fGainMap.Reset (dng_gain_map::GetStream (host, stream));
if (stream.Position () != startPosition + byteCount)
{
ThrowBadFormat ();
}
}
开发者ID:F0x06,项目名称:Movie2DNG,代码行数:27,代码来源:dng_gain_map.cpp
示例3: DuplicateStream
void dng_stream::DuplicateStream (dng_stream &dstStream)
{
// Turn off sniffers for this operation.
TempStreamSniffer noSniffer1 (*this , NULL);
TempStreamSniffer noSniffer2 (dstStream, NULL);
// First grow the destination stream if required, in an attempt to
// reserve any needed space before overwriting the existing data.
if (dstStream.Length () < Length ())
{
dstStream.SetLength (Length ());
}
SetReadPosition (0);
dstStream.SetWritePosition (0);
CopyToStream (dstStream, Length ());
dstStream.Flush ();
dstStream.SetLength (Length ());
}
开发者ID:dnikishov,项目名称:raw2dng,代码行数:27,代码来源:dng_stream.cpp
示例4: ReadHueSatMap
void dng_camera_profile::ReadHueSatMap (dng_stream &stream,
dng_hue_sat_map &hueSatMap,
uint32 hues,
uint32 sats,
uint32 vals,
bool skipSat0)
{
hueSatMap.SetDivisions (hues, sats, vals);
for (uint32 val = 0; val < vals; val++)
{
for (uint32 hue = 0; hue < hues; hue++)
{
for (uint32 sat = skipSat0 ? 1 : 0; sat < sats; sat++)
{
dng_hue_sat_map::HSBModify modify;
modify.fHueShift = stream.Get_real32 ();
modify.fSatScale = stream.Get_real32 ();
modify.fValScale = stream.Get_real32 ();
hueSatMap.SetDelta (hue, sat, val, modify);
}
}
}
}
开发者ID:F0x06,项目名称:Movie2DNG,代码行数:34,代码来源:dng_camera_profile.cpp
示例5:
dng_opcode_MapPolynomial::dng_opcode_MapPolynomial (dng_stream &stream)
: dng_inplace_opcode (dngOpcode_MapPolynomial,
stream,
"MapPolynomial")
, fAreaSpec ()
, fDegree (0)
{
uint32 dataSize = stream.Get_uint32 ();
fAreaSpec.GetData (stream);
fDegree = stream.Get_uint32 ();
if (dataSize != dng_area_spec::kDataSize + 4 + (fDegree + 1) * 8)
{
ThrowBadFormat ();
}
if (fDegree > kMaxDegree)
{
ThrowBadFormat ();
}
for (uint32 j = 0; j <= kMaxDegree; j++)
{
if (j <= fDegree)
{
fCoefficient [j] = stream.Get_real64 ();
}
else
{
fCoefficient [j] = 0.0;
}
}
#if qDNGValidate
if (gVerbose)
{
for (uint32 k = 0; k <= fDegree; k++)
{
printf (" Coefficient [%u] = %f\n", k, fCoefficient [k]);
}
}
#endif
}
开发者ID:KDE,项目名称:digikam,代码行数:56,代码来源:dng_misc_opcodes.cpp
示例6: PutData
void dng_opcode_TrimBounds::PutData (dng_stream &stream) const
{
stream.Put_uint32 (16);
stream.Put_int32 (fBounds.t);
stream.Put_int32 (fBounds.l);
stream.Put_int32 (fBounds.b);
stream.Put_int32 (fBounds.r);
}
开发者ID:KDE,项目名称:digikam,代码行数:11,代码来源:dng_misc_opcodes.cpp
示例7: GetData
void dng_area_spec::GetData (dng_stream &stream)
{
fArea.t = stream.Get_int32 ();
fArea.l = stream.Get_int32 ();
fArea.b = stream.Get_int32 ();
fArea.r = stream.Get_int32 ();
fPlane = stream.Get_uint32 ();
fPlanes = stream.Get_uint32 ();
fRowPitch = stream.Get_uint32 ();
fColPitch = stream.Get_uint32 ();
if (fPlanes < 1)
{
ThrowBadFormat ();
}
if (fRowPitch < 1 || fColPitch < 1)
{
ThrowBadFormat ();
}
if (fArea.IsEmpty () && (fRowPitch != 1 || fColPitch != 1))
{
ThrowBadFormat ();
}
#if qDNGValidate
if (gVerbose)
{
printf ("AreaSpec: t=%d, l=%d, b=%d, r=%d, p=%u:%u, rp=%u, cp=%u\n",
(int) fArea.t,
(int) fArea.l,
(int) fArea.b,
(int) fArea.r,
(unsigned) fPlane,
(unsigned) fPlanes,
(unsigned) fRowPitch,
(unsigned) fColPitch);
}
#endif
}
开发者ID:KDE,项目名称:digikam,代码行数:49,代码来源:dng_misc_opcodes.cpp
示例8: WriteData
void dng_jpeg_preview::WriteData (dng_host & /* host */,
dng_image_writer & /* writer */,
dng_basic_tag_set &basic,
dng_stream &stream) const
{
basic.SetTileOffset (0, (uint32) stream.Position ());
basic.SetTileByteCount (0, fCompressedData->LogicalSize ());
stream.Put (fCompressedData->Buffer (),
fCompressedData->LogicalSize ());
if (fCompressedData->LogicalSize () & 1)
{
stream.Put_uint8 (0);
}
}
开发者ID:ruphy,项目名称:kipi-plugins,代码行数:19,代码来源:dng_preview.cpp
示例9: CopyToStream
void dng_stream::CopyToStream (dng_stream &dstStream,
uint64 count)
{
uint8 smallBuffer [1024];
if (count <= sizeof (smallBuffer))
{
Get (smallBuffer, (uint32) count);
dstStream.Put (smallBuffer, (uint32) count);
}
else
{
const uint32 bigBufferSize = (uint32) Min_uint64 (kBigBufferSize,
count);
dng_memory_data bigBuffer (bigBufferSize);
while (count)
{
uint32 blockCount = (uint32) Min_uint64 (bigBufferSize,
count);
Get (bigBuffer.Buffer (),
blockCount);
dstStream.Put (bigBuffer.Buffer (),
blockCount);
count -= blockCount;
}
}
}
开发者ID:dnikishov,项目名称:raw2dng,代码行数:42,代码来源:dng_stream.cpp
示例10: PutData
void dng_opcode_GainMap::PutData (dng_stream &stream) const
{
stream.Put_uint32 (dng_area_spec::kDataSize +
fGainMap->PutStreamSize ());
fAreaSpec.PutData (stream);
fGainMap->PutStream (stream);
}
开发者ID:F0x06,项目名称:Movie2DNG,代码行数:11,代码来源:dng_gain_map.cpp
示例11:
TempStreamSniffer::TempStreamSniffer (dng_stream &stream,
dng_abort_sniffer *sniffer)
: fStream (stream)
, fOldSniffer (stream.Sniffer ())
{
fStream.SetSniffer (sniffer);
}
开发者ID:dnikishov,项目名称:raw2dng,代码行数:11,代码来源:dng_stream.cpp
示例12: ParseString
void dng_iptc::ParseString (dng_stream &stream,
dng_string &s,
CharSet charSet)
{
uint32 length = stream.Get_uint16 ();
dng_memory_data buffer (length + 1);
char *c = buffer.Buffer_char ();
stream.Get (c, length);
c [length] = 0;
switch (charSet)
{
case kCharSetUTF8:
{
s.Set_UTF8 (c);
break;
}
default:
{
s.Set_SystemEncoding (c);
}
}
s.SetLineEndingsToNewLines ();
s.StripLowASCII ();
s.TrimTrailingBlanks ();
}
开发者ID:karaimer,项目名称:camera-pipeline-dng-sdk,代码行数:38,代码来源:dng_iptc.cpp
示例13: CopyToStream
void dng_memory_stream::CopyToStream (dng_stream &dstStream,
uint64 count)
{
if (count < kBigBufferSize)
{
dng_stream::CopyToStream (dstStream, count);
}
else
{
Flush ();
uint64 offset = Position ();
if (offset + count > Length ())
{
ThrowEndOfFile ();
}
while (count)
{
uint32 pageIndex = (uint32) (offset / fPageSize);
uint32 pageOffset = (uint32) (offset % fPageSize);
uint32 blockCount = (uint32) Min_uint64 (fPageSize - pageOffset, count);
const uint8 *sPtr = fPageList [pageIndex]->Buffer_uint8 () +
pageOffset;
dstStream.Put (sPtr, blockCount);
offset += blockCount;
count -= blockCount;
}
SetReadPosition (offset);
}
}
开发者ID:aizvorski,项目名称:dng_sdk,代码行数:48,代码来源:dng_memory_stream.cpp
示例14: Parse
void dng_info::Parse (dng_host &host,
dng_stream &stream)
{
fTIFFBlockOffset = stream.Position ();
fTIFFBlockOriginalOffset = stream.PositionInOriginalFile ();
// Check byte order indicator.
uint16 byteOrder = stream.Get_uint16 ();
if (byteOrder == byteOrderII)
{
fBigEndian = false;
#if qDNGValidate
if (gVerbose)
{
printf ("\nUses little-endian byte order\n");
}
#endif
stream.SetLittleEndian ();
}
else if (byteOrder == byteOrderMM)
{
fBigEndian = true;
#if qDNGValidate
if (gVerbose)
{
printf ("\nUses big-endian byte order\n");
}
#endif
stream.SetBigEndian ();
}
else
{
#if qDNGValidate
ReportError ("Unknown byte order");
#endif
ThrowBadFormat ();
}
// Check "magic number" indicator.
fMagic = stream.Get_uint16 ();
#if qDNGValidate
if (gVerbose)
{
printf ("Magic number = %u\n\n", (unsigned) fMagic);
}
#endif
ValidateMagic ();
// Parse IFD 0.
uint64 next_offset = stream.Get_uint32 ();
fExif.Reset (host.Make_dng_exif ());
fShared.Reset (host.Make_dng_shared ());
fIFD [0].Reset (host.Make_dng_ifd ());
ParseIFD (host,
stream,
fExif.Get (),
fShared.Get (),
fIFD [0].Get (),
fTIFFBlockOffset + next_offset,
fTIFFBlockOffset,
0);
next_offset = fIFD [0]->fNextIFD;
fIFDCount = 1;
// Parse chained IFDs.
//.........这里部分代码省略.........
开发者ID:BielBdeLuna,项目名称:jp4tools,代码行数:101,代码来源:dng_info.cpp
示例15: ParseTag
void dng_info::ParseTag (dng_host &host,
dng_stream &stream,
dng_exif *exif,
dng_shared *shared,
dng_ifd *ifd,
uint32 parentCode,
uint32 tagCode,
uint32 tagType,
uint32 tagCount,
uint64 tagOffset,
int64 offsetDelta)
{
bool isSubIFD = parentCode >= tcFirstSubIFD &&
parentCode <= tcLastSubIFD;
bool isMainIFD = (parentCode == 0 || isSubIFD) &&
ifd &&
ifd->fUsesNewSubFileType &&
ifd->fNewSubFileType == sfMainImage;
// Panasonic RAW format stores private tags using tag codes < 254 in
// IFD 0. Redirect the parsing of these tags into a logical
// "PanasonicRAW" IFD.
// Panasonic is starting to use some higher numbers also (280..283).
if (fMagic == 85 && parentCode == 0 && (tagCode < tcNewSubFileType ||
(tagCode >= 280 && tagCode <= 283)))
{
parentCode = tcPanasonicRAW;
ifd = NULL;
}
stream.SetReadPosition (tagOffset);
if (ifd && ifd->ParseTag (stream,
parentCode,
tagCode,
tagType,
tagCount,
tagOffset))
{
return;
}
stream.SetReadPosition (tagOffset);
if (exif && shared && exif->ParseTag (stream,
*shared,
parentCode,
isMainIFD,
tagCode,
tagType,
tagCount,
tagOffset))
{
return;
}
stream.SetReadPosition (tagOffset);
if (shared && exif && shared->ParseTag (stream,
*exif,
parentCode,
isMainIFD,
tagCode,
tagType,
tagCount,
tagOffset,
offsetDelta))
{
return;
}
if (parentCode == tcOlympusMakerNote &&
tagType == ttUndefined &&
tagCount >= 14)
{
uint32 olympusMakerParent = 0;
switch (tagCode)
{
case 8208:
olympusMakerParent = tcOlympusMakerNote8208;
break;
case 8224:
olympusMakerParent = tcOlympusMakerNote8224;
//.........这里部分代码省略.........
开发者ID:BielBdeLuna,项目名称:jp4tools,代码行数:101,代码来源:dng_info.cpp
示例16: ParseMakerNote
void dng_info::ParseMakerNote (dng_host &host,
dng_stream &stream,
uint32 makerNoteCount,
uint64 makerNoteOffset,
int64 offsetDelta,
uint64 minOffset,
uint64 maxOffset)
{
uint8 firstBytes [16];
memset (firstBytes, 0, sizeof (firstBytes));
stream.SetReadPosition (makerNoteOffset);
stream.Get (firstBytes, (uint32) Min_uint64 (sizeof (firstBytes),
makerNoteCount));
// Epson MakerNote with header.
if (memcmp (firstBytes, "EPSON\000\001\000", 8) == 0)
{
if (makerNoteCount > 8)
{
ParseMakerNoteIFD (host,
stream,
makerNoteCount - 8,
makerNoteOffset + 8,
offsetDelta,
minOffset,
maxOffset,
tcEpsonMakerNote);
}
return;
}
// Fujifilm MakerNote.
if (memcmp (firstBytes, "FUJIFILM", 8) == 0)
{
stream.SetReadPosition (makerNoteOffset + 8);
TempLittleEndian tempEndian (stream);
uint32 ifd_offset = stream.Get_uint32 ();
if (ifd_offset >= 12 && ifd_offset < makerNoteCount)
{
ParseMakerNoteIFD (host,
stream,
makerNoteCount - ifd_offset,
makerNoteOffset + ifd_offset,
makerNoteOffset,
minOffset,
maxOffset,
tcFujiMakerNote);
}
return;
}
// Leica MakerNote.
if (memcmp (firstBytes, "LEICA\000\000\000", 8) == 0)
{
if (makerNoteCount > 8)
{
ParseMakerNoteIFD (host,
stream,
makerNoteCount - 8,
makerNoteOffset + 8,
makerNoteOffset,
minOffset,
maxOffset,
tcLeicaMakerNote);
}
return;
}
// Nikon version 2 MakerNote with header.
if (memcmp (firstBytes, "Nikon\000\002", 7) == 0)
{
stream.SetReadPosition (makerNoteOffset + 10);
//.........这里部分代码省略.........
开发者ID:BielBdeLuna,项目名称:jp4tools,代码行数:101,代码来源:dng_info.cpp
示例17: ParseMakerNoteIFD
bool dng_info::ParseMakerNoteIFD (dng_host &host,
dng_stream &stream,
uint64 ifdSize,
uint64 ifdOffset,
int64 offsetDelta,
uint64 minOffset,
uint64 maxOffset,
uint32 parentCode)
{
uint32 tagIndex;
uint32 tagCode;
uint32 tagType;
uint32 tagCount;
// Assume there is no next IFD pointer.
fMakerNoteNextIFD = 0;
// If size is too small to hold a single entry IFD, abort.
if (ifdSize < 14)
{
return false;
}
// Get entry count.
stream.SetReadPosition (ifdOffset);
uint32 ifdEntries = stream.Get_uint16 ();
// Make the entry count if reasonable for the MakerNote size.
if (ifdEntries < 1 || 2 + ifdEntries * 12 > ifdSize)
{
return false;
}
// Scan IFD to verify all the tag types are all valid.
for (tagIndex = 0; tagIndex < ifdEntries; tagIndex++)
{
stream.SetReadPosition (ifdOffset + 2 + tagIndex * 12 + 2);
tagType = stream.Get_uint16 ();
// Kludge: Some Canon MakerNotes contain tagType = 0 tags, so we
// need to ignore them. This was a "firmware 1.0.4" Canon 40D raw file.
if (parentCode == tcCanonMakerNote && tagType == 0)
{
continue;
}
if (TagTypeSize (tagType) == 0)
{
return false;
}
}
// OK, the IFD looks reasonable enough to parse.
#if qDNGValidate
if (gVerbose)
{
printf ("%s: Offset = %u, Entries = %u\n\n",
LookupParentCode (parentCode),
(unsigned) ifdOffset,
(unsigned) ifdEntries);
}
#endif
for (tagIndex = 0; tagIndex < ifdEntries; tagIndex++)
{
stream.SetReadPosition (ifdOffset + 2 + tagIndex * 12);
tagCode = stream.Get_uint16 ();
tagType = stream.Get_uint16 ();
tagCount = stream.Get_uint32 ();
if (tagType == 0)
{
continue;
}
uint32 tagSize = tagCount * TagTypeSize (tagType);
uint64 tagOffset = ifdOffset + 2 + tagIndex * 12 + 8;
if (tagSize > 4)
{
//.........这里部分代码省略.........
开发者ID:BielBdeLuna,项目名称:jp4tools,代码行数:101,代码来源:dng_info.cpp
示例18: ParseIFD
void dng_info::ParseIFD (dng_host &host,
dng_stream &stream,
dng_exif *exif,
dng_shared *shared,
dng_ifd *ifd,
uint64 ifdOffset,
int64 offsetDelta,
uint32 parentCode)
{
#if qDNGValidate
bool isMakerNote = (parentCode >= tcFirstMakerNoteIFD &&
parentCode <= tcLastMakerNoteIFD);
#endif
stream.SetReadPosition (ifdOffset);
if (ifd)
{
ifd->fThisIFD = ifdOffset;
}
uint32 ifdEntries = stream.Get_uint16 ();
#if qDNGValidate
if (gVerbose)
{
printf ("%s: Offset = %u, Entries = %u\n\n",
LookupParentCode (parentCode),
(unsigned) ifdOffset,
(unsigned) ifdEntries);
}
if ((ifdOffset & 1) && !isMakerNote)
{
char message [256];
sprintf (message,
"%s has odd offset (%u)",
LookupParentCode (parentCode),
(unsigned) ifdOffset);
ReportWarning (message);
}
#endif
uint32 prev_tag_code = 0;
for (uint32 tag_index = 0; tag_index < ifdEntries; tag_index++)
{
stream.SetReadPosition (ifdOffset + 2 + tag_index * 12);
uint32 tagCode = stream.Get_uint16 ();
uint32 tagType = stream.Get_uint16 ();
// Minolta 7D files have a bug in the EXIF block where the count
// is wrong, and we run off into next IFD link. So if abort parsing
// if we get a zero code/type combinations.
if (tagCode == 0 && tagType == 0)
{
#if qDNGValidate
char message [256];
sprintf (message,
"%s had zero/zero tag code/type entry",
LookupParentCode (parentCode));
ReportWarning (message);
#endif
return;
}
uint32 tagCount = stream.Get_uint32 ();
#if qDNGValidate
{
if (tag_index > 0 && tagCode <= prev_tag_code && !isMakerNote)
{
char message [256];
sprintf (message,
"%s tags are not sorted in ascending numerical order",
//.........这里部分代码省略.........
开发者ID:BielBdeLuna,项目名称:jp4tools,代码行数:101,代码来源:dng_info.cpp
示例19: ValidateIFD
bool dng_info::ValidateIFD (dng_stream &stream,
uint64 ifdOffset,
int64 offsetDelta)
{
// Make sure we have a count.
if (ifdOffset + 2 > stream.Length ())
{
return false;
}
// Get entry count.
stream.SetReadPosition (ifdOffset);
uint32 ifdEntries = stream.Get_uint16 ();
if (ifdEntries < 1)
{
return false;
}
// Make sure we have room for all entries and next IFD link.
if (ifdOffset + 2 + ifdEntries * 12 + 4 > stream.Length ())
{
return false;
}
// Check each entry.
for (uint32 tag_index = 0; tag_index < ifdEntries; tag_index++)
{
stream.SetReadPosition (ifdOffset + 2 + tag_index * 12);
stream.Skip (2); // Ignore tag code.
uint32 tagType = stream.Get_uint16 ();
uint32 tagCount = stream.Get_uint32 ();
uint32 tag_type_size = TagTypeSize (tagType);
if (tag_type_size == 0)
{
return false;
}
uint32 tag_data_size = tagCount * tag_type_size;
if (tag_data_size > 4)
{
uint64 tagOffset = stream.Get_uint32 ();
tagOffset += offsetDelta;
if (tagOffset + tag_data_size > stream.Length ())
{
return false;
}
}
}
return true;
}
开发者ID:BielBdeLuna,项目名称:jp4tools,代码行数:70,代码来源:dng_info.cpp
示例20: Min_uint32
void dng_info::ParseDNGPrivateData (dng_host &host,
dng_stream &stream)
{
if (fShared->fDNGPrivateDataCount < 2)
{
return;
}
// DNG private data should always start with a null-terminated
// company name, to define the format of the private data.
dng_string privateName;
{
char buffer [64];
stream.SetReadPosition (fShared->fDNGPrivateDataOffset);
uint32 readLength = Min_uint32 (fShared->fDNGPrivateDataCount,
sizeof (buffer) - 1);
stream.Get (buffer, readLength);
buffer [readLength] = 0;
privateName.Set (buffer);
}
// Pentax is storing their MakerNote in the DNGPrivateData data.
if (privateName.StartsWith ("PENTAX" ) ||
privateName.StartsWith ("SAMSUNG"))
{
#if qDNGValidate
if (gVerbose)
{
printf ("Parsing Pentax/Samsung DNGPrivateData\n\n");
}
#endif
stream.SetReadPosition (fShared->fDNGPrivateDataOffset + 8);
bool bigEndian = stream.BigEndian ();
uint16 endianMark = stream.Get_uint16 ();
if (endianMark == byteOrderMM)
{
bigEndian = true;
}
else if (endianMark == byteOrderII)
{
bigEndian = false;
}
TempBigEndian temp_endian (stream, bigEndian);
ParseMakerNoteIFD (host,
stream,
fShared->fDNGPrivateDataCount - 10,
fShared->fDNGPrivateDataOffset + 10,
fShared->fDNGPrivateDataOffset,
fShared->fDNGPrivateDataOffset,
fShared->fDNGPrivateDataOffset + fShared->fDNGPrivateDataCount,
tcPentaxMakerNote);
return;
}
// Stop parsing if this is not an Adobe format block.
if (!privateName.Matches ("Adobe"))
{
return;
}
TempBigEndian temp_order (stream);
uint32 section_offset = 6;
while (section_offset + 8 < fShared->fDNGPrivateDataCount)
{
stream.SetReadPosition (fShared->fDNGPrivateDataOffset + section_offset);
uint32 section_key = stream.Get_uint32 ();
uint32 section_count = stream.Get_uint32 ();
if (section_key == DNG_CHAR4 ('M','a','k','N') && section_count > 6)
{
#if qDNGValidate
//.........这里部分代码省略.........
开发者ID:BielBdeLuna,项目名称:jp4tools,代码行数:101,代码来源:dng_info.cpp
注:本文中的dng_stream类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论