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

Side by Side Diff: src/codec/SkCodecPriv.h

Issue 1641273003: Support decoding opaque to *premul (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Update SkMaskSwizzler to support opaque to premul Created 4 years, 10 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 2015 The Android Open Source Project 2 * Copyright 2015 The Android Open Source Project
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 #ifndef SkCodecPriv_DEFINED 8 #ifndef SkCodecPriv_DEFINED
9 #define SkCodecPriv_DEFINED 9 #define SkCodecPriv_DEFINED
10 10
11 #include "SkColorPriv.h" 11 #include "SkColorPriv.h"
12 #include "SkColorTable.h" 12 #include "SkColorTable.h"
13 #include "SkImageInfo.h" 13 #include "SkImageInfo.h"
14 #include "SkTypes.h" 14 #include "SkTypes.h"
15 #include "SkUtils.h" 15 #include "SkUtils.h"
16 16
17 #ifdef SK_PRINT_CODEC_MESSAGES
18 #define SkCodecPrintf SkDebugf
19 #else
20 #define SkCodecPrintf(...)
21 #endif
22
17 // FIXME: Consider sharing with dm, nanbench, and tools. 23 // FIXME: Consider sharing with dm, nanbench, and tools.
18 inline float get_scale_from_sample_size(int sampleSize) { 24 inline float get_scale_from_sample_size(int sampleSize) {
19 return 1.0f / ((float) sampleSize); 25 return 1.0f / ((float) sampleSize);
20 } 26 }
21 27
22 inline bool is_valid_subset(const SkIRect& subset, const SkISize& imageDims) { 28 inline bool is_valid_subset(const SkIRect& subset, const SkISize& imageDims) {
23 return SkIRect::MakeSize(imageDims).contains(subset); 29 return SkIRect::MakeSize(imageDims).contains(subset);
24 } 30 }
25 31
26 /* 32 /*
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 // Return false on edge cases 74 // Return false on edge cases
69 if (srcCoord < startCoord || get_dst_coord(srcCoord, sampleFactor) >= scaled Dim) { 75 if (srcCoord < startCoord || get_dst_coord(srcCoord, sampleFactor) >= scaled Dim) {
70 return false; 76 return false;
71 } 77 }
72 78
73 // Every sampleFactor rows are necessary 79 // Every sampleFactor rows are necessary
74 return ((srcCoord - startCoord) % sampleFactor) == 0; 80 return ((srcCoord - startCoord) % sampleFactor) == 0;
75 } 81 }
76 82
77 inline bool valid_alpha(SkAlphaType dstAlpha, SkAlphaType srcAlpha) { 83 inline bool valid_alpha(SkAlphaType dstAlpha, SkAlphaType srcAlpha) {
78 // Check for supported alpha types 84 if (kUnknown_SkAlphaType == dstAlpha) {
85 return false;
86 }
87
79 if (srcAlpha != dstAlpha) { 88 if (srcAlpha != dstAlpha) {
80 if (kOpaque_SkAlphaType == srcAlpha) { 89 if (kOpaque_SkAlphaType == srcAlpha) {
81 // If the source is opaque, we must decode to opaque 90 // If the source is opaque, we can support any.
82 return false; 91 SkCodecPrintf("Warning: an opaque image should be decoded as opaque "
92 "- it is being decoded as non-opaque, which will draw slower\n");
93 return true;
83 } 94 }
84 95
85 // The source is not opaque 96 // The source is not opaque
86 switch (dstAlpha) { 97 switch (dstAlpha) {
87 case kPremul_SkAlphaType: 98 case kPremul_SkAlphaType:
88 case kUnpremul_SkAlphaType: 99 case kUnpremul_SkAlphaType:
89 // The source is not opaque, so either of these is okay 100 // The source is not opaque, so either of these is okay
90 break; 101 break;
91 default: 102 default:
92 // We cannot decode a non-opaque image to opaque (or unknown) 103 // We cannot decode a non-opaque image to opaque (or unknown)
93 return false; 104 return false;
94 } 105 }
95 } 106 }
96 return true; 107 return true;
97 } 108 }
98 109
99 /* 110 /*
100 * Most of our codecs support the same conversions: 111 * Most of our codecs support the same conversions:
101 * - profileType must be the same 112 * - profileType must be the same
102 * - opaque only to opaque (and 565 only if opaque) 113 * - opaque to any alpha type
114 * - 565 only if opaque
103 * - premul to unpremul and vice versa 115 * - premul to unpremul and vice versa
104 * - always support N32 116 * - always support N32
105 * - otherwise match the src color type 117 * - otherwise match the src color type
106 */ 118 */
107 inline bool conversion_possible(const SkImageInfo& dst, const SkImageInfo& src) { 119 inline bool conversion_possible(const SkImageInfo& dst, const SkImageInfo& src) {
108 if (dst.profileType() != src.profileType()) { 120 if (dst.profileType() != src.profileType()) {
109 return false; 121 return false;
110 } 122 }
111 123
112 // Ensure the alpha type is valid 124 // Ensure the alpha type is valid
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 inline uint32_t get_int(uint8_t* buffer, uint32_t i) { 235 inline uint32_t get_int(uint8_t* buffer, uint32_t i) {
224 uint32_t result; 236 uint32_t result;
225 memcpy(&result, &(buffer[i]), 4); 237 memcpy(&result, &(buffer[i]), 4);
226 #ifdef SK_CPU_BENDIAN 238 #ifdef SK_CPU_BENDIAN
227 return SkEndianSwap32(result); 239 return SkEndianSwap32(result);
228 #else 240 #else
229 return result; 241 return result;
230 #endif 242 #endif
231 } 243 }
232 244
233 #ifdef SK_PRINT_CODEC_MESSAGES
234 #define SkCodecPrintf SkDebugf
235 #else
236 #define SkCodecPrintf(...)
237 #endif
238
239 #endif // SkCodecPriv_DEFINED 245 #endif // SkCodecPriv_DEFINED
OLDNEW
« no previous file with comments | « src/codec/SkCodec.cpp ('k') | src/codec/SkGifCodec.h » ('j') | src/codec/SkMaskSwizzler.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698