REGRESSION (r226981): ASSERTION FAILED: startY >= 0 && endY <= height && startY ...
[WebKit-https.git] / Source / WebCore / platform / graphics / filters / FELighting.cpp
index 00d53f5..63bc826 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2010 University of Szeged
  * Copyright (C) 2010 Zoltan Herczeg
+ * Copyright (C) 2018 Apple Inc.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -307,6 +308,7 @@ void FELighting::platformApplyGenericPaint(const LightingData& data, const Light
 {
     // Make sure startY is > 0 since we read from the previous row in the loop.
     ASSERT(startY);
+    ASSERT(endY > startY);
 
     for (int y = startY; y < endY; ++y) {
         int rowStartOffset = y * data.widthMultipliedByPixelSize;
@@ -341,7 +343,9 @@ void FELighting::platformApplyGenericWorker(PlatformApplyGenericParameters* para
 
 void FELighting::platformApplyGeneric(const LightingData& data, const LightSource::PaintingData& paintingData)
 {
-    int optimalThreadNumber = ((data.widthDecreasedByOne - 1) * (data.heightDecreasedByOne - 1)) / s_minimalRectDimension;
+    unsigned rowsToProcess = data.heightDecreasedByOne - 1;
+    unsigned maxNumThreads = rowsToProcess / 8;
+    unsigned optimalThreadNumber = std::min<unsigned>(((data.widthDecreasedByOne - 1) * rowsToProcess) / s_minimalRectDimension, maxNumThreads);
     if (optimalThreadNumber > 1) {
         // Initialize parallel jobs
         WTF::ParallelJobs<PlatformApplyGenericParameters> parallelJobs(&platformApplyGenericWorker, optimalThreadNumber);
@@ -351,8 +355,8 @@ void FELighting::platformApplyGeneric(const LightingData& data, const LightSourc
         if (job > 1) {
             // Split the job into "yStep"-sized jobs but there a few jobs that need to be slightly larger since
             // yStep * jobs < total size. These extras are handled by the remainder "jobsWithExtra".
-            const int yStep = (data.heightDecreasedByOne - 1) / job;
-            const int jobsWithExtra = (data.heightDecreasedByOne - 1) % job;
+            const int yStep = rowsToProcess / job;
+            const int jobsWithExtra = rowsToProcess % job;
 
             int yStart = 1;
             for (--job; job >= 0; --job) {