diff options
-rw-r--r-- | bench/SkLinearBitmapPipelineBench.cpp | 4 | ||||
-rw-r--r-- | gm/SkLinearBitmapPipelineGM.cpp | 4 | ||||
-rw-r--r-- | src/core/SkLinearBitmapPipeline.cpp | 40 | ||||
-rw-r--r-- | src/core/SkLinearBitmapPipeline.h | 11 | ||||
-rw-r--r-- | tests/SkLinearBitmapPipelineTest.cpp | 7 |
5 files changed, 34 insertions, 32 deletions
diff --git a/bench/SkLinearBitmapPipelineBench.cpp b/bench/SkLinearBitmapPipelineBench.cpp index 89d4c79ba4..0fc2ac6a26 100644 --- a/bench/SkLinearBitmapPipelineBench.cpp +++ b/bench/SkLinearBitmapPipelineBench.cpp @@ -142,8 +142,10 @@ struct SkBitmapFPGeneral final : public CommonBitmapFPBenchmark { filterQuality = SkFilterQuality::kNone_SkFilterQuality; } + SkPixmap srcPixmap{fInfo, fBitmap.get(), static_cast<size_t>(4 * width)}; + SkLinearBitmapPipeline pipeline{ - fInvert, filterQuality, fXTile, fYTile, fInfo, fBitmap.get() }; + fInvert, filterQuality, fXTile, fYTile, srcPixmap}; int count = 100; diff --git a/gm/SkLinearBitmapPipelineGM.cpp b/gm/SkLinearBitmapPipelineGM.cpp index 7138a5dfde..a446b7442f 100644 --- a/gm/SkLinearBitmapPipelineGM.cpp +++ b/gm/SkLinearBitmapPipelineGM.cpp @@ -98,7 +98,6 @@ static void draw_rect_fp(SkCanvas* canvas, const SkRect& r, SkColor c, const SkM bmdst.peekPixels(&pmdst); SkPM4f* dstBits = new SkPM4f[ir.width()]; - SkImageInfo info = SkImageInfo::MakeN32(ir.width(), ir.height(), kPremul_SkAlphaType); SkMatrix inv; bool trash = mat->invert(&inv); @@ -120,8 +119,7 @@ static void draw_rect_fp(SkCanvas* canvas, const SkRect& r, SkColor c, const SkM SkLinearBitmapPipeline pipeline{ inv, filterQuality, - SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, - info, pmsrc.addr32()}; + SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, pmsrc}; for (int y = 0; y < ir.height(); y++) { pipeline.shadeSpan4f(0, y, dstBits, ir.width()); diff --git a/src/core/SkLinearBitmapPipeline.cpp b/src/core/SkLinearBitmapPipeline.cpp index edb0e88135..1565b7e32b 100644 --- a/src/core/SkLinearBitmapPipeline.cpp +++ b/src/core/SkLinearBitmapPipeline.cpp @@ -8,6 +8,12 @@ #include "SkLinearBitmapPipeline.h" #include "SkPM4f.h" +#include <algorithm> +#include <cmath> +#include <limits> +#include "SkColor.h" +#include "SkSize.h" + struct X { explicit X(SkScalar val) : fVal{val} { } explicit X(SkPoint pt) : fVal{pt.fX} { } @@ -191,18 +197,18 @@ public: void pointListFew(int n, Sk4fArg xs, Sk4fArg ys) override { SkASSERT(0 < n && n < 4); - // px00 px10 px01 px11 - const Sk4f kXOffsets{0.0f, 1.0f, 0.0f, 1.0f}, - kYOffsets{0.0f, 0.0f, 1.0f, 1.0f}; + // px00 px10 px01 px11 + const Sk4f kXOffsets{-0.5f, 0.5f, -0.5f, 0.5f}, + kYOffsets{-0.5f, -0.5f, 0.5f, 0.5f}; if (n >= 1) fNext->bilerpList(Sk4f{xs[0]} + kXOffsets, Sk4f{ys[0]} + kYOffsets); if (n >= 2) fNext->bilerpList(Sk4f{xs[1]} + kXOffsets, Sk4f{ys[1]} + kYOffsets); if (n >= 3) fNext->bilerpList(Sk4f{xs[2]} + kXOffsets, Sk4f{ys[2]} + kYOffsets); } void pointList4(Sk4fArg xs, Sk4fArg ys) override { - // px00 px10 px01 px11 - const Sk4f kXOffsets{0.0f, 1.0f, 0.0f, 1.0f}, - kYOffsets{0.0f, 0.0f, 1.0f, 1.0f}; + // px00 px10 px01 px11 + const Sk4f kXOffsets{-0.5f, 0.5f, -0.5f, 0.5f}, + kYOffsets{-0.5f, -0.5f, 0.5f, 0.5f}; fNext->bilerpList(Sk4f{xs[0]} + kXOffsets, Sk4f{ys[0]} + kYOffsets); fNext->bilerpList(Sk4f{xs[1]} + kXOffsets, Sk4f{ys[1]} + kYOffsets); fNext->bilerpList(Sk4f{xs[2]} + kXOffsets, Sk4f{ys[2]} + kYOffsets); @@ -456,21 +462,21 @@ private: static BilerpProcessorInterface* choose_pixel_sampler( PixelPlacerInterface* next, - const SkImageInfo& imageInfo, - const void* imageData, + const SkPixmap& srcPixmap, SkLinearBitmapPipeline::SampleStage* sampleStage) { + const SkImageInfo& imageInfo = srcPixmap.info(); switch (imageInfo.colorType()) { case kRGBA_8888_SkColorType: case kBGRA_8888_SkColorType: if (kN32_SkColorType == imageInfo.colorType()) { if (imageInfo.profileType() == kSRGB_SkColorProfileType) { sampleStage->Initialize<Sampler<Passthrough8888<kSRGB_SkColorProfileType>>>( - next, imageInfo.width(), - (uint32_t*)imageData); + next, static_cast<int>(srcPixmap.rowBytes() / 4), + srcPixmap.addr32()); } else { sampleStage->Initialize<Sampler<Passthrough8888<kLinear_SkColorProfileType>>>( - next, imageInfo.width(), - (uint32_t*)imageData); + next, static_cast<int>(srcPixmap.rowBytes() / 4), + srcPixmap.addr32()); } } else { SkFAIL("Not implemented. No 8888 Swizzle"); @@ -536,16 +542,14 @@ SkLinearBitmapPipeline::SkLinearBitmapPipeline( const SkMatrix& inverse, SkFilterQuality filterQuality, SkShader::TileMode xTile, SkShader::TileMode yTile, - const SkImageInfo& srcImageInfo, - const void* srcImageData) { - SkSize size; - size = srcImageInfo.dimensions(); + 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, srcImageInfo, - srcImageData, &fSampleStage); + 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); diff --git a/src/core/SkLinearBitmapPipeline.h b/src/core/SkLinearBitmapPipeline.h index 9d537df501..5f9da1ea4c 100644 --- a/src/core/SkLinearBitmapPipeline.h +++ b/src/core/SkLinearBitmapPipeline.h @@ -8,16 +8,12 @@ #ifndef SkLinearBitmapPipeline_DEFINED #define SkLinearBitmapPipeline_DEFINED -#include <algorithm> -#include <cmath> -#include <limits> -#include <cstdio> + #include "SkColor.h" #include "SkImageInfo.h" #include "SkMatrix.h" -#include "SkShader.h" -#include "SkSize.h" #include "SkNx.h" +#include "SkShader.h" using Sk4fArg = const Sk4f&; @@ -59,8 +55,7 @@ public: const SkMatrix& inverse, SkFilterQuality filterQuality, SkShader::TileMode xTile, SkShader::TileMode yTile, - const SkImageInfo& srcImageInfo, - const void* srcImageData); + const SkPixmap& srcPixmap); void shadeSpan4f(int x, int y, SkPM4f* dst, int count); diff --git a/tests/SkLinearBitmapPipelineTest.cpp b/tests/SkLinearBitmapPipelineTest.cpp index 851b2014d8..8a6ed087c3 100644 --- a/tests/SkLinearBitmapPipelineTest.cpp +++ b/tests/SkLinearBitmapPipelineTest.cpp @@ -41,13 +41,15 @@ DEF_TEST(SkBitmapFP, reporter) { const SkImageInfo info = SkImageInfo::MakeN32Premul(width, height, kLinear_SkColorProfileType); + SkPixmap srcPixmap{info, bitmap, static_cast<size_t>(4 * width)}; + SkLinearBitmapPipeline pipeline{invert, kNone_SkFilterQuality, SkShader::kClamp_TileMode, - SkShader::kClamp_TileMode, info, bitmap}; + SkShader::kClamp_TileMode, srcPixmap}; int count = 10; pipeline.shadeSpan4f(3, 6, FPbuffer, count); - +#if 0 Pixel* pixelBuffer = (Pixel*)FPbuffer; for (int i = 0; i < count; i++) { printf("i: %d - (%g, %g, %g, %g)\n", i, @@ -56,6 +58,7 @@ DEF_TEST(SkBitmapFP, reporter) { pixelBuffer[i][2] * 255.0f, pixelBuffer[i][3] * 255.0f); } +#endif delete [] bitmap; delete [] FPbuffer; |