/* * Copyright (C) 2010-2016 JPEXS, All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. */ package com.jpexs.decompiler.flash.importers; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.helpers.ImageHelper; import com.jpexs.decompiler.flash.tags.DefineBitsJPEG2Tag; import com.jpexs.decompiler.flash.tags.DefineBitsJPEG3Tag; import com.jpexs.decompiler.flash.tags.DefineBitsJPEG4Tag; import com.jpexs.decompiler.flash.tags.DefineBitsLossless2Tag; import com.jpexs.decompiler.flash.tags.DefineBitsLosslessTag; import com.jpexs.decompiler.flash.tags.DefineShape2Tag; import com.jpexs.decompiler.flash.tags.DefineShape3Tag; import com.jpexs.decompiler.flash.tags.DefineShape4Tag; import com.jpexs.decompiler.flash.tags.DefineShapeTag; import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.flash.tags.base.ImageTag; import com.jpexs.decompiler.flash.tags.base.ShapeTag; import com.jpexs.decompiler.flash.tags.enums.ImageFormat; import com.jpexs.decompiler.flash.types.RECT; import com.jpexs.decompiler.flash.types.SHAPEWITHSTYLE; import java.awt.Dimension; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; /** * * @author JPEXS */ public class ShapeImporter { public Tag importImage(ShapeTag st, byte[] newData) throws IOException { return importImage(st, newData, 0, true); } public Tag importImage(ShapeTag st, byte[] newData, int tagType, boolean fill) throws IOException { ImageTag imageTag = addImage(st, newData, tagType); st.setModified(true); RECT rect = st.getRect(); if (!fill) { Dimension dimension = imageTag.getImageDimension(); rect.Xmax = rect.Xmin + (int) (SWF.unitDivisor * dimension.getWidth()); rect.Ymax = rect.Ymin + (int) (SWF.unitDivisor * dimension.getHeight()); } SHAPEWITHSTYLE shapes = imageTag.getShape(rect, fill); st.shapes = shapes; return (Tag) st; } /** * Adds an image tag before the specified tag * * @param st * @param newData * @param tagType * @return * @throws IOException */ public ImageTag addImage(Tag st, byte[] newData, int tagType) throws IOException { SWF swf = st.getSwf(); if (newData[0] == 'B' && newData[1] == 'M') { BufferedImage b = ImageHelper.read(newData); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageHelper.write(b, ImageFormat.PNG, baos); newData = baos.toByteArray(); } if (tagType == 0) { if (ImageTag.getImageFormat(newData) == ImageFormat.JPEG) { tagType = DefineBitsJPEG2Tag.ID; } else { tagType = DefineBitsLossless2Tag.ID; } } ImageTag imageTag; switch (tagType) { case DefineBitsJPEG2Tag.ID: { imageTag = new DefineBitsJPEG2Tag(swf, null, swf.getNextCharacterId(), newData); break; } case DefineBitsJPEG3Tag.ID: { imageTag = new DefineBitsJPEG3Tag(swf, null, swf.getNextCharacterId(), newData); break; } case DefineBitsJPEG4Tag.ID: { imageTag = new DefineBitsJPEG4Tag(swf, null, swf.getNextCharacterId(), newData); break; } case DefineBitsLosslessTag.ID: { DefineBitsLosslessTag losslessTag = new DefineBitsLosslessTag(swf); losslessTag.setImage(newData); imageTag = losslessTag; break; } case DefineBitsLossless2Tag.ID: { DefineBitsLossless2Tag lossless2Tag = new DefineBitsLossless2Tag(swf); lossless2Tag.setImage(newData); imageTag = lossless2Tag; break; } default: throw new Error("Unsupported image type tag."); } swf.addTag(imageTag, st); swf.updateCharacters(); return imageTag; } public static int getShapeTagType(String format) { int res = 0; switch (format) { case "shape": res = DefineShapeTag.ID; break; case "shape2": res = DefineShape2Tag.ID; break; case "shape3": res = DefineShape3Tag.ID; break; case "shape4": res = DefineShape4Tag.ID; break; } return res; } }