SkLinearBitmapPipeline::SkLinearBitmapPipeline( const SkMatrix& inverse, SkFilterQuality filterQuality, SkShader::TileMode xTile, SkShader::TileMode yTile, const SkPixmap& srcPixmap) { SkSize size = SkSize::Make(srcPixmap.width(), srcPixmap.height()); const SkImageInfo& srcImageInfo = srcPixmap.info(); // As the stages are built, the chooser function may skip a stage. For example, with the // identity matrix, the matrix stage is skipped, and the tilerStage is the first stage. auto placementStage = choose_pixel_placer(srcImageInfo.alphaType(), &fPixelStage); auto samplerStage = choose_pixel_sampler(placementStage, srcPixmap, &fSampleStage); auto tilerStage = choose_tiler(samplerStage, size, xTile, yTile, &fTileXOrBothStage, &fTileYStage); auto filterStage = choose_filter(tilerStage, filterQuality, &fFilterStage); fFirstStage = choose_matrix(filterStage, inverse, &fMatrixStage); }
SkLinearBitmapPipeline::SkLinearBitmapPipeline( const SkMatrix& inverse, SkFilterQuality filterQuality, SkShader::TileMode xTile, SkShader::TileMode yTile, float postAlpha, const SkPixmap& srcPixmap) { SkISize dimensions = srcPixmap.info().dimensions(); const SkImageInfo& srcImageInfo = srcPixmap.info(); SkMatrix adjustedInverse = inverse; if (filterQuality == kNone_SkFilterQuality) { if (inverse.getScaleX() >= 0.0f) { adjustedInverse.setTranslateX( nextafterf(inverse.getTranslateX(), std::floor(inverse.getTranslateX()))); } if (inverse.getScaleY() >= 0.0f) { adjustedInverse.setTranslateY( nextafterf(inverse.getTranslateY(), std::floor(inverse.getTranslateY()))); } } SkScalar dx = adjustedInverse.getScaleX(); // If it is an index 8 color type, the sampler converts to unpremul for better fidelity. SkAlphaType alphaType = srcImageInfo.alphaType(); if (srcPixmap.colorType() == kIndex_8_SkColorType) { alphaType = kUnpremul_SkAlphaType; } // As the stages are built, the chooser function may skip a stage. For example, with the // identity matrix, the matrix stage is skipped, and the tilerStage is the first stage. auto placementStage = choose_pixel_placer(alphaType, postAlpha, &fPixelStage); auto samplerStage = choose_pixel_sampler(placementStage, filterQuality, srcPixmap, &fSampleStage); auto tilerStage = choose_tiler(samplerStage, dimensions, xTile, yTile, filterQuality, dx, &fTiler); fFirstStage = choose_matrix(tilerStage, adjustedInverse, &fMatrixStage); }