Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1331)

Side by Side Diff: src/core/SkBlitter.cpp

Issue 816003002: Add device space skshader GM to test kDevice_GrCoordSet (Closed) Base URL: https://skia.googlesource.com/skia.git@kpos
Patch Set: add #if SK_SUPPORT_GPU, make FP a non-local class so it can be a template param in c++03. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « include/gpu/GrColor.h ('k') | tests/GpuColorFilterTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2006 The Android Open Source Project 2 * Copyright 2006 The Android Open Source Project
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkBlitter.h" 8 #include "SkBlitter.h"
9 #include "SkAntiRun.h" 9 #include "SkAntiRun.h"
10 #include "SkColor.h" 10 #include "SkColor.h"
(...skipping 823 matching lines...) Expand 10 before | Expand all | Expand 10 after
834 return kNormal_XferInterp; 834 return kNormal_XferInterp;
835 } 835 }
836 836
837 SkBlitter* SkBlitter::Choose(const SkBitmap& device, 837 SkBlitter* SkBlitter::Choose(const SkBitmap& device,
838 const SkMatrix& matrix, 838 const SkMatrix& matrix,
839 const SkPaint& origPaint, 839 const SkPaint& origPaint,
840 SkTBlitterAllocator* allocator, 840 SkTBlitterAllocator* allocator,
841 bool drawCoverage) { 841 bool drawCoverage) {
842 SkASSERT(allocator != NULL); 842 SkASSERT(allocator != NULL);
843 843
844 SkBlitter* blitter = NULL;
845
846 // which check, in case we're being called by a client with a dummy device 844 // which check, in case we're being called by a client with a dummy device
847 // (e.g. they have a bounder that always aborts the draw) 845 // (e.g. they have a bounder that always aborts the draw)
848 if (kUnknown_SkColorType == device.colorType() || 846 if (kUnknown_SkColorType == device.colorType() ||
849 (drawCoverage && (kAlpha_8_SkColorType != device.colorType()))) { 847 (drawCoverage && (kAlpha_8_SkColorType != device.colorType()))) {
850 blitter = allocator->createT<SkNullBlitter>(); 848 return allocator->createT<SkNullBlitter>();
851 return blitter;
852 } 849 }
853 850
854 SkShader* shader = origPaint.getShader(); 851 SkShader* shader = origPaint.getShader();
855 SkColorFilter* cf = origPaint.getColorFilter(); 852 SkColorFilter* cf = origPaint.getColorFilter();
856 SkXfermode* mode = origPaint.getXfermode(); 853 SkXfermode* mode = origPaint.getXfermode();
857 Sk3DShader* shader3D = NULL; 854 Sk3DShader* shader3D = NULL;
858 855
859 SkTCopyOnFirstWrite<SkPaint> paint(origPaint); 856 SkTCopyOnFirstWrite<SkPaint> paint(origPaint);
860 857
861 if (origPaint.getMaskFilter() != NULL && 858 if (origPaint.getMaskFilter() != NULL &&
862 origPaint.getMaskFilter()->getFormat() == SkMask::k3D_Format) { 859 origPaint.getMaskFilter()->getFormat() == SkMask::k3D_Format) {
863 shader3D = SkNEW_ARGS(Sk3DShader, (shader)); 860 shader3D = SkNEW_ARGS(Sk3DShader, (shader));
864 // we know we haven't initialized lazyPaint yet, so just do it 861 // we know we haven't initialized lazyPaint yet, so just do it
865 paint.writable()->setShader(shader3D)->unref(); 862 paint.writable()->setShader(shader3D)->unref();
866 shader = shader3D; 863 shader = shader3D;
867 } 864 }
868 865
869 if (mode) { 866 if (mode) {
870 switch (interpret_xfermode(*paint, mode, device.colorType())) { 867 switch (interpret_xfermode(*paint, mode, device.colorType())) {
871 case kSrcOver_XferInterp: 868 case kSrcOver_XferInterp:
872 mode = NULL; 869 mode = NULL;
873 paint.writable()->setXfermode(NULL); 870 paint.writable()->setXfermode(NULL);
874 break; 871 break;
875 case kSkipDrawing_XferInterp:{ 872 case kSkipDrawing_XferInterp:{
876 blitter = allocator->createT<SkNullBlitter>(); 873 return allocator->createT<SkNullBlitter>();
877 return blitter;
878 } 874 }
879 default: 875 default:
880 break; 876 break;
881 } 877 }
882 } 878 }
883 879
884 /* 880 /*
885 * If the xfermode is CLEAR, then we can completely ignore the installed 881 * If the xfermode is CLEAR, then we can completely ignore the installed
886 * color/shader/colorfilter, and just pretend we're SRC + color==0. This 882 * color/shader/colorfilter, and just pretend we're SRC + color==0. This
887 * will fall into our optimizations for SRC mode. 883 * will fall into our optimizations for SRC mode.
(...skipping 26 matching lines...) Expand all
914 SkASSERT(shader); 910 SkASSERT(shader);
915 shader = SkNEW_ARGS(SkFilterShader, (shader, cf)); 911 shader = SkNEW_ARGS(SkFilterShader, (shader, cf));
916 paint.writable()->setShader(shader)->unref(); 912 paint.writable()->setShader(shader)->unref();
917 // blitters should ignore the presence/absence of a filter, since 913 // blitters should ignore the presence/absence of a filter, since
918 // if there is one, the shader will take care of it. 914 // if there is one, the shader will take care of it.
919 } 915 }
920 916
921 /* 917 /*
922 * We create a SkShader::Context object, and store it on the blitter. 918 * We create a SkShader::Context object, and store it on the blitter.
923 */ 919 */
924 SkShader::Context* shaderContext; 920 SkShader::Context* shaderContext = NULL;
925 if (shader) { 921 if (shader) {
926 SkShader::ContextRec rec(device, *paint, matrix); 922 SkShader::ContextRec rec(device, *paint, matrix);
927 // Try to create the ShaderContext 923 size_t contextSize = shader->contextSize();
928 void* storage = allocator->reserveT<SkShader::Context>(shader->contextSi ze()); 924 if (contextSize) {
929 shaderContext = shader->createContext(rec, storage); 925 // Try to create the ShaderContext
930 if (!shaderContext) { 926 void* storage = allocator->reserveT<SkShader::Context>(contextSize);
931 allocator->freeLast(); 927 shaderContext = shader->createContext(rec, storage);
932 blitter = allocator->createT<SkNullBlitter>(); 928 if (!shaderContext) {
933 return blitter; 929 allocator->freeLast();
930 return allocator->createT<SkNullBlitter>();
931 }
932 SkASSERT(shaderContext);
933 SkASSERT((void*) shaderContext == storage);
934 } else {
935 return allocator->createT<SkNullBlitter>();
934 } 936 }
935 SkASSERT(shaderContext);
936 SkASSERT((void*) shaderContext == storage);
937 } else {
938 shaderContext = NULL;
939 } 937 }
940 938
941 939 SkBlitter* blitter = NULL;
942 switch (device.colorType()) { 940 switch (device.colorType()) {
943 case kAlpha_8_SkColorType: 941 case kAlpha_8_SkColorType:
944 if (drawCoverage) { 942 if (drawCoverage) {
945 SkASSERT(NULL == shader); 943 SkASSERT(NULL == shader);
946 SkASSERT(NULL == paint->getXfermode()); 944 SkASSERT(NULL == paint->getXfermode());
947 blitter = allocator->createT<SkA8_Coverage_Blitter>(device, *pai nt); 945 blitter = allocator->createT<SkA8_Coverage_Blitter>(device, *pai nt);
948 } else if (shader) { 946 } else if (shader) {
949 blitter = allocator->createT<SkA8_Shader_Blitter>(device, *paint , shaderContext); 947 blitter = allocator->createT<SkA8_Shader_Blitter>(device, *paint , shaderContext);
950 } else { 948 } else {
951 blitter = allocator->createT<SkA8_Blitter>(device, *paint); 949 blitter = allocator->createT<SkA8_Blitter>(device, *paint);
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1026 fShaderContext->~Context(); 1024 fShaderContext->~Context();
1027 SkShader::Context* ctx = fShader->createContext(rec, (void*)fShaderContext); 1025 SkShader::Context* ctx = fShader->createContext(rec, (void*)fShaderContext);
1028 if (NULL == ctx) { 1026 if (NULL == ctx) {
1029 // Need a valid context in fShaderContext's storage, so we can later (or our caller) call 1027 // Need a valid context in fShaderContext's storage, so we can later (or our caller) call
1030 // the in-place destructor. 1028 // the in-place destructor.
1031 SkNEW_PLACEMENT_ARGS(fShaderContext, SkTransparentShaderContext, (*fShad er, rec)); 1029 SkNEW_PLACEMENT_ARGS(fShaderContext, SkTransparentShaderContext, (*fShad er, rec));
1032 return false; 1030 return false;
1033 } 1031 }
1034 return true; 1032 return true;
1035 } 1033 }
OLDNEW
« no previous file with comments | « include/gpu/GrColor.h ('k') | tests/GpuColorFilterTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698