| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2010 Google Inc. | 3 * Copyright 2010 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 | 9 |
| 10 | 10 |
| (...skipping 903 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 914 | 914 |
| 915 SkIRect clippedSrcRect; | 915 SkIRect clippedSrcRect; |
| 916 SkIPoint clippedDstPoint; | 916 SkIPoint clippedDstPoint; |
| 917 // If the rect is outside the src or dst then we've already succeeded. | 917 // If the rect is outside the src or dst then we've already succeeded. |
| 918 if (!clip_srcrect_and_dstpoint(dst, | 918 if (!clip_srcrect_and_dstpoint(dst, |
| 919 src, | 919 src, |
| 920 srcRect, | 920 srcRect, |
| 921 dstPoint, | 921 dstPoint, |
| 922 &clippedSrcRect, | 922 &clippedSrcRect, |
| 923 &clippedDstPoint)) { | 923 &clippedDstPoint)) { |
| 924 SkASSERT(GrDrawTarget::canCopySurface(dst, src, srcRect, dstPoint)); | |
| 925 return true; | 924 return true; |
| 926 } | 925 } |
| 927 | 926 |
| 928 if (!GrDrawTarget::canCopySurface(dst, src, clippedSrcRect, clippedDstPoint)
) { | 927 if (this->onCopySurface(dst, src, clippedSrcRect, clippedDstPoint)) { |
| 929 return false; | 928 return true; |
| 930 } | 929 } |
| 931 | 930 |
| 932 GrRenderTarget* rt = dst->asRenderTarget(); | 931 GrRenderTarget* rt = dst->asRenderTarget(); |
| 933 GrTexture* tex = src->asTexture(); | 932 GrTexture* tex = src->asTexture(); |
| 934 | 933 |
| 934 if ((dst == src) || !rt || !tex) { |
| 935 return false; |
| 936 } |
| 937 |
| 935 GrDrawState drawState; | 938 GrDrawState drawState; |
| 936 drawState.setRenderTarget(rt); | 939 drawState.setRenderTarget(rt); |
| 937 SkMatrix matrix; | 940 SkMatrix matrix; |
| 938 matrix.setTranslate(SkIntToScalar(clippedSrcRect.fLeft - clippedDstPoint.fX)
, | 941 matrix.setTranslate(SkIntToScalar(clippedSrcRect.fLeft - clippedDstPoint.fX)
, |
| 939 SkIntToScalar(clippedSrcRect.fTop - clippedDstPoint.fY))
; | 942 SkIntToScalar(clippedSrcRect.fTop - clippedDstPoint.fY))
; |
| 940 matrix.postIDiv(tex->width(), tex->height()); | 943 matrix.postIDiv(tex->width(), tex->height()); |
| 941 drawState.addColorTextureProcessor(tex, matrix); | 944 drawState.addColorTextureProcessor(tex, matrix); |
| 942 SkIRect dstRect = SkIRect::MakeXYWH(clippedDstPoint.fX, | 945 SkIRect dstRect = SkIRect::MakeXYWH(clippedDstPoint.fX, |
| 943 clippedDstPoint.fY, | 946 clippedDstPoint.fY, |
| 944 clippedSrcRect.width(), | 947 clippedSrcRect.width(), |
| (...skipping 13 matching lines...) Expand all Loading... |
| 958 SkIPoint clippedDstPoint; | 961 SkIPoint clippedDstPoint; |
| 959 // If the rect is outside the src or dst then we're guaranteed success | 962 // If the rect is outside the src or dst then we're guaranteed success |
| 960 if (!clip_srcrect_and_dstpoint(dst, | 963 if (!clip_srcrect_and_dstpoint(dst, |
| 961 src, | 964 src, |
| 962 srcRect, | 965 srcRect, |
| 963 dstPoint, | 966 dstPoint, |
| 964 &clippedSrcRect, | 967 &clippedSrcRect, |
| 965 &clippedDstPoint)) { | 968 &clippedDstPoint)) { |
| 966 return true; | 969 return true; |
| 967 } | 970 } |
| 971 return this->internalCanCopySurface(dst, src, clippedSrcRect, clippedDstPoin
t); |
| 972 } |
| 968 | 973 |
| 974 bool GrDrawTarget::internalCanCopySurface(const GrSurface* dst, |
| 975 const GrSurface* src, |
| 976 const SkIRect& clippedSrcRect, |
| 977 const SkIPoint& clippedDstPoint) { |
| 969 // Check that the read/write rects are contained within the src/dst bounds. | 978 // Check that the read/write rects are contained within the src/dst bounds. |
| 970 SkASSERT(!clippedSrcRect.isEmpty()); | 979 SkASSERT(!clippedSrcRect.isEmpty()); |
| 971 SkASSERT(SkIRect::MakeWH(src->width(), src->height()).contains(clippedSrcRec
t)); | 980 SkASSERT(SkIRect::MakeWH(src->width(), src->height()).contains(clippedSrcRec
t)); |
| 972 SkASSERT(clippedDstPoint.fX >= 0 && clippedDstPoint.fY >= 0); | 981 SkASSERT(clippedDstPoint.fX >= 0 && clippedDstPoint.fY >= 0); |
| 973 SkASSERT(clippedDstPoint.fX + clippedSrcRect.width() <= dst->width() && | 982 SkASSERT(clippedDstPoint.fX + clippedSrcRect.width() <= dst->width() && |
| 974 clippedDstPoint.fY + clippedSrcRect.height() <= dst->height()); | 983 clippedDstPoint.fY + clippedSrcRect.height() <= dst->height()); |
| 975 | 984 |
| 976 return (dst != src) && dst->asRenderTarget() && src->asTexture(); | 985 // The base class can do it as a draw or the subclass may be able to handle
it. |
| 977 } | 986 return ((dst != src) && dst->asRenderTarget() && src->asTexture()) || |
| 978 | 987 this->onCanCopySurface(dst, src, clippedSrcRect, clippedDstPoint); |
| 979 void GrDrawTarget::initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* d
esc) { | |
| 980 // Make the dst of the copy be a render target because the default copySurfa
ce draws to the dst. | |
| 981 desc->fOrigin = kDefault_GrSurfaceOrigin; | |
| 982 desc->fFlags = kRenderTarget_GrSurfaceFlag | kNoStencil_GrSurfaceFlag; | |
| 983 desc->fConfig = src->config(); | |
| 984 } | 988 } |
| 985 | 989 |
| 986 /////////////////////////////////////////////////////////////////////////////// | 990 /////////////////////////////////////////////////////////////////////////////// |
| 987 | 991 |
| 988 void GrDrawTargetCaps::reset() { | 992 void GrDrawTargetCaps::reset() { |
| 989 fMipMapSupport = false; | 993 fMipMapSupport = false; |
| 990 fNPOTTextureTileSupport = false; | 994 fNPOTTextureTileSupport = false; |
| 991 fTwoSidedStencilSupport = false; | 995 fTwoSidedStencilSupport = false; |
| 992 fStencilWrapOpsSupport = false; | 996 fStencilWrapOpsSupport = false; |
| 993 fHWAALineSupport = false; | 997 fHWAALineSupport = false; |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1155 GrDrawState::AutoRestoreStencil* ars, | 1159 GrDrawState::AutoRestoreStencil* ars, |
| 1156 GrDrawState* ds, | 1160 GrDrawState* ds, |
| 1157 GrClipMaskManager::ScissorState* scissorState) { | 1161 GrClipMaskManager::ScissorState* scissorState) { |
| 1158 return fClipMaskManager.setupClipping(ds, | 1162 return fClipMaskManager.setupClipping(ds, |
| 1159 are, | 1163 are, |
| 1160 ars, | 1164 ars, |
| 1161 scissorState, | 1165 scissorState, |
| 1162 this->getClip(), | 1166 this->getClip(), |
| 1163 devBounds); | 1167 devBounds); |
| 1164 } | 1168 } |
| OLD | NEW |