OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org> | 2 * Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org> |
3 * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org> | 3 * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org> |
4 * Copyright (C) 2005 Eric Seidel <eric@webkit.org> | 4 * Copyright (C) 2005 Eric Seidel <eric@webkit.org> |
5 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> | 5 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> |
6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
166 param->filter->platformApplyGeneric(param->paintingData, param->startY, para
m->endY); | 166 param->filter->platformApplyGeneric(param->paintingData, param->startY, para
m->endY); |
167 } | 167 } |
168 | 168 |
169 void FEMorphology::platformApply(PaintingData* paintingData) | 169 void FEMorphology::platformApply(PaintingData* paintingData) |
170 { | 170 { |
171 int optimalThreadNumber = (paintingData->width * paintingData->height) / s_m
inimalArea; | 171 int optimalThreadNumber = (paintingData->width * paintingData->height) / s_m
inimalArea; |
172 if (optimalThreadNumber > 1) { | 172 if (optimalThreadNumber > 1) { |
173 ParallelJobs<PlatformApplyParameters> parallelJobs(&WebCore::FEMorpholog
y::platformApplyWorker, optimalThreadNumber); | 173 ParallelJobs<PlatformApplyParameters> parallelJobs(&WebCore::FEMorpholog
y::platformApplyWorker, optimalThreadNumber); |
174 int numOfThreads = parallelJobs.numberOfJobs(); | 174 int numOfThreads = parallelJobs.numberOfJobs(); |
175 if (numOfThreads > 1) { | 175 if (numOfThreads > 1) { |
176 const int deltaY = 1 + paintingData->height / numOfThreads; | 176 // Split the job into "jobSize"-sized jobs but there a few jobs that
need to be slightly larger since |
| 177 // jobSize * jobs < total size. These extras are handled by the rema
inder "jobsWithExtra". |
| 178 const int jobSize = paintingData->height / numOfThreads; |
| 179 const int jobsWithExtra = paintingData->height % numOfThreads; |
177 int currentY = 0; | 180 int currentY = 0; |
178 for (int job = numOfThreads - 1; job >= 0; --job) { | 181 for (int job = numOfThreads - 1; job >= 0; --job) { |
179 PlatformApplyParameters& param = parallelJobs.parameter(job); | 182 PlatformApplyParameters& param = parallelJobs.parameter(job); |
180 param.filter = this; | 183 param.filter = this; |
181 param.startY = currentY; | 184 param.startY = currentY; |
182 currentY += deltaY; | 185 currentY += job < jobsWithExtra ? jobSize + 1 : jobSize; |
183 param.endY = job ? currentY : paintingData->height; | 186 param.endY = currentY; |
184 param.paintingData = paintingData; | 187 param.paintingData = paintingData; |
185 } | 188 } |
186 parallelJobs.execute(); | 189 parallelJobs.execute(); |
187 return; | 190 return; |
188 } | 191 } |
189 // Fallback to single thread model | 192 // Fallback to single thread model |
190 } | 193 } |
191 | 194 |
192 platformApplyGeneric(paintingData, 0, paintingData->height); | 195 platformApplyGeneric(paintingData, 0, paintingData->height); |
193 } | 196 } |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 FilterEffect::externalRepresentation(ts); | 255 FilterEffect::externalRepresentation(ts); |
253 ts << " operator=\"" << morphologyOperator() << "\" " | 256 ts << " operator=\"" << morphologyOperator() << "\" " |
254 << "radius=\"" << radiusX() << ", " << radiusY() << "\"]\n"; | 257 << "radius=\"" << radiusX() << ", " << radiusY() << "\"]\n"; |
255 inputEffect(0)->externalRepresentation(ts, indent + 1); | 258 inputEffect(0)->externalRepresentation(ts, indent + 1); |
256 return ts; | 259 return ts; |
257 } | 260 } |
258 | 261 |
259 } // namespace WebCore | 262 } // namespace WebCore |
260 | 263 |
261 #endif // ENABLE(FILTERS) | 264 #endif // ENABLE(FILTERS) |
OLD | NEW |