deMutex deMutex_create (const deMutexAttributes* attributes) { pthread_mutexattr_t attr; int ret; pthread_mutex_t* mutex = deMalloc(sizeof(pthread_mutex_t)); if (!mutex) return 0; if (pthread_mutexattr_init(&attr) != 0) { deFree(mutex); return 0; } #if defined(DE_DEBUG) if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK) != 0) #else if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL) != 0) #endif { pthread_mutexattr_destroy(&attr); deFree(mutex); return 0; } if (attributes) { if (attributes->flags & DE_MUTEX_RECURSIVE) { if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0) { pthread_mutexattr_destroy(&attr); deFree(mutex); return 0; } } } ret = pthread_mutex_init(mutex, &attr); if (ret != 0) { pthread_mutexattr_destroy(&attr); deFree(mutex); return 0; } pthread_mutexattr_destroy(&attr); return (deMutex)mutex; }
deSemaphore deSemaphore_create (int initialValue, const deSemaphoreAttributes* attributes) { sem_t* sem = (sem_t*)deMalloc(sizeof(sem_t)); DE_UNREF(attributes); if (!sem) return 0; if (sem_init(sem, 0, initialValue) != 0) { deFree(sem); return 0; } return (deSemaphore)sem; }
static deBool compressImagePNG (Buffer* buffer, qpImageFormat imageFormat, int width, int height, int rowStride, const void* data) { deBool compressOk = DE_FALSE; png_structp png = DE_NULL; png_infop info = DE_NULL; png_byte** rowPointers = DE_NULL; deBool hasAlpha = imageFormat == QP_IMAGE_FORMAT_RGBA8888; int ndx; /* Handle format. */ DE_ASSERT(imageFormat == QP_IMAGE_FORMAT_RGB888 || imageFormat == QP_IMAGE_FORMAT_RGBA8888); /* Allocate & set row pointers. */ rowPointers = (png_byte**)deMalloc((size_t)height * sizeof(png_byte*)); if (!rowPointers) return DE_FALSE; for (ndx = 0; ndx < height; ndx++) rowPointers[ndx] = (png_byte*)((const deUint8*)data + ndx*rowStride); /* Initialize PNG compressor. */ png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); info = png ? png_create_info_struct(png) : DE_NULL; if (png && info) { /* Set our own write function. */ png_set_write_fn(png, buffer, pngWriteData, pngFlushData); compressOk = writeCompressedPNG(png, info, rowPointers, width, height, hasAlpha ? PNG_COLOR_TYPE_RGBA : PNG_COLOR_TYPE_RGB); } /* Cleanup & return. */ if (png && info) { png_destroy_info_struct(png, &info); png_destroy_write_struct(&png, DE_NULL); } else if (png) png_destroy_write_struct(&png, &info); deFree(rowPointers); return compressOk; }
deBool Buffer_resize (Buffer* buffer, size_t newSize) { /* Grow buffer if necessary. */ if (newSize > buffer->capacity) { size_t newCapacity = (size_t)deAlign32(deMax32(2*(int)buffer->capacity, (int)newSize), 512); deUint8* newData = (deUint8*)deMalloc(newCapacity); if (!newData) return DE_FALSE; memcpy(newData, buffer->data, buffer->size); deFree(buffer->data); buffer->data = newData; buffer->capacity = newCapacity; } buffer->size = newSize; return DE_TRUE; }