case PlaneConfig::kY_U_V: case PlaneConfig::kY_V_U: case PlaneConfig::kY_U_V_A: case PlaneConfig::kY_V_U_A:
isSubsampledPlane = planeIdx == 1 || planeIdx == 2; break;
case PlaneConfig::kY_UV: case PlaneConfig::kY_VU: case PlaneConfig::kY_UV_A: case PlaneConfig::kY_VU_A:
isSubsampledPlane = planeIdx == 1; break;
case PlaneConfig::kYUV: case PlaneConfig::kUYV: case PlaneConfig::kYUVA: case PlaneConfig::kUYVA: break;
} return isSubsampledPlane ? SubsamplingFactors(subsampling) : std::make_tuple(1, 1);
}
int w = imageDimensions.width(); int h = imageDimensions.height(); if (origin >= kLeftTop_SkEncodedOrigin) { using std::swap;
swap(w, h);
} auto down2 = [](int x) { return (x + 1)/2; }; auto down4 = [](int x) { return (x + 3)/4; };
SkISize uvSize; switch (subsampling) { case Subsampling::kUnknown: SkUNREACHABLE;
case Subsampling::k444: uvSize = { w , h }; break; case Subsampling::k422: uvSize = {down2(w), h }; break; case Subsampling::k420: uvSize = {down2(w), down2(h)}; break; case Subsampling::k440: uvSize = { w , down2(h)}; break; case Subsampling::k411: uvSize = {down4(w), h }; break; case Subsampling::k410: uvSize = {down4(w), down2(h)}; break;
} switch (planeConfig) { case PlaneConfig::kUnknown: SkUNREACHABLE;
case PlaneConfig::kY_U_V: case PlaneConfig::kY_V_U:
planeDimensions[0] = {w, h};
planeDimensions[1] = planeDimensions[2] = uvSize; return 3;
case PlaneConfig::kY_UV: case PlaneConfig::kY_VU:
planeDimensions[0] = {w, h};
planeDimensions[1] = uvSize; return 2;
case PlaneConfig::kY_U_V_A: case PlaneConfig::kY_V_U_A:
planeDimensions[0] = planeDimensions[3] = {w, h};
planeDimensions[1] = planeDimensions[2] = uvSize; return 4;
case PlaneConfig::kY_UV_A: case PlaneConfig::kY_VU_A:
planeDimensions[0] = planeDimensions[2] = {w, h};
planeDimensions[1] = uvSize; return 3;
case PlaneConfig::kYUV: case PlaneConfig::kUYV: case PlaneConfig::kYUVA: case PlaneConfig::kUYVA:
planeDimensions[0] = {w, h};
SkASSERT(planeDimensions[0] == uvSize); return 1;
}
SkUNREACHABLE;
}
staticbool channel_index_to_channel(uint32_t channelFlags, int channelIdx,
SkColorChannel* channel) { switch (channelFlags) { case kGray_SkColorChannelFlag: // For gray returning any of R, G, or B for index 0 is ok. case kRed_SkColorChannelFlag: if (channelIdx == 0) {
*channel = SkColorChannel::kR; returntrue;
} returnfalse; case kGrayAlpha_SkColorChannelFlags: switch (channelIdx) { case 0: *channel = SkColorChannel::kR; returntrue; case 1: *channel = SkColorChannel::kA; returntrue;
default: returnfalse;
} case kAlpha_SkColorChannelFlag: if (channelIdx == 0) {
*channel = SkColorChannel::kA; returntrue;
} returnfalse; case kRG_SkColorChannelFlags: if (channelIdx == 0 || channelIdx == 1) {
*channel = static_cast<SkColorChannel>(channelIdx); returntrue;
} returnfalse; case kRGB_SkColorChannelFlags: if (channelIdx >= 0 && channelIdx <= 2) {
*channel = static_cast<SkColorChannel>(channelIdx); returntrue;
} returnfalse; case kRGBA_SkColorChannelFlags: if (channelIdx >= 0 && channelIdx <= 3) {
*channel = static_cast<SkColorChannel>(channelIdx); returntrue;
} returnfalse; default: returnfalse;
}
}
SkYUVAInfo::YUVALocations SkYUVAInfo::GetYUVALocations(PlaneConfig config, const uint32_t* planeChannelFlags) { // Like YUVALocation but chanIdx refers to channels by index rather than absolute channel, e.g. // A is the 0th channel of an alpha-only texture. We'll use this plus planeChannelFlags to get // the actual channel. struct PlaneAndIndex {int plane, chanIdx;}; const PlaneAndIndex* planesAndIndices = nullptr; switch (config) { case PlaneConfig::kUnknown: return {};
bool SkYUVAInfo::HasAlpha(PlaneConfig planeConfig) { switch (planeConfig) { case PlaneConfig::kUnknown: returnfalse;
case PlaneConfig::kY_U_V: returnfalse; case PlaneConfig::kY_V_U: returnfalse; case PlaneConfig::kY_UV: returnfalse; case PlaneConfig::kY_VU: returnfalse; case PlaneConfig::kYUV: returnfalse; case PlaneConfig::kUYV: returnfalse;
case PlaneConfig::kY_U_V_A: returntrue; case PlaneConfig::kY_V_U_A: returntrue; case PlaneConfig::kY_UV_A: returntrue; case PlaneConfig::kY_VU_A: returntrue; case PlaneConfig::kYUVA: returntrue; case PlaneConfig::kUYVA: returntrue;
}
SkUNREACHABLE;
}
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.13Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.