65 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
| /*
 | |
|  * Copyright 2019 Google Inc.
 | |
|  *
 | |
|  * Use of this source code is governed by a BSD-style license that can be
 | |
|  * found in the LICENSE file.
 | |
|  */
 | |
| 
 | |
| #include "gm/gm.h"
 | |
| #include "include/core/SkCanvas.h"
 | |
| #include "include/core/SkImage.h"
 | |
| #include "include/core/SkPaint.h"
 | |
| #include "include/core/SkRect.h"
 | |
| #include "include/core/SkRefCnt.h"
 | |
| #include "include/core/SkScalar.h"
 | |
| #include "tools/Resources.h"
 | |
| 
 | |
| DEF_SIMPLE_GM(skbug_8664, canvas, 830, 550) {
 | |
|     const struct {
 | |
|         SkScalar    fSx, fSy, fTx, fTy;
 | |
|     } xforms[] = {
 | |
|         { 1, 1, 0, 0 },
 | |
|         { 0.5f, 0.5f, 530, 0 },
 | |
|         { 0.25f, 0.25f, 530, 275 },
 | |
|         { 0.125f, 0.125f, 530, 420 },
 | |
|     };
 | |
| 
 | |
|     // Must be at least medium to require mipmaps when we downscale the image
 | |
|     SkSamplingOptions sampling(SkFilterMode::kLinear,
 | |
|                                SkMipmapMode::kLinear);
 | |
| 
 | |
|     sk_sp<SkImage> image(GetResourceAsImage("images/mandrill_512.png"));
 | |
| 
 | |
|     SkPaint overlayPaint;
 | |
|     overlayPaint.setColor(0x80FFFFFF);
 | |
| 
 | |
|     // Make the overlay visible even when the downscaled images fail to render
 | |
|     canvas->clear(0xFF888888);
 | |
| 
 | |
|     canvas->translate(20, 20);
 | |
|     for (const auto& xform : xforms) {
 | |
|         canvas->save();
 | |
|         canvas->translate(xform.fTx, xform.fTy);
 | |
|         canvas->scale(xform.fSx, xform.fSy);
 | |
| 
 | |
|         // Draw an image, possibly down sampled, which forces us to generate mipmaps inline
 | |
|         // on the second iteration.
 | |
|         canvas->drawImage(image, 0, 0, sampling, nullptr);
 | |
| 
 | |
|         // Draw an overlay that requires the scissor test for its clipping, so that the mipmap
 | |
|         // generation + scissor interference bug is highlighted in Adreno 330 devices.
 | |
|         SkRect inner = SkRect::MakeLTRB(32.f, 32.f, 480.f, 480.f);
 | |
|         SkRect outer = inner.makeOutset(16.f, 16.f);
 | |
| 
 | |
|         // Clip to smaller rectangle
 | |
|         canvas->save();
 | |
|         canvas->clipRect(inner);
 | |
|         // Then apply a rotation and draw a larger rectangle to ensure the clip cannot be dropped
 | |
|         canvas->rotate(20.f);
 | |
|         canvas->drawRect(outer, overlayPaint);
 | |
|         canvas->restore();
 | |
| 
 | |
|         canvas->restore();
 | |
|     }
 | |
| }
 |