in src/core/SkPixmap.cpp [592:756]
bool SkPixmap::computeIsOpaque() const {
const int height = this->height();
const int width = this->width();
switch (this->colorType()) {
case kAlpha_8_SkColorType: {
unsigned a = 0xFF;
for (int y = 0; y < height; ++y) {
const uint8_t* row = this->addr8(0, y);
for (int x = 0; x < width; ++x) {
a &= row[x];
}
if (0xFF != a) {
return false;
}
}
return true;
}
case kA16_unorm_SkColorType: {
unsigned a = 0xFFFF;
for (int y = 0; y < height; ++y) {
const uint16_t* row = this->addr16(0, y);
for (int x = 0; x < width; ++x) {
a &= row[x];
}
if (0xFFFF != a) {
return false;
}
}
return true;
}
case kA16_float_SkColorType: {
for (int y = 0; y < height; ++y) {
const SkHalf* row = this->addr16(0, y);
for (int x = 0; x < width; ++x) {
if (row[x] < SK_Half1) {
return false;
}
}
}
return true;
}
case kRGB_565_SkColorType:
case kGray_8_SkColorType:
case kR8G8_unorm_SkColorType:
case kR16G16_unorm_SkColorType:
case kR16G16_float_SkColorType:
case kRGB_888x_SkColorType:
case kRGB_101010x_SkColorType:
case kBGR_101010x_SkColorType:
case kRGB_F16F16F16x_SkColorType:
case kBGR_101010x_XR_SkColorType:
case kR8_unorm_SkColorType:
return true;
case kARGB_4444_SkColorType: {
unsigned c = 0xFFFF;
for (int y = 0; y < height; ++y) {
const SkPMColor16* row = this->addr16(0, y);
for (int x = 0; x < width; ++x) {
c &= row[x];
}
if (0xF != SkGetPackedA4444(c)) {
return false;
}
}
return true;
}
case kBGRA_8888_SkColorType:
case kRGBA_8888_SkColorType:
case kSRGBA_8888_SkColorType: {
SkPMColor c = (SkPMColor)~0;
for (int y = 0; y < height; ++y) {
const SkPMColor* row = this->addr32(0, y);
for (int x = 0; x < width; ++x) {
c &= row[x];
}
if (0xFF != SkGetPackedA32(c)) {
return false;
}
}
return true;
}
case kRGBA_F16Norm_SkColorType:
case kRGBA_F16_SkColorType: {
const SkHalf* row = (const SkHalf*)this->addr();
for (int y = 0; y < height; ++y) {
for (int x = 0; x < width; ++x) {
if (row[4 * x + 3] < SK_Half1) {
return false;
}
}
row += this->rowBytes() >> 1;
}
return true;
}
case kRGBA_F32_SkColorType: {
const float* row = (const float*)this->addr();
for (int y = 0; y < height; ++y) {
for (int x = 0; x < width; ++x) {
if (row[4 * x + 3] < 1.0f) {
return false;
}
}
row += this->rowBytes() >> 2;
}
return true;
}
case kRGBA_1010102_SkColorType:
case kBGRA_1010102_SkColorType: {
uint32_t c = ~0;
for (int y = 0; y < height; ++y) {
const uint32_t* row = this->addr32(0, y);
for (int x = 0; x < width; ++x) {
c &= row[x];
}
if (0b11 != c >> 30) {
return false;
}
}
return true;
}
case kBGRA_10101010_XR_SkColorType:{
static constexpr uint64_t kOne = 510 + 384;
for (int y = 0; y < height; ++y) {
const uint64_t* row = this->addr64(0, y);
for (int x = 0; x < width; ++x) {
if ((row[x] >> 54) < kOne) {
return false;
}
}
}
return true;
}
case kRGBA_10x6_SkColorType: {
uint16_t acc = 0xFFC0; // Ignore bottom six bits
for (int y = 0; y < height; ++y) {
const uint64_t* row = this->addr64(0, y);
for (int x = 0; x < width; ++x) {
acc &= (row[x] >> 48);
}
if (0xFFC0 != acc) {
return false;
}
}
return true;
}
case kR16G16B16A16_unorm_SkColorType: {
uint16_t acc = 0xFFFF;
for (int y = 0; y < height; ++y) {
const uint64_t* row = this->addr64(0, y);
for (int x = 0; x < width; ++x) {
acc &= (row[x] >> 48);
}
if (0xFFFF != acc) {
return false;
}
}
return true;
}
case kUnknown_SkColorType:
SkDEBUGFAIL("");
break;
}
return false;
}