@aurigma/design-atoms
Version:
Design Atoms is a part of Customer's Canvas SDK which allows for manipulating individual design elements through your code.
114 lines • 7.02 kB
JavaScript
import { Violation, ViolationState, ViolationInfoResult } from "./Violation";
import { PlaceholderItem, ImageItem } from "@aurigma/design-atoms-model/Product/Items";
import { ItemUtils } from "../../../Utils/ItemUtils";
import { ImageViolationSettings } from "@aurigma/design-atoms-model/Product/Items/ImageViolationSettings";
import { EqualsOfFloatNumbers } from "@aurigma/design-atoms-model/Math";
import { SurfaceContainer } from "@aurigma/design-atoms-model/Product/Container";
export class ImageQualityViolation extends Violation {
constructor(_productHandler, config, _messages, _renderingDpi, _eventManager) {
super();
this._productHandler = _productHandler;
this._messages = _messages;
this._renderingDpi = _renderingDpi;
this._eventManager = _eventManager;
this._dpiValuePlaceholder = "[DPI_VALUE_PLACEHOLDER]";
this._getQualityInfo = (imageItem, targetDpi) => {
const imageItemHandler = this._productHandler.getHandler(imageItem);
if (imageItemHandler == null)
return ViolationInfoResult.none;
const renderingToSourceImageDpiRatio = this._getRenderingToSourceImageDpiRatio(imageItemHandler, targetDpi);
if (renderingToSourceImageDpiRatio == null)
return ViolationInfoResult.none;
const currentDpi = targetDpi * renderingToSourceImageDpiRatio;
const data = { dpiValue: currentDpi };
const renderingToSourceImageDpiRatioPct = renderingToSourceImageDpiRatio * 100;
if (this._qualityLevels.bad - renderingToSourceImageDpiRatioPct > 0.001)
return { state: ViolationState.Bad, data: data, message: this._getMessage(ViolationState.Bad, currentDpi) };
if (this._qualityLevels.warning - renderingToSourceImageDpiRatioPct > 0.001)
return { state: ViolationState.Warning, data: data, message: this._getMessage(ViolationState.Warning, currentDpi) };
return { state: ViolationState.Good, data: data };
};
this._getRenderingToSourceImageDpiRatio = (imageItemHandler, targetDpi) => {
const rect = imageItemHandler.rectangle;
const source = imageItemHandler.item.source;
const renderingWidth = rect.width * targetDpi / source.dpiX;
const renderingHeight = rect.height * targetDpi / source.dpiY;
const sourceSize = ItemUtils.getImageSizeInPoints(source);
const renderingToSourceImageDpiRatio = Math.min(sourceSize.width / renderingWidth, sourceSize.height / renderingHeight);
return renderingToSourceImageDpiRatio;
};
this._checkDpiChanging = (newInfo, oldViolationInfo, item) => {
var _a, _b;
const oldDpiValue = (_a = oldViolationInfo === null || oldViolationInfo === void 0 ? void 0 : oldViolationInfo.data[this.getDataPropertyName()]) === null || _a === void 0 ? void 0 : _a.dpiValue;
const newDpiValue = (_b = newInfo === null || newInfo === void 0 ? void 0 : newInfo.data) === null || _b === void 0 ? void 0 : _b.dpiValue;
if (oldDpiValue == null || EqualsOfFloatNumbers(oldDpiValue, newDpiValue))
return;
this._eventManager.imageDpiChangedEvent.notify({
oldValue: oldDpiValue,
newValue: newDpiValue,
item: item,
state: newInfo.state
});
};
this._qualityLevels = Object.assign({ bad: 100, warning: 100 }, (config === null || config === void 0 ? void 0 : config.qualityLevels) || {});
if (this._qualityLevels.warning < this._qualityLevels.bad) {
console.warn("violationWarningsSettings.qualityMeter.qualityLevels.warning cannot be less than violationWarningsSettings.qualityMeter.qualityLevels.bad.");
}
}
set renderingDpi(value) { this._renderingDpi = value; }
isAvailableFor(item) {
return item instanceof ImageItem || item instanceof PlaceholderItem;
}
// review для ImageQualityViolation я бы сделал наследника IImageQualityViolationInfo extends IViolationInfo
// который бы включал в себя более подробную информацию
getViolationInfo(item, oldViolationInfo) {
var _a, _b;
if (item instanceof PlaceholderItem && item.isStubOrEmpty)
return ViolationInfoResult.good;
const image = ItemUtils.getImageItem(item);
if (image == null || ((_a = image.source) === null || _a === void 0 ? void 0 : _a.id) == null)
return ViolationInfoResult.none;
// TODO: Revisit DPI validation logic for PDF/AI files.
// - PDFs can be vector-based, raster-based, or hybrid
// - AI files may contain embedded raster images
// Current solution may incorrectly skip DPI checks for mixed-content files
const isPdfOrAi = image.source.id.toLowerCase().endsWith(".pdf") || image.source.id.toLowerCase().endsWith(".ai");
if (((_b = image.source) === null || _b === void 0 ? void 0 : _b.isVector) || isPdfOrAi)
return ViolationInfoResult.good;
const imageViolationSettings = item.violationSettings instanceof ImageViolationSettings ? item.violationSettings : null;
if (imageViolationSettings == null || !imageViolationSettings.allowImageQuality)
return ViolationInfoResult.good;
const targetDpi = this._getTargetDpi(item);
const newInfo = this._getQualityInfo(image, targetDpi);
this._checkDpiChanging(newInfo, oldViolationInfo, item);
return newInfo;
}
/**
* Retrieves the target DPI from the container constraints if specified.
* If no constraint is set, it falls back to the default `_renderingDpi`.
*/
_getTargetDpi(item) {
var _a, _b;
const parent = item.parentContainer;
if (parent instanceof SurfaceContainer) {
return (_b = (_a = parent.printingTechniqueConstraints) === null || _a === void 0 ? void 0 : _a.targetDpi) !== null && _b !== void 0 ? _b : this._renderingDpi;
}
return this._renderingDpi;
}
_getMessage(state, dpiValue) {
const roundedDpi = Math.round(dpiValue).toString();
const templateMessage = state === ViolationState.Bad ?
this._messages.badImageResolution :
this._messages.warningImageResolution;
return templateMessage.replace(this._dpiValuePlaceholder, roundedDpi);
}
getStatePropertyName() {
return ImageQualityViolation.statePropertyName;
}
getDataPropertyName() {
return ImageQualityViolation.dataPropertyName;
}
}
ImageQualityViolation.dataPropertyName = "qualityViolationData";
ImageQualityViolation.statePropertyName = "qualityViolationState";
//# sourceMappingURL=ImageQualityViolation.js.map