Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright 2014 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "SkTypes.h"
      9 #if SK_SUPPORT_GPU
     10 #include "GrContextFactory.h"
     11 #endif
     12 #include "SkCanvas.h"
     13 #include "SkImage.h"
     14 #include "SkShader.h"
     15 #include "SkSurface.h"
     16 
     17 #include "Test.h"
     18 
     19 void testBitmapEquality(skiatest::Reporter* reporter, SkBitmap& bm1, SkBitmap& bm2) {
     20     SkAutoLockPixels lockBm1(bm1);
     21     SkAutoLockPixels lockBm2(bm2);
     22 
     23     REPORTER_ASSERT(reporter, bm1.getSize() == bm2.getSize());
     24     REPORTER_ASSERT(reporter, 0 == memcmp(bm1.getPixels(), bm2.getPixels(), bm1.getSize()));
     25 }
     26 
     27 void paintSource(SkSurface* sourceSurface) {
     28     SkCanvas* sourceCanvas = sourceSurface->getCanvas();
     29     sourceCanvas->clear(0xFFDEDEDE);
     30 
     31     SkPaint paintColor;
     32     paintColor.setColor(0xFFFF0000);
     33     paintColor.setStyle(SkPaint::kFill_Style);
     34 
     35     SkRect rect = SkRect::MakeXYWH(
     36             SkIntToScalar(1),
     37             SkIntToScalar(0),
     38             SkIntToScalar(1),
     39             SkIntToScalar(sourceSurface->height()));
     40 
     41     sourceCanvas->drawRect(rect, paintColor);
     42 }
     43 
     44 void runShaderTest(skiatest::Reporter* reporter, SkSurface* sourceSurface, SkSurface* destinationSurface, SkImageInfo& info) {
     45     paintSource(sourceSurface);
     46 
     47     SkAutoTUnref<SkImage> sourceImage(sourceSurface->newImageSnapshot());
     48     SkAutoTUnref<SkShader> sourceShader(sourceImage->newShader(
     49             SkShader::kRepeat_TileMode,
     50             SkShader::kRepeat_TileMode));
     51 
     52     SkPaint paint;
     53     paint.setShader(sourceShader);
     54 
     55     SkCanvas* destinationCanvas = destinationSurface->getCanvas();
     56     destinationCanvas->clear(SK_ColorTRANSPARENT);
     57     destinationCanvas->drawPaint(paint);
     58 
     59     SkIRect rect = info.bounds();
     60 
     61     SkBitmap bmOrig;
     62     sourceSurface->getCanvas()->readPixels(rect, &bmOrig);
     63 
     64 
     65     SkBitmap bm;
     66     destinationCanvas->readPixels(rect, &bm);
     67 
     68     testBitmapEquality(reporter, bmOrig, bm);
     69 
     70 
     71 
     72     // Test with a translated shader
     73     SkMatrix matrix;
     74     matrix.setTranslate(SkIntToScalar(-1), SkIntToScalar(0));
     75 
     76     SkAutoTUnref<SkShader> sourceShaderTranslated(sourceImage->newShader(
     77             SkShader::kRepeat_TileMode,
     78             SkShader::kRepeat_TileMode,
     79             &matrix));
     80 
     81     destinationCanvas->clear(SK_ColorTRANSPARENT);
     82 
     83     SkPaint paintTranslated;
     84     paintTranslated.setShader(sourceShaderTranslated);
     85 
     86     destinationCanvas->drawPaint(paintTranslated);
     87 
     88     SkBitmap bmt;
     89     destinationCanvas->readPixels(rect, &bmt);
     90 
     91     //  Test correctness
     92     {
     93         SkAutoLockPixels lockBm(bmt);
     94         for (int y = 0; y < info.height(); y++) {
     95             REPORTER_ASSERT(reporter, 0xFFFF0000 == bmt.getColor(0, y));
     96 
     97             for (int x = 1; x < info.width(); x++) {
     98                 REPORTER_ASSERT(reporter, 0xFFDEDEDE == bmt.getColor(x, y));
     99             }
    100         }
    101     }
    102 }
    103 
    104 DEF_TEST(ImageNewShader, reporter) {
    105     SkImageInfo info = SkImageInfo::MakeN32Premul(5, 5);
    106 
    107     SkAutoTUnref<SkSurface> sourceSurface(SkSurface::NewRaster(info));
    108     SkAutoTUnref<SkSurface> destinationSurface(SkSurface::NewRaster(info));
    109 
    110     runShaderTest(reporter, sourceSurface.get(), destinationSurface.get(), info);
    111 }
    112 
    113 #if SK_SUPPORT_GPU
    114 
    115 void gpuToGpu(skiatest::Reporter* reporter, GrContext* context) {
    116     SkImageInfo info = SkImageInfo::MakeN32Premul(5, 5);
    117 
    118     SkAutoTUnref<SkSurface> sourceSurface(
    119         SkSurface::NewRenderTarget(context, SkSurface::kNo_Budgeted, info));
    120     SkAutoTUnref<SkSurface> destinationSurface(
    121         SkSurface::NewRenderTarget(context, SkSurface::kNo_Budgeted, info));
    122 
    123     runShaderTest(reporter, sourceSurface.get(), destinationSurface.get(), info);
    124 }
    125 
    126 void gpuToRaster(skiatest::Reporter* reporter, GrContext* context) {
    127     SkImageInfo info = SkImageInfo::MakeN32Premul(5, 5);
    128 
    129     SkAutoTUnref<SkSurface> sourceSurface(SkSurface::NewRenderTarget(context,
    130         SkSurface::kNo_Budgeted, info));
    131     SkAutoTUnref<SkSurface> destinationSurface(SkSurface::NewRaster(info));
    132 
    133     runShaderTest(reporter, sourceSurface.get(), destinationSurface.get(), info);
    134 }
    135 
    136 void rasterToGpu(skiatest::Reporter* reporter, GrContext* context) {
    137     SkImageInfo info = SkImageInfo::MakeN32Premul(5, 5);
    138 
    139     SkAutoTUnref<SkSurface> sourceSurface(SkSurface::NewRaster(info));
    140     SkAutoTUnref<SkSurface> destinationSurface(SkSurface::NewRenderTarget(context,
    141         SkSurface::kNo_Budgeted, info));
    142 
    143     runShaderTest(reporter, sourceSurface.get(), destinationSurface.get(), info);
    144 }
    145 
    146 DEF_GPUTEST(ImageNewShader_GPU, reporter, factory) {
    147     for (int i = 0; i < GrContextFactory::kGLContextTypeCnt; ++i) {
    148         GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLContextType) i;
    149 
    150         if (!GrContextFactory::IsRenderingGLContext(glCtxType)) {
    151             continue;
    152         }
    153 
    154         GrContext* context = factory->get(glCtxType);
    155 
    156         if (NULL == context) {
    157             continue;
    158         }
    159 
    160         //  GPU -> GPU
    161         gpuToGpu(reporter, context);
    162 
    163         //  GPU -> RASTER
    164         gpuToRaster(reporter, context);
    165 
    166         //  RASTER -> GPU
    167         rasterToGpu(reporter, context);
    168     }
    169 }
    170 
    171 #endif
    172