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 898 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
909 | 909 |
910 SkIRect clippedSrcRect; | 910 SkIRect clippedSrcRect; |
911 SkIPoint clippedDstPoint; | 911 SkIPoint clippedDstPoint; |
912 // If the rect is outside the src or dst then we've already succeeded. | 912 // If the rect is outside the src or dst then we've already succeeded. |
913 if (!clip_srcrect_and_dstpoint(dst, | 913 if (!clip_srcrect_and_dstpoint(dst, |
914 src, | 914 src, |
915 srcRect, | 915 srcRect, |
916 dstPoint, | 916 dstPoint, |
917 &clippedSrcRect, | 917 &clippedSrcRect, |
918 &clippedDstPoint)) { | 918 &clippedDstPoint)) { |
919 SkASSERT(this->canCopySurface(dst, src, srcRect, dstPoint)); | 919 SkASSERT(GrDrawTarget::canCopySurface(dst, src, srcRect, dstPoint)); |
920 return true; | 920 return true; |
921 } | 921 } |
922 | 922 |
923 bool result = this->onCopySurface(dst, src, clippedSrcRect, clippedDstPoint)
; | 923 if (!GrDrawTarget::canCopySurface(dst, src, clippedSrcRect, clippedDstPoint)
) { |
924 SkASSERT(result == this->canCopySurface(dst, src, clippedSrcRect, clippedDst
Point)); | 924 return false; |
925 return result; | 925 } |
| 926 |
| 927 GrRenderTarget* rt = dst->asRenderTarget(); |
| 928 GrTexture* tex = src->asTexture(); |
| 929 |
| 930 GrDrawTarget::AutoStateRestore asr(this, kReset_ASRInit); |
| 931 this->drawState()->setRenderTarget(rt); |
| 932 SkMatrix matrix; |
| 933 matrix.setTranslate(SkIntToScalar(clippedSrcRect.fLeft - clippedDstPoint.fX)
, |
| 934 SkIntToScalar(clippedSrcRect.fTop - clippedDstPoint.fY))
; |
| 935 matrix.postIDiv(tex->width(), tex->height()); |
| 936 this->drawState()->addColorTextureProcessor(tex, matrix); |
| 937 SkIRect dstRect = SkIRect::MakeXYWH(clippedDstPoint.fX, |
| 938 clippedDstPoint.fY, |
| 939 clippedSrcRect.width(), |
| 940 clippedSrcRect.height()); |
| 941 this->drawSimpleRect(dstRect); |
| 942 return true; |
926 } | 943 } |
927 | 944 |
928 bool GrDrawTarget::canCopySurface(GrSurface* dst, | 945 bool GrDrawTarget::canCopySurface(GrSurface* dst, |
929 GrSurface* src, | 946 GrSurface* src, |
930 const SkIRect& srcRect, | 947 const SkIRect& srcRect, |
931 const SkIPoint& dstPoint) { | 948 const SkIPoint& dstPoint) { |
932 SkASSERT(dst); | 949 SkASSERT(dst); |
933 SkASSERT(src); | 950 SkASSERT(src); |
934 | 951 |
935 SkIRect clippedSrcRect; | 952 SkIRect clippedSrcRect; |
936 SkIPoint clippedDstPoint; | 953 SkIPoint clippedDstPoint; |
937 // If the rect is outside the src or dst then we're guaranteed success | 954 // If the rect is outside the src or dst then we're guaranteed success |
938 if (!clip_srcrect_and_dstpoint(dst, | 955 if (!clip_srcrect_and_dstpoint(dst, |
939 src, | 956 src, |
940 srcRect, | 957 srcRect, |
941 dstPoint, | 958 dstPoint, |
942 &clippedSrcRect, | 959 &clippedSrcRect, |
943 &clippedDstPoint)) { | 960 &clippedDstPoint)) { |
944 return true; | 961 return true; |
945 } | 962 } |
946 return this->onCanCopySurface(dst, src, clippedSrcRect, clippedDstPoint); | |
947 } | |
948 | 963 |
949 bool GrDrawTarget::onCanCopySurface(GrSurface* dst, | |
950 GrSurface* src, | |
951 const SkIRect& srcRect, | |
952 const SkIPoint& dstPoint) { | |
953 // Check that the read/write rects are contained within the src/dst bounds. | 964 // Check that the read/write rects are contained within the src/dst bounds. |
954 SkASSERT(!srcRect.isEmpty()); | 965 SkASSERT(!clippedSrcRect.isEmpty()); |
955 SkASSERT(SkIRect::MakeWH(src->width(), src->height()).contains(srcRect)); | 966 SkASSERT(SkIRect::MakeWH(src->width(), src->height()).contains(clippedSrcRec
t)); |
956 SkASSERT(dstPoint.fX >= 0 && dstPoint.fY >= 0); | 967 SkASSERT(clippedDstPoint.fX >= 0 && clippedDstPoint.fY >= 0); |
957 SkASSERT(dstPoint.fX + srcRect.width() <= dst->width() && | 968 SkASSERT(clippedDstPoint.fX + clippedSrcRect.width() <= dst->width() && |
958 dstPoint.fY + srcRect.height() <= dst->height()); | 969 clippedDstPoint.fY + clippedSrcRect.height() <= dst->height()); |
959 | 970 |
960 return !dst->surfacePriv().isSameAs(src) && dst->asRenderTarget() && src->as
Texture(); | 971 return !dst->surfacePriv().isSameAs(src) && dst->asRenderTarget() && src->as
Texture(); |
961 } | 972 } |
962 | 973 |
963 bool GrDrawTarget::onCopySurface(GrSurface* dst, | |
964 GrSurface* src, | |
965 const SkIRect& srcRect, | |
966 const SkIPoint& dstPoint) { | |
967 if (!GrDrawTarget::onCanCopySurface(dst, src, srcRect, dstPoint)) { | |
968 return false; | |
969 } | |
970 | |
971 GrRenderTarget* rt = dst->asRenderTarget(); | |
972 GrTexture* tex = src->asTexture(); | |
973 | |
974 GrDrawTarget::AutoStateRestore asr(this, kReset_ASRInit); | |
975 this->drawState()->setRenderTarget(rt); | |
976 SkMatrix matrix; | |
977 matrix.setTranslate(SkIntToScalar(srcRect.fLeft - dstPoint.fX), | |
978 SkIntToScalar(srcRect.fTop - dstPoint.fY)); | |
979 matrix.postIDiv(tex->width(), tex->height()); | |
980 this->drawState()->addColorTextureProcessor(tex, matrix); | |
981 SkIRect dstRect = SkIRect::MakeXYWH(dstPoint.fX, | |
982 dstPoint.fY, | |
983 srcRect.width(), | |
984 srcRect.height()); | |
985 this->drawSimpleRect(dstRect); | |
986 return true; | |
987 } | |
988 | |
989 void GrDrawTarget::initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* d
esc) { | 974 void GrDrawTarget::initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* d
esc) { |
990 // Make the dst of the copy be a render target because the default copySurfa
ce draws to the dst. | 975 // Make the dst of the copy be a render target because the default copySurfa
ce draws to the dst. |
991 desc->fOrigin = kDefault_GrSurfaceOrigin; | 976 desc->fOrigin = kDefault_GrSurfaceOrigin; |
992 desc->fFlags = kRenderTarget_GrSurfaceFlag | kNoStencil_GrSurfaceFlag; | 977 desc->fFlags = kRenderTarget_GrSurfaceFlag | kNoStencil_GrSurfaceFlag; |
993 desc->fConfig = src->config(); | 978 desc->fConfig = src->config(); |
994 } | 979 } |
995 | 980 |
996 /////////////////////////////////////////////////////////////////////////////// | 981 /////////////////////////////////////////////////////////////////////////////// |
997 | 982 |
998 void GrDrawTargetCaps::reset() { | 983 void GrDrawTargetCaps::reset() { |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1143 | 1128 |
1144 uint32_t GrDrawTargetCaps::CreateUniqueID() { | 1129 uint32_t GrDrawTargetCaps::CreateUniqueID() { |
1145 static int32_t gUniqueID = SK_InvalidUniqueID; | 1130 static int32_t gUniqueID = SK_InvalidUniqueID; |
1146 uint32_t id; | 1131 uint32_t id; |
1147 do { | 1132 do { |
1148 id = static_cast<uint32_t>(sk_atomic_inc(&gUniqueID) + 1); | 1133 id = static_cast<uint32_t>(sk_atomic_inc(&gUniqueID) + 1); |
1149 } while (id == SK_InvalidUniqueID); | 1134 } while (id == SK_InvalidUniqueID); |
1150 return id; | 1135 return id; |
1151 } | 1136 } |
1152 | 1137 |
OLD | NEW |