Skip to content

Commit 6770bb2

Browse files
author
Nir Maoz
authored
Feature/quality from json (#471)
1 parent 52e020a commit 6770bb2

File tree

5 files changed

+78
-9
lines changed

5 files changed

+78
-9
lines changed

__TESTS__/unit/fromJson/delivery.fromJson.test.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
import {fromJson} from "../../../src/internal/fromJson";
2+
import {Transformation} from "../../../src";
3+
import {Delivery} from "../../../src/actions/delivery";
4+
import {Quality} from "../../../src/qualifiers/quality";
5+
import {ChromaSubSampling} from "../../../src/qualifiers/chromaSubSampling";
26

37
describe('delivery.fromJson', () => {
48
it('should generate a transformation string from colorSpace action', function () {
@@ -8,6 +12,7 @@ describe('delivery.fromJson', () => {
812

913
expect(transformation.toString()).toStrictEqual('cs_srgb:truecolor');
1014
});
15+
1116
it('should generate a transformation string from colorSpaceFromIcc action', function () {
1217
const transformation = fromJson([
1318
{actionType: 'colorSpaceFromICC', publicId: 'sample'}
@@ -39,4 +44,50 @@ describe('delivery.fromJson', () => {
3944

4045
expect(transformation.toString()).toStrictEqual('f_gif,fl_lossy');
4146
});
47+
48+
it('quality:80', () => {
49+
const transformation = fromJson([
50+
{
51+
actionType: 'quality',
52+
level: '80'
53+
}
54+
]);
55+
56+
expect(transformation.toString()).toStrictEqual('q_80');
57+
});
58+
59+
it('quality:80.quantization', () => {
60+
const transformation = fromJson([
61+
{
62+
actionType: 'quality',
63+
level: '80',
64+
quantization: 10
65+
}
66+
]);
67+
68+
expect(transformation.toString()).toStrictEqual('q_80:qmax_10');
69+
});
70+
71+
it('quality:auto', () => {
72+
const transformation = fromJson([
73+
{
74+
actionType: 'quality',
75+
level: 'auto'
76+
}
77+
]);
78+
79+
expect(transformation.toString()).toStrictEqual('q_auto');
80+
});
81+
82+
it('chromaSubSampling', () => {
83+
const transformation = fromJson([
84+
{
85+
actionType: 'quality',
86+
level: '75',
87+
chromaSubSampling: 'CHROMA_420'
88+
}
89+
]);
90+
91+
expect(transformation.toString()).toStrictEqual('q_75:420');
92+
});
4293
});

src/actions/delivery.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*/
88

99
import {DeliveryFormatAction} from "./delivery/DeliveryFormatAction.js";
10-
import {DeliveryQualityAction} from "./delivery/DeliveryQuality.js";
10+
import {DeliveryQualityAction} from "./delivery/DeliveryQualityAction.js";
1111
import {FormatQualifier} from "../qualifiers/format/FormatQualifier.js";
1212
import {toFloatAsString} from "../internal/utils/toFloatAsString.js";
1313
import {DeliveryColorSpaceFromICCAction} from "./delivery/DeliveryColorSpaceFromICCAction.js";

src/actions/delivery/DeliveryQuality.ts renamed to src/actions/delivery/DeliveryQualityAction.ts

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import {QualifierValue} from "../../internal/qualifier/QualifierValue.js";
22
import {Qualifier} from "../../internal/qualifier/Qualifier.js";
33
import {DeliveryAction} from "./DeliveryAction.js";
44
import {IDeliveryQualityModel} from "../../internal/models/IDeliveryActionModel.js";
5-
import {ACTION_TYPE_TO_CHROMA_MAP} from "../../internal/internalConstants.js";
5+
import {CHROMA_VALUE_TO_CHROMA_MODEL_ENUM, CHROMA_MODEL_ENUM_TO_CHROMA_VALUE} from "../../internal/internalConstants.js";
6+
import {IActionModel} from "../../internal/models/IActionModel.js";
67

78

89
/**
@@ -19,7 +20,6 @@ class DeliveryQualityAction extends DeliveryAction {
1920
*/
2021
constructor(qualityValue: string | number) {
2122
super( 'q', qualityValue.toString(), 'level');
22-
this.qualityValue = qualityValue;
2323
}
2424

2525
/**
@@ -28,8 +28,8 @@ class DeliveryQualityAction extends DeliveryAction {
2828
* @param {420 | 444 | number} type The chroma sub sampling type
2929
*/
3030
chromaSubSampling(type: 420 | 444 | number): this {
31-
this._actionModel.chromaSubSampling = ACTION_TYPE_TO_CHROMA_MAP[type];
32-
const qualityWithSubSampling = new QualifierValue([this.qualityValue, type]);
31+
this._actionModel.chromaSubSampling = CHROMA_VALUE_TO_CHROMA_MODEL_ENUM[type];
32+
const qualityWithSubSampling = new QualifierValue([this._actionModel.level, type]);
3333
qualityWithSubSampling.setDelimiter(':');
3434
// We either have chroma or quantization, but not both
3535
return this.addQualifier(new Qualifier('q', qualityWithSubSampling));
@@ -41,12 +41,26 @@ class DeliveryQualityAction extends DeliveryAction {
4141
*/
4242
quantization(val:number): this {
4343
this._actionModel.quantization = val;
44-
const qualityWithQuantization = new QualifierValue([this.qualityValue, `qmax_${val}`]);
45-
qualityWithQuantization.setDelimiter(':');
44+
const qualityWithQuantization = new QualifierValue([this._actionModel.level, `qmax_${val}`]).setDelimiter(':');
4645

4746
// We either have chroma or quantization, but not both
4847
return this.addQualifier(new Qualifier('q', qualityWithQuantization));
4948
}
49+
50+
static fromJson(actionModel: IActionModel): DeliveryQualityAction {
51+
const {level, chromaSubSampling, quantization} = (actionModel as IDeliveryQualityModel);
52+
const result = new this(level);
53+
54+
if (chromaSubSampling){
55+
//Turn strings like 'CHROMA_420' to 420
56+
const chromaValue = CHROMA_MODEL_ENUM_TO_CHROMA_VALUE[chromaSubSampling.toUpperCase()];
57+
chromaValue && result.chromaSubSampling(+chromaValue);
58+
}
59+
60+
quantization && result.quantization(quantization);
61+
62+
return result;
63+
}
5064
}
5165

5266
export {DeliveryQualityAction};

src/internal/fromJson.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {ResizeMinimumPadAction} from "../actions/resize/ResizeMinimumPadAction.j
1818
import {DeliveryColorSpaceAction} from "../actions/delivery/DeliveryColorSpaceAction.js";
1919
import {DeliveryColorSpaceFromICCAction} from "../actions/delivery/DeliveryColorSpaceFromICCAction.js";
2020
import {DeliveryFormatAction} from "../actions/delivery/DeliveryFormatAction.js";
21+
import {DeliveryQualityAction} from "../actions/delivery/DeliveryQualityAction.js";
2122

2223
const ActionModelMap: Record<string, IHasFromJson> = {
2324
scale: ResizeScaleAction,
@@ -33,7 +34,8 @@ const ActionModelMap: Record<string, IHasFromJson> = {
3334
minimumPad: ResizeMinimumPadAction,
3435
colorSpace: DeliveryColorSpaceAction,
3536
colorSpaceFromICC: DeliveryColorSpaceFromICCAction,
36-
format: DeliveryFormatAction
37+
format: DeliveryFormatAction,
38+
quality: DeliveryQualityAction
3739
};
3840

3941
/**

src/internal/internalConstants.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ export const ACTION_TYPE_TO_EFFECT_MODE_MAP: Record<string, string> = {
106106
advancedRedEye: 'adv_redeye'
107107
};
108108

109-
export const ACTION_TYPE_TO_CHROMA_MAP: Record<number, string> = {
109+
export const CHROMA_VALUE_TO_CHROMA_MODEL_ENUM: Record<number, string> = {
110110
444: "CHROMA_444",
111111
420: "CHROMA_420"
112112
};
@@ -118,6 +118,8 @@ export const COLOR_SPACE_MODEL_MODE_TO_COLOR_SPACE_MODE_MAP: Record<string, stri
118118
'srgbTrueColor': 'srgb:truecolor'
119119
};
120120

121+
export const CHROMA_MODEL_ENUM_TO_CHROMA_VALUE = objectFlip(CHROMA_VALUE_TO_CHROMA_MODEL_ENUM);
122+
121123
export const COLOR_SPACE_MODE_TO_COLOR_SPACE_MODEL_MODE_MAP = objectFlip(COLOR_SPACE_MODEL_MODE_TO_COLOR_SPACE_MODE_MAP);
122124

123125
export const CROP_MODE_TO_ACTION_TYPE_MAP = objectFlip(ACTION_TYPE_TO_CROP_MODE_MAP);

0 commit comments

Comments
 (0)