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); |