| Index: src/core/SkLinearBitmapPipeline.cpp
|
| diff --git a/src/core/SkLinearBitmapPipeline.cpp b/src/core/SkLinearBitmapPipeline.cpp
|
| index d25335b0e7468ad4bc1ec026b08ac133c51e38b0..2a222481bb6b1096518abe68e68402c0506f2681 100644
|
| --- a/src/core/SkLinearBitmapPipeline.cpp
|
| +++ b/src/core/SkLinearBitmapPipeline.cpp
|
| @@ -7,6 +7,12 @@
|
|
|
| #include "SkLinearBitmapPipeline.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} { }
|
| @@ -190,18 +196,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);
|
| @@ -455,21 +461,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");
|
| @@ -535,16 +541,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);
|
|
|