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

Side by Side Diff: src/core/SkColorSpaceXform.cpp

Issue 2166093003: Miscellaneous color space refactors (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Tweak SkColorLookUpTable constructor Created 4 years, 5 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
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
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 #include "SkColorPriv.h" 8 #include "SkColorPriv.h"
9 #include "SkColorSpace_Base.h" 9 #include "SkColorSpace_Base.h"
10 #include "SkColorSpaceXform.h" 10 #include "SkColorSpaceXform.h"
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 new SkFastXform<SkColorSpace::kNonStandard_GammaNamed>(s rcSpace, srcToDst, 483 new SkFastXform<SkColorSpace::kNonStandard_GammaNamed>(s rcSpace, srcToDst,
484 d stSpace)); 484 d stSpace));
485 } 485 }
486 } 486 }
487 487
488 return std::unique_ptr<SkColorSpaceXform>(new SkDefaultXform(srcSpace, srcTo Dst, dstSpace)); 488 return std::unique_ptr<SkColorSpaceXform>(new SkDefaultXform(srcSpace, srcTo Dst, dstSpace));
489 } 489 }
490 490
491 //////////////////////////////////////////////////////////////////////////////// /////////////////// 491 //////////////////////////////////////////////////////////////////////////////// ///////////////////
492 492
493 // TODO (msarett):
494 // Once SkFastXform supports translation, delete this function and use asRowMajo rf().
495 static void build_src_to_dst(float srcToDstArray[12], const SkMatrix44& srcToDst Matrix) {
496 // Build the following row major matrix:
497 // rX gX bX 0
498 // rY gY bY 0
499 // rZ gZ bZ 0
500 srcToDstArray[0] = srcToDstMatrix.getFloat(0, 0);
501 srcToDstArray[1] = srcToDstMatrix.getFloat(0, 1);
502 srcToDstArray[2] = srcToDstMatrix.getFloat(0, 2);
503 srcToDstArray[3] = 0.0f;
504 srcToDstArray[4] = srcToDstMatrix.getFloat(1, 0);
505 srcToDstArray[5] = srcToDstMatrix.getFloat(1, 1);
506 srcToDstArray[6] = srcToDstMatrix.getFloat(1, 2);
507 srcToDstArray[7] = 0.0f;
508 srcToDstArray[8] = srcToDstMatrix.getFloat(2, 0);
509 srcToDstArray[9] = srcToDstMatrix.getFloat(2, 1);
510 srcToDstArray[10] = srcToDstMatrix.getFloat(2, 2);
511 srcToDstArray[11] = 0.0f;
512 }
513
514 template <SkColorSpace::GammaNamed Dst> 493 template <SkColorSpace::GammaNamed Dst>
515 SkFastXform<Dst>::SkFastXform(const sk_sp<SkColorSpace>& srcSpace, const SkMatri x44& srcToDst, 494 SkFastXform<Dst>::SkFastXform(const sk_sp<SkColorSpace>& srcSpace, const SkMatri x44& srcToDst,
516 const sk_sp<SkColorSpace>& dstSpace) 495 const sk_sp<SkColorSpace>& dstSpace)
517 { 496 {
518 build_src_to_dst(fSrcToDst, srcToDst); 497 srcToDst.asRowMajorf(fSrcToDst);
519 build_gamma_tables(fSrcGammaTables, fSrcGammaTableStorage, 256, srcSpace, kT oLinear); 498 build_gamma_tables(fSrcGammaTables, fSrcGammaTableStorage, 256, srcSpace, kT oLinear);
520 build_gamma_tables(fDstGammaTables, fDstGammaTableStorage, SkDefaultXform::k DstGammaTableSize, 499 build_gamma_tables(fDstGammaTables, fDstGammaTableStorage, SkDefaultXform::k DstGammaTableSize,
521 dstSpace, kFromLinear); 500 dstSpace, kFromLinear);
522 } 501 }
523 502
524 template <> 503 template <>
525 void SkFastXform<SkColorSpace::kSRGB_GammaNamed> 504 void SkFastXform<SkColorSpace::kSRGB_GammaNamed>
526 ::applyTo8888(SkPMColor* dst, const RGBA32* src, int len) const 505 ::applyTo8888(SkPMColor* dst, const RGBA32* src, int len) const
527 { 506 {
528 SkOpts::color_xform_RGB1_to_srgb(dst, src, len, fSrcGammaTables, fSrcToDst); 507 SkOpts::color_xform_RGB1_to_srgb(dst, src, len, fSrcGammaTables, fSrcToDst);
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
608 const int n000 = 0; 587 const int n000 = 0;
609 const int n001 = 3 * colorLUT->fGridPoints[1] * colorLUT->fGridPoints[2]; 588 const int n001 = 3 * colorLUT->fGridPoints[1] * colorLUT->fGridPoints[2];
610 const int n010 = 3 * colorLUT->fGridPoints[2]; 589 const int n010 = 3 * colorLUT->fGridPoints[2];
611 const int n011 = n001 + n010; 590 const int n011 = n001 + n010;
612 const int n100 = 3; 591 const int n100 = 3;
613 const int n101 = n100 + n001; 592 const int n101 = n100 + n001;
614 const int n110 = n100 + n010; 593 const int n110 = n100 + n010;
615 const int n111 = n110 + n001; 594 const int n111 = n110 + n001;
616 595
617 // Base ptr into the table. 596 // Base ptr into the table.
618 float* ptr = &colorLUT->fTable[ix*n001 + iy*n010 + iz*n100]; 597 const float* ptr = &(colorLUT->table()[ix*n001 + iy*n010 + iz*n100]);
619 598
620 // The code below performs a tetrahedral interpolation for each of the three 599 // The code below performs a tetrahedral interpolation for each of the three
621 // dst components. Once the tetrahedron containing the interpolation point is 600 // dst components. Once the tetrahedron containing the interpolation point is
622 // identified, the interpolation is a weighted sum of grid values at the 601 // identified, the interpolation is a weighted sum of grid values at the
623 // vertices of the tetrahedron. The claim is that tetrahedral interpolation 602 // vertices of the tetrahedron. The claim is that tetrahedral interpolation
624 // provides a more accurate color conversion. 603 // provides a more accurate color conversion.
625 // blogs.mathworks.com/steve/2006/11/24/tetrahedral-interpolation-for-colors pace-conversion/ 604 // blogs.mathworks.com/steve/2006/11/24/tetrahedral-interpolation-for-colors pace-conversion/
626 // 605 //
627 // I have one test image, and visually I can't tell the difference between 606 // I have one test image, and visually I can't tell the difference between
628 // tetrahedral and trilinear interpolation. In terms of computation, the 607 // tetrahedral and trilinear interpolation. In terms of computation, the
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
722 dst++; 701 dst++;
723 src++; 702 src++;
724 } 703 }
725 } 704 }
726 705
727 void SkDefaultXform::applyToF16(RGBAF16* dst, const RGBA32* src, int len) const { 706 void SkDefaultXform::applyToF16(RGBAF16* dst, const RGBA32* src, int len) const {
728 // FIXME (msarett): 707 // FIXME (msarett):
729 // Planning to delete SkDefaultXform. Not going to bother to implement this . 708 // Planning to delete SkDefaultXform. Not going to bother to implement this .
730 memset(dst, 0, len * sizeof(RGBAF16)); 709 memset(dst, 0, len * sizeof(RGBAF16));
731 } 710 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698