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

Side by Side Diff: third_party/qcms/src/transform_util.c

Issue 1185163003: lut_inverse_interp16: interpolate degenerate zeros in TRC curves (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 months 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 | « third_party/qcms/README.chromium ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // qcms 1 // qcms
2 // Copyright (C) 2009 Mozilla Foundation 2 // Copyright (C) 2009 Mozilla Foundation
3 // 3 //
4 // Permission is hereby granted, free of charge, to any person obtaining 4 // Permission is hereby granted, free of charge, to any person obtaining
5 // a copy of this software and associated documentation files (the "Software"), 5 // a copy of this software and associated documentation files (the "Software"),
6 // to deal in the Software without restriction, including without limitation 6 // to deal in the Software without restriction, including without limitation
7 // the rights to use, copy, modify, merge, publish, distribute, sublicense, 7 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 // and/or sell copies of the Software, and to permit persons to whom the Softwar e 8 // and/or sell copies of the Software, and to permit persons to whom the Softwar e
9 // is furnished to do so, subject to the following conditions: 9 // is furnished to do so, subject to the following conditions:
10 // 10 //
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 327
328 // Does the curve belong to this case? 328 // Does the curve belong to this case?
329 if (NumZeroes > 1 || NumPoles > 1) 329 if (NumZeroes > 1 || NumPoles > 1)
330 { 330 {
331 int a, b, sample; 331 int a, b, sample;
332 332
333 // Identify if value fall downto 0 or FFFF zone 333 // Identify if value fall downto 0 or FFFF zone
334 if (Value == 0) return 0; 334 if (Value == 0) return 0;
335 // if (Value == 0xFFFF) return 0xFFFF; 335 // if (Value == 0xFFFF) return 0xFFFF;
336 sample = (length-1) * ((double) Value * (1./65535.)); 336 sample = (length-1) * ((double) Value * (1./65535.));
337 if (LutTable[sample] == 0)
338 return 0;
339 if (LutTable[sample] == 0xffff) 337 if (LutTable[sample] == 0xffff)
340 return 0xffff; 338 return 0xffff;
341 339
342 // else restrict to valid zone 340 // else restrict to valid zone
343 341
344 a = ((NumZeroes-1) * 0xFFFF) / (length-1); 342 a = ((NumZeroes-1) * 0xFFFF) / (length-1);
345 b = ((length-1 - NumPoles) * 0xFFFF) / (length-1); 343 b = ((length-1 - NumPoles) * 0xFFFF) / (length-1);
346 344
347 l = a - 1; 345 l = a - 1;
348 r = b + 1; 346 r = b + 1;
349 347
350 // Ensure a valid binary search range 348 // Ensure a valid binary search range
351 349
352 if (l < 1) 350 if (l < 1)
353 l = 1; 351 l = 1;
354 if (r > 0x10000) 352 if (r > 0x10000)
355 r = 0x10000; 353 r = 0x10000;
354
355 // If the search range is inverted due to degeneracy,
356 // deem LutTable non-invertible in this search range.
357 // Refer to https://bugzil.la/1132467
358
359 if (r <= l)
360 return 0;
356 } 361 }
357 362
358 // Seems not a degenerated case... apply binary search 363 // Seems not a degenerated case... apply binary search
359 364
360 while (r > l) { 365 while (r > l) {
361 366
362 x = (l + r) / 2; 367 x = (l + r) / 2;
363 368
364 res = (int) lut_interp_linear16((uint16_fract_t) (x-1), LutTable , length); 369 res = (int) lut_interp_linear16((uint16_fract_t) (x-1), LutTable , length);
365 370
366 if (res == Value) { 371 if (res == Value) {
367 372
368 // Found exact match. 373 // Found exact match.
369 374
370 return (uint16_fract_t) (x - 1); 375 return (uint16_fract_t) (x - 1);
371 } 376 }
372 377
373 if (res > Value) r = x - 1; 378 if (res > Value) r = x - 1;
374 else l = x + 1; 379 else l = x + 1;
375 } 380 }
376 381
377 // Not found, should we interpolate? 382 // Not found, should we interpolate?
378 383
384 // Get surrounding nodes
379 385
380 // Get surrounding nodes 386 assert(x >= 1);
381 387
382 val2 = (length-1) * ((double) (x - 1) / 65535.0); 388 val2 = (length-1) * ((double) (x - 1) / 65535.0);
383 389
384 cell0 = (int) floor(val2); 390 cell0 = (int) floor(val2);
385 cell1 = (int) ceil(val2); 391 cell1 = (int) ceil(val2);
386 392
393 assert(cell0 >= 0);
394 assert(cell1 >= 0);
395 assert(cell0 < length);
396 assert(cell1 < length);
397
387 if (cell0 == cell1) return (uint16_fract_t) x; 398 if (cell0 == cell1) return (uint16_fract_t) x;
388 399
389 y0 = LutTable[cell0] ; 400 y0 = LutTable[cell0] ;
390 x0 = (65535.0 * cell0) / (length-1); 401 x0 = (65535.0 * cell0) / (length-1);
391 402
392 y1 = LutTable[cell1] ; 403 y1 = LutTable[cell1] ;
393 x1 = (65535.0 * cell1) / (length-1); 404 x1 = (65535.0 * cell1) / (length-1);
394 405
395 a = (y1 - y0) / (x1 - x0); 406 a = (y1 - y0) / (x1 - x0);
396 b = y0 - a * x0; 407 b = y0 - a * x0;
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
648 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 659 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
649 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 24, 660 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 24,
650 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 661 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
651 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 662 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
652 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 663 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
653 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 664 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
654 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 665 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
655 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 666 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
656 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 13 667 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 13
657 }; 668 };
OLDNEW
« no previous file with comments | « third_party/qcms/README.chromium ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698