Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit be84355f authored by nicolasroard's avatar nicolasroard
Browse files

Speed up load times

Compute the small res image on the fly
Load the high res preview image after first load

Change-Id: Icc556c2204cb4fd25766d90064a5756c877b11cc
parent 6a2491c0
Loading
Loading
Loading
Loading
+20 −5
Original line number Diff line number Diff line
@@ -498,6 +498,24 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL
        mCategoryBordersAdapter.reflectImagePreset(preset);
    }

    private class LoadHighresBitmapTask extends AsyncTask<Void, Void, Boolean> {
        @Override
        protected Boolean doInBackground(Void... params) {
            mImageLoader.loadHighResBitmap();
            return true;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            Bitmap highresBitmap = mImageLoader.getOriginalBitmapHighres();
            if (highresBitmap != null) {
                FilteringPipeline pipeline = FilteringPipeline.getPipeline();
                float highResPreviewScale = (float) highresBitmap.getWidth() / (float) mImageLoader.getOriginalBounds().width();
                pipeline.setHighResPreviewScaleFactor(highResPreviewScale);
            }
        }
    }

    private class LoadBitmapTask extends AsyncTask<Uri, Boolean, Boolean> {
        int mBitmapSize;

@@ -550,11 +568,6 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL
            pipeline.setOriginal(largeBitmap);
            float previewScale = (float) largeBitmap.getWidth() / (float) mImageLoader.getOriginalBounds().width();
            pipeline.setPreviewScaleFactor(previewScale);
            Bitmap highresBitmap = mImageLoader.getOriginalBitmapHighres();
            if (highresBitmap != null) {
                float highResPreviewScale = (float) highresBitmap.getWidth() / (float) mImageLoader.getOriginalBounds().width();
                pipeline.setHighResPreviewScaleFactor(highResPreviewScale);
            }
            if (!mShowingTinyPlanet) {
                mCategoryFiltersAdapter.removeTinyPlanet();
            }
@@ -578,6 +591,8 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL
            }
            mLoading = false;
            MasterImage.getImage().notifyGeometryChange();
            LoadHighresBitmapTask highresLoad = new LoadHighresBitmapTask();
            highresLoad.execute();
            super.onPostExecute(result);
        }

+3 −1
Original line number Diff line number Diff line
@@ -257,8 +257,10 @@ public class CachingPipeline implements PipelineInterface {
            if (request.getType() == RenderingRequest.HIGHRES_RENDERING) {
                ImageLoader loader = MasterImage.getImage().getImageLoader();
                bitmap = loader.getOriginalBitmapHighres();
                if (bitmap != null) {
                    bitmap = preset.applyGeometry(bitmap, mEnvironment);
                }
            }

            if (request.getType() == RenderingRequest.FULL_RENDERING
                    || request.getType() == RenderingRequest.GEOMETRY_RENDERING
+4 −0
Original line number Diff line number Diff line
@@ -174,6 +174,10 @@ public class FilteringPipeline implements Handler.Callback {
        }
        if (request.getType() == RenderingRequest.HIGHRES_RENDERING) {
            type = COMPUTE_HIGHRES_RENDERING_REQUEST;
            ImageLoader imageLoader = MasterImage.getImage().getImageLoader();
            if (imageLoader.getOriginalBitmapHighres() == null) {
                return;
            }
        }
        Message msg = mProcessingHandler.obtainMessage(type);
        msg.obj = request;
+19 −17
Original line number Diff line number Diff line
@@ -88,6 +88,7 @@ public class ImageLoader {
    private static int mZoomOrientation = ORI_NORMAL;

    static final int MAX_BITMAP_DIM = 900;
    static final int SMALL_BITMAP_DIM = 160;

    private ReentrantLock mLoadingLock = new ReentrantLock();

@@ -104,28 +105,29 @@ public class ImageLoader {
        return mActivity;
    }

    public void loadHighResBitmap() {
        if (MasterImage.getImage().supportsHighRes()) {
            int highresPreviewSize = mOriginalBitmapLarge.getWidth() * 2;
            if (highresPreviewSize > mOriginalBounds.width()) {
                highresPreviewSize = mOriginalBounds.width();
            }
            mOriginalBitmapHighres = loadScaledBitmap(mUri, highresPreviewSize, false);
            if (mOrientation > 1 && mOriginalBitmapHighres != null) {
                mOriginalBitmapHighres = rotateToPortrait(mOriginalBitmapHighres, mOrientation);
            }
            warnListeners();
        }
    }

    public boolean loadBitmap(Uri uri, int size) {
        mLoadingLock.lock();
        mUri = uri;
        mOrientation = getOrientation(mContext, uri);
        mOriginalBitmapSmall = loadScaledBitmap(uri, 160);
        if (mOriginalBitmapSmall == null) {
            // Couldn't read the bitmap, let's exit
            mLoadingLock.unlock();
            return false;
        }
        mOriginalBitmapLarge = loadScaledBitmap(uri, size);
        if (mOriginalBitmapLarge == null) {
            mLoadingLock.unlock();
            return false;
        }
        if (MasterImage.getImage().supportsHighRes()) {
            int highresPreviewSize = mOriginalBitmapLarge.getWidth() * 2;
            if (highresPreviewSize > mOriginalBounds.width()) {
                highresPreviewSize = mOriginalBounds.width();
            }
            mOriginalBitmapHighres = loadScaledBitmap(uri, highresPreviewSize, false);
        }
        updateBitmaps();
        mLoadingLock.unlock();
        return true;
@@ -194,12 +196,11 @@ public class ImageLoader {

    private void updateBitmaps() {
        if (mOrientation > 1) {
            mOriginalBitmapSmall = rotateToPortrait(mOriginalBitmapSmall, mOrientation);
            mOriginalBitmapLarge = rotateToPortrait(mOriginalBitmapLarge, mOrientation);
            if (mOriginalBitmapHighres != null) {
                mOriginalBitmapHighres = rotateToPortrait(mOriginalBitmapHighres, mOrientation);
            }
        }
        int sw = SMALL_BITMAP_DIM;
        int sh = (int) (sw * (float) mOriginalBitmapLarge.getHeight() / (float) mOriginalBitmapLarge.getWidth());
        mOriginalBitmapSmall = Bitmap.createScaledBitmap(mOriginalBitmapLarge, sw, sh, true);
        mZoomOrientation = mOrientation;
        warnListeners();
    }
@@ -369,6 +370,7 @@ public class ImageLoader {
                ImageShow imageShow = mListeners.elementAt(i);
                imageShow.imageLoaded();
            }
            MasterImage.getImage().invalidatePreview();
        }
    };