Fixed bug in BitmapFactory.decodeStream
Downloading images over a slow connection could result in errors and null images. The JavaInputStreamAdaptor::do_skip method was correctly called in a loop (to handle the EOF case using read()), but the amount that was skipped at each time was not decreased by the amount already skipped. Bug http://code.google.com/p/android/issues/detail?id=6066 Cherry picked from master CL57808 Change-Id: Ie6856898b21ba31de1209e1f995b4ae784c919b9
This commit is contained in:
@@ -52,7 +52,7 @@ public:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n <= 0) {
|
if (n < 0) { // n == 0 should not be possible, see InputStream read() specifications.
|
||||||
break; // eof
|
break; // eof
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,17 +76,19 @@ public:
|
|||||||
|
|
||||||
size_t doSkip(size_t size) {
|
size_t doSkip(size_t size) {
|
||||||
JNIEnv* env = fEnv;
|
JNIEnv* env = fEnv;
|
||||||
|
|
||||||
jlong skipped = env->CallLongMethod(fJavaInputStream,
|
jlong skipped = env->CallLongMethod(fJavaInputStream,
|
||||||
gInputStream_skipMethodID, (jlong)size);
|
gInputStream_skipMethodID, (jlong)size);
|
||||||
if (env->ExceptionCheck()) {
|
if (env->ExceptionCheck()) {
|
||||||
env->ExceptionDescribe();
|
env->ExceptionDescribe();
|
||||||
env->ExceptionClear();
|
env->ExceptionClear();
|
||||||
SkDebugf("------- available threw an exception\n");
|
SkDebugf("------- skip threw an exception\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (skipped < 0) {
|
if (skipped < 0) {
|
||||||
skipped = 0;
|
skipped = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (size_t)skipped;
|
return (size_t)skipped;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,7 +117,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
size_t amountSkipped = 0;
|
size_t amountSkipped = 0;
|
||||||
do {
|
do {
|
||||||
size_t amount = this->doSkip(size);
|
size_t amount = this->doSkip(size - amountSkipped);
|
||||||
if (0 == amount) {
|
if (0 == amount) {
|
||||||
char tmp;
|
char tmp;
|
||||||
amount = this->doRead(&tmp, 1);
|
amount = this->doRead(&tmp, 1);
|
||||||
|
|||||||
Reference in New Issue
Block a user