OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2010 Google Inc. | 2 * Copyright 2010 Google Inc. |
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 "SkGr.h" | 8 #include "SkGr.h" |
9 | 9 |
10 #include "GrXferProcessor.h" | 10 #include "GrXferProcessor.h" |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 // If filtering is not desired then we want to ensure all texels in the resa
mpled image are | 238 // If filtering is not desired then we want to ensure all texels in the resa
mpled image are |
239 // copies of texels from the original. | 239 // copies of texels from the original. |
240 GrTextureParams params(SkShader::kClamp_TileMode, | 240 GrTextureParams params(SkShader::kClamp_TileMode, |
241 kBilerp_Stretch == stretch ? GrTextureParams::kBilerp
_FilterMode : | 241 kBilerp_Stretch == stretch ? GrTextureParams::kBilerp
_FilterMode : |
242 GrTextureParams::kNone_F
ilterMode); | 242 GrTextureParams::kNone_F
ilterMode); |
243 paint.addColorTextureProcessor(inputTexture, SkMatrix::I(), params); | 243 paint.addColorTextureProcessor(inputTexture, SkMatrix::I(), params); |
244 | 244 |
245 SkRect rect = SkRect::MakeWH(SkIntToScalar(rtDesc.fWidth), SkIntToScalar(rtD
esc.fHeight)); | 245 SkRect rect = SkRect::MakeWH(SkIntToScalar(rtDesc.fWidth), SkIntToScalar(rtD
esc.fHeight)); |
246 SkRect localRect = SkRect::MakeWH(1.f, 1.f); | 246 SkRect localRect = SkRect::MakeWH(1.f, 1.f); |
247 | 247 |
248 GrContext::AutoRenderTarget autoRT(context, stretched->asRenderTarget()); | |
249 GrContext::AutoClip ac(context, GrContext::AutoClip::kWideOpen_InitialClip); | 248 GrContext::AutoClip ac(context, GrContext::AutoClip::kWideOpen_InitialClip); |
250 context->drawNonAARectToRect(paint, SkMatrix::I(), rect, localRect); | 249 context->drawNonAARectToRect(stretched->asRenderTarget(), paint, SkMatrix::I
(), rect, |
| 250 localRect); |
251 | 251 |
252 return stretched; | 252 return stretched; |
253 } | 253 } |
254 | 254 |
255 #ifndef SK_IGNORE_ETC1_SUPPORT | 255 #ifndef SK_IGNORE_ETC1_SUPPORT |
256 static GrTexture *load_etc1_texture(GrContext* ctx, const GrContentKey& optional
Key, | 256 static GrTexture *load_etc1_texture(GrContext* ctx, const GrContentKey& optional
Key, |
257 const SkBitmap &bm, GrSurfaceDesc desc) { | 257 const SkBitmap &bm, GrSurfaceDesc desc) { |
258 SkAutoTUnref<SkData> data(bm.pixelRef()->refEncodedData()); | 258 SkAutoTUnref<SkData> data(bm.pixelRef()->refEncodedData()); |
259 | 259 |
260 // Is this even encoded data? | 260 // Is this even encoded data? |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 GrRenderTarget* renderTarget = result->asRenderTarget(); | 389 GrRenderTarget* renderTarget = result->asRenderTarget(); |
390 SkASSERT(renderTarget); | 390 SkASSERT(renderTarget); |
391 | 391 |
392 SkAutoTUnref<GrFragmentProcessor> | 392 SkAutoTUnref<GrFragmentProcessor> |
393 yuvToRgbProcessor(GrYUVtoRGBEffect::Create(yuvTextures[0], yuvTextures[1
], yuvTextures[2], | 393 yuvToRgbProcessor(GrYUVtoRGBEffect::Create(yuvTextures[0], yuvTextures[1
], yuvTextures[2], |
394 yuvInfo.fSize, yuvInfo.fColor
Space)); | 394 yuvInfo.fSize, yuvInfo.fColor
Space)); |
395 GrPaint paint; | 395 GrPaint paint; |
396 paint.addColorProcessor(yuvToRgbProcessor); | 396 paint.addColorProcessor(yuvToRgbProcessor); |
397 SkRect r = SkRect::MakeWH(SkIntToScalar(yuvInfo.fSize[0].fWidth), | 397 SkRect r = SkRect::MakeWH(SkIntToScalar(yuvInfo.fSize[0].fWidth), |
398 SkIntToScalar(yuvInfo.fSize[0].fHeight)); | 398 SkIntToScalar(yuvInfo.fSize[0].fHeight)); |
399 GrContext::AutoRenderTarget autoRT(ctx, renderTarget); | |
400 GrContext::AutoClip ac(ctx, GrContext::AutoClip::kWideOpen_InitialClip); | 399 GrContext::AutoClip ac(ctx, GrContext::AutoClip::kWideOpen_InitialClip); |
401 ctx->drawRect(paint, SkMatrix::I(), r); | 400 ctx->drawRect(renderTarget, paint, SkMatrix::I(), r); |
402 | 401 |
403 return result; | 402 return result; |
404 } | 403 } |
405 | 404 |
406 static GrTexture* create_unstretched_bitmap_texture(GrContext* ctx, | 405 static GrTexture* create_unstretched_bitmap_texture(GrContext* ctx, |
407 const SkBitmap& origBitmap, | 406 const SkBitmap& origBitmap, |
408 const GrContentKey& optional
Key) { | 407 const GrContentKey& optional
Key) { |
409 SkBitmap tmpBitmap; | 408 SkBitmap tmpBitmap; |
410 | 409 |
411 const SkBitmap* bitmap = &origBitmap; | 410 const SkBitmap* bitmap = &origBitmap; |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
633 *ctOut = ct; | 632 *ctOut = ct; |
634 } | 633 } |
635 if (ptOut) { | 634 if (ptOut) { |
636 *ptOut = pt; | 635 *ptOut = pt; |
637 } | 636 } |
638 return true; | 637 return true; |
639 } | 638 } |
640 | 639 |
641 /////////////////////////////////////////////////////////////////////////////// | 640 /////////////////////////////////////////////////////////////////////////////// |
642 | 641 |
643 void SkPaint2GrPaintNoShader(GrContext* context, const SkPaint& skPaint, GrColor
paintColor, | 642 void SkPaint2GrPaintNoShader(GrContext* context, GrRenderTarget* rt, const SkPai
nt& skPaint, |
644 bool constantColor, GrPaint* grPaint) { | 643 GrColor paintColor, bool constantColor, GrPaint* gr
Paint) { |
645 | 644 |
646 grPaint->setDither(skPaint.isDither()); | 645 grPaint->setDither(skPaint.isDither()); |
647 grPaint->setAntiAlias(skPaint.isAntiAlias()); | 646 grPaint->setAntiAlias(skPaint.isAntiAlias()); |
648 | 647 |
649 SkXfermode* mode = skPaint.getXfermode(); | 648 SkXfermode* mode = skPaint.getXfermode(); |
650 GrXPFactory* xpFactory = NULL; | 649 GrXPFactory* xpFactory = NULL; |
651 if (!SkXfermode::AsXPFactory(mode, &xpFactory)) { | 650 if (!SkXfermode::AsXPFactory(mode, &xpFactory)) { |
652 // Fall back to src-over | 651 // Fall back to src-over |
653 xpFactory = GrPorterDuffXPFactory::Create(SkXfermode::kSrcOver_Mode); | 652 xpFactory = GrPorterDuffXPFactory::Create(SkXfermode::kSrcOver_Mode); |
654 } | 653 } |
(...skipping 16 matching lines...) Expand all Loading... |
671 grPaint->addColorProcessor(fp); | 670 grPaint->addColorProcessor(fp); |
672 } | 671 } |
673 } | 672 } |
674 } | 673 } |
675 | 674 |
676 #ifndef SK_IGNORE_GPU_DITHER | 675 #ifndef SK_IGNORE_GPU_DITHER |
677 // If the dither flag is set, then we need to see if the underlying context | 676 // If the dither flag is set, then we need to see if the underlying context |
678 // supports it. If not, then install a dither effect. | 677 // supports it. If not, then install a dither effect. |
679 if (skPaint.isDither() && grPaint->numColorStages() > 0) { | 678 if (skPaint.isDither() && grPaint->numColorStages() > 0) { |
680 // What are we rendering into? | 679 // What are we rendering into? |
681 const GrRenderTarget *target = context->getRenderTarget(); | 680 SkASSERT(rt); |
682 SkASSERT(target); | |
683 | 681 |
684 // Suspect the dithering flag has no effect on these configs, otherwise | 682 // Suspect the dithering flag has no effect on these configs, otherwise |
685 // fall back on setting the appropriate state. | 683 // fall back on setting the appropriate state. |
686 if (target->config() == kRGBA_8888_GrPixelConfig || | 684 if (GrPixelConfigIs8888(rt->config()) || |
687 target->config() == kBGRA_8888_GrPixelConfig) { | 685 GrPixelConfigIs8888(rt->config())) { |
688 // The dither flag is set and the target is likely | 686 // The dither flag is set and the target is likely |
689 // not going to be dithered by the GPU. | 687 // not going to be dithered by the GPU. |
690 SkAutoTUnref<GrFragmentProcessor> fp(GrDitherEffect::Create()); | 688 SkAutoTUnref<GrFragmentProcessor> fp(GrDitherEffect::Create()); |
691 if (fp.get()) { | 689 if (fp.get()) { |
692 grPaint->addColorProcessor(fp); | 690 grPaint->addColorProcessor(fp); |
693 grPaint->setDither(false); | 691 grPaint->setDither(false); |
694 } | 692 } |
695 } | 693 } |
696 } | 694 } |
697 #endif | 695 #endif |
698 } | 696 } |
699 | 697 |
700 void SkPaint2GrPaintShader(GrContext* context, const SkPaint& skPaint, const SkM
atrix& viewM, | 698 void SkPaint2GrPaintShader(GrContext* context, GrRenderTarget* rt, const SkPaint
& skPaint, |
701 bool constantColor, GrPaint* grPaint) { | 699 const SkMatrix& viewM, bool constantColor, GrPaint* g
rPaint) { |
702 SkShader* shader = skPaint.getShader(); | 700 SkShader* shader = skPaint.getShader(); |
703 if (NULL == shader) { | 701 if (NULL == shader) { |
704 SkPaint2GrPaintNoShader(context, skPaint, SkColor2GrColor(skPaint.getCol
or()), | 702 SkPaint2GrPaintNoShader(context, rt, skPaint, SkColor2GrColor(skPaint.ge
tColor()), |
705 constantColor, grPaint); | 703 constantColor, grPaint); |
706 return; | 704 return; |
707 } | 705 } |
708 | 706 |
709 GrColor paintColor = SkColor2GrColor(skPaint.getColor()); | 707 GrColor paintColor = SkColor2GrColor(skPaint.getColor()); |
710 | 708 |
711 // Start a new block here in order to preserve our context state after calli
ng | 709 // Start a new block here in order to preserve our context state after calli
ng |
712 // asFragmentProcessor(). Since these calls get passed back to the client, w
e don't really | 710 // asFragmentProcessor(). Since these calls get passed back to the client, w
e don't really |
713 // want them messing around with the context. | 711 // want them messing around with the context. |
714 { | 712 { |
715 // SkShader::asFragmentProcessor() may do offscreen rendering. Save off
the current RT, | |
716 // and clip | |
717 GrContext::AutoRenderTarget art(context, NULL); | |
718 GrContext::AutoClip ac(context, GrContext::AutoClip::kWideOpen_InitialCl
ip); | 713 GrContext::AutoClip ac(context, GrContext::AutoClip::kWideOpen_InitialCl
ip); |
719 | 714 |
720 // Allow the shader to modify paintColor and also create an effect to be
installed as | 715 // Allow the shader to modify paintColor and also create an effect to be
installed as |
721 // the first color effect on the GrPaint. | 716 // the first color effect on the GrPaint. |
722 GrFragmentProcessor* fp = NULL; | 717 GrFragmentProcessor* fp = NULL; |
723 if (shader->asFragmentProcessor(context, skPaint, viewM, NULL, &paintCol
or, &fp) && fp) { | 718 if (shader->asFragmentProcessor(context, skPaint, viewM, NULL, &paintCol
or, &fp) && fp) { |
724 grPaint->addColorProcessor(fp)->unref(); | 719 grPaint->addColorProcessor(fp)->unref(); |
725 constantColor = false; | 720 constantColor = false; |
726 } | 721 } |
727 } | 722 } |
728 | 723 |
729 // The grcolor is automatically set when calling asFragmentProcessor. | 724 // The grcolor is automatically set when calling asFragmentProcessor. |
730 // If the shader can be seen as an effect it returns true and adds its effec
t to the grpaint. | 725 // If the shader can be seen as an effect it returns true and adds its effec
t to the grpaint. |
731 SkPaint2GrPaintNoShader(context, skPaint, paintColor, constantColor, grPaint
); | 726 SkPaint2GrPaintNoShader(context, rt, skPaint, paintColor, constantColor, grP
aint); |
732 } | 727 } |
OLD | NEW |