diff options
Diffstat (limited to 'libs/hwui/OpenGLRenderer.cpp')
| -rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 80 | 
1 files changed, 38 insertions, 42 deletions
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 7fe0a69274e4..428980e485f1 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -635,38 +635,17 @@ bool OpenGLRenderer::restoreSnapshot() {  ///////////////////////////////////////////////////////////////////////////////  int OpenGLRenderer::saveLayer(float left, float top, float right, float bottom, -        SkPaint* p, int flags) { +        int alpha, SkXfermode::Mode mode, int flags) {      const GLuint previousFbo = mSnapshot->fbo;      const int count = saveSnapshot(flags);      if (!mSnapshot->isIgnored()) { -        int alpha = 255; -        SkXfermode::Mode mode; - -        if (p) { -            alpha = p->getAlpha(); -            mode = getXfermode(p->getXfermode()); -        } else { -            mode = SkXfermode::kSrcOver_Mode; -        } -          createLayer(left, top, right, bottom, alpha, mode, flags, previousFbo);      }      return count;  } -int OpenGLRenderer::saveLayerAlpha(float left, float top, float right, float bottom, -        int alpha, int flags) { -    if (alpha >= 255) { -        return saveLayer(left, top, right, bottom, NULL, flags); -    } else { -        SkPaint paint; -        paint.setAlpha(alpha); -        return saveLayer(left, top, right, bottom, &paint, flags); -    } -} -  /**   * Layers are viewed by Skia are slightly different than layers in image editing   * programs (for instance.) When a layer is created, previously created layers @@ -1225,36 +1204,48 @@ void OpenGLRenderer::clearLayerRegions() {  // State Deferral  /////////////////////////////////////////////////////////////////////////////// -bool OpenGLRenderer::storeDisplayState(DeferredDisplayState& state) { +bool OpenGLRenderer::storeDisplayState(DeferredDisplayState& state, int stateDeferFlags) {      const Rect& currentClip = *(mSnapshot->clipRect);      const mat4& currentMatrix = *(mSnapshot->transform); -    // state only has bounds initialized in local coordinates -    if (!state.mBounds.isEmpty()) { -        currentMatrix.mapRect(state.mBounds); -        if (!state.mBounds.intersect(currentClip)) { -            // quick rejected -            return true; +    if (stateDeferFlags & kStateDeferFlag_Draw) { +        // state has bounds initialized in local coordinates +        if (!state.mBounds.isEmpty()) { +            currentMatrix.mapRect(state.mBounds); +            if (!state.mBounds.intersect(currentClip)) { +                // quick rejected +                return true; +            } +        } else { +            state.mBounds.set(currentClip);          } +        state.mDrawModifiers = mDrawModifiers; +        state.mAlpha = mSnapshot->alpha; +    } + +    if (stateDeferFlags & kStateDeferFlag_Clip) { +        state.mClip.set(currentClip);      } else { -        state.mBounds.set(currentClip); +        state.mClip.setEmpty();      } -    state.mClip.set(currentClip); +    // transform always deferred      state.mMatrix.load(currentMatrix); -    state.mDrawModifiers = mDrawModifiers;      return false;  } -void OpenGLRenderer::restoreDisplayState(const DeferredDisplayState& state) { +void OpenGLRenderer::restoreDisplayState(const DeferredDisplayState& state, int stateDeferFlags) {      currentTransform().load(state.mMatrix); -    // NOTE: a clip RECT will be saved and restored, but DeferredDisplayState doesn't support -    // complex clips. In the future, we should add support for deferral of operations clipped by -    // these. for now, we don't defer with complex clips (see OpenGLRenderer::disallowDeferral()) -    mSnapshot->setClip(state.mClip.left, state.mClip.top, state.mClip.right, state.mClip.bottom); -    dirtyClip(); -    mDrawModifiers = state.mDrawModifiers; +    if (stateDeferFlags & kStateDeferFlag_Draw) { +        mDrawModifiers = state.mDrawModifiers; +        mSnapshot->alpha = state.mAlpha; +    } + +    if (!state.mClip.isEmpty()) { //stateDeferFlags & kStateDeferFlag_Clip) { +        mSnapshot->setClip(state.mClip.left, state.mClip.top, state.mClip.right, state.mClip.bottom); +        dirtyClip(); +    }  }  /////////////////////////////////////////////////////////////////////////////// @@ -1805,16 +1796,21 @@ void OpenGLRenderer::finishDrawTexture() {  // Drawing  /////////////////////////////////////////////////////////////////////////////// -status_t OpenGLRenderer::drawDisplayList(DisplayList* displayList, Rect& dirty, int32_t flags) { +status_t OpenGLRenderer::drawDisplayList(DisplayList* displayList, Rect& dirty, +        int32_t replayFlags) {      // All the usual checks and setup operations (quickReject, setupDraw, etc.)      // will be performed by the display list itself      if (displayList && displayList->isRenderable()) {          if (CC_UNLIKELY(mCaches.drawDeferDisabled)) { -            return displayList->replay(*this, dirty, flags, 0); +            ReplayStateStruct replayStruct(*this, dirty, replayFlags); +            displayList->replay(replayStruct, 0); +            return replayStruct.mDrawGlStatus;          }          DeferredDisplayList deferredList; -        return displayList->replay(*this, dirty, flags, 0, &deferredList); +        DeferStateStruct deferStruct(deferredList, *this, replayFlags); +        displayList->defer(deferStruct, 0); +        return deferredList.flush(*this, dirty);      }      return DrawGlInfo::kStatusDone;  |