UNPKG

@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
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