LibGfx/JPEGXL: Add support for x4 and x8 upsampling
All the logic is exactly the same as for x2 upsampling, so this commit essentially boils down to adding arrays for default weights and the logic to select the correct array.
This commit is contained in:
parent
fad834a21c
commit
271d0015fe
Notes:
sideshowbarker
2024-07-17 04:01:41 +09:00
Author: https://github.com/LucasChollet Commit: https://github.com/SerenityOS/serenity/commit/271d0015fe Pull-request: https://github.com/SerenityOS/serenity/pull/20155
1 changed files with 51 additions and 4 deletions
|
@ -250,11 +250,49 @@ static ErrorOr<Extensions> read_extensions(LittleEndianInputBitStream& stream)
|
|||
///
|
||||
|
||||
/// K.2 - Non-separable upsampling
|
||||
Array<double, 15> s_d_up2 {
|
||||
Array s_d_up2 {
|
||||
-0.01716200, -0.03452303, -0.04022174, -0.02921014, -0.00624645,
|
||||
0.14111091, 0.28896755, 0.00278718, -0.01610267, 0.56661550,
|
||||
0.03777607, -0.01986694, -0.03144731, -0.01185068, -0.00213539
|
||||
};
|
||||
|
||||
Array s_d_up4 = {
|
||||
-0.02419067, -0.03491987, -0.03693351, -0.03094285, -0.00529785,
|
||||
-0.01663432, -0.03556863, -0.03888905, -0.03516850, -0.00989469,
|
||||
0.23651958, 0.33392945, -0.01073543, -0.01313181, -0.03556694,
|
||||
0.13048175, 0.40103025, 0.03951150, -0.02077584, 0.46914198,
|
||||
-0.00209270, -0.01484589, -0.04064806, 0.18942530, 0.56279892,
|
||||
0.06674400, -0.02335494, -0.03551682, -0.00754830, -0.02267919,
|
||||
-0.02363578, 0.00315804, -0.03399098, -0.01359519, -0.00091653,
|
||||
-0.00335467, -0.01163294, -0.01610294, -0.00974088, -0.00191622,
|
||||
-0.01095446, -0.03198464, -0.04455121, -0.02799790, -0.00645912,
|
||||
0.06390599, 0.22963888, 0.00630981, -0.01897349, 0.67537268,
|
||||
0.08483369, -0.02534994, -0.02205197, -0.01667999, -0.00384443
|
||||
};
|
||||
|
||||
Array s_d_up8 {
|
||||
-0.02928613, -0.03706353, -0.03783812, -0.03324558, -0.00447632, -0.02519406, -0.03752601, -0.03901508, -0.03663285, -0.00646649,
|
||||
-0.02066407, -0.03838633, -0.04002101, -0.03900035, -0.00901973, -0.01626393, -0.03954148, -0.04046620, -0.03979621, -0.01224485,
|
||||
0.29895328, 0.35757708, -0.02447552, -0.01081748, -0.04314594, 0.23903219, 0.41119301, -0.00573046, -0.01450239, -0.04246845,
|
||||
0.17567618, 0.45220643, 0.02287757, -0.01936783, -0.03583255, 0.11572472, 0.47416733, 0.06284440, -0.02685066, 0.42720050,
|
||||
-0.02248939, -0.01155273, -0.04562755, 0.28689496, 0.49093869, -0.00007891, -0.01545926, -0.04562659, 0.21238920, 0.53980934,
|
||||
0.03369474, -0.02070211, -0.03866988, 0.14229550, 0.56593398, 0.08045181, -0.02888298, -0.03680918, -0.00542229, -0.02920477,
|
||||
-0.02788574, -0.02118180, -0.03942402, -0.00775547, -0.02433614, -0.03193943, -0.02030828, -0.04044014, -0.01074016, -0.01930822,
|
||||
-0.03620399, -0.01974125, -0.03919545, -0.01456093, -0.00045072, -0.00360110, -0.01020207, -0.01231907, -0.00638988, -0.00071592,
|
||||
-0.00279122, -0.00957115, -0.01288327, -0.00730937, -0.00107783, -0.00210156, -0.00890705, -0.01317668, -0.00813895, -0.00153491,
|
||||
-0.02128481, -0.04173044, -0.04831487, -0.03293190, -0.00525260, -0.01720322, -0.04052736, -0.05045706, -0.03607317, -0.00738030,
|
||||
-0.01341764, -0.03965629, -0.05151616, -0.03814886, -0.01005819, 0.18968273, 0.33063684, -0.01300105, -0.01372950, -0.04017465,
|
||||
0.13727832, 0.36402234, 0.01027890, -0.01832107, -0.03365072, 0.08734506, 0.38194295, 0.04338228, -0.02525993, 0.56408126,
|
||||
0.00458352, -0.01648227, -0.04887868, 0.24585519, 0.62026135, 0.04314807, -0.02213737, -0.04158014, 0.16637289, 0.65027023,
|
||||
0.09621636, -0.03101388, -0.04082742, -0.00904519, -0.02790922, -0.02117818, 0.00798662, -0.03995711, -0.01243427, -0.02231705,
|
||||
-0.02946266, 0.00992055, -0.03600283, -0.01684920, -0.00111684, -0.00411204, -0.01297130, -0.01723725, -0.01022545, -0.00165306,
|
||||
-0.00313110, -0.01218016, -0.01763266, -0.01125620, -0.00231663, -0.01374149, -0.03797620, -0.05142937, -0.03117307, -0.00581914,
|
||||
-0.01064003, -0.03608089, -0.05272168, -0.03375670, -0.00795586, 0.09628104, 0.27129991, -0.00353779, -0.01734151, -0.03153981,
|
||||
0.05686230, 0.28500998, 0.02230594, -0.02374955, 0.68214326, 0.05018048, -0.02320852, -0.04383616, 0.18459474, 0.71517975,
|
||||
0.10805613, -0.03263677, -0.03637639, -0.01394373, -0.02511203, -0.01728636, 0.05407331, -0.02867568, -0.01893131, -0.00240854,
|
||||
-0.00446511, -0.01636187, -0.02377053, -0.01522848, -0.00333334, -0.00819975, -0.02964169, -0.04499287, -0.02745350, -0.00612408,
|
||||
0.02727416, 0.19446600, 0.00159832, -0.02232473, 0.74982506, 0.11452620, -0.03348048, -0.01605681, -0.02070339, -0.00458223
|
||||
};
|
||||
///
|
||||
|
||||
/// D.3 - Image metadata
|
||||
|
@ -307,7 +345,8 @@ struct ImageMetadata {
|
|||
u8 cw_mask { 0 };
|
||||
|
||||
Array<double, 15> up2_weight = s_d_up2;
|
||||
// TODO: add up[4, 8]_weight
|
||||
Array<double, 55> up4_weight = s_d_up4;
|
||||
Array<double, 210> up8_weight = s_d_up8;
|
||||
};
|
||||
|
||||
static ErrorOr<ImageMetadata> read_metadata_header(LittleEndianInputBitStream& stream)
|
||||
|
@ -1529,11 +1568,19 @@ static ErrorOr<void> apply_upsampling(Image& image, ImageMetadata const& metadat
|
|||
}
|
||||
|
||||
if (frame.frame_header.upsampling > 1 || ec_max.value_or(0) > 1) {
|
||||
if (frame.frame_header.upsampling > 2 || ec_max.value_or(0) > 2)
|
||||
if (ec_max.value_or(0) > 2)
|
||||
TODO();
|
||||
|
||||
auto const k = frame.frame_header.upsampling;
|
||||
|
||||
auto weight = [k, &metadata](u8 index) -> double {
|
||||
if (k == 2)
|
||||
return metadata.up2_weight[index];
|
||||
if (k == 4)
|
||||
return metadata.up4_weight[index];
|
||||
return metadata.up8_weight[index];
|
||||
};
|
||||
|
||||
// FIXME: Use ec_upsampling for extra-channels
|
||||
for (auto& channel : image.channels()) {
|
||||
auto upsampled = TRY(Channel::create(k * channel.width(), k * channel.height()));
|
||||
|
@ -1565,7 +1612,7 @@ static ErrorOr<void> apply_upsampling(Image& image, ImageMetadata const& metadat
|
|||
W_min = min(W_min, origin_sample);
|
||||
W_max = max(W_max, origin_sample);
|
||||
|
||||
sum += origin_sample * metadata.up2_weight[index];
|
||||
sum += origin_sample * weight(index);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue