本文整理汇总了C++中eglDestroyImageKHR函数的典型用法代码示例。如果您正苦于以下问题:C++ eglDestroyImageKHR函数的具体用法?C++ eglDestroyImageKHR怎么用?C++ eglDestroyImageKHR使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了eglDestroyImageKHR函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: raspitexutil_gl_term
/**
* Deletes textures and EGL surfaces and context.
* @param raspitex_state Pointer to the Raspi
*/
void raspitexutil_gl_term(RASPITEX_STATE *raspitex_state)
{
vcos_log_trace("%s", VCOS_FUNCTION);
/* Delete OES textures */
glDeleteTextures(1, &raspitex_state->texture);
eglDestroyImageKHR(raspitex_state->display, raspitex_state->egl_image);
raspitex_state->egl_image = EGL_NO_IMAGE_KHR;
glDeleteTextures(1, &raspitex_state->y_texture);
eglDestroyImageKHR(raspitex_state->display, raspitex_state->y_egl_image);
raspitex_state->y_egl_image = EGL_NO_IMAGE_KHR;
glDeleteTextures(1, &raspitex_state->u_texture);
eglDestroyImageKHR(raspitex_state->display, raspitex_state->u_egl_image);
raspitex_state->u_egl_image = EGL_NO_IMAGE_KHR;
glDeleteTextures(1, &raspitex_state->v_texture);
eglDestroyImageKHR(raspitex_state->display, raspitex_state->v_egl_image);
raspitex_state->u_egl_image = EGL_NO_IMAGE_KHR;
/* Terminate EGL */
eglMakeCurrent(raspitex_state->display, EGL_NO_SURFACE,
EGL_NO_SURFACE, EGL_NO_CONTEXT);
eglDestroyContext(raspitex_state->display, raspitex_state->context);
eglDestroySurface(raspitex_state->display, raspitex_state->surface);
eglTerminate(raspitex_state->display);
}
开发者ID:arubisov,项目名称:skazzbot,代码行数:32,代码来源:RaspiTexUtil.c
示例2: glamor_egl_close_screen
static Bool
glamor_egl_close_screen(ScreenPtr screen)
{
ScrnInfoPtr scrn;
struct glamor_egl_screen_private *glamor_egl;
PixmapPtr screen_pixmap;
EGLImageKHR back_image;
scrn = xf86ScreenToScrn(screen);
glamor_egl = glamor_egl_get_screen_private(scrn);
screen_pixmap = screen->GetScreenPixmap(screen);
eglDestroyImageKHR(glamor_egl->display,glamor_egl->front_image);
dixSetPrivate(&screen_pixmap->devPrivates, glamor_egl_pixmap_private_key,
NULL);
glamor_egl->front_image = NULL;
if (glamor_egl->back_pixmap && *glamor_egl->back_pixmap) {
back_image = dixLookupPrivate(&(*glamor_egl->back_pixmap)->devPrivates,
glamor_egl_pixmap_private_key);
if (back_image != NULL && back_image != EGL_NO_IMAGE_KHR) {
eglDestroyImageKHR(glamor_egl->display, back_image);
dixSetPrivate(&(*glamor_egl->back_pixmap)->devPrivates,
glamor_egl_pixmap_private_key, NULL);
}
}
screen->CloseScreen = glamor_egl->saved_close_screen;
return screen->CloseScreen(screen);
}
开发者ID:cubanismo,项目名称:xserver,代码行数:30,代码来源:glamor_egl.c
示例3: make_gl_backend_texture
static GrBackendTexture make_gl_backend_texture(
GrContext* context, AHardwareBuffer* hardwareBuffer,
int width, int height, GrPixelConfig config,
GrAHardwareBufferImageGenerator::DeleteImageProc* deleteProc,
GrAHardwareBufferImageGenerator::DeleteImageCtx* deleteCtx,
bool isProtectedContent,
const GrBackendFormat& backendFormat) {
while (GL_NO_ERROR != glGetError()) {} //clear GL errors
EGLClientBuffer clientBuffer = eglGetNativeClientBufferANDROID(hardwareBuffer);
EGLint attribs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE,
isProtectedContent ? EGL_PROTECTED_CONTENT_EXT : EGL_NONE,
isProtectedContent ? EGL_TRUE : EGL_NONE,
EGL_NONE };
EGLDisplay display = eglGetCurrentDisplay();
// eglCreateImageKHR will add a ref to the AHardwareBuffer
EGLImageKHR image = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID,
clientBuffer, attribs);
if (EGL_NO_IMAGE_KHR == image) {
SkDebugf("Could not create EGL image, err = (%#x)", (int) eglGetError() );
return GrBackendTexture();
}
GrGLuint texID;
glGenTextures(1, &texID);
if (!texID) {
eglDestroyImageKHR(display, image);
return GrBackendTexture();
}
glBindTexture(GL_TEXTURE_EXTERNAL_OES, texID);
GLenum status = GL_NO_ERROR;
if ((status = glGetError()) != GL_NO_ERROR) {
SkDebugf("glBindTexture failed (%#x)", (int) status);
glDeleteTextures(1, &texID);
eglDestroyImageKHR(display, image);
return GrBackendTexture();
}
glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, image);
if ((status = glGetError()) != GL_NO_ERROR) {
SkDebugf("glEGLImageTargetTexture2DOES failed (%#x)", (int) status);
glDeleteTextures(1, &texID);
eglDestroyImageKHR(display, image);
return GrBackendTexture();
}
context->resetContext(kTextureBinding_GrGLBackendState);
GrGLTextureInfo textureInfo;
textureInfo.fID = texID;
SkASSERT(backendFormat.isValid());
textureInfo.fTarget = *backendFormat.getGLTarget();
textureInfo.fFormat = *backendFormat.getGLFormat();
*deleteProc = GrAHardwareBufferImageGenerator::DeleteGLTexture;
*deleteCtx = new GLCleanupHelper(texID, image, display);
return GrBackendTexture(width, height, GrMipMapped::kNo, textureInfo);
}
开发者ID:jasonLaster,项目名称:gecko-dev,代码行数:57,代码来源:GrAHardwareBufferImageGenerator.cpp
示例4: glDeleteTextures
WindowGrabber::~WindowGrabber()
{
QCoreApplication::eventDispatcher()->removeNativeEventFilter(this);
if (eglImagesInitialized()) {
glDeleteTextures(2, imgTextures);
eglDestroyImageKHR(eglGetDisplay(EGL_DEFAULT_DISPLAY), img[0]);
eglDestroyImageKHR(eglGetDisplay(EGL_DEFAULT_DISPLAY), img[1]);
}
}
开发者ID:SchleunigerAG,项目名称:WinEC7_Qt5.3.1_Fixes,代码行数:9,代码来源:windowgrabber.cpp
示例5: test_buffer_not_null
static bool
test_buffer_not_null(unsigned w, unsigned h, int fd, unsigned stride,
unsigned offset)
{
EGLImageKHR img;
EGLint attr[] = {
EGL_WIDTH, w,
EGL_HEIGHT, h,
EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_ARGB8888,
EGL_DMA_BUF_PLANE0_FD_EXT, fd,
EGL_DMA_BUF_PLANE0_OFFSET_EXT, offset,
EGL_DMA_BUF_PLANE0_PITCH_EXT, stride,
EGL_NONE
};
/**
* The spec says:
*
* "If <target> is EGL_LINUX_DMA_BUF_EXT, <dpy> must be a valid
* display, <ctx> must be EGL_NO_CONTEXT, and <buffer> must be
* NULL, cast into the type EGLClientBuffer."
*/
img = eglCreateImageKHR(eglGetCurrentDisplay(), EGL_NO_CONTEXT,
EGL_LINUX_DMA_BUF_EXT, (EGLClientBuffer)1, attr);
if (!piglit_check_egl_error(EGL_BAD_PARAMETER)) {
if (img)
eglDestroyImageKHR(eglGetCurrentDisplay(), img);
return false;
}
return true;
}
开发者ID:BNieuwenhuizen,项目名称:piglit,代码行数:33,代码来源:invalid_attributes.c
示例6: fourcc_code
PIGLIT_GL_TEST_CONFIG_END
#define DRM_FORMAT_INVALID fourcc_code('F', 'O', 'O', '0')
static bool
test_excess_attributes(unsigned w, unsigned h, int fd, unsigned stride,
unsigned offset, EGLint attr_id, EGLint attr_val)
{
const EGLint excess_attr[2 * 7 + 1] = {
EGL_HEIGHT, w,
EGL_WIDTH, h,
EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_ARGB8888,
EGL_DMA_BUF_PLANE0_FD_EXT, fd,
EGL_DMA_BUF_PLANE0_OFFSET_EXT, offset,
EGL_DMA_BUF_PLANE0_PITCH_EXT, stride,
attr_id, attr_val,
EGL_NONE };
EGLImageKHR img = eglCreateImageKHR(eglGetCurrentDisplay(),
EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT,
(EGLClientBuffer)NULL, excess_attr);
if (!piglit_check_egl_error(EGL_BAD_ATTRIBUTE)) {
if (img)
eglDestroyImageKHR(eglGetCurrentDisplay(), img);
return false;
}
return true;
}
开发者ID:BNieuwenhuizen,项目名称:piglit,代码行数:29,代码来源:invalid_attributes.c
示例7: log_warn
/*------------------------------------------------------------------------------
| OMX_TextureData::freeData
+-----------------------------------------------------------------------------*/
void OMX_TextureData::freeData()
{
if (!m_textureData || !m_textureId || !m_eglImage)
log_warn("Double free of OMX texture data requested.");
EGLDisplay eglDisplay = get_egl_display();
// Destroy texture, EGL image and free the buffer.
log_debug("Freeing KHR image...");
if (m_eglImage && eglDestroyImageKHR(eglDisplay, m_eglImage) == EGL_SUCCESS) {
EGLint err = eglGetError();
LOG_ERROR(LOG_TAG, "Failed to destroy EGLImageKHR: %d.", err);
}
m_eglImage = NULL;
if (m_textureId) {
log_debug("Freeing texture...");
glDeleteTextures(1, &m_textureId);
m_textureId = 0;
}
if (m_textureData) {
log_debug("Freeing texture data...");
delete m_textureData;
m_textureData = NULL;
}
}
开发者ID:CheckLiu,项目名称:pi,代码行数:30,代码来源:omx_textureprovider.cpp
示例8: piglit_display
enum piglit_result
piglit_display(void)
{
const unsigned w = 2;
const unsigned h = 2;
const unsigned cpp = 4;
const unsigned fourcc = DRM_FORMAT_ARGB8888;
const unsigned char *pixels = alloca(w * h * cpp);
struct piglit_dma_buf *buf;
EGLImageKHR img;
enum piglit_result res;
bool pass = true;
res = piglit_create_dma_buf(w, h, fourcc, pixels, &buf);
if (res != PIGLIT_PASS)
return res;
img = create_image(w, h, buf->fd, buf->stride[0], buf->offset[0]);
if (!img) {
piglit_destroy_dma_buf(buf);
/* unsupported format (BAD_MATCH) is not an error. */
return piglit_check_egl_error(EGL_BAD_MATCH) ?
PIGLIT_SKIP : PIGLIT_FAIL;
}
pass = try_as_texture_2d(img) && pass;
pass = try_as_render_buffer(img) && pass;
eglDestroyImageKHR(eglGetCurrentDisplay(), img);
piglit_destroy_dma_buf(buf);
return pass ? PIGLIT_PASS : PIGLIT_FAIL;
}
开发者ID:chemecse,项目名称:piglit,代码行数:35,代码来源:intel_external_sampler_only.c
示例9: test_pitch_zero
static bool
test_pitch_zero(unsigned w, unsigned h, int fd, unsigned stride,
unsigned offset)
{
EGLImageKHR img;
EGLint attr[] = {
EGL_WIDTH, w,
EGL_HEIGHT, h,
EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_ARGB8888,
EGL_DMA_BUF_PLANE0_FD_EXT, fd,
EGL_DMA_BUF_PLANE0_OFFSET_EXT, offset,
EGL_DMA_BUF_PLANE0_PITCH_EXT, 0,
EGL_NONE
};
img = eglCreateImageKHR(eglGetCurrentDisplay(), EGL_NO_CONTEXT,
EGL_LINUX_DMA_BUF_EXT, (EGLClientBuffer)0, attr);
if (!piglit_check_egl_error(EGL_BAD_ACCESS)) {
if (img)
eglDestroyImageKHR(eglGetCurrentDisplay(), img);
return false;
}
return true;
}
开发者ID:BNieuwenhuizen,项目名称:piglit,代码行数:26,代码来源:invalid_attributes.c
示例10: mesaDeallocateBuffer
static DFBResult
mesaDeallocateBuffer( CoreSurfacePool *pool,
void *pool_data,
void *pool_local,
CoreSurfaceBuffer *buffer,
CoreSurfaceAllocation *allocation,
void *alloc_data )
{
MesaPoolData *data = pool_data;
MesaAllocationData *alloc = alloc_data;
MesaPoolLocalData *local = pool_local;
(void)data;
D_DEBUG_AT( Mesa_Surfaces, "%s( %p )\n", __FUNCTION__, buffer );
D_MAGIC_ASSERT( pool, CoreSurfacePool );
D_MAGIC_ASSERT( data, MesaPoolData );
D_MAGIC_ASSERT( alloc, MesaAllocationData );
drmModeRmFB( local->mesa->fd, alloc->fb_id );
eglDestroyImageKHR( local->mesa->dpy, alloc->image );
gbm_bo_destroy( alloc->bo );
D_MAGIC_CLEAR( alloc );
return DFB_OK;
}
开发者ID:lelou6666,项目名称:DirectFB-1.6.3-ab,代码行数:28,代码来源:mesa_surface_pool.c
示例11: MessageDestroyTexture
LayerBuffer::BufferSource::~BufferSource()
{
class MessageDestroyTexture : public MessageBase {
SurfaceFlinger* flinger;
GLuint name;
public:
MessageDestroyTexture(
SurfaceFlinger* flinger, GLuint name)
: flinger(flinger), name(name) { }
virtual bool handler() {
glDeleteTextures(1, &name);
return true;
}
};
if (mTexture.name != -1U) {
// GL textures can only be destroyed from the GL thread
getFlinger()->mEventQueue.postMessage(
new MessageDestroyTexture(getFlinger(), mTexture.name) );
}
if (mTexture.image != EGL_NO_IMAGE_KHR) {
EGLDisplay dpy(getFlinger()->graphicPlane(0).getEGLDisplay());
eglDestroyImageKHR(dpy, mTexture.image);
}
}
开发者ID:TribeMedia,项目名称:android-apex,代码行数:25,代码来源:LayerBuffer.cpp
示例12: eglDestroyImageKHR
status_t SurfaceTexture::acquireBufferLocked(BufferQueue::BufferItem *item) {
status_t err = ConsumerBase::acquireBufferLocked(item);
if (err != NO_ERROR) {
return err;
}
int slot = item->mBuf;
if (item->mGraphicBuffer != NULL) {
if (mEglSlots[slot].mEglImage != EGL_NO_IMAGE_KHR) {
eglDestroyImageKHR(mEglDisplay, mEglSlots[slot].mEglImage);
mEglSlots[slot].mEglImage = EGL_NO_IMAGE_KHR;
}
}
#ifndef STE_HARDWARE
// Update the GL texture object. We may have to do this even when
// item.mGraphicBuffer == NULL, if we destroyed the EGLImage when
// detaching from a context but the buffer has not been re-allocated.
if (mEglSlots[slot].mEglImage == EGL_NO_IMAGE_KHR) {
EGLImageKHR image = createImage(mEglDisplay, mSlots[slot].mGraphicBuffer);
if (image == EGL_NO_IMAGE_KHR) {
return UNKNOWN_ERROR;
}
mEglSlots[slot].mEglImage = image;
}
#endif
return NO_ERROR;
}
开发者ID:Benzonat0r,项目名称:omx-components-u8500,代码行数:29,代码来源:SurfaceTexture.cpp
示例13: ST_LOGV
status_t GLConsumer::bindUnslottedBufferLocked(EGLDisplay dpy) {
ST_LOGV("bindUnslottedBuffer ct=%d ctb=%p",
mCurrentTexture, mCurrentTextureBuf.get());
// Create a temporary EGLImageKHR.
Rect crop;
EGLImageKHR image = createImage(dpy, mCurrentTextureBuf, mCurrentCrop);
if (image == EGL_NO_IMAGE_KHR) {
return UNKNOWN_ERROR;
}
// Attach the current buffer to the GL texture.
glEGLImageTargetTexture2DOES(mTexTarget, (GLeglImageOES)image);
GLint error;
status_t err = OK;
while ((error = glGetError()) != GL_NO_ERROR) {
ST_LOGE("bindUnslottedBuffer: error binding external texture image %p "
"(slot %d): %#04x", image, mCurrentTexture, error);
err = UNKNOWN_ERROR;
}
// We destroy the EGLImageKHR here because the current buffer may no
// longer be associated with one of the buffer slots, so we have
// nowhere to to store it. If the buffer is still associated with a
// slot then another EGLImageKHR will be created next time that buffer
// gets acquired in updateTexImage.
eglDestroyImageKHR(dpy, image);
return err;
}
开发者ID:WayWingsDev,项目名称:Source_MT6582,代码行数:31,代码来源:GLConsumer.cpp
示例14: ATRACE_CALL
status_t GLConsumer::detachFromContext() {
ATRACE_CALL();
#ifndef MTK_DEFAULT_AOSP
ST_LOGI("detachFromContext");
#else
ST_LOGV("detachFromContext");
#endif
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
ST_LOGE("detachFromContext: abandoned GLConsumer");
return NO_INIT;
}
if (!mAttached) {
ST_LOGE("detachFromContext: GLConsumer is not attached to a "
"context");
return INVALID_OPERATION;
}
EGLDisplay dpy = eglGetCurrentDisplay();
EGLContext ctx = eglGetCurrentContext();
if (mEglDisplay != dpy && mEglDisplay != EGL_NO_DISPLAY) {
ST_LOGE("detachFromContext: invalid current EGLDisplay");
return INVALID_OPERATION;
}
if (mEglContext != ctx && mEglContext != EGL_NO_CONTEXT) {
ST_LOGE("detachFromContext: invalid current EGLContext");
return INVALID_OPERATION;
}
if (dpy != EGL_NO_DISPLAY && ctx != EGL_NO_CONTEXT) {
status_t err = syncForReleaseLocked(dpy);
if (err != OK) {
return err;
}
glDeleteTextures(1, &mTexName);
}
// Because we're giving up the EGLDisplay we need to free all the EGLImages
// that are associated with it. They'll be recreated when the
// GLConsumer gets attached to a new OpenGL ES context (and thus gets a
// new EGLDisplay).
for (int i =0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) {
EGLImageKHR img = mEglSlots[i].mEglImage;
if (img != EGL_NO_IMAGE_KHR) {
eglDestroyImageKHR(mEglDisplay, img);
mEglSlots[i].mEglImage = EGL_NO_IMAGE_KHR;
}
}
mEglDisplay = EGL_NO_DISPLAY;
mEglContext = EGL_NO_CONTEXT;
mAttached = false;
return OK;
}
开发者ID:WayWingsDev,项目名称:Source_MT6582,代码行数:60,代码来源:GLConsumer.cpp
示例15: if
status_t GLConsumer::acquireBufferLocked(BufferQueue::BufferItem *item,
nsecs_t presentWhen) {
status_t err = ConsumerBase::acquireBufferLocked(item, presentWhen);
if (err != NO_ERROR) {
return err;
}
int slot = item->mBuf;
bool destroyEglImage = false;
if (mEglSlots[slot].mEglImage != EGL_NO_IMAGE_KHR) {
if (item->mGraphicBuffer != NULL) {
// This buffer has not been acquired before, so we must assume
// that any EGLImage in mEglSlots is stale.
destroyEglImage = true;
} else if (mEglSlots[slot].mCropRect != item->mCrop) {
// We've already seen this buffer before, but it now has a
// different crop rect, so we'll need to recreate the EGLImage if
// we're using the EGL_ANDROID_image_crop extension.
destroyEglImage = hasEglAndroidImageCrop();
}
}
if (destroyEglImage) {
if (!eglDestroyImageKHR(mEglDisplay, mEglSlots[slot].mEglImage)) {
ST_LOGW("acquireBufferLocked: eglDestroyImageKHR failed for slot=%d",
slot);
// keep going
}
mEglSlots[slot].mEglImage = EGL_NO_IMAGE_KHR;
}
return NO_ERROR;
}
开发者ID:WayWingsDev,项目名称:Source_MT6582,代码行数:34,代码来源:GLConsumer.cpp
示例16: piglit_display
enum piglit_result
piglit_display(void)
{
GLuint tex;
enum piglit_result result = PIGLIT_FAIL;
const unsigned char src[] = { 0x00, 0x00, 0x00, 0x00 };
EGLImageKHR img = create_tex_based_egl_image(1, 1, src);
if (img == EGL_NO_IMAGE_KHR)
return PIGLIT_FAIL;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_EXTERNAL_OES, tex);
glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES,
(GLeglImageOES)img);
if (piglit_check_gl_error(GL_INVALID_OPERATION))
result = PIGLIT_PASS;
glDeleteTextures(1, &tex);
eglDestroyImageKHR(eglGetCurrentDisplay(), img);
return result;
}
开发者ID:RAOF,项目名称:piglit,代码行数:25,代码来源:intel_external_sampler_with_dma_only.c
示例17: ALOGE
GLConsumer::EglImage::~EglImage() {
if (mEglImage != EGL_NO_IMAGE_KHR) {
if (!eglDestroyImageKHR(mEglDisplay, mEglImage)) {
ALOGE("~EglImage: eglDestroyImageKHR failed");
}
eglTerminate(mEglDisplay);
}
}
开发者ID:Hazy-legacy-zf2,项目名称:platform_frameworks_native,代码行数:8,代码来源:GLConsumer.cpp
示例18: eglDestroyImageKHR
Image::~Image() {
if (mImage != EGL_NO_IMAGE_KHR) {
eglDestroyImageKHR(eglGetDisplay(EGL_DEFAULT_DISPLAY), mImage);
mImage = EGL_NO_IMAGE_KHR;
Caches::getInstance().deleteTexture(mTexture);
mTexture = 0;
}
}
开发者ID:109021017,项目名称:platform_frameworks_base,代码行数:9,代码来源:Image.cpp
示例19: eglDestroyImageKHR
void SurfaceTexture::freeBufferLocked(int i) {
mSlots[i].mGraphicBuffer = 0;
mSlots[i].mBufferState = BufferSlot::FREE;
mSlots[i].mFrameNumber = 0;
if (mSlots[i].mEglImage != EGL_NO_IMAGE_KHR) {
eglDestroyImageKHR(mSlots[i].mEglDisplay, mSlots[i].mEglImage);
mSlots[i].mEglImage = EGL_NO_IMAGE_KHR;
mSlots[i].mEglDisplay = EGL_NO_DISPLAY;
}
}
开发者ID:cfansjlu,项目名称:frameworks_base,代码行数:10,代码来源:SurfaceTexture.cpp
示例20: dpy
void LayerBuffer::BufferSource::clearTempBufferImage() const
{
// delete the image
EGLDisplay dpy(getFlinger()->graphicPlane(0).getEGLDisplay());
eglDestroyImageKHR(dpy, mTexture.image);
// and the associated texture (recreate a name)
glDeleteTextures(1, &mTexture.name);
Texture defaultTexture;
mTexture = defaultTexture;
}
开发者ID:TribeMedia,项目名称:android-apex,代码行数:11,代码来源:LayerBuffer.cpp
注:本文中的eglDestroyImageKHR函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论