Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1171)

Side by Side Diff: src/core/SkBitmapProcState.h

Issue 1529833003: Repeating SkBitmapProcState rounding bias (Closed) Base URL: https://chromium.googlesource.com/skia.git@master
Patch Set: v2 (SkBitmapProcStateAutoMapper) Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/core/SkBitmapProcState.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2007 The Android Open Source Project 2 * Copyright 2007 The Android Open Source Project
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef SkBitmapProcState_DEFINED 8 #ifndef SkBitmapProcState_DEFINED
9 #define SkBitmapProcState_DEFINED 9 #define SkBitmapProcState_DEFINED
10 10
11 #include "SkBitmap.h" 11 #include "SkBitmap.h"
12 #include "SkBitmapController.h" 12 #include "SkBitmapController.h"
13 #include "SkBitmapFilter.h" 13 #include "SkBitmapFilter.h"
14 #include "SkBitmapProvider.h" 14 #include "SkBitmapProvider.h"
15 #include "SkFloatBits.h" 15 #include "SkFloatBits.h"
16 #include "SkMatrix.h" 16 #include "SkMatrix.h"
17 #include "SkMipMap.h" 17 #include "SkMipMap.h"
18 #include "SkPaint.h" 18 #include "SkPaint.h"
19 #include "SkShader.h" 19 #include "SkShader.h"
20 #include "SkTemplates.h" 20 #include "SkTemplates.h"
21 21
22 typedef SkFixed3232 SkFractionalInt; 22 typedef SkFixed3232 SkFractionalInt;
23 #define SkScalarToFractionalInt(x) SkScalarToFixed3232(x) 23 #define SkScalarToFractionalInt(x) SkScalarToFixed3232(x)
24 #define SkFractionalIntToFixed(x) SkFixed3232ToFixed(x) 24 #define SkFractionalIntToFixed(x) SkFixed3232ToFixed(x)
25 #define SkFixedToFractionalInt(x) SkFixedToFixed3232(x) 25 #define SkFixedToFractionalInt(x) SkFixedToFixed3232(x)
26 #define SkFractionalIntToInt(x) SkFixed3232ToInt(x) 26 #define SkFractionalIntToInt(x) SkFixed3232ToInt(x)
27 27
28 // Applying a fixed point (SkFixed, SkFractionalInt) epsilon bias ensures that t he inverse-mapped
29 // bitmap coordinates are rounded consistently WRT geometry. Note that we only have to do this
30 // when the scale is positive - for negative scales we're already rounding in th e right direction.
31 static inline int bitmap_sampler_inv_bias(SkScalar scale) {
32 #ifndef SK_SUPPORT_LEGACY_BITMAP_SAMPLER_BIAS
33 return -(scale > 0);
34 #else
35 return 0;
36 #endif
37 }
38
39 class SkPaint; 28 class SkPaint;
40 29
41 struct SkBitmapProcState { 30 struct SkBitmapProcState {
42 SkBitmapProcState(const SkBitmapProvider&, SkShader::TileMode tmx, SkShader: :TileMode tmy); 31 SkBitmapProcState(const SkBitmapProvider&, SkShader::TileMode tmx, SkShader: :TileMode tmy);
43 SkBitmapProcState(const SkBitmap&, SkShader::TileMode tmx, SkShader::TileMod e tmy); 32 SkBitmapProcState(const SkBitmap&, SkShader::TileMode tmx, SkShader::TileMod e tmy);
44 ~SkBitmapProcState(); 33 ~SkBitmapProcState();
45 34
46 typedef void (*ShaderProc32)(const SkBitmapProcState&, int x, int y, 35 typedef void (*ShaderProc32)(const SkBitmapProcState&, int x, int y,
47 SkPMColor[], int count); 36 SkPMColor[], int count);
48 37
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 int count, int x, int y); 194 int count, int x, int y);
206 void ClampX_ClampY_filter_affine(const SkBitmapProcState& s, 195 void ClampX_ClampY_filter_affine(const SkBitmapProcState& s,
207 uint32_t xy[], int count, int x, int y); 196 uint32_t xy[], int count, int x, int y);
208 void ClampX_ClampY_nofilter_affine(const SkBitmapProcState& s, 197 void ClampX_ClampY_nofilter_affine(const SkBitmapProcState& s,
209 uint32_t xy[], int count, int x, int y); 198 uint32_t xy[], int count, int x, int y);
210 void S32_D16_filter_DX(const SkBitmapProcState& s, 199 void S32_D16_filter_DX(const SkBitmapProcState& s,
211 const uint32_t* xy, int count, uint16_t* colors); 200 const uint32_t* xy, int count, uint16_t* colors);
212 void S32_D16_filter_DXDY(const SkBitmapProcState& s, 201 void S32_D16_filter_DXDY(const SkBitmapProcState& s,
213 const uint32_t* xy, int count, uint16_t* colors); 202 const uint32_t* xy, int count, uint16_t* colors);
214 203
204 // Helper class for mapping the middle of pixel (x, y) into SkFixed bitmap space .
205 class SkBitmapProcStateAutoMapper {
206 public:
207 SkBitmapProcStateAutoMapper(const SkBitmapProcState& s, int x, int y) {
208 SkPoint pt;
209 s.fInvProc(s.fInvMatrix,
210 SkIntToScalar(x) + SK_ScalarHalf,
211 SkIntToScalar(y) + SK_ScalarHalf, &pt);
212
213 #ifndef SK_SUPPORT_LEGACY_BITMAP_SAMPLER_BIAS
214 // SkFixed epsilon bias to ensure inverse-mapped bitmap coordinates are rounded
215 // consistently WRT geometry. Note that we only need the bias for posit ive scales:
216 // for negative scales, the rounding is intrinsically correct.
217 fX = SkScalarToFixed(pt.x()) - (s.fInvMatrix.getScaleX() > 0);
218 fY = SkScalarToFixed(pt.y()) - (s.fInvMatrix.getScaleY() > 0);
219 #else
220 fX = SkScalarToFixed(pt.x());
221 fY = SkScalarToFixed(pt.y());
215 #endif 222 #endif
223 }
224
225 SkFixed x() const { return fX; }
226 SkFixed y() const { return fY; }
227
228 private:
229 SkFixed fX, fY;
230 };
231
232 #endif
OLDNEW
« no previous file with comments | « no previous file | src/core/SkBitmapProcState.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698