boolean scaleWidth = (requestedDimension.getWidth() > 0 && requestedDimension.getWidth() != originalDimension.getWidth()); boolean scaleHeight = (requestedDimension.getHeight() > 0 && requestedDimension.getHeight() != originalDimension.getHeight()); if (scaleWidth || scaleHeight) { long requestedWidth = requestedDimension.getWidth(); long requestedHeight = requestedDimension.getHeight(); double imageRatio = (double)originalDimension.getWidth() / (double)originalDimension.getHeight(); if (requestedWidth == 0 && requestedHeight > 0) { requestedWidth = (int)Math.round(requestedHeight * imageRatio); || (originalDimension.getWidth() < requestedWidth) || (originalDimension.getHeight() < requestedHeight)) { return SCALING_NOT_POSSIBLE_DIMENSION; return new Dimension(requestedWidth, requestedHeight);
/** * Build HTML5 video player element * @param media Media metadata * @return Media element */ protected Video getVideoPlayerElement(@NotNull Media media) { Dimension dimension = MediaMarkupBuilderUtil.getMediaformatDimension(media); Video video = new Video(); video.setWidth((int)dimension.getWidth()); video.setHeight((int)dimension.getHeight()); video.setControls(true); // add video sources for each video profile addSources(video, media); // add flash player as fallback video.addContent(getFlashPlayerElement(media, dimension)); return video; }
/** * Get minimum dimensions for media format. If only with or height is defined the missing dimensions * is calculated from the ratio. If no ratio defined either only width or height dimension is returned. * If neither width or height are defined null is returned. * @return Min. dimensions or null */ public Dimension getMinDimension() { long effWithMin = getEffectiveMinWidth(); long effHeightMin = getEffectiveMinHeight(); double effRatio = getRatio(); if (effWithMin == 0 && effHeightMin > 0 && effRatio > 0) { effWithMin = Math.round(effHeightMin * effRatio); } if (effWithMin > 0 && effHeightMin == 0 && effRatio > 0) { effHeightMin = Math.round(effWithMin / effRatio); } if (effWithMin > 0 || effHeightMin > 0) { return new Dimension(effWithMin, effHeightMin); } else { return null; } }
if (scaledDimension != null && !scaledDimension.equals(SCALING_NOT_POSSIBLE_DIMENSION)) {
@Override public long getWidth() { if (this.imageDimension != null) { return this.imageDimension.getWidth(); } else { return 0; } }
@Override public long getHeight() { if (this.imageDimension != null) { return this.imageDimension.getHeight(); } else { return 0; } }
/** * Requested dimensions either from media format or fixed dimensions from media args. * @return Requested dimensions */ private Dimension getRequestedDimension() { // check for fixed dimensions from media args if (mediaArgs.getFixedWidth() > 0 || mediaArgs.getFixedHeight() > 0) { return new Dimension(mediaArgs.getFixedWidth(), mediaArgs.getFixedHeight()); } // check for dimensions from mediaformat (evaluate only first media format) MediaFormat[] mediaFormats = mediaArgs.getMediaFormats(); if (mediaFormats != null && mediaFormats.length > 0) { Dimension dimension = mediaFormats[0].getMinDimension(); if (dimension != null) { return dimension; } } // fallback to 0/0 - no specific dimension requested return new Dimension(0, 0); }
if (scaledDimension.equals(SCALING_NOT_POSSIBLE_DIMENSION)) { return null;
/** * Get dimension from first media format defined in media args. Fall back to dummy min. dimension if none specified. * @param media Media metadata * @return Dimension */ public static @NotNull Dimension getMediaformatDimension(@NotNull Media media) { // Create dummy image element to be displayed in Edit mode as placeholder. MediaArgs mediaArgs = media.getMediaRequest().getMediaArgs(); MediaFormat[] mediaFormats = mediaArgs.getMediaFormats(); // detect width/height - either from media args, or from first media format long width = mediaArgs.getFixedWidth(); long height = mediaArgs.getFixedHeight(); if ((width == 0 || height == 0) && mediaFormats != null && mediaFormats.length > 0) { MediaFormat firstMediaFormat = mediaArgs.getMediaFormats()[0]; Dimension dimension = firstMediaFormat.getMinDimension(); if (dimension != null) { width = dimension.getWidth(); height = dimension.getHeight(); } } // fallback to min width/height if (width == 0) { width = MediaMarkupBuilder.DUMMY_MIN_DIMENSION; } if (height == 0) { height = MediaMarkupBuilder.DUMMY_MIN_DIMENSION; } return new Dimension(width, height); }
@SuppressWarnings({ "null", "unused" }) @Override public HtmlElement<?> build(@NotNull Media media) { // Create dummy image element to be displayed in Edit mode as placeholder. Dimension dimension = MediaMarkupBuilderUtil.getMediaformatDimension(media); MediaArgs mediaArgs = media.getMediaRequest().getMediaArgs(); // create dummy image String dummyImageUrl = StringUtils.defaultString(mediaArgs.getDummyImageUrl(), DUMMY_IMAGE); dummyImageUrl = urlHandler.get(dummyImageUrl) .urlMode(media.getMediaRequest().getMediaArgs().getUrlMode()) .buildExternalResourceUrl(); Image image = new Image(dummyImageUrl, dimension.getWidth(), dimension.getHeight()) .addCssClass(MediaNameConstants.CSS_DUMMYIMAGE); // set additional attributes setAdditionalAttributes(image, media); // enable drag&drop for media source - if none is specified use first one defined in config MediaSource mediaSource = media.getMediaSource(); if (mediaSource == null && !mediaHandlerConfig.getSources().isEmpty()) { Class<? extends MediaSource> mediaSourceClass = mediaHandlerConfig.getSources().iterator().next(); mediaSource = AdaptTo.notNull(adaptable, mediaSourceClass); } if (mediaSource != null) { mediaSource.enableMediaDrop(image, media.getMediaRequest()); } return image; }
/** * Gets the dimension of the uploaded image (if the binary is an image file at all). * @return Dimension */ private Dimension getImageDimension() { Dimension dimension = null; // check for cropping dimension if (this.media.getCropDimension() != null) { dimension = this.media.getCropDimension(); } else { // if binary is image try to calculcate dimensions by loading it into a layer Layer layer = this.resource.adaptTo(Layer.class); if (layer != null) { dimension = new Dimension(layer.getWidth(), layer.getHeight()); } } return dimension; }
/** * Builds URL to rescaled version of the binary image. * @return Media URL */ private String buildScaledMediaUrl(Dimension dimension, CropDimension cropDimension) { String resourcePath = this.resource.getPath(); // if parent resource is a nt:file resource, use this one as path for scaled image Resource parentResource = this.resource.getParent(); if (JcrBinary.isNtFile(parentResource)) { resourcePath = parentResource.getPath(); } // URL to render scaled image via {@link InlineRenditionServlet} String path = resourcePath + "." + ImageFileServlet.SELECTOR + "." + dimension.getWidth() + "." + dimension.getHeight() + (cropDimension != null ? "." + cropDimension.getCropString() : "") + (this.mediaArgs.isContentDispositionAttachment() ? "." + MediaFileServlet.SELECTOR_DOWNLOAD : "") + "." + MediaFileServlet.EXTENSION + "/" // replace extension based on the format supported by ImageFileServlet for rendering for this rendition + ImageFileServlet.getImageFileName(getFileName()); // build externalized URL UrlHandler urlHandler = AdaptTo.notNull(this.adaptable, UrlHandler.class); return urlHandler.get(path).urlMode(this.mediaArgs.getUrlMode()).buildExternalResourceUrl(this.resource); }