char load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity, char immediate_load) { uint8_t *data; size_t size; int w,h; int has_alpha; #if (WEBP_DECODER_ABI_VERSION >= 0x200) WebPBitstreamFeatures features; #endif char ret = 0; if(im->data) return 0; if(!(data = read_file(im->real_file, &size, progress))) return 0; #if (WEBP_DECODER_ABI_VERSION >= 0x200) if(WebPGetFeatures(data, size, &features) != VP8_STATUS_OK) goto EXIT; w = features.width; h = features.height; has_alpha = features.has_alpha; #else /* compatibility with versions <= 0.1.3 */ if (!WebPGetInfo(data, size, &w, &h)) goto EXIT; has_alpha = 0; #endif if(!im->loader && !im->data) { im->w = w; im->h = h; if(!IMAGE_DIMENSIONS_OK(w, h)) goto EXIT; if(!has_alpha) UNSET_FLAGS(im->flags, F_HAS_ALPHA); else SET_FLAGS(im->flags, F_HAS_ALPHA); im->format = strdup("webp"); } if((!im->data && im->loader) || immediate_load || progress) im->data = (DATA32*)WebPDecodeBGRA(data, size, &w, &h); if(progress) progress(im, 100, 0, 0, 0, 0); ret = 1; EXIT: free(data); return ret; }
//{ Draw void image_load(img_t *img,BYTE *data,int sz) { BYTE *bits,*p1,*p2; BITMAPINFO bmi; int ret; int i; img->hasalpha=img->sx=img->sy=0; #ifdef CONSOLE_MODE return; #else ret=WebPGetInfo((PBYTE)data,sz,&img->sx,&img->sy); if(!ret) { log_err("ERROR in image_load(): failed WebPGetInfo\n"); return; } img->big=WebPDecodeBGRA((PBYTE)data,sz,&img->sx,&img->sy); if(!img->big) { log_err("ERROR in image_load(): failed WebPDecodeBGRA\n"); return; } #endif ZeroMemory(&bmi,sizeof(BITMAPINFO)); bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth=img->sx; bmi.bmiHeader.biHeight=-img->sy; bmi.bmiHeader.biPlanes=1; bmi.bmiHeader.biBitCount=32; bmi.bmiHeader.biCompression=BI_RGB; bmi.bmiHeader.biSizeImage=img->sx*img->sy*4; img->dc=CreateCompatibleDC(0); img->bitmap=CreateDIBSection(img->dc,&bmi,DIB_RGB_COLORS,(void *)&bits,0,0); SelectObject(img->dc,img->bitmap); p1=bits;p2=img->big; for(i=0;i<img->sx*img->sy;i++) { BYTE B,G,R,A; B=*p2++; G=*p2++; R=*p2++; A=*p2++; double dA=A/255.; if(A!=255)img->hasalpha=1; *p1++=(BYTE)(B*dA); *p1++=(BYTE)(G*dA); *p1++=(BYTE)(R*dA); *p1++=A; } //log_con("%dx%d:%d,%d\n",img->sx,img->sy,img->hasalpha,img->index); }
SWIGEXPORT jbyteArray JNICALL Java_com_google_webp_libwebpJNI_WebPDecodeBGRA(JNIEnv *jenv, jclass jcls, jbyteArray jarg1, jint jarg2, jintArray jarg3, jintArray jarg4) { jbyteArray jresult = 0 ; uint8_t *arg1 = (uint8_t *) 0 ; uint32_t arg2 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; jbyte *jarr1 ; int temp3 ; int temp4 ; uint8_t *result = 0 ; (void)jenv; (void)jcls; if (!SWIG_JavaArrayInSchar(jenv, &jarr1, &arg1, jarg1)) return 0; arg2 = (uint32_t)jarg2; { if (!jarg3) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg3) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg3 = &temp3; } { if (!jarg4) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg4) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg4 = &temp4; } { if (arg2 < 0) { { SWIG_JavaException(jenv, SWIG_ValueError, "Expected a non-negative value."); return 0; }; } } result = (uint8_t *)WebPDecodeBGRA((uint8_t const *)arg1,arg2,arg3,arg4); jresult = SWIG_JavaArrayOutSchar(jenv, result, FillMeInAsSizeCannotBeDeterminedAutomatically); SWIG_JavaArrayArgoutSchar(jenv, jarr1, arg1, jarg1); { jint jvalue = (jint)temp3; (*jenv)->SetIntArrayRegion(jenv, jarg3, 0, 1, &jvalue); } { jint jvalue = (jint)temp4; (*jenv)->SetIntArrayRegion(jenv, jarg4, 0, 1, &jvalue); } free(arg1); free(result); return jresult; }
status_t WebPTranslator::_TranslateFromWebP(BPositionIO* stream, BMessage* ioExtension, uint32 outType, BPositionIO* target) { if (!outType) outType = B_TRANSLATOR_BITMAP; if (outType != B_TRANSLATOR_BITMAP) return B_NO_TRANSLATOR; off_t streamLength = 0; stream->GetSize(&streamLength); off_t streamSize = stream->Seek(0, SEEK_END); stream->Seek(0, SEEK_SET); void* streamData = malloc(streamSize); if (streamData == NULL) return B_NO_MEMORY; if (stream->Read(streamData, streamSize) != streamSize) { free(streamData); return B_IO_ERROR; } int width, height; uint8* out = WebPDecodeBGRA((const uint8*)streamData, streamSize, &width, &height); free(streamData); if (out == NULL) return B_ILLEGAL_DATA; FreeAllocation _(out); uint32 dataSize = width * 4 * height; TranslatorBitmap bitmapHeader; bitmapHeader.magic = B_TRANSLATOR_BITMAP; bitmapHeader.bounds.Set(0, 0, width - 1, height - 1); bitmapHeader.rowBytes = width * 4; bitmapHeader.colors = B_RGBA32; bitmapHeader.dataSize = width * 4 * height; // write out Be's Bitmap header swap_data(B_UINT32_TYPE, &bitmapHeader, sizeof(TranslatorBitmap), B_SWAP_HOST_TO_BENDIAN); ssize_t bytesWritten = target->Write(&bitmapHeader, sizeof(TranslatorBitmap)); if (bytesWritten < B_OK) return bytesWritten; if ((size_t)bytesWritten != sizeof(TranslatorBitmap)) return B_IO_ERROR; bool headerOnly = false; if (ioExtension != NULL) ioExtension->FindBool(B_TRANSLATOR_EXT_HEADER_ONLY, &headerOnly); if (headerOnly) return B_OK; uint32 dataLeft = dataSize; uint8* p = out; while (dataLeft) { bytesWritten = target->Write(p, 4); if (bytesWritten < B_OK) return bytesWritten; if (bytesWritten != 4) return B_IO_ERROR; p += 4; dataLeft -= 4; } return B_OK; }