diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/jni/android/graphics/BitmapFactory.cpp | 16 | ||||
-rw-r--r-- | core/jni/android/graphics/NinePatchImpl.cpp | 27 | ||||
-rw-r--r-- | core/jni/android/graphics/NinePatchPeeker.cpp | 2 | ||||
-rw-r--r-- | core/jni/android/graphics/NinePatchPeeker.h | 2 |
4 files changed, 27 insertions, 20 deletions
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index 56d903c..13c1fc8 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -106,17 +106,19 @@ static void scaleNinePatchChunk(android::Res_png_9patch* chunk, float scale) { chunk->paddingRight = int(chunk->paddingRight * scale + 0.5f); chunk->paddingBottom = int(chunk->paddingBottom * scale + 0.5f); + int32_t* xDivs = chunk->getXDivs(); for (int i = 0; i < chunk->numXDivs; i++) { - chunk->xDivs[i] = int(chunk->xDivs[i] * scale + 0.5f); - if (i > 0 && chunk->xDivs[i] == chunk->xDivs[i - 1]) { - chunk->xDivs[i]++; + xDivs[i] = int32_t(xDivs[i] * scale + 0.5f); + if (i > 0 && xDivs[i] == xDivs[i - 1]) { + xDivs[i]++; } } + int32_t* yDivs = chunk->getXDivs(); for (int i = 0; i < chunk->numYDivs; i++) { - chunk->yDivs[i] = int(chunk->yDivs[i] * scale + 0.5f); - if (i > 0 && chunk->yDivs[i] == chunk->yDivs[i - 1]) { - chunk->yDivs[i]++; + yDivs[i] = int32_t(yDivs[i] * scale + 0.5f); + if (i > 0 && yDivs[i] == yDivs[i - 1]) { + yDivs[i]++; } } } @@ -365,7 +367,7 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding return nullObjectReturn("primitive array == null"); } - peeker.fPatch->serialize(array); + memcpy(array, peeker.fPatch, peeker.fPatchSize); env->ReleasePrimitiveArrayCritical(ninePatchChunk, array, 0); } diff --git a/core/jni/android/graphics/NinePatchImpl.cpp b/core/jni/android/graphics/NinePatchImpl.cpp index 01e7e3e..86ff13c 100644 --- a/core/jni/android/graphics/NinePatchImpl.cpp +++ b/core/jni/android/graphics/NinePatchImpl.cpp @@ -115,13 +115,15 @@ void NinePatch_Draw(SkCanvas* canvas, const SkRect& bounds, defaultPaint.setDither(true); paint = &defaultPaint; } - + + const int32_t* xDivs = chunk.getXDivs(); + const int32_t* yDivs = chunk.getYDivs(); // if our SkCanvas were back by GL we should enable this and draw this as // a mesh, which will be faster in most cases. if (false) { SkNinePatch::DrawMesh(canvas, bounds, bitmap, - chunk.xDivs, chunk.numXDivs, - chunk.yDivs, chunk.numYDivs, + xDivs, chunk.numXDivs, + yDivs, chunk.numYDivs, paint); return; } @@ -145,8 +147,8 @@ void NinePatch_Draw(SkCanvas* canvas, const SkRect& bounds, if (gTrace) { ALOGV("======== ninepatch bounds [%g %g]\n", SkScalarToFloat(bounds.width()), SkScalarToFloat(bounds.height())); ALOGV("======== ninepatch paint bm [%d,%d]\n", bitmap.width(), bitmap.height()); - ALOGV("======== ninepatch xDivs [%d,%d]\n", chunk.xDivs[0], chunk.xDivs[1]); - ALOGV("======== ninepatch yDivs [%d,%d]\n", chunk.yDivs[0], chunk.yDivs[1]); + ALOGV("======== ninepatch xDivs [%d,%d]\n", xDivs[0], xDivs[1]); + ALOGV("======== ninepatch yDivs [%d,%d]\n", yDivs[0], yDivs[1]); } #endif @@ -171,8 +173,8 @@ void NinePatch_Draw(SkCanvas* canvas, const SkRect& bounds, SkRect dst; SkIRect src; - const int32_t x0 = chunk.xDivs[0]; - const int32_t y0 = chunk.yDivs[0]; + const int32_t x0 = xDivs[0]; + const int32_t y0 = yDivs[0]; const SkColor initColor = ((SkPaint*)paint)->getColor(); const uint8_t numXDivs = chunk.numXDivs; const uint8_t numYDivs = chunk.numYDivs; @@ -191,12 +193,12 @@ void NinePatch_Draw(SkCanvas* canvas, const SkRect& bounds, int numStretchyXPixelsRemaining = 0; for (i = 0; i < numXDivs; i += 2) { - numStretchyXPixelsRemaining += chunk.xDivs[i + 1] - chunk.xDivs[i]; + numStretchyXPixelsRemaining += xDivs[i + 1] - xDivs[i]; } int numFixedXPixelsRemaining = bitmapWidth - numStretchyXPixelsRemaining; int numStretchyYPixelsRemaining = 0; for (i = 0; i < numYDivs; i += 2) { - numStretchyYPixelsRemaining += chunk.yDivs[i + 1] - chunk.yDivs[i]; + numStretchyYPixelsRemaining += yDivs[i + 1] - yDivs[i]; } int numFixedYPixelsRemaining = bitmapHeight - numStretchyYPixelsRemaining; @@ -235,7 +237,7 @@ void NinePatch_Draw(SkCanvas* canvas, const SkRect& bounds, src.fBottom = bitmapHeight; dst.fBottom = bounds.fBottom; } else { - src.fBottom = chunk.yDivs[j]; + src.fBottom = yDivs[j]; const int srcYSize = src.fBottom - src.fTop; if (yIsStretchable) { dst.fBottom = dst.fTop + calculateStretch(bounds.fBottom, dst.fTop, @@ -252,15 +254,16 @@ void NinePatch_Draw(SkCanvas* canvas, const SkRect& bounds, xIsStretchable = initialXIsStretchable; // The initial xDiv and whether the first column is considered // stretchable or not depends on whether xDiv[0] was zero or not. + const uint32_t* colors = chunk.getColors(); for (i = xIsStretchable ? 1 : 0; i <= numXDivs && src.fLeft < bitmapWidth; i++, xIsStretchable = !xIsStretchable) { - color = chunk.colors[colorIndex++]; + color = colors[colorIndex++]; if (i == numXDivs) { src.fRight = bitmapWidth; dst.fRight = bounds.fRight; } else { - src.fRight = chunk.xDivs[i]; + src.fRight = xDivs[i]; if (dstRightsHaveBeenCached) { dst.fRight = dstRights[i]; } else { diff --git a/core/jni/android/graphics/NinePatchPeeker.cpp b/core/jni/android/graphics/NinePatchPeeker.cpp index df996af..51392ab 100644 --- a/core/jni/android/graphics/NinePatchPeeker.cpp +++ b/core/jni/android/graphics/NinePatchPeeker.cpp @@ -28,11 +28,11 @@ bool NinePatchPeeker::peek(const char tag[], const void* data, size_t length) { // You have to copy the data because it is owned by the png reader Res_png_9patch* patchNew = (Res_png_9patch*) malloc(patchSize); memcpy(patchNew, patch, patchSize); - // this relies on deserialization being done in place Res_png_9patch::deserialize(patchNew); patchNew->fileToDevice(); free(fPatch); fPatch = patchNew; + fPatchSize = patchSize; //printf("9patch: (%d,%d)-(%d,%d)\n", // fPatch.sizeLeft, fPatch.sizeTop, // fPatch.sizeRight, fPatch.sizeBottom); diff --git a/core/jni/android/graphics/NinePatchPeeker.h b/core/jni/android/graphics/NinePatchPeeker.h index 10d268a..2043862 100644 --- a/core/jni/android/graphics/NinePatchPeeker.h +++ b/core/jni/android/graphics/NinePatchPeeker.h @@ -29,6 +29,7 @@ public: // the host lives longer than we do, so a raw ptr is safe fHost = host; fPatch = NULL; + fPatchSize = 0; fLayoutBounds = NULL; } @@ -38,6 +39,7 @@ public: } Res_png_9patch* fPatch; + size_t fPatchSize; int *fLayoutBounds; virtual bool peek(const char tag[], const void* data, size_t length); |