summaryrefslogtreecommitdiff
path: root/gnu/packages/patches/icecat-bug-1146335-pt1.patch
blob: a41e638b2f1d5bdfe9d942aa4ec5858cbeddcdf7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
Copied from: https://hg.mozilla.org/releases/mozilla-esr38/rev/9d14787bd10e
Mozilla Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1146335

# HG changeset patch
# User Seth Fowler <mark.seth.fowler@gmail.com>
# Date 1428627143 25200
# Node ID 9d14787bd10e6f3013263a2cae0bcc78bebde1db
# Parent  aaf922ae679685acb5d2b8ffa5f0bf22f1e6987a
Bug 1146335 (Part 1) - Add assertions and fix style issues in image::Downscaler. r=tn a=lizzard

diff --git a/image/src/Downscaler.cpp b/image/src/Downscaler.cpp
--- a/image/src/Downscaler.cpp
+++ b/image/src/Downscaler.cpp
@@ -72,23 +72,25 @@ Downscaler::BeginFrame(const nsIntSize& 
   mOutputBuffer = aOutputBuffer;
   mHasAlpha = aHasAlpha;
 
   ResetForNextProgressivePass();
   ReleaseWindow();
 
   auto resizeMethod = skia::ImageOperations::RESIZE_LANCZOS3;
 
-  skia::resize::ComputeFilters(resizeMethod, mOriginalSize.width,
-                               mTargetSize.width, 0,
-                               mTargetSize.width, mXFilter.get());
+  skia::resize::ComputeFilters(resizeMethod,
+                               mOriginalSize.width, mTargetSize.width,
+                               0, mTargetSize.width,
+                               mXFilter.get());
 
-  skia::resize::ComputeFilters(resizeMethod, mOriginalSize.height,
-                               mTargetSize.height, 0,
-                               mTargetSize.height, mYFilter.get());
+  skia::resize::ComputeFilters(resizeMethod,
+                               mOriginalSize.height, mTargetSize.height,
+                               0, mTargetSize.height,
+                               mYFilter.get());
 
   // Allocate the buffer, which contains scanlines of the original image.
   size_t bufferLen = mOriginalSize.width * sizeof(uint32_t);
   mRowBuffer = MakeUnique<uint8_t[]>(bufferLen);
   if (MOZ_UNLIKELY(!mRowBuffer)) {
     return NS_ERROR_OUT_OF_MEMORY;
   }
 
@@ -126,39 +128,54 @@ void
 Downscaler::ResetForNextProgressivePass()
 {
   mPrevInvalidatedLine = 0;
   mCurrentOutLine = 0;
   mCurrentInLine = 0;
   mLinesInBuffer = 0;
 }
 
+static void
+GetFilterOffsetAndLength(UniquePtr<skia::ConvolutionFilter1D>& aFilter,
+                         int32_t aOutputImagePosition,
+                         int32_t* aFilterOffsetOut,
+                         int32_t* aFilterLengthOut)
+{
+  MOZ_ASSERT(aOutputImagePosition < aFilter->num_values());
+  aFilter->FilterForValue(aOutputImagePosition,
+                          aFilterOffsetOut,
+                          aFilterLengthOut);
+}
+
 void
 Downscaler::CommitRow()
 {
   MOZ_ASSERT(mOutputBuffer, "Should have a current frame");
   MOZ_ASSERT(mCurrentInLine < mOriginalSize.height, "Past end of input");
   MOZ_ASSERT(mCurrentOutLine < mTargetSize.height, "Past end of output");
 
   int32_t filterOffset = 0;
   int32_t filterLength = 0;
-  mYFilter->FilterForValue(mCurrentOutLine, &filterOffset, &filterLength);
+  GetFilterOffsetAndLength(mYFilter, mCurrentOutLine,
+                           &filterOffset, &filterLength);
 
   int32_t inLineToRead = filterOffset + mLinesInBuffer;
   MOZ_ASSERT(mCurrentInLine <= inLineToRead, "Reading past end of input");
   if (mCurrentInLine == inLineToRead) {
     skia::ConvolveHorizontally(mRowBuffer.get(), *mXFilter,
                                mWindow[mLinesInBuffer++], mHasAlpha,
                                /* use_sse2 = */ true);
   }
 
   while (mLinesInBuffer == filterLength &&
          mCurrentOutLine < mTargetSize.height) {
     DownscaleInputLine();
-    mYFilter->FilterForValue(mCurrentOutLine, &filterOffset, &filterLength);
+
+    GetFilterOffsetAndLength(mYFilter, mCurrentOutLine,
+                             &filterOffset, &filterLength);
   }
 
   mCurrentInLine += 1;
 }
 
 bool
 Downscaler::HasInvalidation() const
 {
@@ -184,16 +201,17 @@ Downscaler::DownscaleInputLine()
 {
   typedef skia::ConvolutionFilter1D::Fixed FilterValue;
 
   MOZ_ASSERT(mOutputBuffer);
   MOZ_ASSERT(mCurrentOutLine < mTargetSize.height, "Writing past end of output");
 
   int32_t filterOffset = 0;
   int32_t filterLength = 0;
+  MOZ_ASSERT(mCurrentOutLine < mYFilter->num_values());
   auto filterValues =
     mYFilter->FilterForValue(mCurrentOutLine, &filterOffset, &filterLength);
 
   uint8_t* outputLine =
     &mOutputBuffer[mCurrentOutLine * mTargetSize.width * sizeof(uint32_t)];
   skia::ConvolveVertically(static_cast<const FilterValue*>(filterValues),
                            filterLength, mWindow.get(), mXFilter->num_values(),
                            outputLine, mHasAlpha, /* use_sse2 = */ true);
@@ -202,17 +220,18 @@ Downscaler::DownscaleInputLine()
 
   if (mCurrentOutLine == mTargetSize.height) {
     // We're done.
     return;
   }
 
   int32_t newFilterOffset = 0;
   int32_t newFilterLength = 0;
-  mYFilter->FilterForValue(mCurrentOutLine, &newFilterOffset, &newFilterLength);
+  GetFilterOffsetAndLength(mYFilter, mCurrentOutLine,
+                           &newFilterOffset, &newFilterLength);
 
   int diff = newFilterOffset - filterOffset;
   MOZ_ASSERT(diff >= 0, "Moving backwards in the filter?");
 
   // Shift the buffer. We're just moving pointers here, so this is cheap.
   mLinesInBuffer -= diff;
   mLinesInBuffer = max(mLinesInBuffer, 0);
   for (int32_t i = 0; i < mLinesInBuffer; ++i) {