gifData =new ConcurrentHashMap<>();
-
- public static void setGifData(String k,byte[] v){
- gifData.put(k, v);
- }
- public static byte[] getGifData(String k){
- return gifData.get(k);
- }
-
-
-
- static boolean CheckArgs(Object[] args,int num) {
- return args.length==num;
- }
-
- static Color TextToColor(String ColorText) {
- Color result=new Color(0,0,0);
- if (ColorText.length() != 6) {
- return result;
- }
- final int red = Integer.parseInt(ColorText.substring(0, 2), 16);
- final int blue = Integer.parseInt(ColorText.substring(2, 4), 16);
- final int green = Integer.parseInt(ColorText.substring(4, 6), 16);
- if (red > 255 || red < 0) {
- return result;
- }
- if (blue > 255 || blue < 0) {
- return result;
- }
- if (green > 255 || green < 0) {
- return result;
- }
- Color color = new Color(red, blue, green);
- return color;
- }
- final static BufferedImage ImageFromText(String text, int fontSize, Color color, int width) {
-
- Font font = new Font("黑体", Font.BOLD, fontSize);
- FontMetrics fm = FontDesignMetrics.getMetrics(font);
- final int y = fm.getAscent();
- int textWidth = fm.stringWidth(text);
- int textHeight=fm.getHeight();
- BufferedImage img = new BufferedImage(width, textHeight, BufferedImage.TYPE_4BYTE_ABGR);
- Graphics2D g2 = img.createGraphics();
-
- AffineTransform affineTransform = new AffineTransform();
- Font rotatedFont = font.deriveFont(affineTransform);
- g2.setFont(rotatedFont);
- g2.setColor(color);
- g2.drawString(text, 0, y);
- g2.dispose();
- return img;
- }
- final static BufferedImage ImageFromMultiText(String text, int fontSize, Color color) {
-
- Font font = new Font("黑体", Font.BOLD, fontSize);
- FontMetrics fm = FontDesignMetrics.getMetrics(font);
-
- int textWidth = fm.stringWidth(text);
- int textHeight=fm.getHeight();
- final int top = fm.getAscent()+(textWidth-textHeight)/2;
-
- BufferedImage img = new BufferedImage(textWidth, textWidth, BufferedImage.TYPE_4BYTE_ABGR);
- Graphics2D g2 = img.createGraphics();
-
- AffineTransform affineTransform = new AffineTransform();
- Font rotatedFont = font.deriveFont(affineTransform);
- g2.setFont(rotatedFont);
- g2.setColor(color);
- g2.drawString(text, 0, top);
- g2.dispose();
- return img;
- }
-
-
- final static void CreateCountUpAnimate(String id, Integer number, int fontSize, int rate, Color color, int width) {
-
- // 读数据
- int len=10;
- int step=number/len;
-
- AnimatedGifEncoder e = new AnimatedGifEncoder();
- ByteArrayOutputStream out=new ByteArrayOutputStream();
- e.start(out);
-
- //图片之间间隔时间
- e.setDelay(rate); // 1 frame per sec
- //重复次数 0表示无限重复 默认不重复
- e.setRepeat(0);
- //添加图片
- String subStr;
- for (int i = 0; i <= len; i++) {
- subStr=String.valueOf(i*step);
- e.addFrame(ImageFromText(subStr,fontSize,color,width));
- }
- e.finish();
-
- byte[] data = out.toByteArray();
- CartUtils.setGifData(id,data);
- }
- static String GetCellId(AbstractFunction calculator){
- final ColumnRow currentColumnRow = calculator.getCalculator().getCurrentColumnRow();
- int intRow=currentColumnRow.getRow();
- int intCol=currentColumnRow.getColumn();
- final String strCol = String.valueOf((char) (intCol + 65));
- String id=strCol+intRow;
- final JTemplate, ?> currentEditingTemplate = com.fanruan.api.design.DesignKit.getCurrentEditingTemplate();
- BaseBook target = currentEditingTemplate.getTarget();
- final String templateID = target.getTemplateID();
- final String getTemplateName = currentEditingTemplate.getTemplateName();
-// FineLoggerFactory.getLogger().info("getTemplateName:{}",getTemplateName);
-// FineLoggerFactory.getLogger().info("System.currentTimeMillis():{}",System.currentTimeMillis());
-// FineLoggerFactory.getLogger().info("name:{}",nameID);
-
- return templateID+"-"+System.currentTimeMillis()+"-"+id;
- }
- static BufferedImage readImage(Object file) {
- BufferedImage res=null;
- String filename = file.toString();
- if(isHttpUrl(filename)){
- res= BaseUtils.readImage(filename);
- }else {
-
- File fn = new File(filename);
- try {
- ImageIO.setUseCache(false);
- res = ImageIO.read(fn);
-
- } catch (IOException e) {
- throw new Error("File:" + filename + InterProviderFactory.getProvider().getLocText("Plugin.Function.ImagProcess_ReadImageError"));
- }
- }
- return res;
- }
- static boolean isHttpUrl(String urls) {
- String regex = "(((https|http)?://)?([a-z0-9]+[.])|(www.))"
- + "\\w+[.|\\/]([a-z0-9]{0,})?[[.]([a-z0-9]{0,})]+((/[\\S&&[^,;\u4E00-\u9FA5]]+)+)?([.][a-z0-9]{0,}+|/?)";//设置正则表达式
-
- Pattern pat = Pattern.compile(regex.trim());//对比
- Matcher mat = pat.matcher(urls.trim());
- return mat.matches();//判断是否匹配
- }
- static String[] GetSrcImgFromArgs(Object arg){
- if (arg instanceof FArray) {
- FArray fa = (FArray) arg;
- int len = fa.length();
- String[] result = new String[len];
- for (int j = 0; j < len; j++) {
- Object fao = fa.elementAt(j);
- String title = GeneralUtils.objectToString(fao);
- if (title != null && title != "" && title.length() != 0) {
- result[j] = title;
- }
- }
- return result;
- }
- return null;
- }
-}
diff --git a/src/com/fr/plugin/cool/cartnoon/FRAnimateArraow.java b/src/com/fr/plugin/cool/cartnoon/FRAnimateArraow.java
deleted file mode 100644
index 9f1cfcc..0000000
--- a/src/com/fr/plugin/cool/cartnoon/FRAnimateArraow.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package com.fr.plugin.cool.cartnoon;
-
-import com.fr.intelli.record.Focus;
-import com.fr.intelli.record.Original;
-import com.fr.locale.InterProviderFactory;
-import com.fr.plugin.PluginLicense;
-import com.fr.plugin.PluginLicenseManager;
-import com.fr.plugin.context.PluginContext;
-import com.fr.plugin.cool.cartnoon.utils.AnimatedGifEncoder;
-import com.fr.plugin.cool.cartnoon.utils.DrawValueLine;
-import com.fr.plugin.manage.PluginManager;
-import com.fr.record.analyzer.EnableMetrics;
-import com.fr.script.AbstractFunction;
-import com.fr.stable.Primitive;
-import com.fr.stable.fun.Authorize;
-
-import java.awt.*;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-
-@EnableMetrics
-@Authorize(callSignKey = CartUtils.PLUGIN_ID)
-public class FRAnimateArraow extends AbstractFunction {
- @Override
- @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRAnimateArraow", source = Original.PLUGIN)
- public Object run(Object[] args) {
- PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(CartUtils.PLUGIN_ID);
- if (!pluginLicense.isAvailable()) {
- return InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR");
- }
- PluginContext contexts = PluginManager.getContext(CartUtils.PLUGIN_ID);
- if(!contexts.isActive()){
- return "插件已被禁用!";
- }
- if(!CartUtils.CheckArgs(args,4)){
- return Primitive.ERROR_VALUE;
- }
-
- final int width= Integer.parseInt(args[0].toString());
- final int height= Integer.parseInt(args[1].toString());
- final Color color = CartUtils.TextToColor(args[2].toString());
- final int stroke= Integer.parseInt(args[3].toString());
-
- final String id= CartUtils.GetCellId(this);
- final String url="/webroot/decision/url/img?id="+id;
-
- try {
- CreateAnimateArra(id,width,height,color,stroke);
- } catch (IOException e) {
- e.printStackTrace();
- }
- return "";
-
- }
- private void CreateAnimateArra(String id,int width,int height,Color color,int stroke) throws IOException {
- // 读数据
- AnimatedGifEncoder e = new AnimatedGifEncoder();
-
- ByteArrayOutputStream out=new ByteArrayOutputStream();
- e.start(out);
- e.setTransparent(new Color(255,255,255));
- //图片之间间隔时间
- e.setDelay(100); // 1 frame per sec
- //重复次数 0表示无限重复 默认不重复
- e.setRepeat(0);
- //添加图片
-
- int arraLen=width*8/10;
- int len=arraLen/10;
- for (int i = 1; i <= len; i++) {
- final BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
- e.addFrame(setFilter(image,i*10,stroke,stroke*2,color));
- }
- e.finish();
-
- byte[] data = out.toByteArray();
- CartUtils.setGifData(id,data);
- }
- //生成箭头
- private BufferedImage setFilter(BufferedImage src,int arraLen, float stroke, double alh,Color color) {
- int sx=src.getWidth()/10;
- int sy=src.getHeight()/10;
- int ex=sx+arraLen;
- int ey=sy;
- DrawValueLine drawValueLine= new DrawValueLine(src,sx,sy,ex,ey,alh);
- drawValueLine.DrawLine(stroke,color);
- return src;
- }
-
-}
\ No newline at end of file
diff --git a/src/com/fr/plugin/cool/cartnoon/FRBlurText.java b/src/com/fr/plugin/cool/cartnoon/FRBlurText.java
deleted file mode 100644
index 99cc28a..0000000
--- a/src/com/fr/plugin/cool/cartnoon/FRBlurText.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package com.fr.plugin.cool.cartnoon;
-
-import com.fr.intelli.record.Focus;
-import com.fr.intelli.record.Original;
-import com.fr.locale.InterProviderFactory;
-import com.fr.plugin.PluginLicense;
-import com.fr.plugin.PluginLicenseManager;
-import com.fr.plugin.context.PluginContext;
-import com.fr.plugin.cool.cartnoon.utils.AnimatedGifEncoder;
-import com.fr.plugin.manage.PluginManager;
-import com.fr.record.analyzer.EnableMetrics;
-import com.fr.script.AbstractFunction;
-import com.fr.stable.Primitive;
-import com.fr.stable.fun.Authorize;
-import com.jhlabs.image.GaussianFilter;
-
-import java.awt.*;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-
-@EnableMetrics
-@Authorize(callSignKey = CartUtils.PLUGIN_ID)
-public class FRBlurText extends AbstractFunction {
- @Override
- @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRBlurText", source = Original.PLUGIN)
- public Object run(Object[] args) {
- PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(CartUtils.PLUGIN_ID);
- if (!pluginLicense.isAvailable()) {
- return InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR");
- }
- PluginContext contexts = PluginManager.getContext(CartUtils.PLUGIN_ID);
- if(!contexts.isActive()){
- return "插件已被禁用!";
- }
- if(!CartUtils.CheckArgs(args,6)){
- return Primitive.ERROR_VALUE;
- }
- final String text = args[0].toString();
-
- int width= Integer.parseInt(args[1].toString());
- int height= Integer.parseInt(args[2].toString());
- int fontSize= Integer.parseInt(args[3].toString());
- int rate= Integer.parseInt(args[4].toString());
- final Color color = CartUtils.TextToColor(args[5].toString());
-
- final String id= CartUtils.GetCellId(this);
- final String url="/webroot/decision/url/img?id="+id;
- try {
- CreateMasaicText(id,text,fontSize,rate,color);
- } catch (IOException e) {
- e.printStackTrace();
- }
- return "";
-
- }
-
-
- private void CreateMasaicText(String id, String text, int fontSize, int rate, Color color) throws IOException {
-
- // 读数据
- AnimatedGifEncoder e = new AnimatedGifEncoder();
-
- ByteArrayOutputStream out=new ByteArrayOutputStream();
- e.start(out);
-
- //图片之间间隔时间
- e.setDelay(rate); // 1 frame per sec
- //重复次数 0表示无限重复 默认不重复
- e.setRepeat(0);
- //添加图片
- final BufferedImage image = CartUtils.ImageFromMultiText(text, fontSize, color);
- for (int o=100; o>0; o--) {
- e.addFrame(setFilter(image,o));
- }
- for (int i = 0; i < 30; i++) {
- e.addFrame(image);
- }
- e.finish();
-
- byte[] data = out.toByteArray();
- CartUtils.setGifData(id,data);
- }
- //图像上执行高斯模糊
- private BufferedImage setFilter(BufferedImage src,float radius) {
- BufferedImage result = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
- GaussianFilter gaussianFilter = new GaussianFilter();
- gaussianFilter.setRadius(radius);
- gaussianFilter.filter(src, result);
- return result;
- }
-
-}
\ No newline at end of file
diff --git a/src/com/fr/plugin/cool/cartnoon/FRCartnoonFunctions.java b/src/com/fr/plugin/cool/cartnoon/FRCartnoonFunctions.java
deleted file mode 100644
index 80d21b3..0000000
--- a/src/com/fr/plugin/cool/cartnoon/FRCartnoonFunctions.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.fr.plugin.cool.cartnoon;
-
-import com.fr.intelli.record.Focus;
-import com.fr.record.analyzer.EnableMetrics;
-import com.fr.stable.fun.Authorize;
-import com.fr.stable.fun.impl.AbstractFunctionDefContainer;
-import com.fr.stable.script.FunctionDef;
-@EnableMetrics
-@Authorize(callSignKey = CartUtils.PLUGIN_ID)
-public class FRCartnoonFunctions extends AbstractFunctionDefContainer {
- @Override
- @Focus(id= CartUtils.PLUGIN_ID, text="字符动画函数")
- public FunctionDef[] getFunctionDefs() {
- return new FunctionDef[]{
- new FunctionDef("FRPrintText", "生成打字机动画效果。\n参数说明:\n参数1:字符型,打字的文本。\n参数2:整型,显示宽度。\n参数3:整型,显示高度。\n参数4:整型,文本字号。\n参数5:整型,动画刷新频率(毫秒)。\n示例:FRPrintText(\"123456790\",500,100,20,100,\"ffff00\")", FRPrintText.class.getName()),
- new FunctionDef("FRRollText", "生成浮动文本动画效果。\n参数说明:\n参数1:字符型,要浮动的文本。\n参数2:整型,文本字号。\n参数3:字符型,文本颜色。\n示例:FRRollText(\"2021\",25,\"ff0000\")", FRRollText.class.getName()),
- new FunctionDef("FRDissolveText", "生成溶解文本动画效果。\n参数说明:\n参数1:字符型,要溶解的文本。\n参数2:整型,文本宽度。\n参数3:整型,文本高度。\n参数4:整型,文本字号。\n参数5:整型,动画刷新频率(毫秒)。\n示例:FRDissolveText(\"88888888888\",180,50,25,300,\"ff0000\")", FRDissolveText.class.getName()),
- new FunctionDef("FRRotateText", "生成旋转文本动画效果。\n参数说明:\n参数1:字符型,要旋转的文本。\n参数2:整型,文本宽度。\n参数3:整型,文本高度。\n参数4:整型,文本字号。\n参数5:整型,动画刷新频率(毫秒)。\n示例:FRRotateText(\"你好,世界\",180,180,25,300,\"ff0000\")", FRRotateText.class.getName()),
- new FunctionDef("FRAnimateArraow", "生成箭头动画效果。\n参数说明:\n参数1:整型,页面占用宽度。\n参数2:整型,页面占用高度。\n参数3:文本,箭头颜色,如FF0000。\n参数4:整型,箭头粗细。\n示例:FRAnimateArraow(300,200,\"ff0000\",10)", FRAnimateArraow.class.getName()),
- new FunctionDef("FRCountUp", "生成数字计数动画效果。\n参数说明:\n参数1:整型,要计数的数字。\n参数2:整型,显示宽度。\n参数3:整型,显示高度。\n参数4:整型,文本字号。\n参数5:整型,动画刷新频率(毫秒)。\n示例:FRCountUp(123456,500,100,20,100,\"ffff00\")", FRCountUp.class.getName()),
- new FunctionDef("FRClockTime", "生成时钟动画效果。\n参数说明:\n参数1:文本,时间,用HH:MM表示。\n参数2:整型,显示宽度。\n参数3:整型,显示高度。\n参数4:整型,动画刷新频率(毫秒)。\n示例:FRClockTime(\"6:30\",100,100,20)", FRClockTime.class.getName()),
- new FunctionDef("FRMasaicText", "生成马塞克动画效果。\n参数说明:\n参数1:显示的文本。\n参数2:整型,显示宽度。\n参数3:整型,显示高度。\n参数4:整型,动画刷新频率(毫秒)。\n示例:FRMasaicText(\"你好,世界\", 180, 180, 25, 100, \"ff0000\")", FRMasaicText.class.getName()),
- new FunctionDef("FRBlurText", "生成高斯模糊动画效果。\n参数说明:\n参数1:显示的文本。\n参数2:整型,显示宽度。\n参数3:整型,显示高度。\n参数4:整型,动画刷新频率(毫秒)。\n示例:FRBlurText(\"你好,世界\", 180, 180, 25, 60, \"ff0000\")", FRBlurText.class.getName()),
- new FunctionDef("FRCustomAnimation", "生成自定义动画效果。\n参数说明:\n参数1:文本数组,动画图片文件名或网址。\n参数2:整型,动画刷新频率(毫秒)。\n参数3:整型,显示宽度。\n参数4:整型,显示高度。\n示例:FRCustomAnimation([\"http://www.jhlabs.com/ip/filters/ChannelMixFilter.jpg\",\"http://www.jhlabs.com/ip/filters/DiffuseFilter.jpg\"], 100, 300, 300)", FRCustomAnimation.class.getName()),
-
- };
- }
-
- @Override
- public String getGroupName() {
- return "字符动画函数";
- }
-}
diff --git a/src/com/fr/plugin/cool/cartnoon/FRClockTime.java b/src/com/fr/plugin/cool/cartnoon/FRClockTime.java
deleted file mode 100644
index 45d35bb..0000000
--- a/src/com/fr/plugin/cool/cartnoon/FRClockTime.java
+++ /dev/null
@@ -1,121 +0,0 @@
-package com.fr.plugin.cool.cartnoon;
-
-import com.fr.base.BaseUtils;
-import com.fr.intelli.record.Focus;
-import com.fr.intelli.record.Original;
-import com.fr.locale.InterProviderFactory;
-import com.fr.plugin.PluginLicense;
-import com.fr.plugin.PluginLicenseManager;
-import com.fr.plugin.context.PluginContext;
-import com.fr.plugin.cool.cartnoon.utils.AnimatedGifEncoder;
-import com.fr.plugin.cool.cartnoon.web.ImageViewer;
-import com.fr.plugin.manage.PluginManager;
-import com.fr.record.analyzer.EnableMetrics;
-import com.fr.script.AbstractFunction;
-import com.fr.stable.Primitive;
-import com.fr.stable.fun.Authorize;
-import net.coobird.thumbnailator.Thumbnails;
-
-import java.awt.*;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-
-@EnableMetrics
-@Authorize(callSignKey = CartUtils.PLUGIN_ID)
-public class FRClockTime extends AbstractFunction {
- @Override
- @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRClockTime", source = Original.PLUGIN)
- public Object run(Object[] args) {
- PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(CartUtils.PLUGIN_ID);
- if (!pluginLicense.isAvailable()) {
- return InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR");
- }
- PluginContext contexts = PluginManager.getContext(CartUtils.PLUGIN_ID);
- if(!contexts.isActive()){
- return "插件已被禁用!";
- }
- if(!CartUtils.CheckArgs(args,4)){
- return Primitive.ERROR_VALUE;
- }
- final String time = args[0].toString();
- if(time.split(":").length!=2){
- return Primitive.ERROR_VALUE;
- }
- int htime=Integer.parseInt(time.split(":")[0]);
- if(htime>12){
- htime=htime%12;
- }
- int mtime=Integer.parseInt(time.split(":")[1]);
- int width= Integer.parseInt(args[1].toString());
- int height= Integer.parseInt(args[2].toString());
- int rate= Integer.parseInt(args[3].toString());
-
- final String id= CartUtils.GetCellId(this);
- final String url="/webroot/decision/url/img?id="+id;
- try {
- CreateClockTime(id,htime,mtime,width,rate);
- } catch (IOException e) {
- e.printStackTrace();
- }
- return "";
-
- }
-
-
- private void CreateClockTime(String id, int htime,int mtime, int width, int rate) throws IOException {
-
- BufferedImage bufferColck = BaseUtils.readImage("com/fr/plugin/cool/cartnoon/web/resource/images/clock.png");
- final BufferedImage bufferHour = BaseUtils.readImage("com/fr/plugin/cool/cartnoon/web/resource/images/hour.png");
- final BufferedImage bufferMinute = BaseUtils.readImage("com/fr/plugin/cool/cartnoon/web/resource/images/minute.png");
-
- bufferColck=setSize(bufferColck,width,width);
- AnimatedGifEncoder encoder = new AnimatedGifEncoder();
- ByteArrayOutputStream out=new ByteArrayOutputStream();
- encoder.start(out);
- encoder.setTransparent(Color.WHITE);
- encoder.setRepeat(0);
- encoder.setDelay(rate);
- Graphics2D g2d = bufferColck.createGraphics();
-
- int x1=bufferColck.getWidth()/2;
- int y1=bufferColck.getHeight()/2;
- int hrr=htime*360/12;
- int hrm=mtime*30/60;
- int mr=mtime*360/60;
-
- int o=36;
- for (int i=0; i<=o; i++) {
- g2d.setColor(Color.WHITE);
- BufferedImage hImage1=setFilter(bufferHour,1,hrr+i*hrm/o);
- BufferedImage hImage2=setSize(hImage1,bufferColck.getWidth(),bufferColck.getHeight());
- g2d.fillRect(x1/2,y1/2,x1,y1);
- g2d.drawImage(hImage2,null,0,0);
-
- BufferedImage mImage1=setFilter(bufferMinute,1,i*mr/o);
- BufferedImage mImage2=setSize(mImage1,bufferColck.getWidth(),bufferColck.getHeight());
- g2d.drawImage(mImage2,null,0,0);
- encoder.addFrame(bufferColck);
-
- }
- for (int i = 0; i <10 ; i++) {
- encoder.addFrame(bufferColck);
- }
-
-
- g2d.dispose();
- encoder.finish();
- byte[] data = out.toByteArray();
- CartUtils.setGifData(id,data);
- }
- //设置图像旋转缩放
- private static BufferedImage setFilter(BufferedImage src, float scale, float rotate) throws IOException {
- BufferedImage result = Thumbnails.of(src).scale(scale).rotate(rotate).asBufferedImage();
- return result;
- }
- private static BufferedImage setSize(BufferedImage src, int width, int height) throws IOException {
- BufferedImage result = Thumbnails.of(src).size(width,height).asBufferedImage();
- return result;
- }
-
-}
\ No newline at end of file
diff --git a/src/com/fr/plugin/cool/cartnoon/FRCustomAnimation.java b/src/com/fr/plugin/cool/cartnoon/FRCustomAnimation.java
deleted file mode 100644
index b9ab3f6..0000000
--- a/src/com/fr/plugin/cool/cartnoon/FRCustomAnimation.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.fr.plugin.cool.cartnoon;
-
-import com.fr.intelli.record.Focus;
-import com.fr.intelli.record.Original;
-import com.fr.locale.InterProviderFactory;
-import com.fr.plugin.PluginLicense;
-import com.fr.plugin.PluginLicenseManager;
-import com.fr.plugin.context.PluginContext;
-import com.fr.plugin.cool.cartnoon.utils.AnimatedGifEncoder;
-import com.fr.plugin.cool.cartnoon.web.ImageViewer;
-import com.fr.plugin.manage.PluginManager;
-import com.fr.record.analyzer.EnableMetrics;
-import com.fr.script.AbstractFunction;
-import com.fr.stable.Primitive;
-import com.fr.stable.fun.Authorize;
-import net.coobird.thumbnailator.Thumbnails;
-
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-
-@EnableMetrics
-@Authorize(callSignKey = CartUtils.PLUGIN_ID)
-public class FRCustomAnimation extends AbstractFunction {
- @Override
- @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRCustomAnimation", source = Original.PLUGIN)
- public Object run(Object[] args) {
- PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(CartUtils.PLUGIN_ID);
- if (!pluginLicense.isAvailable()) {
- return InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR");
- }
-
- PluginContext contexts = PluginManager.getContext(CartUtils.PLUGIN_ID);
- if(!contexts.isActive()){
- return "插件已被禁用!";
- }
- if(!CartUtils.CheckArgs(args,4)){
- return Primitive.ERROR_VALUE;
- }
- String[] arrSrcImg= CartUtils.GetSrcImgFromArgs(args[0]);
- int rate= Integer.parseInt(args[1].toString());
- int width= Integer.parseInt(args[2].toString());
- int height= Integer.parseInt(args[3].toString());
-
- final String id= CartUtils.GetCellId(this);
- final String url="/webroot/decision/url/img?id="+id;
- try {
- Create(id,arrSrcImg,rate,width,height);
- } catch (IOException e) {
- e.printStackTrace();
- }
- return "";
-
- }
-
-
- private void Create(String id, String[] srcImage, int rate,int width,int height) throws IOException {
-
- // 读数据
- AnimatedGifEncoder e = new AnimatedGifEncoder();
-
- ByteArrayOutputStream out=new ByteArrayOutputStream();
- e.start(out);
-
- //图片之间间隔时间
- e.setDelay(rate); // 1 frame per sec
- //重复次数 0表示无限重复 默认不重复
- e.setRepeat(0);
- //添加图片
- int imgLen=srcImage.length;
- for (int i = 0; i < imgLen; i++) {
- e.addFrame(setSize(CartUtils.readImage(srcImage[i]),width,height));
- }
- e.finish();
-
- byte[] data = out.toByteArray();
- CartUtils.setGifData(id,data);
- }
-
- private BufferedImage setSize(BufferedImage src, int width, int height) throws IOException {
- BufferedImage result = Thumbnails.of(src).size(width,height).asBufferedImage();
- return result;
- }
-}
\ No newline at end of file
diff --git a/src/com/fr/plugin/cool/cartnoon/FRDissolveText.java b/src/com/fr/plugin/cool/cartnoon/FRDissolveText.java
deleted file mode 100644
index fa3173c..0000000
--- a/src/com/fr/plugin/cool/cartnoon/FRDissolveText.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package com.fr.plugin.cool.cartnoon;
-
-import com.fr.intelli.record.Focus;
-import com.fr.intelli.record.Original;
-import com.fr.locale.InterProviderFactory;
-import com.fr.plugin.PluginLicense;
-import com.fr.plugin.PluginLicenseManager;
-import com.fr.plugin.context.PluginContext;
-import com.fr.plugin.cool.cartnoon.utils.AnimatedGifEncoder;
-import com.fr.plugin.cool.cartnoon.web.ImageViewer;
-import com.fr.plugin.manage.PluginManager;
-import com.fr.record.analyzer.EnableMetrics;
-import com.fr.script.AbstractFunction;
-import com.fr.stable.Primitive;
-import com.fr.stable.fun.Authorize;
-import com.jhlabs.image.DissolveFilter;
-
-import java.awt.*;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayOutputStream;
-
-@EnableMetrics
-@Authorize(callSignKey = CartUtils.PLUGIN_ID)
-public class FRDissolveText extends AbstractFunction {
- @Override
- @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRDissolveText", source = Original.PLUGIN)
- public Object run(Object[] args) {
- PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(CartUtils.PLUGIN_ID);
- if (!pluginLicense.isAvailable()) {
- return InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR");
- }
- PluginContext contexts = PluginManager.getContext(CartUtils.PLUGIN_ID);
- if(!contexts.isActive()){
- return "插件已被禁用!";
- }
- if(!CartUtils.CheckArgs(args,6)){
- return Primitive.ERROR_VALUE;
- }
- final String text = args[0].toString();
-
- int width= Integer.parseInt(args[1].toString());
- int height= Integer.parseInt(args[2].toString());
- int fontSize= Integer.parseInt(args[3].toString());
- int rate= Integer.parseInt(args[4].toString());
- final Color color = CartUtils.TextToColor(args[5].toString());
-
- final String id= CartUtils.GetCellId(this);
- final String url="/webroot/decision/url/img?id="+id;
-
- CreateDissoveText(id,text,fontSize,rate,color,width);
- return "";
-
- }
- private void CreateDissoveText(String id,String text,int fontSize,int rate,Color color,int width) {
-
- // 读数据
- AnimatedGifEncoder e = new AnimatedGifEncoder();
-
- ByteArrayOutputStream out=new ByteArrayOutputStream();
- e.start(out);
-
- //图片之间间隔时间
- e.setDelay(rate); // 1 frame per sec
- //重复次数 0表示无限重复 默认不重复
- e.setRepeat(0);
- //添加图片
- final BufferedImage image = CartUtils.ImageFromText(text, fontSize, color, width);
- for (float i = 0; i <= 9; i++) {
- float v=i/10;
- e.addFrame(setFilter(image,v,v));
- }
- e.finish();
-
- byte[] data = out.toByteArray();
- CartUtils.setGifData(id,data);
- }
- //设置图像溶解效果
- private BufferedImage setFilter(BufferedImage src, float density, float softness) {
- BufferedImage result = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
- DissolveFilter dissolveFilter = new DissolveFilter();
- dissolveFilter.setDensity(density);
- dissolveFilter.setSoftness(softness);
- dissolveFilter.filter(src, result);
- return result;
- }
-
-}
\ No newline at end of file
diff --git a/src/com/fr/plugin/cool/cartnoon/FRMasaicText.java b/src/com/fr/plugin/cool/cartnoon/FRMasaicText.java
deleted file mode 100644
index 9cf4fae..0000000
--- a/src/com/fr/plugin/cool/cartnoon/FRMasaicText.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package com.fr.plugin.cool.cartnoon;
-
-import com.fr.intelli.record.Focus;
-import com.fr.intelli.record.Original;
-import com.fr.locale.InterProviderFactory;
-import com.fr.plugin.PluginLicense;
-import com.fr.plugin.PluginLicenseManager;
-import com.fr.plugin.context.PluginContext;
-import com.fr.plugin.cool.cartnoon.utils.AnimatedGifEncoder;
-import com.fr.plugin.cool.cartnoon.web.ImageViewer;
-import com.fr.plugin.manage.PluginManager;
-import com.fr.record.analyzer.EnableMetrics;
-import com.fr.script.AbstractFunction;
-import com.fr.stable.Primitive;
-import com.fr.stable.fun.Authorize;
-import com.jhlabs.image.BlockFilter;
-
-import java.awt.*;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-
-@EnableMetrics
-@Authorize(callSignKey = CartUtils.PLUGIN_ID)
-public class FRMasaicText extends AbstractFunction {
- @Override
- @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRMasaicText", source = Original.PLUGIN)
- public Object run(Object[] args) {
- PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(CartUtils.PLUGIN_ID);
- if (!pluginLicense.isAvailable()) {
- return InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR");
- }
-
- PluginContext contexts = PluginManager.getContext(CartUtils.PLUGIN_ID);
- if(!contexts.isActive()){
- return "插件已被禁用!";
- }
- if(!CartUtils.CheckArgs(args,6)){
- return Primitive.ERROR_VALUE;
- }
- final String text = args[0].toString();
-
- int width= Integer.parseInt(args[1].toString());
- int height= Integer.parseInt(args[2].toString());
- int fontSize= Integer.parseInt(args[3].toString());
- int rate= Integer.parseInt(args[4].toString());
- final Color color = CartUtils.TextToColor(args[5].toString());
-
- final String id= CartUtils.GetCellId(this);
- final String url="/webroot/decision/url/img?id="+id;
- try {
- CreateMasaicText(id,text,fontSize,rate,color);
- } catch (IOException e) {
- e.printStackTrace();
- }
- return "";
-
- }
-
-
- private void CreateMasaicText(String id, String text, int fontSize, int rate, Color color) throws IOException {
-
- // 读数据
- AnimatedGifEncoder e = new AnimatedGifEncoder();
-
- ByteArrayOutputStream out=new ByteArrayOutputStream();
- e.start(out);
-
- //图片之间间隔时间
- e.setDelay(rate); // 1 frame per sec
- //重复次数 0表示无限重复 默认不重复
- e.setRepeat(0);
- //添加图片
- final BufferedImage image = CartUtils.ImageFromMultiText(text, fontSize, color);
- for (int o=36; o>0; o--) {
- e.addFrame(setFilter(image,o));
- }
- for (int i = 0; i < 30; i++) {
- e.addFrame(image);
- }
- e.finish();
-
- byte[] data = out.toByteArray();
- CartUtils.setGifData(id,data);
- }
- //设置图像马赛克
- private BufferedImage setFilter(BufferedImage src, int blockSize) {
- BufferedImage result = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
- BlockFilter blockFilter = new BlockFilter();
- blockFilter.setBlockSize(blockSize);
- blockFilter.filter(src, result);
- return result;
- }
-
-}
\ No newline at end of file
diff --git a/src/com/fr/plugin/cool/cartnoon/FRPrintText.java b/src/com/fr/plugin/cool/cartnoon/FRPrintText.java
deleted file mode 100644
index 1211824..0000000
--- a/src/com/fr/plugin/cool/cartnoon/FRPrintText.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package com.fr.plugin.cool.cartnoon;
-
-import com.fr.intelli.record.Focus;
-import com.fr.intelli.record.Original;
-import com.fr.locale.InterProviderFactory;
-import com.fr.plugin.PluginLicense;
-import com.fr.plugin.PluginLicenseManager;
-import com.fr.plugin.context.PluginContext;
-import com.fr.plugin.cool.cartnoon.utils.AnimatedGifEncoder;
-import com.fr.plugin.manage.PluginManager;
-import com.fr.record.analyzer.EnableMetrics;
-import com.fr.script.AbstractFunction;
-import com.fr.stable.Primitive;
-import com.fr.stable.fun.Authorize;
-
-import java.awt.*;
-import java.io.ByteArrayOutputStream;
-
-@EnableMetrics
-@Authorize(callSignKey = CartUtils.PLUGIN_ID)
-public class FRPrintText extends AbstractFunction {
- @Override
- @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRPrintText", source = Original.PLUGIN)
- public Object run(Object[] args) {
- PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(CartUtils.PLUGIN_ID);
- if (!pluginLicense.isAvailable()) {
- return InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR");
- }
-
- PluginContext contexts = PluginManager.getContext(CartUtils.PLUGIN_ID);
- if(!contexts.isActive()){
- return "插件已被禁用!";
- }
-
- if(!CartUtils.CheckArgs(args,6)){
- return Primitive.ERROR_VALUE;
- }
- final String text = args[0].toString();
-
- int width= Integer.parseInt(args[1].toString());
- int height= Integer.parseInt(args[2].toString());
- int fontSize= Integer.parseInt(args[3].toString());
- int rate= Integer.parseInt(args[4].toString());
- final Color color = CartUtils.TextToColor(args[5].toString());
-
- final String id= CartUtils.GetCellId(this);
- final String url="/webroot/decision/url/img?id="+id;
-
- CreatePrintAnimate(id,text,fontSize,rate,color,width);
- return "";
-
- }
-
- final void CreatePrintAnimate(String id, String text, int fontSize, int rate, Color color, int width) {
-
- // 读数据
- int len=text.length();
-
- AnimatedGifEncoder e = new AnimatedGifEncoder();
-
- ByteArrayOutputStream out=new ByteArrayOutputStream();
- e.start(out);
-
- //图片之间间隔时间
- e.setDelay(rate); // 1 frame per sec
- //重复次数 0表示无限重复 默认不重复
- e.setRepeat(0);
- //添加图片
- String subStr;
- for (int i = 0; i <= len; i++) {
- subStr=text.substring(0,i);
- e.addFrame(CartUtils.ImageFromText(subStr,fontSize,color,width));
- }
- e.finish();
-
- byte[] data = out.toByteArray();
- CartUtils.setGifData(id,data);
-
- }
-
-}
\ No newline at end of file
diff --git a/src/com/fr/plugin/cool/cartnoon/FRRollText.java b/src/com/fr/plugin/cool/cartnoon/FRRollText.java
deleted file mode 100644
index 2483917..0000000
--- a/src/com/fr/plugin/cool/cartnoon/FRRollText.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.fr.plugin.cool.cartnoon;
-
-import com.fr.intelli.record.Focus;
-import com.fr.intelli.record.Original;
-import com.fr.locale.InterProviderFactory;
-import com.fr.plugin.PluginLicense;
-import com.fr.plugin.PluginLicenseManager;
-import com.fr.plugin.context.PluginContext;
-import com.fr.plugin.manage.PluginManager;
-import com.fr.record.analyzer.EnableMetrics;
-import com.fr.script.AbstractFunction;
-import com.fr.stable.Primitive;
-import com.fr.stable.fun.Authorize;
-
-@EnableMetrics
-@Authorize(callSignKey = CartUtils.PLUGIN_ID)
-public class FRRollText extends AbstractFunction {
- @Override
- @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRRollText", source = Original.PLUGIN)
- public Object run(Object[] args) {
- PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(CartUtils.PLUGIN_ID);
- if (!pluginLicense.isAvailable()) {
- return InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR");
- }
- PluginContext contexts = PluginManager.getContext(CartUtils.PLUGIN_ID);
- if(!contexts.isActive()){
- return "插件已被禁用!";
- }
- if(!CartUtils.CheckArgs(args,3)){
- return Primitive.ERROR_VALUE;
- }
- final String text = args[0].toString();
-
- int fontsize= Integer.parseInt(args[1].toString());
- String color=args[2].toString();
- return CreateDiv(text,fontsize,color);
-
- }
-
- private String CreateDiv(String number,int fontsize,String color){
- String beginText="";
- String endText="
";
- int numLen=number.length();
- String divText="";
- for (int i = 0; i < numLen; i++) {
- final String n = number.charAt(i)+"";
- String subDivText="";
- for (int j = 0; j < 12; j++) {
- subDivText=subDivText+""+n+"
";
- }
- divText=divText+ "" + n + subDivText + "
";
- }
- return beginText+divText+endText;
- }
-
-}
\ No newline at end of file
diff --git a/src/com/fr/plugin/cool/cartnoon/FRRotateText.java b/src/com/fr/plugin/cool/cartnoon/FRRotateText.java
deleted file mode 100644
index 6a844b9..0000000
--- a/src/com/fr/plugin/cool/cartnoon/FRRotateText.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package com.fr.plugin.cool.cartnoon;
-
-import com.fr.intelli.record.Focus;
-import com.fr.intelli.record.Original;
-import com.fr.locale.InterProviderFactory;
-import com.fr.plugin.PluginLicense;
-import com.fr.plugin.PluginLicenseManager;
-import com.fr.plugin.context.PluginContext;
-import com.fr.plugin.cool.cartnoon.utils.AnimatedGifEncoder;
-import com.fr.plugin.cool.cartnoon.web.ImageViewer;
-import com.fr.plugin.manage.PluginManager;
-import com.fr.record.analyzer.EnableMetrics;
-import com.fr.script.AbstractFunction;
-import com.fr.stable.Primitive;
-import com.fr.stable.fun.Authorize;
-import net.coobird.thumbnailator.Thumbnails;
-
-import java.awt.*;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-
-@EnableMetrics
-@Authorize(callSignKey = CartUtils.PLUGIN_ID)
-public class FRRotateText extends AbstractFunction {
- @Override
- @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRRotateText", source = Original.PLUGIN)
- public Object run(Object[] args) {
- PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(CartUtils.PLUGIN_ID);
- if (!pluginLicense.isAvailable()) {
- return InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR");
- }
-
- PluginContext contexts = PluginManager.getContext(CartUtils.PLUGIN_ID);
- if(!contexts.isActive()){
- return "插件已被禁用!";
- }
- if(!CartUtils.CheckArgs(args,6)){
- return Primitive.ERROR_VALUE;
- }
- final String text = args[0].toString();
-
- int width= Integer.parseInt(args[1].toString());
- int height= Integer.parseInt(args[2].toString());
- int fontSize= Integer.parseInt(args[3].toString());
- int rate= Integer.parseInt(args[4].toString());
- final Color color = CartUtils.TextToColor(args[5].toString());
-
- final String id= CartUtils.GetCellId(this);
- final String url="/webroot/decision/url/img?id="+id;
- try {
- CreateText(id,text,fontSize,rate,color);
- } catch (IOException e) {
- e.printStackTrace();
- }
- return "";
-
- }
-
-
- private void CreateText(String id,String text,int fontSize,int rate,Color color) throws IOException {
-
- // 读数据
- AnimatedGifEncoder e = new AnimatedGifEncoder();
-
- ByteArrayOutputStream out=new ByteArrayOutputStream();
- e.start(out);
-
- //图片之间间隔时间
- e.setDelay(rate); // 1 frame per sec
- //重复次数 0表示无限重复 默认不重复
- e.setRepeat(0);
- //添加图片
- final BufferedImage image = CartUtils.ImageFromMultiText(text, fontSize, color);
- for (float i = 1; i <= 10; i++) {
- float rotate=i*36;
- e.addFrame(setFilter(image,1,rotate));
- }
- e.finish();
-
- byte[] data = out.toByteArray();
- CartUtils.setGifData(id,data);
- }
- //设置图像旋转缩放
- private BufferedImage setFilter(BufferedImage src, float scale, float rotate) throws IOException {
- BufferedImage result = Thumbnails.of(src).scale(scale).rotate(rotate).asBufferedImage();
- return result;
- }
-
-}
\ No newline at end of file
diff --git a/src/com/fr/plugin/cool/cartnoon/FunLocaleFinder.java b/src/com/fr/plugin/cool/cartnoon/FunLocaleFinder.java
deleted file mode 100644
index f4436da..0000000
--- a/src/com/fr/plugin/cool/cartnoon/FunLocaleFinder.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.fr.plugin.cool.cartnoon;
-
-import com.fr.intelli.record.Focus;
-import com.fr.intelli.record.Original;
-import com.fr.plugin.transform.FunctionRecorder;
-import com.fr.record.analyzer.EnableMetrics;
-import com.fr.stable.fun.impl.AbstractLocaleFinder;
-
-@FunctionRecorder
-@EnableMetrics
-public class FunLocaleFinder extends AbstractLocaleFinder {
- @Override
- @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Test_Function_coolCartNoon", source = Original.PLUGIN)
- public String find() {
- return "com/fr/plugin/cool/cartnoon/local/coolCartNoon";
- }
-}
diff --git a/src/com/fr/plugin/cool/cartnoon/TestFun.java b/src/com/fr/plugin/cool/cartnoon/TestFun.java
deleted file mode 100644
index 909879f..0000000
--- a/src/com/fr/plugin/cool/cartnoon/TestFun.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.fr.plugin.cool.cartnoon;
-
-import com.fr.base.BaseUtils;
-import com.fr.plugin.cool.cartnoon.utils.AnimatedGifEncoder;
-import com.fr.plugin.cool.cartnoon.utils.DrawValueLine;
-import com.fr.plugin.cool.cartnoon.web.ImageViewer;
-import com.jhlabs.image.BlockFilter;
-import javafx.scene.shape.Shape3D;
-import net.coobird.thumbnailator.Thumbnails;
-
-import javax.imageio.ImageIO;
-import java.awt.*;
-import java.awt.geom.GeneralPath;
-import java.awt.image.BufferedImage;
-import java.io.*;
-
-public class TestFun {
-
- public static void main(String args[]) throws Exception {
-
- BufferedImage image=BaseUtils.readImage("http://www.jhlabs.com/shadowheader.jpg");
- AnimatedGifEncoder encoder = new AnimatedGifEncoder();
- encoder.start("d:\\out.gif");
- encoder.setTransparent(Color.WHITE);
- encoder.setRepeat(0);
- encoder.setDelay(100);
-
- int o=36;
- for (; o>0; o--) {
-
- encoder.addFrame(setFilter(image,o));
-
- }
- for (int i = 0; i < 30; i++) {
- encoder.addFrame(image);
- }
- encoder.finish();
-
- }
-
- //设置图像马赛克
- private static BufferedImage setFilter(BufferedImage src, int blockSize) {
- BufferedImage result = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
- BlockFilter blockFilter = new BlockFilter();
- blockFilter.setBlockSize(blockSize);
- blockFilter.filter(src, result);
- return result;
- }
-}
diff --git a/src/com/fr/plugin/cool/cartnoon/utils/AnimatedGifEncoder.java b/src/com/fr/plugin/cool/cartnoon/utils/AnimatedGifEncoder.java
deleted file mode 100644
index 683e155..0000000
--- a/src/com/fr/plugin/cool/cartnoon/utils/AnimatedGifEncoder.java
+++ /dev/null
@@ -1,543 +0,0 @@
-package com.fr.plugin.cool.cartnoon.utils;
-
-import java.io.*;
-import java.awt.*;
-import java.awt.image.*;
-
-/**
- * Class AnimatedGifEncoder - Encodes a GIF file consisting of one or
- * more frames.
- *
- * Example:
- * AnimatedGifEncoder e = new AnimatedGifEncoder();
- * e.start(outputFileName);
- * e.setDelay(1000); // 1 frame per sec
- * e.addFrame(image1);
- * e.addFrame(image2);
- * e.finish();
- *
- * No copyright asserted on the source code of this class. May be used
- * for any purpose, however, refer to the Unisys LZW patent for restrictions
- * on use of the associated LZWEncoder class. Please forward any corrections
- * to questions at fmsware.com.
- *
- * @author Kevin Weiner, FM Software
- * @version 1.03 November 2003
- *
- */
-
-public class AnimatedGifEncoder {
-
- protected int width; // image size
- protected int height;
- protected Color transparent = null; // transparent color if given
- protected boolean transparentExactMatch = false; // transparent color will be found by looking for the closest color
- // or for the exact color if transparentExactMatch == true
- protected Color background = null; // background color if given
- protected int transIndex; // transparent index in color table
- protected int repeat = -1; // no repeat
- protected int delay = 0; // frame delay (hundredths)
- protected boolean started = false; // ready to output frames
- protected OutputStream out;
- protected BufferedImage image; // current frame
- protected byte[] pixels; // BGR byte array from frame
- protected byte[] indexedPixels; // converted frame indexed to palette
- protected int colorDepth; // number of bit planes
- protected byte[] colorTab; // RGB palette
- protected boolean[] usedEntry = new boolean[256]; // active palette entries
- protected int palSize = 7; // color table size (bits-1)
- protected int dispose = -1; // disposal code (-1 = use default)
- protected boolean closeStream = false; // close stream when finished
- protected boolean firstFrame = true;
- protected boolean sizeSet = false; // if false, get size from first frame
- protected int sample = 10; // default sample interval for quantizer
-
- /**
- * Sets the delay time between each frame, or changes it
- * for subsequent frames (applies to last frame added).
- *
- * @param ms int delay time in milliseconds
- */
- public void setDelay(int ms) {
- delay = Math.round(ms / 10.0f);
- }
-
- /**
- * Sets the GIF frame disposal code for the last added frame
- * and any subsequent frames. Default is 0 if no transparent
- * color has been set, otherwise 2.
- * @param code int disposal code.
- */
- public void setDispose(int code) {
- if (code >= 0) {
- dispose = code;
- }
- }
-
- /**
- * Sets the number of times the set of GIF frames
- * should be played. Default is 1; 0 means play
- * indefinitely. Must be invoked before the first
- * image is added.
- *
- * @param iter int number of iterations.
- */
- public void setRepeat(int iter) {
- if (iter >= 0) {
- repeat = iter;
- }
- }
-
- /**
- * Sets the transparent color for the last added frame
- * and any subsequent frames.
- * Since all colors are subject to modification
- * in the quantization process, the color in the final
- * palette for each frame closest to the given color
- * becomes the transparent color for that frame.
- * May be set to null to indicate no transparent color.
- *
- * @param c Color to be treated as transparent on display.
- */
- public void setTransparent(Color c) {
- setTransparent (c, false);
- }
-
- /**
- * Sets the transparent color for the last added frame
- * and any subsequent frames.
- * Since all colors are subject to modification
- * in the quantization process, the color in the final
- * palette for each frame closest to the given color
- * becomes the transparent color for that frame.
- * If exactMatch is set to true, transparent color index
- * is search with exact match, and not looking for the
- * closest one.
- * May be set to null to indicate no transparent color.
- *
- * @param c Color to be treated as transparent on display.
- */
- public void setTransparent(Color c, boolean exactMatch) {
- transparent = c;
- transparentExactMatch = exactMatch;
- }
-
-
- /**
- * Sets the background color for the last added frame
- * and any subsequent frames.
- * Since all colors are subject to modification
- * in the quantization process, the color in the final
- * palette for each frame closest to the given color
- * becomes the background color for that frame.
- * May be set to null to indicate no background color
- * which will default to black.
- *
- * @param c Color to be treated as background on display.
- */
- public void setBackground(Color c) {
- background = c;
- }
-
- /**
- * Adds next GIF frame. The frame is not written immediately, but is
- * actually deferred until the next frame is received so that timing
- * data can be inserted. Invoking finish()
flushes all
- * frames. If setSize
was not invoked, the size of the
- * first image is used for all subsequent frames.
- *
- * @param im BufferedImage containing frame to write.
- * @return true if successful.
- */
- public boolean addFrame(BufferedImage im) {
- if ((im == null) || !started) {
- return false;
- }
- boolean ok = true;
- try {
- if (!sizeSet) {
- // use first frame's size
- setSize(im.getWidth(), im.getHeight());
- }
- image = im;
- getImagePixels(); // convert to correct format if necessary
- analyzePixels(); // build color table & map pixels
- if (firstFrame) {
- writeLSD(); // logical screen descriptior
- writePalette(); // global color table
- if (repeat >= 0) {
- // use NS app extension to indicate reps
- writeNetscapeExt();
- }
- }
- writeGraphicCtrlExt(); // write graphic control extension
- writeImageDesc(); // image descriptor
- if (!firstFrame) {
- writePalette(); // local color table
- }
- writePixels(); // encode and write pixel data
- firstFrame = false;
- } catch (IOException e) {
- ok = false;
- }
-
- return ok;
- }
-
- /**
- * Flushes any pending data and closes output file.
- * If writing to an OutputStream, the stream is not
- * closed.
- */
- public boolean finish() {
- if (!started) return false;
- boolean ok = true;
- started = false;
- try {
- out.write(0x3b); // gif trailer
- out.flush();
- if (closeStream) {
- out.close();
- }
- } catch (IOException e) {
- ok = false;
- }
-
- // reset for subsequent use
- transIndex = 0;
- out = null;
- image = null;
- pixels = null;
- indexedPixels = null;
- colorTab = null;
- closeStream = false;
- firstFrame = true;
-
- return ok;
- }
-
- /**
- * Sets frame rate in frames per second. Equivalent to
- * setDelay(1000/fps)
.
- *
- * @param fps float frame rate (frames per second)
- */
- public void setFrameRate(float fps) {
- if (fps != 0f) {
- delay = Math.round(100f / fps);
- }
- }
-
- /**
- * Sets quality of color quantization (conversion of images
- * to the maximum 256 colors allowed by the GIF specification).
- * Lower values (minimum = 1) produce better colors, but slow
- * processing significantly. 10 is the default, and produces
- * good color mapping at reasonable speeds. Values greater
- * than 20 do not yield significant improvements in speed.
- *
- * @param quality int greater than 0.
- */
- public void setQuality(int quality) {
- if (quality < 1) quality = 1;
- sample = quality;
- }
-
- /**
- * Sets the GIF frame size. The default size is the
- * size of the first frame added if this method is
- * not invoked.
- *
- * @param w int frame width.
- * @param h int frame width.
- */
- public void setSize(int w, int h) {
- if (started && !firstFrame) return;
- width = w;
- height = h;
- if (width < 1) width = 320;
- if (height < 1) height = 240;
- sizeSet = true;
- }
-
- /**
- * Initiates GIF file creation on the given stream. The stream
- * is not closed automatically.
- *
- * @param os OutputStream on which GIF images are written.
- * @return false if initial write failed.
- */
- public boolean start(OutputStream os) {
- if (os == null) return false;
- boolean ok = true;
- closeStream = false;
- out = os;
- try {
- writeString("GIF89a"); // header
- } catch (IOException e) {
- ok = false;
- }
- return started = ok;
- }
-
- /**
- * Initiates writing of a GIF file with the specified name.
- *
- * @param file String containing output file name.
- * @return false if open or initial write failed.
- */
- public boolean start(String file) {
- boolean ok = true;
- try {
- out = new BufferedOutputStream(new FileOutputStream(file));
- ok = start(out);
- closeStream = true;
- } catch (IOException e) {
- ok = false;
- }
- return started = ok;
- }
-
- public boolean isStarted() {
- return started;
- }
-
- /**
- * Analyzes image colors and creates color map.
- */
- protected void analyzePixels() {
- int len = pixels.length;
- int nPix = len / 3;
- indexedPixels = new byte[nPix];
- NeuQuant nq = new NeuQuant(pixels, len, sample);
- // initialize quantizer
- colorTab = nq.process(); // create reduced palette
- // convert map from BGR to RGB
- for (int i = 0; i < colorTab.length; i += 3) {
- byte temp = colorTab[i];
- colorTab[i] = colorTab[i + 2];
- colorTab[i + 2] = temp;
- usedEntry[i / 3] = false;
- }
- // map image pixels to new palette
- int k = 0;
- for (int i = 0; i < nPix; i++) {
- int index =
- nq.map(pixels[k++] & 0xff,
- pixels[k++] & 0xff,
- pixels[k++] & 0xff);
- usedEntry[index] = true;
- indexedPixels[i] = (byte) index;
- }
- pixels = null;
- colorDepth = 8;
- palSize = 7;
- // get closest match to transparent color if specified
- if (transparent != null) {
- transIndex = transparentExactMatch ? findExact(transparent) : findClosest(transparent);
- }
- }
-
- /**
- * Returns index of palette color closest to c
- *
- */
- protected int findClosest(Color c) {
- if (colorTab == null) return -1;
- int r = c.getRed();
- int g = c.getGreen();
- int b = c.getBlue();
- int minpos = 0;
- int dmin = 256 * 256 * 256;
- int len = colorTab.length;
- for (int i = 0; i < len;) {
- int dr = r - (colorTab[i++] & 0xff);
- int dg = g - (colorTab[i++] & 0xff);
- int db = b - (colorTab[i] & 0xff);
- int d = dr * dr + dg * dg + db * db;
- int index = i / 3;
- if (usedEntry[index] && (d < dmin)) {
- dmin = d;
- minpos = index;
- }
- i++;
- }
- return minpos;
- }
-
- /*
- * Returns true if the exact matching color is existing, and used in the color palette, otherwise, return false. This method has to be called before
- * finishing the image, because after finished the palette is destroyed and it will always return false.
- */
- boolean isColorUsed(Color c) {
- return findExact(c) != -1;
- }
-
- /**
- * Returns index of palette exactly matching to color c or -1 if there is no exact matching.
- *
- */
- protected int findExact(Color c) {
- if (colorTab == null) {
- return -1;
- }
-
- int r = c.getRed();
- int g = c.getGreen();
- int b = c.getBlue();
- int len = colorTab.length / 3;
- for (int index = 0; index < len; ++index) {
- int i = index * 3;
- // If the entry is used in colorTab, then check if it is the same exact color we're looking for
- if (usedEntry[index] && r == (colorTab[i] & 0xff) && g == (colorTab[i+1] & 0xff) && b == (colorTab[i+2] & 0xff)) {
- return index;
- }
- }
- return -1;
- }
-
- /**
- * Extracts image pixels into byte array "pixels"
- */
- protected void getImagePixels() {
- int w = image.getWidth();
- int h = image.getHeight();
- int type = image.getType();
- if ((w != width)
- || (h != height)
- || (type != BufferedImage.TYPE_3BYTE_BGR)) {
- // create new image with right size/format
- BufferedImage temp =
- new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
- Graphics2D g = temp.createGraphics();
- g.setColor(background);
- g.fillRect(0, 0, width, height);
- g.drawImage(image, 0, 0, null);
- image = temp;
- }
- pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
- }
-
- /**
- * Writes Graphic Control Extension
- */
- protected void writeGraphicCtrlExt() throws IOException {
- out.write(0x21); // extension introducer
- out.write(0xf9); // GCE label
- out.write(4); // data block size
- int transp, disp;
- if (transparent == null) {
- transp = 0;
- disp = 0; // dispose = no action
- } else {
- transp = 1;
- disp = 2; // force clear if using transparent color
- }
- if (dispose >= 0) {
- disp = dispose & 7; // user override
- }
- disp <<= 2;
-
- // packed fields
- out.write(0 | // 1:3 reserved
- disp | // 4:6 disposal
- 0 | // 7 user input - 0 = none
- transp); // 8 transparency flag
-
- writeShort(delay); // delay x 1/100 sec
- out.write(transIndex); // transparent color index
- out.write(0); // block terminator
- }
-
- /**
- * Writes Image Descriptor
- */
- protected void writeImageDesc() throws IOException {
- out.write(0x2c); // image separator
- writeShort(0); // image position x,y = 0,0
- writeShort(0);
- writeShort(width); // image size
- writeShort(height);
- // packed fields
- if (firstFrame) {
- // no LCT - GCT is used for first (or only) frame
- out.write(0);
- } else {
- // specify normal LCT
- out.write(0x80 | // 1 local color table 1=yes
- 0 | // 2 interlace - 0=no
- 0 | // 3 sorted - 0=no
- 0 | // 4-5 reserved
- palSize); // 6-8 size of color table
- }
- }
-
- /**
- * Writes Logical Screen Descriptor
- */
- protected void writeLSD() throws IOException {
- // logical screen size
- writeShort(width);
- writeShort(height);
- // packed fields
- out.write((0x80 | // 1 : global color table flag = 1 (gct used)
- 0x70 | // 2-4 : color resolution = 7
- 0x00 | // 5 : gct sort flag = 0
- palSize)); // 6-8 : gct size
-
- out.write(0); // background color index
- out.write(0); // pixel aspect ratio - assume 1:1
- }
-
- /**
- * Writes Netscape application extension to define
- * repeat count.
- */
- protected void writeNetscapeExt() throws IOException {
- out.write(0x21); // extension introducer
- out.write(0xff); // app extension label
- out.write(11); // block size
- writeString("NETSCAPE" + "2.0"); // app id + auth code
- out.write(3); // sub-block size
- out.write(1); // loop sub-block id
- writeShort(repeat); // loop count (extra iterations, 0=repeat forever)
- out.write(0); // block terminator
- }
-
- /**
- * Writes color table
- */
- protected void writePalette() throws IOException {
- out.write(colorTab, 0, colorTab.length);
- int n = (3 * 256) - colorTab.length;
- for (int i = 0; i < n; i++) {
- out.write(0);
- }
- }
-
- /**
- * Encodes and writes pixel data
- */
- protected void writePixels() throws IOException {
- LZWEncoder encoder =
- new LZWEncoder(width, height, indexedPixels, colorDepth);
- encoder.encode(out);
- }
-
- /**
- * Write 16-bit value to output stream, LSB first
- */
- protected void writeShort(int value) throws IOException {
- out.write(value & 0xff);
- out.write((value >> 8) & 0xff);
- }
-
- /**
- * Writes string to output stream
- */
- protected void writeString(String s) throws IOException {
- for (int i = 0; i < s.length(); i++) {
- out.write((byte) s.charAt(i));
- }
- }
-}
diff --git a/src/com/fr/plugin/cool/cartnoon/utils/DrawValueLine.java b/src/com/fr/plugin/cool/cartnoon/utils/DrawValueLine.java
deleted file mode 100644
index ddf29b0..0000000
--- a/src/com/fr/plugin/cool/cartnoon/utils/DrawValueLine.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package com.fr.plugin.cool.cartnoon.utils;
-
-import java.awt.*;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.GeneralPath;
-import java.awt.image.BufferedImage;
-
-/*
- *
- * 划线 并
- * */
-final public class DrawValueLine {
- private int startX;
- private int startY;
- private int endX;
- private int endY;
- private double alHeight;
- private Graphics2D g2;
-
- //划线起止位置
- public DrawValueLine(BufferedImage image, int sx, int sy, int ex, int ey, double alH) {
- g2 = (Graphics2D) image.getGraphics();
- startX = sx;
- startY = sy;
- endX = ex;
- endY = ey;
- alHeight = alH;
- }
-
- //划线 (粗细,是否旋转)
- public void DrawLine(float stroke,Color color) {
- g2.setColor(color);
- g2.setStroke(new BasicStroke(stroke));
-// g2.drawLine(this.startX, this.startY, this.endX, this.endY);
- drawAL(this.startX, this.startY , this.endX, this.endY , alHeight);
-
- }
-
- //划箭头线
- public void drawAL(int sx, int sy, int ex, int ey, double alHeight) {
-
- double L = alHeight / 2; // 底边的一半
- int x3 = 0;
- int y3 = 0;
- int x4 = 0;
- int y4 = 0;
- double awrad = Math.atan(L / alHeight); // 箭头角度
- double arraow_len = Math.sqrt(L * L + alHeight * alHeight); // 箭头的长度
- double[] arrXY_1 = rotateVec(ex - sx, ey - sy, awrad, true, arraow_len);
- double[] arrXY_2 = rotateVec(ex - sx, ey - sy, -awrad, true, arraow_len);
- double x_3 = ex - arrXY_1[0]; // (x3,y3)是第一端点
- double y_3 = ey - arrXY_1[1];
- double x_4 = ex - arrXY_2[0]; // (x4,y4)是第二端点
- double y_4 = ey - arrXY_2[1];
-
- Double X3 = new Double(x_3);
- x3 = X3.intValue();
- Double Y3 = new Double(y_3);
- y3 = Y3.intValue();
- Double X4 = new Double(x_4);
- x4 = X4.intValue();
- Double Y4 = new Double(y_4);
- y4 = Y4.intValue();
- // 画线
- g2.drawLine(sx, sy, ex, ey);
- //
- GeneralPath triangle = new GeneralPath();
- double anglRate=(new Double(ey)-new Double(sy))/(new Double(ex)-new Double(sx));
- double angl=ex==sx?1:Math.atan(anglRate)/Math.PI*2;
- triangle.moveTo(ex+new Double(L)*2*(1-angl), ey+new Double(L)*2*angl);
- triangle.lineTo(x3+new Double(L)*2, y3);
- triangle.lineTo(x4+new Double(L)*2, y4);
- triangle.closePath();
- //实心箭头
- g2.fill(triangle);
-
- }
-
- // 计算
- private static double[] rotateVec(int px, int py, double ang,
- boolean isChLen, double newLen) {
-
- double mathstr[] = new double[2];
- // 矢量旋转函数,参数含义分别是x分量、y分量、旋转角、是否改变长度、新长度
- double vx = px * Math.cos(ang) - py * Math.sin(ang);
- double vy = px * Math.sin(ang) + py * Math.cos(ang);
- if (isChLen) {
- double d = Math.sqrt(vx * vx + vy * vy);
- vx = vx / d * newLen;
- vy = vy / d * newLen;
- mathstr[0] = vx;
- mathstr[1] = vy;
- }
- return mathstr;
-
- }
-
-}
diff --git a/src/com/fr/plugin/cool/cartnoon/utils/GifDecoder.java b/src/com/fr/plugin/cool/cartnoon/utils/GifDecoder.java
deleted file mode 100644
index 8495638..0000000
--- a/src/com/fr/plugin/cool/cartnoon/utils/GifDecoder.java
+++ /dev/null
@@ -1,783 +0,0 @@
-package com.fr.plugin.cool.cartnoon.utils;
-
-import java.net.*;
-import java.io.*;
-import java.util.*;
-import java.awt.*;
-import java.awt.image.*;
-
-/**
- * Class GifDecoder - Decodes a GIF file into one or more frames.
- *
- * Example:
- *
- *
- * {@code
- * GifDecoder d = new GifDecoder();
- * d.read("sample.gif");
- * int n = d.getFrameCount();
- * for (int i = 0; i < n; i++) {
- * BufferedImage frame = d.getFrame(i); // frame i
- * int t = d.getDelay(i); // display duration of frame in milliseconds
- * // do something with frame
- * }
- * }
- *
- * No copyright asserted on the source code of this class. May be used for
- * any purpose, however, refer to the Unisys LZW patent for any additional
- * restrictions. Please forward any corrections to questions at fmsware.com.
- *
- * @author Kevin Weiner, FM Software; LZW decoder adapted from John Cristy's ImageMagick.
- * @version 1.03 November 2003
- *
- */
-
-public class GifDecoder {
-
- /**
- * File read status: No errors.
- */
- public static final int STATUS_OK = 0;
-
- /**
- * File read status: Error decoding file (may be partially decoded)
- */
- public static final int STATUS_FORMAT_ERROR = 1;
-
- /**
- * File read status: Unable to open source.
- */
- public static final int STATUS_OPEN_ERROR = 2;
-
- protected BufferedInputStream in;
- protected int status;
-
- protected int width; // full image width
- protected int height; // full image height
- protected boolean gctFlag; // global color table used
- protected int gctSize; // size of global color table
- protected int loopCount = 1; // iterations; 0 = repeat forever
-
- protected int[] gct; // global color table
- protected int[] lct; // local color table
- protected int[] act; // active color table
-
- protected int bgIndex; // background color index
- protected int bgColor; // background color
- protected int lastBgColor; // previous bg color
- protected int pixelAspect; // pixel aspect ratio
-
- protected boolean lctFlag; // local color table flag
- protected boolean interlace; // interlace flag
- protected int lctSize; // local color table size
-
- protected int ix, iy, iw, ih; // current image rectangle
- protected Rectangle lastRect; // last image rect
- protected BufferedImage image; // current frame
- protected BufferedImage lastImage; // previous frame
-
- protected byte[] block = new byte[256]; // current data block
- protected int blockSize = 0; // block size
-
- // last graphic control extension info
- protected int dispose = 0;
- // 0=no action; 1=leave in place; 2=restore to bg; 3=restore to prev
- protected int lastDispose = 0;
- protected boolean transparency = false; // use transparent color
- protected int delay = 0; // delay in milliseconds
- protected int transIndex; // transparent color index
-
- protected static final int MaxStackSize = 4096;
- // max decoder pixel stack size
-
- // LZW decoder working arrays
- protected short[] prefix;
- protected byte[] suffix;
- protected byte[] pixelStack;
- protected byte[] pixels;
-
- protected ArrayList frames; // frames read from current file
- protected int frameCount;
-
- static class GifFrame {
- public GifFrame(BufferedImage im, int del) {
- image = im;
- delay = del;
- }
- public BufferedImage image;
- public int delay;
- }
-
- /**
- * Gets display duration for specified frame.
- *
- * @param n int index of frame
- * @return delay in milliseconds
- */
- public int getDelay(int n) {
- //
- delay = -1;
- if ((n >= 0) && (n < frameCount)) {
- delay = ((GifFrame) frames.get(n)).delay;
- }
- return delay;
- }
-
- /**
- * Gets the number of frames read from file.
- * @return frame count
- */
- public int getFrameCount() {
- return frameCount;
- }
-
- /**
- * Gets the first (or only) image read.
- *
- * @return BufferedImage containing first frame, or null if none.
- */
- public BufferedImage getImage() {
- return getFrame(0);
- }
-
- /**
- * Gets the "Netscape" iteration count, if any.
- * A count of 0 means repeat indefinitiely.
- *
- * @return iteration count if one was specified, else 1.
- */
- public int getLoopCount() {
- return loopCount;
- }
-
- /**
- * Creates new frame image from current data (and previous
- * frames as specified by their disposition codes).
- */
- protected void setPixels() {
- // expose destination image's pixels as int array
- int[] dest =
- ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
-
- // fill in starting image contents based on last image's dispose code
- if (lastDispose > 0) {
- if (lastDispose == 3) {
- // use image before last
- int n = frameCount - 2;
- if (n > 0) {
- lastImage = getFrame(n - 1);
- } else {
- lastImage = null;
- }
- }
-
- if (lastImage != null) {
- int[] prev =
- ((DataBufferInt) lastImage.getRaster().getDataBuffer()).getData();
- System.arraycopy(prev, 0, dest, 0, width * height);
- // copy pixels
-
- if (lastDispose == 2) {
- // fill last image rect area with background color
- Graphics2D g = image.createGraphics();
- Color c = null;
- if (transparency) {
- c = new Color(0, 0, 0, 0); // assume background is transparent
- } else {
- c = new Color(lastBgColor); // use given background color
- }
- g.setColor(c);
- g.setComposite(AlphaComposite.Src); // replace area
- g.fill(lastRect);
- g.dispose();
- }
- }
- }
-
- // copy each source line to the appropriate place in the destination
- int pass = 1;
- int inc = 8;
- int iline = 0;
- for (int i = 0; i < ih; i++) {
- int line = i;
- if (interlace) {
- if (iline >= ih) {
- pass++;
- switch (pass) {
- case 2 :
- iline = 4;
- break;
- case 3 :
- iline = 2;
- inc = 4;
- break;
- case 4 :
- iline = 1;
- inc = 2;
- }
- }
- line = iline;
- iline += inc;
- }
- line += iy;
- if (line < height) {
- int k = line * width;
- int dx = k + ix; // start of line in dest
- int dlim = dx + iw; // end of dest line
- if ((k + width) < dlim) {
- dlim = k + width; // past dest edge
- }
- int sx = i * iw; // start of line in source
- while (dx < dlim) {
- // map color and insert in destination
- int index = ((int) pixels[sx++]) & 0xff;
- int c = act[index];
- if (c != 0) {
- dest[dx] = c;
- }
- dx++;
- }
- }
- }
- }
-
- /**
- * Gets the image contents of frame n.
- *
- * @return BufferedImage representation of frame, or null if n is invalid.
- */
- public BufferedImage getFrame(int n) {
- BufferedImage im = null;
- if ((n >= 0) && (n < frameCount)) {
- im = ((GifFrame) frames.get(n)).image;
- }
- return im;
- }
-
- /**
- * Gets image size.
- *
- * @return GIF image dimensions
- */
- public Dimension getFrameSize() {
- return new Dimension(width, height);
- }
-
- /**
- * Reads GIF image from stream
- *
- * @param is BufferedInputStream containing GIF file.
- * @return read status code (0 = no errors)
- */
- public int read(BufferedInputStream is) {
- init();
- if (is != null) {
- in = is;
- readHeader();
- if (!err()) {
- readContents();
- if (frameCount < 0) {
- status = STATUS_FORMAT_ERROR;
- }
- }
- } else {
- status = STATUS_OPEN_ERROR;
- }
- try {
- is.close();
- } catch (IOException e) {
- }
- return status;
- }
-
- /**
- * Reads GIF image from stream
- *
- * @param is InputStream containing GIF file.
- * @return read status code (0 = no errors)
- */
- public int read(InputStream is) {
- init();
- if (is != null) {
- if (!(is instanceof BufferedInputStream))
- is = new BufferedInputStream(is);
- in = (BufferedInputStream) is;
- readHeader();
- if (!err()) {
- readContents();
- if (frameCount < 0) {
- status = STATUS_FORMAT_ERROR;
- }
- }
- } else {
- status = STATUS_OPEN_ERROR;
- }
- try {
- is.close();
- } catch (IOException e) {
- }
- return status;
- }
-
- /**
- * Reads GIF file from specified file/URL source
- * (URL assumed if name contains ":/" or "file:")
- *
- * @param name String containing source
- * @return read status code (0 = no errors)
- */
- public int read(String name) {
- status = STATUS_OK;
- try {
- name = name.trim().toLowerCase();
- if ((name.indexOf("file:") >= 0) ||
- (name.indexOf(":/") > 0)) {
- URL url = new URL(name);
- in = new BufferedInputStream(url.openStream());
- } else {
- in = new BufferedInputStream(new FileInputStream(name));
- }
- status = read(in);
- } catch (IOException e) {
- status = STATUS_OPEN_ERROR;
- }
-
- return status;
- }
-
- /**
- * Decodes LZW image data into pixel array.
- * Adapted from John Cristy's ImageMagick.
- */
- protected void decodeImageData() {
- int NullCode = -1;
- int npix = iw * ih;
- int available,
- clear,
- code_mask,
- code_size,
- end_of_information,
- in_code,
- old_code,
- bits,
- code,
- count,
- i,
- datum,
- data_size,
- first,
- top,
- bi,
- pi;
-
- if ((pixels == null) || (pixels.length < npix)) {
- pixels = new byte[npix]; // allocate new pixel array
- }
- if (prefix == null) prefix = new short[MaxStackSize];
- if (suffix == null) suffix = new byte[MaxStackSize];
- if (pixelStack == null) pixelStack = new byte[MaxStackSize + 1];
-
- // Initialize GIF data stream decoder.
-
- data_size = read();
- clear = 1 << data_size;
- end_of_information = clear + 1;
- available = clear + 2;
- old_code = NullCode;
- code_size = data_size + 1;
- code_mask = (1 << code_size) - 1;
- for (code = 0; code < clear; code++) {
- prefix[code] = 0;
- suffix[code] = (byte) code;
- }
-
- // Decode GIF pixel stream.
-
- datum = bits = count = first = top = pi = bi = 0;
-
- for (i = 0; i < npix;) {
- if (top == 0) {
- if (bits < code_size) {
- // Load bytes until there are enough bits for a code.
- if (count == 0) {
- // Read a new data block.
- count = readBlock();
- if (count <= 0)
- break;
- bi = 0;
- }
- datum += (((int) block[bi]) & 0xff) << bits;
- bits += 8;
- bi++;
- count--;
- continue;
- }
-
- // Get the next code.
-
- code = datum & code_mask;
- datum >>= code_size;
- bits -= code_size;
-
- // Interpret the code
-
- if ((code > available) || (code == end_of_information))
- break;
- if (code == clear) {
- // Reset decoder.
- code_size = data_size + 1;
- code_mask = (1 << code_size) - 1;
- available = clear + 2;
- old_code = NullCode;
- continue;
- }
- if (old_code == NullCode) {
- pixelStack[top++] = suffix[code];
- old_code = code;
- first = code;
- continue;
- }
- in_code = code;
- if (code == available) {
- pixelStack[top++] = (byte) first;
- code = old_code;
- }
- while (code > clear) {
- pixelStack[top++] = suffix[code];
- code = prefix[code];
- }
- first = ((int) suffix[code]) & 0xff;
-
- // Add a new string to the string table,
-
- if (available >= MaxStackSize) {
- pixelStack[top++] = (byte) first;
- continue;
- }
- pixelStack[top++] = (byte) first;
- prefix[available] = (short) old_code;
- suffix[available] = (byte) first;
- available++;
- if (((available & code_mask) == 0)
- && (available < MaxStackSize)) {
- code_size++;
- code_mask += available;
- }
- old_code = in_code;
- }
-
- // Pop a pixel off the pixel stack.
-
- top--;
- pixels[pi++] = pixelStack[top];
- i++;
- }
-
- for (i = pi; i < npix; i++) {
- pixels[i] = 0; // clear missing pixels
- }
-
- }
-
- /**
- * Returns true if an error was encountered during reading/decoding
- */
- protected boolean err() {
- return status != STATUS_OK;
- }
-
- /**
- * Initializes or re-initializes reader
- */
- protected void init() {
- status = STATUS_OK;
- frameCount = 0;
- frames = new ArrayList();
- gct = null;
- lct = null;
- }
-
- /**
- * Reads a single byte from the input stream.
- */
- protected int read() {
- int curByte = 0;
- try {
- curByte = in.read();
- } catch (IOException e) {
- status = STATUS_FORMAT_ERROR;
- }
- return curByte;
- }
-
- /**
- * Reads next variable length block from input.
- *
- * @return number of bytes stored in "buffer"
- */
- protected int readBlock() {
- blockSize = read();
- int n = 0;
- if (blockSize > 0) {
- try {
- int count = 0;
- while (n < blockSize) {
- count = in.read(block, n, blockSize - n);
- if (count == -1)
- break;
- n += count;
- }
- } catch (IOException e) {
- }
-
- if (n < blockSize) {
- status = STATUS_FORMAT_ERROR;
- }
- }
- return n;
- }
-
- /**
- * Reads color table as 256 RGB integer values
- *
- * @param ncolors int number of colors to read
- * @return int array containing 256 colors (packed ARGB with full alpha)
- */
- protected int[] readColorTable(int ncolors) {
- int nbytes = 3 * ncolors;
- int[] tab = null;
- byte[] c = new byte[nbytes];
- int n = 0;
- try {
- n = in.read(c);
- } catch (IOException e) {
- }
- if (n < nbytes) {
- status = STATUS_FORMAT_ERROR;
- } else {
- tab = new int[256]; // max size to avoid bounds checks
- int i = 0;
- int j = 0;
- while (i < ncolors) {
- int r = ((int) c[j++]) & 0xff;
- int g = ((int) c[j++]) & 0xff;
- int b = ((int) c[j++]) & 0xff;
- tab[i++] = 0xff000000 | (r << 16) | (g << 8) | b;
- }
- }
- return tab;
- }
-
- /**
- * Main file parser. Reads GIF content blocks.
- */
- protected void readContents() {
- // read GIF file content blocks
- boolean done = false;
- while (!(done || err())) {
- int code = read();
- switch (code) {
-
- case 0x2C : // image separator
- readImage();
- break;
-
- case 0x21 : // extension
- code = read();
- switch (code) {
- case 0xf9 : // graphics control extension
- readGraphicControlExt();
- break;
-
- case 0xff : // application extension
- readBlock();
- String app = "";
- for (int i = 0; i < 11; i++) {
- app += (char) block[i];
- }
- if (app.equals("NETSCAPE2.0")) {
- readNetscapeExt();
- }
- else
- skip(); // don't care
- break;
-
- default : // uninteresting extension
- skip();
- }
- break;
-
- case 0x3b : // terminator
- done = true;
- break;
-
- case 0x00 : // bad byte, but keep going and see what happens
- break;
-
- default :
- status = STATUS_FORMAT_ERROR;
- }
- }
- }
-
- /**
- * Reads Graphics Control Extension values
- */
- protected void readGraphicControlExt() {
- read(); // block size
- int packed = read(); // packed fields
- dispose = (packed & 0x1c) >> 2; // disposal method
- if (dispose == 0) {
- dispose = 1; // elect to keep old image if discretionary
- }
- transparency = (packed & 1) != 0;
- delay = readShort() * 10; // delay in milliseconds
- transIndex = read(); // transparent color index
- read(); // block terminator
- }
-
- /**
- * Reads GIF file header information.
- */
- protected void readHeader() {
- String id = "";
- for (int i = 0; i < 6; i++) {
- id += (char) read();
- }
- if (!id.startsWith("GIF")) {
- status = STATUS_FORMAT_ERROR;
- return;
- }
-
- readLSD();
- if (gctFlag && !err()) {
- gct = readColorTable(gctSize);
- bgColor = gct[bgIndex];
- }
- }
-
- /**
- * Reads next frame image
- */
- protected void readImage() {
- ix = readShort(); // (sub)image position & size
- iy = readShort();
- iw = readShort();
- ih = readShort();
-
- int packed = read();
- lctFlag = (packed & 0x80) != 0; // 1 - local color table flag
- interlace = (packed & 0x40) != 0; // 2 - interlace flag
- // 3 - sort flag
- // 4-5 - reserved
- lctSize = 2 << (packed & 7); // 6-8 - local color table size
-
- if (lctFlag) {
- lct = readColorTable(lctSize); // read table
- act = lct; // make local table active
- } else {
- act = gct; // make global table active
- if (bgIndex == transIndex)
- bgColor = 0;
- }
- int save = 0;
- if (transparency) {
- save = act[transIndex];
- act[transIndex] = 0; // set transparent color if specified
- }
-
- if (act == null) {
- status = STATUS_FORMAT_ERROR; // no color table defined
- }
-
- if (err()) return;
-
- decodeImageData(); // decode pixel data
- skip();
-
- if (err()) return;
-
- frameCount++;
-
- // create new image to receive frame data
- image =
- new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB_PRE);
-
- setPixels(); // transfer pixel data to image
-
- frames.add(new GifFrame(image, delay)); // add image to frame list
-
- if (transparency) {
- act[transIndex] = save;
- }
- resetFrame();
-
- }
-
- /**
- * Reads Logical Screen Descriptor
- */
- protected void readLSD() {
-
- // logical screen size
- width = readShort();
- height = readShort();
-
- // packed fields
- int packed = read();
- gctFlag = (packed & 0x80) != 0; // 1 : global color table flag
- // 2-4 : color resolution
- // 5 : gct sort flag
- gctSize = 2 << (packed & 7); // 6-8 : gct size
-
- bgIndex = read(); // background color index
- pixelAspect = read(); // pixel aspect ratio
- }
-
- /**
- * Reads Netscape extenstion to obtain iteration count
- */
- protected void readNetscapeExt() {
- do {
- readBlock();
- if (block[0] == 1) {
- // loop count sub-block
- int b1 = ((int) block[1]) & 0xff;
- int b2 = ((int) block[2]) & 0xff;
- loopCount = (b2 << 8) | b1;
- }
- } while ((blockSize > 0) && !err());
- }
-
- /**
- * Reads next 16-bit value, LSB first
- */
- protected int readShort() {
- // read 16-bit value, LSB first
- return read() | (read() << 8);
- }
-
- /**
- * Resets frame state for reading next image.
- */
- protected void resetFrame() {
- lastDispose = dispose;
- lastRect = new Rectangle(ix, iy, iw, ih);
- lastImage = image;
- lastBgColor = bgColor;
- int dispose = 0;
- boolean transparency = false;
- int delay = 0;
- lct = null;
- }
-
- /**
- * Skips variable length blocks up to and including
- * next zero length block.
- */
- protected void skip() {
- do {
- readBlock();
- } while ((blockSize > 0) && !err());
- }
-}
diff --git a/src/com/fr/plugin/cool/cartnoon/utils/LZWEncoder.java b/src/com/fr/plugin/cool/cartnoon/utils/LZWEncoder.java
deleted file mode 100644
index 98b9fb0..0000000
--- a/src/com/fr/plugin/cool/cartnoon/utils/LZWEncoder.java
+++ /dev/null
@@ -1,303 +0,0 @@
-package com.fr.plugin.cool.cartnoon.utils;
-
-import java.io.OutputStream;
-import java.io.IOException;
-
-//==============================================================================
-// Adapted from Jef Poskanzer's Java port by way of J. M. G. Elliott.
-// K Weiner 12/00
-
-class LZWEncoder {
-
- private static final int EOF = -1;
-
- private int imgW, imgH;
- private byte[] pixAry;
- private int initCodeSize;
- private int remaining;
- private int curPixel;
-
- // GIFCOMPR.C - GIF Image compression routines
- //
- // Lempel-Ziv compression based on 'compress'. GIF modifications by
- // David Rowley (mgardi@watdcsu.waterloo.edu)
-
- // General DEFINEs
-
- static final int BITS = 12;
-
- static final int HSIZE = 5003; // 80% occupancy
-
- // GIF Image compression - modified 'compress'
- //
- // Based on: compress.c - File compression ala IEEE Computer, June 1984.
- //
- // By Authors: Spencer W. Thomas (decvax!harpo!utah-cs!utah-gr!thomas)
- // Jim McKie (decvax!mcvax!jim)
- // Steve Davies (decvax!vax135!petsd!peora!srd)
- // Ken Turkowski (decvax!decwrl!turtlevax!ken)
- // James A. Woods (decvax!ihnp4!ames!jaw)
- // Joe Orost (decvax!vax135!petsd!joe)
-
- int n_bits; // number of bits/code
- int maxbits = BITS; // user settable max # bits/code
- int maxcode; // maximum code, given n_bits
- int maxmaxcode = 1 << BITS; // should NEVER generate this code
-
- int[] htab = new int[HSIZE];
- int[] codetab = new int[HSIZE];
-
- int hsize = HSIZE; // for dynamic table sizing
-
- int free_ent = 0; // first unused entry
-
- // block compression parameters -- after all codes are used up,
- // and compression rate changes, start over.
- boolean clear_flg = false;
-
- // Algorithm: use open addressing double hashing (no chaining) on the
- // prefix code / next character combination. We do a variant of Knuth's
- // algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime
- // secondary probe. Here, the modular division first probe is gives way
- // to a faster exclusive-or manipulation. Also do block compression with
- // an adaptive reset, whereby the code table is cleared when the compression
- // ratio decreases, but after the table fills. The variable-length output
- // codes are re-sized at this point, and a special CLEAR code is generated
- // for the decompressor. Late addition: construct the table according to
- // file size for noticeable speed improvement on small files. Please direct
- // questions about this implementation to ames!jaw.
-
- int g_init_bits;
-
- int ClearCode;
- int EOFCode;
-
- // output
- //
- // Output the given code.
- // Inputs:
- // code: A n_bits-bit integer. If == -1, then EOF. This assumes
- // that n_bits =< wordsize - 1.
- // Outputs:
- // Outputs code to the file.
- // Assumptions:
- // Chars are 8 bits long.
- // Algorithm:
- // Maintain a BITS character long buffer (so that 8 codes will
- // fit in it exactly). Use the VAX insv instruction to insert each
- // code in turn. When the buffer fills up empty it and start over.
-
- int cur_accum = 0;
- int cur_bits = 0;
-
- int masks[] =
- {
- 0x0000,
- 0x0001,
- 0x0003,
- 0x0007,
- 0x000F,
- 0x001F,
- 0x003F,
- 0x007F,
- 0x00FF,
- 0x01FF,
- 0x03FF,
- 0x07FF,
- 0x0FFF,
- 0x1FFF,
- 0x3FFF,
- 0x7FFF,
- 0xFFFF };
-
- // Number of characters so far in this 'packet'
- int a_count;
-
- // Define the storage for the packet accumulator
- byte[] accum = new byte[256];
-
- //----------------------------------------------------------------------------
- LZWEncoder(int width, int height, byte[] pixels, int color_depth) {
- imgW = width;
- imgH = height;
- pixAry = pixels;
- initCodeSize = Math.max(2, color_depth);
- }
-
- // Add a character to the end of the current packet, and if it is 254
- // characters, flush the packet to disk.
- void char_out(byte c, OutputStream outs) throws IOException {
- accum[a_count++] = c;
- if (a_count >= 254)
- flush_char(outs);
- }
-
- // Clear out the hash table
-
- // table clear for block compress
- void cl_block(OutputStream outs) throws IOException {
- cl_hash(hsize);
- free_ent = ClearCode + 2;
- clear_flg = true;
-
- output(ClearCode, outs);
- }
-
- // reset code table
- void cl_hash(int hsize) {
- for (int i = 0; i < hsize; ++i)
- htab[i] = -1;
- }
-
- void compress(int init_bits, OutputStream outs) throws IOException {
- int fcode;
- int i /* = 0 */;
- int c;
- int ent;
- int disp;
- int hsize_reg;
- int hshift;
-
- // Set up the globals: g_init_bits - initial number of bits
- g_init_bits = init_bits;
-
- // Set up the necessary values
- clear_flg = false;
- n_bits = g_init_bits;
- maxcode = MAXCODE(n_bits);
-
- ClearCode = 1 << (init_bits - 1);
- EOFCode = ClearCode + 1;
- free_ent = ClearCode + 2;
-
- a_count = 0; // clear packet
-
- ent = nextPixel();
-
- hshift = 0;
- for (fcode = hsize; fcode < 65536; fcode *= 2)
- ++hshift;
- hshift = 8 - hshift; // set hash code range bound
-
- hsize_reg = hsize;
- cl_hash(hsize_reg); // clear hash table
-
- output(ClearCode, outs);
-
- outer_loop : while ((c = nextPixel()) != EOF) {
- fcode = (c << maxbits) + ent;
- i = (c << hshift) ^ ent; // xor hashing
-
- if (htab[i] == fcode) {
- ent = codetab[i];
- continue;
- } else if (htab[i] >= 0) // non-empty slot
- {
- disp = hsize_reg - i; // secondary hash (after G. Knott)
- if (i == 0)
- disp = 1;
- do {
- if ((i -= disp) < 0)
- i += hsize_reg;
-
- if (htab[i] == fcode) {
- ent = codetab[i];
- continue outer_loop;
- }
- } while (htab[i] >= 0);
- }
- output(ent, outs);
- ent = c;
- if (free_ent < maxmaxcode) {
- codetab[i] = free_ent++; // code -> hashtable
- htab[i] = fcode;
- } else
- cl_block(outs);
- }
- // Put out the final code.
- output(ent, outs);
- output(EOFCode, outs);
- }
-
- //----------------------------------------------------------------------------
- void encode(OutputStream os) throws IOException {
- os.write(initCodeSize); // write "initial code size" byte
-
- remaining = imgW * imgH; // reset navigation variables
- curPixel = 0;
-
- compress(initCodeSize + 1, os); // compress and write the pixel data
-
- os.write(0); // write block terminator
- }
-
- // Flush the packet to disk, and reset the accumulator
- void flush_char(OutputStream outs) throws IOException {
- if (a_count > 0) {
- outs.write(a_count);
- outs.write(accum, 0, a_count);
- a_count = 0;
- }
- }
-
- final int MAXCODE(int n_bits) {
- return (1 << n_bits) - 1;
- }
-
- //----------------------------------------------------------------------------
- // Return the next pixel from the image
- //----------------------------------------------------------------------------
- private int nextPixel() {
- if (remaining == 0)
- return EOF;
-
- --remaining;
-
- byte pix = pixAry[curPixel++];
-
- return pix & 0xff;
- }
-
- void output(int code, OutputStream outs) throws IOException {
- cur_accum &= masks[cur_bits];
-
- if (cur_bits > 0)
- cur_accum |= (code << cur_bits);
- else
- cur_accum = code;
-
- cur_bits += n_bits;
-
- while (cur_bits >= 8) {
- char_out((byte) (cur_accum & 0xff), outs);
- cur_accum >>= 8;
- cur_bits -= 8;
- }
-
- // If the next entry is going to be too big for the code size,
- // then increase it, if possible.
- if (free_ent > maxcode || clear_flg) {
- if (clear_flg) {
- maxcode = MAXCODE(n_bits = g_init_bits);
- clear_flg = false;
- } else {
- ++n_bits;
- if (n_bits == maxbits)
- maxcode = maxmaxcode;
- else
- maxcode = MAXCODE(n_bits);
- }
- }
-
- if (code == EOFCode) {
- // At EOF, write the rest of the buffer.
- while (cur_bits > 0) {
- char_out((byte) (cur_accum & 0xff), outs);
- cur_accum >>= 8;
- cur_bits -= 8;
- }
-
- flush_char(outs);
- }
- }
-}
diff --git a/src/com/fr/plugin/cool/cartnoon/utils/NeuQuant.java b/src/com/fr/plugin/cool/cartnoon/utils/NeuQuant.java
deleted file mode 100644
index 356f45c..0000000
--- a/src/com/fr/plugin/cool/cartnoon/utils/NeuQuant.java
+++ /dev/null
@@ -1,459 +0,0 @@
-package com.fr.plugin.cool.cartnoon.utils;
-
-/* NeuQuant Neural-Net Quantization Algorithm
- * ------------------------------------------
- *
- * Copyright (c) 1994 Anthony Dekker
- *
- * NEUQUANT Neural-Net quantization algorithm by Anthony Dekker, 1994.
- * See "Kohonen neural networks for optimal colour quantization"
- * in "Network: Computation in Neural Systems" Vol. 5 (1994) pp 351-367.
- * for a discussion of the algorithm.
- *
- * Any party obtaining a copy of these files from the author, directly or
- * indirectly, is granted, free of charge, a full and unrestricted irrevocable,
- * world-wide, paid up, royalty-free, nonexclusive right and license to deal
- * in this software and documentation files (the "Software"), including without
- * limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons who receive
- * copies from any such party to do so, with the only requirement being
- * that this copyright notice remain intact.
- */
-
-// Ported to Java 12/00 K Weiner
-
-public class NeuQuant {
-
- protected static final int netsize = 256; /* number of colours used */
-
- /* four primes near 500 - assume no image has a length so large */
- /* that it is divisible by all four primes */
- protected static final int prime1 = 499;
- protected static final int prime2 = 491;
- protected static final int prime3 = 487;
- protected static final int prime4 = 503;
-
- protected static final int minpicturebytes = (3 * prime4);
- /* minimum size for input image */
-
- /* Program Skeleton
- ----------------
- [select samplefac in range 1..30]
- [read image from input file]
- pic = (unsigned char*) malloc(3*width*height);
- initnet(pic,3*width*height,samplefac);
- learn();
- unbiasnet();
- [write output image header, using writecolourmap(f)]
- inxbuild();
- write output image using inxsearch(b,g,r) */
-
- /* Network Definitions
- ------------------- */
-
- protected static final int maxnetpos = (netsize - 1);
- protected static final int netbiasshift = 4; /* bias for colour values */
- protected static final int ncycles = 100; /* no. of learning cycles */
-
- /* defs for freq and bias */
- protected static final int intbiasshift = 16; /* bias for fractions */
- protected static final int intbias = (((int) 1) << intbiasshift);
- protected static final int gammashift = 10; /* gamma = 1024 */
- protected static final int gamma = (((int) 1) << gammashift);
- protected static final int betashift = 10;
- protected static final int beta = (intbias >> betashift); /* beta = 1/1024 */
- protected static final int betagamma =
- (intbias << (gammashift - betashift));
-
- /* defs for decreasing radius factor */
- protected static final int initrad = (netsize >> 3); /* for 256 cols, radius starts */
- protected static final int radiusbiasshift = 6; /* at 32.0 biased by 6 bits */
- protected static final int radiusbias = (((int) 1) << radiusbiasshift);
- protected static final int initradius = (initrad * radiusbias); /* and decreases by a */
- protected static final int radiusdec = 30; /* factor of 1/30 each cycle */
-
- /* defs for decreasing alpha factor */
- protected static final int alphabiasshift = 10; /* alpha starts at 1.0 */
- protected static final int initalpha = (((int) 1) << alphabiasshift);
-
- protected int alphadec; /* biased by 10 bits */
-
- /* radbias and alpharadbias used for radpower calculation */
- protected static final int radbiasshift = 8;
- protected static final int radbias = (((int) 1) << radbiasshift);
- protected static final int alpharadbshift = (alphabiasshift + radbiasshift);
- protected static final int alpharadbias = (((int) 1) << alpharadbshift);
-
- /* Types and Global Variables
- -------------------------- */
-
- protected byte[] thepicture; /* the input image itself */
- protected int lengthcount; /* lengthcount = H*W*3 */
-
- protected int samplefac; /* sampling factor 1..30 */
-
- // typedef int pixel[4]; /* BGRc */
- protected int[][] network; /* the network itself - [netsize][4] */
-
- protected int[] netindex = new int[256];
- /* for network lookup - really 256 */
-
- protected int[] bias = new int[netsize];
- /* bias and freq arrays for learning */
- protected int[] freq = new int[netsize];
- protected int[] radpower = new int[initrad];
- /* radpower for precomputation */
-
- /* Initialise network in range (0,0,0) to (255,255,255) and set parameters
- ----------------------------------------------------------------------- */
- public NeuQuant(byte[] thepic, int len, int sample) {
-
- int i;
- int[] p;
-
- thepicture = thepic;
- lengthcount = len;
- samplefac = sample;
-
- network = new int[netsize][];
- for (i = 0; i < netsize; i++) {
- network[i] = new int[4];
- p = network[i];
- p[0] = p[1] = p[2] = (i << (netbiasshift + 8)) / netsize;
- freq[i] = intbias / netsize; /* 1/netsize */
- bias[i] = 0;
- }
- }
-
- public byte[] colorMap() {
- byte[] map = new byte[3 * netsize];
- int[] index = new int[netsize];
- for (int i = 0; i < netsize; i++)
- index[network[i][3]] = i;
- int k = 0;
- for (int i = 0; i < netsize; i++) {
- int j = index[i];
- map[k++] = (byte) (network[j][0]);
- map[k++] = (byte) (network[j][1]);
- map[k++] = (byte) (network[j][2]);
- }
- return map;
- }
-
- /* Insertion sort of network and building of netindex[0..255] (to do after unbias)
- ------------------------------------------------------------------------------- */
- public void inxbuild() {
-
- int i, j, smallpos, smallval;
- int[] p;
- int[] q;
- int previouscol, startpos;
-
- previouscol = 0;
- startpos = 0;
- for (i = 0; i < netsize; i++) {
- p = network[i];
- smallpos = i;
- smallval = p[1]; /* index on g */
- /* find smallest in i..netsize-1 */
- for (j = i + 1; j < netsize; j++) {
- q = network[j];
- if (q[1] < smallval) { /* index on g */
- smallpos = j;
- smallval = q[1]; /* index on g */
- }
- }
- q = network[smallpos];
- /* swap p (i) and q (smallpos) entries */
- if (i != smallpos) {
- j = q[0];
- q[0] = p[0];
- p[0] = j;
- j = q[1];
- q[1] = p[1];
- p[1] = j;
- j = q[2];
- q[2] = p[2];
- p[2] = j;
- j = q[3];
- q[3] = p[3];
- p[3] = j;
- }
- /* smallval entry is now in position i */
- if (smallval != previouscol) {
- netindex[previouscol] = (startpos + i) >> 1;
- for (j = previouscol + 1; j < smallval; j++)
- netindex[j] = i;
- previouscol = smallval;
- startpos = i;
- }
- }
- netindex[previouscol] = (startpos + maxnetpos) >> 1;
- for (j = previouscol + 1; j < 256; j++)
- netindex[j] = maxnetpos; /* really 256 */
- }
-
- /* Main Learning Loop
- ------------------ */
- public void learn() {
-
- int i, j, b, g, r;
- int radius, rad, alpha, step, delta, samplepixels;
- byte[] p;
- int pix, lim;
-
- if (lengthcount < minpicturebytes)
- samplefac = 1;
- alphadec = 30 + ((samplefac - 1) / 3);
- p = thepicture;
- pix = 0;
- lim = lengthcount;
- samplepixels = lengthcount / (3 * samplefac);
- delta = samplepixels / ncycles;
- alpha = initalpha;
- radius = initradius;
-
- rad = radius >> radiusbiasshift;
- if (rad <= 1)
- rad = 0;
- for (i = 0; i < rad; i++)
- radpower[i] =
- alpha * (((rad * rad - i * i) * radbias) / (rad * rad));
-
- //fprintf(stderr,"beginning 1D learning: initial radius=%d\n", rad);
-
- if (lengthcount < minpicturebytes)
- step = 3;
- else if ((lengthcount % prime1) != 0)
- step = 3 * prime1;
- else {
- if ((lengthcount % prime2) != 0)
- step = 3 * prime2;
- else {
- if ((lengthcount % prime3) != 0)
- step = 3 * prime3;
- else
- step = 3 * prime4;
- }
- }
-
- i = 0;
- while (i < samplepixels) {
- b = (p[pix + 0] & 0xff) << netbiasshift;
- g = (p[pix + 1] & 0xff) << netbiasshift;
- r = (p[pix + 2] & 0xff) << netbiasshift;
- j = contest(b, g, r);
-
- altersingle(alpha, j, b, g, r);
- if (rad != 0)
- alterneigh(rad, j, b, g, r); /* alter neighbours */
-
- pix += step;
- if (pix >= lim)
- pix -= lengthcount;
-
- i++;
- if (delta == 0)
- delta = 1;
- if (i % delta == 0) {
- alpha -= alpha / alphadec;
- radius -= radius / radiusdec;
- rad = radius >> radiusbiasshift;
- if (rad <= 1)
- rad = 0;
- for (j = 0; j < rad; j++)
- radpower[j] =
- alpha * (((rad * rad - j * j) * radbias) / (rad * rad));
- }
- }
- //fprintf(stderr,"finished 1D learning: final alpha=%f !\n",((float)alpha)/initalpha);
- }
-
- /* Search for BGR values 0..255 (after net is unbiased) and return colour index
- ---------------------------------------------------------------------------- */
- public int map(int b, int g, int r) {
-
- int i, j, dist, a, bestd;
- int[] p;
- int best;
-
- bestd = 1000; /* biggest possible dist is 256*3 */
- best = -1;
- i = netindex[g]; /* index on g */
- j = i - 1; /* start at netindex[g] and work outwards */
-
- while ((i < netsize) || (j >= 0)) {
- if (i < netsize) {
- p = network[i];
- dist = p[1] - g; /* inx key */
- if (dist >= bestd)
- i = netsize; /* stop iter */
- else {
- i++;
- if (dist < 0)
- dist = -dist;
- a = p[0] - b;
- if (a < 0)
- a = -a;
- dist += a;
- if (dist < bestd) {
- a = p[2] - r;
- if (a < 0)
- a = -a;
- dist += a;
- if (dist < bestd) {
- bestd = dist;
- best = p[3];
- }
- }
- }
- }
- if (j >= 0) {
- p = network[j];
- dist = g - p[1]; /* inx key - reverse dif */
- if (dist >= bestd)
- j = -1; /* stop iter */
- else {
- j--;
- if (dist < 0)
- dist = -dist;
- a = p[0] - b;
- if (a < 0)
- a = -a;
- dist += a;
- if (dist < bestd) {
- a = p[2] - r;
- if (a < 0)
- a = -a;
- dist += a;
- if (dist < bestd) {
- bestd = dist;
- best = p[3];
- }
- }
- }
- }
- }
- return (best);
- }
- public byte[] process() {
- learn();
- unbiasnet();
- inxbuild();
- return colorMap();
- }
-
- /* Unbias network to give byte values 0..255 and record position i to prepare for sort
- ----------------------------------------------------------------------------------- */
- public void unbiasnet() {
-
- int i, j;
-
- for (i = 0; i < netsize; i++) {
- network[i][0] >>= netbiasshift;
- network[i][1] >>= netbiasshift;
- network[i][2] >>= netbiasshift;
- network[i][3] = i; /* record colour no */
- }
- }
-
- /* Move adjacent neurons by precomputed alpha*(1-((i-j)^2/[r]^2)) in radpower[|i-j|]
- --------------------------------------------------------------------------------- */
- protected void alterneigh(int rad, int i, int b, int g, int r) {
-
- int j, k, lo, hi, a, m;
- int[] p;
-
- lo = i - rad;
- if (lo < -1)
- lo = -1;
- hi = i + rad;
- if (hi > netsize)
- hi = netsize;
-
- j = i + 1;
- k = i - 1;
- m = 1;
- while ((j < hi) || (k > lo)) {
- a = radpower[m++];
- if (j < hi) {
- p = network[j++];
- try {
- p[0] -= (a * (p[0] - b)) / alpharadbias;
- p[1] -= (a * (p[1] - g)) / alpharadbias;
- p[2] -= (a * (p[2] - r)) / alpharadbias;
- } catch (Exception e) {
- } // prevents 1.3 miscompilation
- }
- if (k > lo) {
- p = network[k--];
- try {
- p[0] -= (a * (p[0] - b)) / alpharadbias;
- p[1] -= (a * (p[1] - g)) / alpharadbias;
- p[2] -= (a * (p[2] - r)) / alpharadbias;
- } catch (Exception e) {
- }
- }
- }
- }
-
- /* Move neuron i towards biased (b,g,r) by factor alpha
- ---------------------------------------------------- */
- protected void altersingle(int alpha, int i, int b, int g, int r) {
-
- /* alter hit neuron */
- int[] n = network[i];
- n[0] -= (alpha * (n[0] - b)) / initalpha;
- n[1] -= (alpha * (n[1] - g)) / initalpha;
- n[2] -= (alpha * (n[2] - r)) / initalpha;
- }
-
- /* Search for biased BGR values
- ---------------------------- */
- protected int contest(int b, int g, int r) {
-
- /* finds closest neuron (min dist) and updates freq */
- /* finds best neuron (min dist-bias) and returns position */
- /* for frequently chosen neurons, freq[i] is high and bias[i] is negative */
- /* bias[i] = gamma*((1/netsize)-freq[i]) */
-
- int i, dist, a, biasdist, betafreq;
- int bestpos, bestbiaspos, bestd, bestbiasd;
- int[] n;
-
- bestd = ~(((int) 1) << 31);
- bestbiasd = bestd;
- bestpos = -1;
- bestbiaspos = bestpos;
-
- for (i = 0; i < netsize; i++) {
- n = network[i];
- dist = n[0] - b;
- if (dist < 0)
- dist = -dist;
- a = n[1] - g;
- if (a < 0)
- a = -a;
- dist += a;
- a = n[2] - r;
- if (a < 0)
- a = -a;
- dist += a;
- if (dist < bestd) {
- bestd = dist;
- bestpos = i;
- }
- biasdist = dist - ((bias[i]) >> (intbiasshift - netbiasshift));
- if (biasdist < bestbiasd) {
- bestbiasd = biasdist;
- bestbiaspos = i;
- }
- betafreq = (freq[i] >> betashift);
- freq[i] -= betafreq;
- bias[i] += (betafreq << gammashift);
- }
- freq[bestpos] += beta;
- bias[bestpos] -= betagamma;
- return (bestbiaspos);
- }
-}
diff --git a/src/com/fr/plugin/cool/cartnoon/web/CSSLoader.java b/src/com/fr/plugin/cool/cartnoon/web/CSSLoader.java
deleted file mode 100644
index e9ffc96..0000000
--- a/src/com/fr/plugin/cool/cartnoon/web/CSSLoader.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.fr.plugin.cool.cartnoon.web;
-
-import com.fr.decision.fun.impl.AbstractWebResourceProvider;
-import com.fr.intelli.record.Focus;
-import com.fr.report.web.ReportMainComponent;
-import com.fr.web.struct.Atom;
-import com.fr.web.struct.Component;
-import com.fr.web.struct.browser.RequestClient;
-import com.fr.web.struct.category.ScriptPath;
-import com.fr.web.struct.category.StylePath;
-
-public class CSSLoader extends AbstractWebResourceProvider {
-
- @Focus(id = "com.fr.plugin.cool.cartnoon",text = "字符动画函数")
- public Atom[] clients() {
- return new Atom[]{
- new Component() {
- @Override
- public ScriptPath script(RequestClient client) {
- return ScriptPath.build( "" );
- }
- @Override
- public StylePath style(RequestClient client) {
- return StylePath.build("com/fr/plugin/cool/cartnoon/web/resource/style.css");
- }
- }
- };
-
- }
-
-
- @Override
- public Atom attach() {
- return ReportMainComponent.KEY;
- }
-
- @Override
- public Atom client() {
- return null;
- }
-}
diff --git a/src/com/fr/plugin/cool/cartnoon/web/resource/images/clock.png b/src/com/fr/plugin/cool/cartnoon/web/resource/images/clock.png
deleted file mode 100644
index dd98ca4..0000000
Binary files a/src/com/fr/plugin/cool/cartnoon/web/resource/images/clock.png and /dev/null differ
diff --git a/src/com/fr/plugin/cool/cartnoon/web/resource/images/hour.png b/src/com/fr/plugin/cool/cartnoon/web/resource/images/hour.png
deleted file mode 100644
index b2da513..0000000
Binary files a/src/com/fr/plugin/cool/cartnoon/web/resource/images/hour.png and /dev/null differ
diff --git a/src/com/fr/plugin/cool/cartnoon/web/resource/images/minute.png b/src/com/fr/plugin/cool/cartnoon/web/resource/images/minute.png
deleted file mode 100644
index 91cebf8..0000000
Binary files a/src/com/fr/plugin/cool/cartnoon/web/resource/images/minute.png and /dev/null differ
diff --git a/src/com/fr/plugin/cool/cartnoon/web/resource/style.css b/src/com/fr/plugin/cool/cartnoon/web/resource/style.css
deleted file mode 100644
index b9ffbad..0000000
--- a/src/com/fr/plugin/cool/cartnoon/web/resource/style.css
+++ /dev/null
@@ -1,950 +0,0 @@
-body {
- /*display: grid;*/
- /*place-items: center;*/
- /*height: 100vh;*/
- /*background: #323133;*/
- /*font-family: "Quicksand", sans-serif;*/
- /*font-weight: 700;*/
- /*-webkit-perspective: 60rem;*/
- /*perspective: 60rem;*/
- /*-webkit-perspective-origin: 50% 50%;*/
- /*perspective-origin: 50% 50%;*/
- /*overflow: hidden;*/
- --fsize:10vmin;
- --fcolor:#ed5565;
-}
-
-
-body #user-button {
- --user-button-background: #434A54;
- --user-button-text: white;
-}
-
-body .text {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-}
-
-body .text > div {
-
- display: inline-block;
- position: relative;
- /*font-size: 10vmin;*/
- font-size: var(--fsize);
- color: transparent;
- -webkit-transform-origin: center center;
- transform-origin: center center;
- -webkit-transform-style: preserve-3d;
- transform-style: preserve-3d;
- -webkit-animation: float 4s infinite;
- animation: float 4s infinite;
-}
-
-body .text > div:nth-child(1) {
- -webkit-animation-delay: -1.5s;
- animation-delay: -1.5s;
-}
-
-body .text > div:nth-child(2) {
- -webkit-animation-delay: -1s;
- animation-delay: -1s;
-}
-
-body .text > div:nth-child(3) {
- -webkit-animation-delay: -0.5s;
- animation-delay: -0.5s;
-}
-
-body .text > div:nth-child(4) {
- -webkit-animation-delay: 0s;
- animation-delay: 0s;
-}
-
-body .text > div > div {
- position: absolute;
- top: 0;
- left: 0;
- color: white;
- text-shadow: 0 0 1px white;
-}
-
-body .text > div > div:not(:nth-child(n+3)), body .text > div > div:not(:nth-last-child(n+3)) {
- color: var(--fcolor);
- text-shadow: 0 0 1px #ed5565;
-}
-
-body .text > div > div:nth-child(1) {
- -webkit-transform: translateZ(-2.9166666667vmin);
- transform: translateZ(-2.9166666667vmin);
-}
-
-body .text > div > div:nth-child(2) {
- -webkit-transform: translateZ(-2.3333333333vmin);
- transform: translateZ(-2.3333333333vmin);
-}
-
-body .text > div > div:nth-child(3) {
- -webkit-transform: translateZ(-1.75vmin);
- transform: translateZ(-1.75vmin);
-}
-
-body .text > div > div:nth-child(4) {
- -webkit-transform: translateZ(-1.1666666667vmin);
- transform: translateZ(-1.1666666667vmin);
-}
-
-body .text > div > div:nth-child(5) {
- -webkit-transform: translateZ(-0.5833333333vmin);
- transform: translateZ(-0.5833333333vmin);
-}
-
-body .text > div > div:nth-child(6) {
- -webkit-transform: translateZ(0vmin);
- transform: translateZ(0vmin);
-}
-
-body .text > div > div:nth-child(7) {
- -webkit-transform: translateZ(0.5833333333vmin);
- transform: translateZ(0.5833333333vmin);
-}
-
-body .text > div > div:nth-child(8) {
- -webkit-transform: translateZ(1.1666666667vmin);
- transform: translateZ(1.1666666667vmin);
-}
-
-body .text > div > div:nth-child(9) {
- -webkit-transform: translateZ(1.75vmin);
- transform: translateZ(1.75vmin);
-}
-
-body .text > div > div:nth-child(10) {
- -webkit-transform: translateZ(2.3333333333vmin);
- transform: translateZ(2.3333333333vmin);
-}
-
-body .text > div > div:nth-child(11) {
- -webkit-transform: translateZ(2.9166666667vmin);
- transform: translateZ(2.9166666667vmin);
-}
-
-body .text > div > div:nth-child(12) {
- -webkit-transform: translateZ(3.5vmin);
- transform: translateZ(3.5vmin);
-}
-
-@-webkit-keyframes float {
- 0% {
- -webkit-transform: rotate3d(0, 1, 0, 30deg);
- transform: rotate3d(0, 1, 0, 30deg);
- }
- 1% {
- -webkit-transform: rotate3d(0.0627905195, 0.9980267284, 0, 30deg);
- transform: rotate3d(0.0627905195, 0.9980267284, 0, 30deg);
- }
- 2% {
- -webkit-transform: rotate3d(0.1253332336, 0.9921147013, 0, 30deg);
- transform: rotate3d(0.1253332336, 0.9921147013, 0, 30deg);
- }
- 3% {
- -webkit-transform: rotate3d(0.1873813146, 0.9822872507, 0, 30deg);
- transform: rotate3d(0.1873813146, 0.9822872507, 0, 30deg);
- }
- 4% {
- -webkit-transform: rotate3d(0.2486898872, 0.9685831611, 0, 30deg);
- transform: rotate3d(0.2486898872, 0.9685831611, 0, 30deg);
- }
- 5% {
- -webkit-transform: rotate3d(0.3090169944, 0.9510565163, 0, 30deg);
- transform: rotate3d(0.3090169944, 0.9510565163, 0, 30deg);
- }
- 6% {
- -webkit-transform: rotate3d(0.3681245527, 0.9297764859, 0, 30deg);
- transform: rotate3d(0.3681245527, 0.9297764859, 0, 30deg);
- }
- 7% {
- -webkit-transform: rotate3d(0.4257792916, 0.9048270525, 0, 30deg);
- transform: rotate3d(0.4257792916, 0.9048270525, 0, 30deg);
- }
- 8% {
- -webkit-transform: rotate3d(0.4817536741, 0.87630668, 0, 30deg);
- transform: rotate3d(0.4817536741, 0.87630668, 0, 30deg);
- }
- 9% {
- -webkit-transform: rotate3d(0.535826795, 0.8443279255, 0, 30deg);
- transform: rotate3d(0.535826795, 0.8443279255, 0, 30deg);
- }
- 10% {
- -webkit-transform: rotate3d(0.5877852523, 0.8090169944, 0, 30deg);
- transform: rotate3d(0.5877852523, 0.8090169944, 0, 30deg);
- }
- 11% {
- -webkit-transform: rotate3d(0.6374239897, 0.7705132428, 0, 30deg);
- transform: rotate3d(0.6374239897, 0.7705132428, 0, 30deg);
- }
- 12% {
- -webkit-transform: rotate3d(0.6845471059, 0.7289686274, 0, 30deg);
- transform: rotate3d(0.6845471059, 0.7289686274, 0, 30deg);
- }
- 13% {
- -webkit-transform: rotate3d(0.7289686274, 0.6845471059, 0, 30deg);
- transform: rotate3d(0.7289686274, 0.6845471059, 0, 30deg);
- }
- 14% {
- -webkit-transform: rotate3d(0.7705132428, 0.6374239897, 0, 30deg);
- transform: rotate3d(0.7705132428, 0.6374239897, 0, 30deg);
- }
- 15% {
- -webkit-transform: rotate3d(0.8090169944, 0.5877852523, 0, 30deg);
- transform: rotate3d(0.8090169944, 0.5877852523, 0, 30deg);
- }
- 16% {
- -webkit-transform: rotate3d(0.8443279255, 0.535826795, 0, 30deg);
- transform: rotate3d(0.8443279255, 0.535826795, 0, 30deg);
- }
- 17% {
- -webkit-transform: rotate3d(0.87630668, 0.4817536741, 0, 30deg);
- transform: rotate3d(0.87630668, 0.4817536741, 0, 30deg);
- }
- 18% {
- -webkit-transform: rotate3d(0.9048270525, 0.4257792916, 0, 30deg);
- transform: rotate3d(0.9048270525, 0.4257792916, 0, 30deg);
- }
- 19% {
- -webkit-transform: rotate3d(0.9297764859, 0.3681245527, 0, 30deg);
- transform: rotate3d(0.9297764859, 0.3681245527, 0, 30deg);
- }
- 20% {
- -webkit-transform: rotate3d(0.9510565163, 0.3090169944, 0, 30deg);
- transform: rotate3d(0.9510565163, 0.3090169944, 0, 30deg);
- }
- 21% {
- -webkit-transform: rotate3d(0.9685831611, 0.2486898872, 0, 30deg);
- transform: rotate3d(0.9685831611, 0.2486898872, 0, 30deg);
- }
- 22% {
- -webkit-transform: rotate3d(0.9822872507, 0.1873813146, 0, 30deg);
- transform: rotate3d(0.9822872507, 0.1873813146, 0, 30deg);
- }
- 23% {
- -webkit-transform: rotate3d(0.9921147013, 0.1253332336, 0, 30deg);
- transform: rotate3d(0.9921147013, 0.1253332336, 0, 30deg);
- }
- 24% {
- -webkit-transform: rotate3d(0.9980267284, 0.0627905195, 0, 30deg);
- transform: rotate3d(0.9980267284, 0.0627905195, 0, 30deg);
- }
- 25% {
- -webkit-transform: rotate3d(1, 0, 0, 30deg);
- transform: rotate3d(1, 0, 0, 30deg);
- }
- 26% {
- -webkit-transform: rotate3d(0.9980267284, -0.0627905195, 0, 30deg);
- transform: rotate3d(0.9980267284, -0.0627905195, 0, 30deg);
- }
- 27% {
- -webkit-transform: rotate3d(0.9921147013, -0.1253332336, 0, 30deg);
- transform: rotate3d(0.9921147013, -0.1253332336, 0, 30deg);
- }
- 28% {
- -webkit-transform: rotate3d(0.9822872507, -0.1873813146, 0, 30deg);
- transform: rotate3d(0.9822872507, -0.1873813146, 0, 30deg);
- }
- 29% {
- -webkit-transform: rotate3d(0.9685831611, -0.2486898872, 0, 30deg);
- transform: rotate3d(0.9685831611, -0.2486898872, 0, 30deg);
- }
- 30% {
- -webkit-transform: rotate3d(0.9510565163, -0.3090169944, 0, 30deg);
- transform: rotate3d(0.9510565163, -0.3090169944, 0, 30deg);
- }
- 31% {
- -webkit-transform: rotate3d(0.9297764859, -0.3681245527, 0, 30deg);
- transform: rotate3d(0.9297764859, -0.3681245527, 0, 30deg);
- }
- 32% {
- -webkit-transform: rotate3d(0.9048270525, -0.4257792916, 0, 30deg);
- transform: rotate3d(0.9048270525, -0.4257792916, 0, 30deg);
- }
- 33% {
- -webkit-transform: rotate3d(0.87630668, -0.4817536741, 0, 30deg);
- transform: rotate3d(0.87630668, -0.4817536741, 0, 30deg);
- }
- 34% {
- -webkit-transform: rotate3d(0.8443279255, -0.535826795, 0, 30deg);
- transform: rotate3d(0.8443279255, -0.535826795, 0, 30deg);
- }
- 35% {
- -webkit-transform: rotate3d(0.8090169944, -0.5877852523, 0, 30deg);
- transform: rotate3d(0.8090169944, -0.5877852523, 0, 30deg);
- }
- 36% {
- -webkit-transform: rotate3d(0.7705132428, -0.6374239897, 0, 30deg);
- transform: rotate3d(0.7705132428, -0.6374239897, 0, 30deg);
- }
- 37% {
- -webkit-transform: rotate3d(0.7289686274, -0.6845471059, 0, 30deg);
- transform: rotate3d(0.7289686274, -0.6845471059, 0, 30deg);
- }
- 38% {
- -webkit-transform: rotate3d(0.6845471059, -0.7289686274, 0, 30deg);
- transform: rotate3d(0.6845471059, -0.7289686274, 0, 30deg);
- }
- 39% {
- -webkit-transform: rotate3d(0.6374239897, -0.7705132428, 0, 30deg);
- transform: rotate3d(0.6374239897, -0.7705132428, 0, 30deg);
- }
- 40% {
- -webkit-transform: rotate3d(0.5877852523, -0.8090169944, 0, 30deg);
- transform: rotate3d(0.5877852523, -0.8090169944, 0, 30deg);
- }
- 41% {
- -webkit-transform: rotate3d(0.535826795, -0.8443279255, 0, 30deg);
- transform: rotate3d(0.535826795, -0.8443279255, 0, 30deg);
- }
- 42% {
- -webkit-transform: rotate3d(0.4817536741, -0.87630668, 0, 30deg);
- transform: rotate3d(0.4817536741, -0.87630668, 0, 30deg);
- }
- 43% {
- -webkit-transform: rotate3d(0.4257792916, -0.9048270525, 0, 30deg);
- transform: rotate3d(0.4257792916, -0.9048270525, 0, 30deg);
- }
- 44% {
- -webkit-transform: rotate3d(0.3681245527, -0.9297764859, 0, 30deg);
- transform: rotate3d(0.3681245527, -0.9297764859, 0, 30deg);
- }
- 45% {
- -webkit-transform: rotate3d(0.3090169944, -0.9510565163, 0, 30deg);
- transform: rotate3d(0.3090169944, -0.9510565163, 0, 30deg);
- }
- 46% {
- -webkit-transform: rotate3d(0.2486898872, -0.9685831611, 0, 30deg);
- transform: rotate3d(0.2486898872, -0.9685831611, 0, 30deg);
- }
- 47% {
- -webkit-transform: rotate3d(0.1873813146, -0.9822872507, 0, 30deg);
- transform: rotate3d(0.1873813146, -0.9822872507, 0, 30deg);
- }
- 48% {
- -webkit-transform: rotate3d(0.1253332336, -0.9921147013, 0, 30deg);
- transform: rotate3d(0.1253332336, -0.9921147013, 0, 30deg);
- }
- 49% {
- -webkit-transform: rotate3d(0.0627905195, -0.9980267284, 0, 30deg);
- transform: rotate3d(0.0627905195, -0.9980267284, 0, 30deg);
- }
- 50% {
- -webkit-transform: rotate3d(0, -0.9999999999, 0, 30deg);
- transform: rotate3d(0, -0.9999999999, 0, 30deg);
- }
- 51% {
- -webkit-transform: rotate3d(-0.0627905195, -0.9980267283, 0, 30deg);
- transform: rotate3d(-0.0627905195, -0.9980267283, 0, 30deg);
- }
- 52% {
- -webkit-transform: rotate3d(-0.1253332335, -0.9921147011, 0, 30deg);
- transform: rotate3d(-0.1253332335, -0.9921147011, 0, 30deg);
- }
- 53% {
- -webkit-transform: rotate3d(-0.1873813145, -0.9822872505, 0, 30deg);
- transform: rotate3d(-0.1873813145, -0.9822872505, 0, 30deg);
- }
- 54% {
- -webkit-transform: rotate3d(-0.2486898871, -0.9685831607, 0, 30deg);
- transform: rotate3d(-0.2486898871, -0.9685831607, 0, 30deg);
- }
- 55% {
- -webkit-transform: rotate3d(-0.3090169943, -0.9510565157, 0, 30deg);
- transform: rotate3d(-0.3090169943, -0.9510565157, 0, 30deg);
- }
- 56% {
- -webkit-transform: rotate3d(-0.3681245525, -0.929776485, 0, 30deg);
- transform: rotate3d(-0.3681245525, -0.929776485, 0, 30deg);
- }
- 57% {
- -webkit-transform: rotate3d(-0.4257792914, -0.9048270511, 0, 30deg);
- transform: rotate3d(-0.4257792914, -0.9048270511, 0, 30deg);
- }
- 58% {
- -webkit-transform: rotate3d(-0.4817536738, -0.8763066781, 0, 30deg);
- transform: rotate3d(-0.4817536738, -0.8763066781, 0, 30deg);
- }
- 59% {
- -webkit-transform: rotate3d(-0.5358267945, -0.8443279226, 0, 30deg);
- transform: rotate3d(-0.5358267945, -0.8443279226, 0, 30deg);
- }
- 60% {
- -webkit-transform: rotate3d(-0.5877852516, -0.8090169902, 0, 30deg);
- transform: rotate3d(-0.5877852516, -0.8090169902, 0, 30deg);
- }
- 61% {
- -webkit-transform: rotate3d(-0.6374239888, -0.7705132368, 0, 30deg);
- transform: rotate3d(-0.6374239888, -0.7705132368, 0, 30deg);
- }
- 62% {
- -webkit-transform: rotate3d(-0.6845471045, -0.7289686189, 0, 30deg);
- transform: rotate3d(-0.6845471045, -0.7289686189, 0, 30deg);
- }
- 63% {
- -webkit-transform: rotate3d(-0.7289686253, -0.6845470938, 0, 30deg);
- transform: rotate3d(-0.7289686253, -0.6845470938, 0, 30deg);
- }
- 64% {
- -webkit-transform: rotate3d(-0.7705132398, -0.6374239727, 0, 30deg);
- transform: rotate3d(-0.7705132398, -0.6374239727, 0, 30deg);
- }
- 65% {
- -webkit-transform: rotate3d(-0.8090169901, -0.5877852283, 0, 30deg);
- transform: rotate3d(-0.8090169901, -0.5877852283, 0, 30deg);
- }
- 66% {
- -webkit-transform: rotate3d(-0.8443279194, -0.5358267614, 0, 30deg);
- transform: rotate3d(-0.8443279194, -0.5358267614, 0, 30deg);
- }
- 67% {
- -webkit-transform: rotate3d(-0.8763066715, -0.4817536274, 0, 30deg);
- transform: rotate3d(-0.8763066715, -0.4817536274, 0, 30deg);
- }
- 68% {
- -webkit-transform: rotate3d(-0.9048270404, -0.425779227, 0, 30deg);
- transform: rotate3d(-0.9048270404, -0.425779227, 0, 30deg);
- }
- 69% {
- -webkit-transform: rotate3d(-0.9297764691, -0.3681244637, 0, 30deg);
- transform: rotate3d(-0.9297764691, -0.3681244637, 0, 30deg);
- }
- 70% {
- -webkit-transform: rotate3d(-0.9510564929, -0.3090168724, 0, 30deg);
- transform: rotate3d(-0.9510564929, -0.3090168724, 0, 30deg);
- }
- 71% {
- -webkit-transform: rotate3d(-0.9685831287, -0.2486897207, 0, 30deg);
- transform: rotate3d(-0.9685831287, -0.2486897207, 0, 30deg);
- }
- 72% {
- -webkit-transform: rotate3d(-0.9822872061, -0.1873810883, 0, 30deg);
- transform: rotate3d(-0.9822872061, -0.1873810883, 0, 30deg);
- }
- 73% {
- -webkit-transform: rotate3d(-0.9921146401, -0.1253329274, 0, 30deg);
- transform: rotate3d(-0.9921146401, -0.1253329274, 0, 30deg);
- }
- 74% {
- -webkit-transform: rotate3d(-0.9980266448, -0.0627901069, 0, 30deg);
- transform: rotate3d(-0.9980266448, -0.0627901069, 0, 30deg);
- }
- 75% {
- -webkit-transform: rotate3d(-0.9999998862, 0.0000005537, 0, 30deg);
- transform: rotate3d(-0.9999998862, 0.0000005537, 0, 30deg);
- }
- 76% {
- -webkit-transform: rotate3d(-0.9980265742, 0.0627912598, 0, 30deg);
- transform: rotate3d(-0.9980265742, 0.0627912598, 0, 30deg);
- }
- 77% {
- -webkit-transform: rotate3d(-0.9921144932, 0.1253342195, 0, 30deg);
- transform: rotate3d(-0.9921144932, 0.1253342195, 0, 30deg);
- }
- 78% {
- -webkit-transform: rotate3d(-0.982286971, 0.1873826227, 0, 30deg);
- transform: rotate3d(-0.982286971, 0.1873826227, 0, 30deg);
- }
- 79% {
- -webkit-transform: rotate3d(-0.9685827866, 0.2486916166, 0, 30deg);
- transform: rotate3d(-0.9685827866, 0.2486916166, 0, 30deg);
- }
- 80% {
- -webkit-transform: rotate3d(-0.9510560166, 0.3090192726, 0, 30deg);
- transform: rotate3d(-0.9510560166, 0.3090192726, 0, 30deg);
- }
- 81% {
- -webkit-transform: rotate3d(-0.9297758216, 0.3681275437, 0, 30deg);
- transform: rotate3d(-0.9297758216, 0.3681275437, 0, 30deg);
- }
- 82% {
- -webkit-transform: rotate3d(-0.9048261725, 0.425783205, 0, 30deg);
- transform: rotate3d(-0.9048261725, 0.425783205, 0, 30deg);
- }
- 83% {
- -webkit-transform: rotate3d(-0.8763055184, 0.4817587777, 0, 30deg);
- transform: rotate3d(-0.8763055184, 0.4817587777, 0, 30deg);
- }
- 84% {
- -webkit-transform: rotate3d(-0.8443263971, 0.5358334293, 0, 30deg);
- transform: rotate3d(-0.8443263971, 0.5358334293, 0, 30deg);
- }
- 85% {
- -webkit-transform: rotate3d(-0.80901499, 0.5877938496, 0, 30deg);
- transform: rotate3d(-0.80901499, 0.5877938496, 0, 30deg);
- }
- 86% {
- -webkit-transform: rotate3d(-0.7705106226, 0.6374350969, 0, 30deg);
- transform: rotate3d(-0.7705106226, 0.6374350969, 0, 30deg);
- }
- 87% {
- -webkit-transform: rotate3d(-0.7289652129, 0.6845614127, 0, 30deg);
- transform: rotate3d(-0.7289652129, 0.6845614127, 0, 30deg);
- }
- 88% {
- -webkit-transform: rotate3d(-0.6845426698, 0.7289870018, 0, 30deg);
- transform: rotate3d(-0.6845426698, 0.7289870018, 0, 30deg);
- }
- 89% {
- -webkit-transform: rotate3d(-0.6374182434, 0.7705367741, 0, 30deg);
- transform: rotate3d(-0.6374182434, 0.7705367741, 0, 30deg);
- }
- 90% {
- -webkit-transform: rotate3d(-0.5877778306, 0.8090470459, 0, 30deg);
- transform: rotate3d(-0.5877778306, 0.8090470459, 0, 30deg);
- }
- 91% {
- -webkit-transform: rotate3d(-0.5358172367, 0.8443661994, 0, 30deg);
- transform: rotate3d(-0.5358172367, 0.8443661994, 0, 30deg);
- }
- 92% {
- -webkit-transform: rotate3d(-0.4817413984, 0.876355296, 0, 30deg);
- transform: rotate3d(-0.4817413984, 0.876355296, 0, 30deg);
- }
- 93% {
- -webkit-transform: rotate3d(-0.4257635689, 0.904888644, 0, 30deg);
- transform: rotate3d(-0.4257635689, 0.904888644, 0, 30deg);
- }
- 94% {
- -webkit-transform: rotate3d(-0.3681044689, 0.9298543169, 0, 30deg);
- transform: rotate3d(-0.3681044689, 0.9298543169, 0, 30deg);
- }
- 95% {
- -webkit-transform: rotate3d(-0.3089914068, 0.9511546228, 0, 30deg);
- transform: rotate3d(-0.3089914068, 0.9511546228, 0, 30deg);
- }
- 96% {
- -webkit-transform: rotate3d(-0.2486573708, 0.9687065223, 0, 30deg);
- transform: rotate3d(-0.2486573708, 0.9687065223, 0, 30deg);
- }
- 97% {
- -webkit-transform: rotate3d(-0.1873400968, 0.9824419959, 0, 30deg);
- transform: rotate3d(-0.1873400968, 0.9824419959, 0, 30deg);
- }
- 98% {
- -webkit-transform: rotate3d(-0.1252811139, 0.9923083591, 0, 30deg);
- transform: rotate3d(-0.1252811139, 0.9923083591, 0, 30deg);
- }
- 99% {
- -webkit-transform: rotate3d(-0.062724773, 0.9982685263, 0, 30deg);
- transform: rotate3d(-0.062724773, 0.9982685263, 0, 30deg);
- }
- 100% {
- -webkit-transform: rotate3d(0.000082741, 1.000301224, 0, 30deg);
- transform: rotate3d(0.000082741, 1.000301224, 0, 30deg);
- }
-}
-
-@keyframes float {
- 0% {
- -webkit-transform: rotate3d(0, 1, 0, 30deg);
- transform: rotate3d(0, 1, 0, 30deg);
- }
- 1% {
- -webkit-transform: rotate3d(0.0627905195, 0.9980267284, 0, 30deg);
- transform: rotate3d(0.0627905195, 0.9980267284, 0, 30deg);
- }
- 2% {
- -webkit-transform: rotate3d(0.1253332336, 0.9921147013, 0, 30deg);
- transform: rotate3d(0.1253332336, 0.9921147013, 0, 30deg);
- }
- 3% {
- -webkit-transform: rotate3d(0.1873813146, 0.9822872507, 0, 30deg);
- transform: rotate3d(0.1873813146, 0.9822872507, 0, 30deg);
- }
- 4% {
- -webkit-transform: rotate3d(0.2486898872, 0.9685831611, 0, 30deg);
- transform: rotate3d(0.2486898872, 0.9685831611, 0, 30deg);
- }
- 5% {
- -webkit-transform: rotate3d(0.3090169944, 0.9510565163, 0, 30deg);
- transform: rotate3d(0.3090169944, 0.9510565163, 0, 30deg);
- }
- 6% {
- -webkit-transform: rotate3d(0.3681245527, 0.9297764859, 0, 30deg);
- transform: rotate3d(0.3681245527, 0.9297764859, 0, 30deg);
- }
- 7% {
- -webkit-transform: rotate3d(0.4257792916, 0.9048270525, 0, 30deg);
- transform: rotate3d(0.4257792916, 0.9048270525, 0, 30deg);
- }
- 8% {
- -webkit-transform: rotate3d(0.4817536741, 0.87630668, 0, 30deg);
- transform: rotate3d(0.4817536741, 0.87630668, 0, 30deg);
- }
- 9% {
- -webkit-transform: rotate3d(0.535826795, 0.8443279255, 0, 30deg);
- transform: rotate3d(0.535826795, 0.8443279255, 0, 30deg);
- }
- 10% {
- -webkit-transform: rotate3d(0.5877852523, 0.8090169944, 0, 30deg);
- transform: rotate3d(0.5877852523, 0.8090169944, 0, 30deg);
- }
- 11% {
- -webkit-transform: rotate3d(0.6374239897, 0.7705132428, 0, 30deg);
- transform: rotate3d(0.6374239897, 0.7705132428, 0, 30deg);
- }
- 12% {
- -webkit-transform: rotate3d(0.6845471059, 0.7289686274, 0, 30deg);
- transform: rotate3d(0.6845471059, 0.7289686274, 0, 30deg);
- }
- 13% {
- -webkit-transform: rotate3d(0.7289686274, 0.6845471059, 0, 30deg);
- transform: rotate3d(0.7289686274, 0.6845471059, 0, 30deg);
- }
- 14% {
- -webkit-transform: rotate3d(0.7705132428, 0.6374239897, 0, 30deg);
- transform: rotate3d(0.7705132428, 0.6374239897, 0, 30deg);
- }
- 15% {
- -webkit-transform: rotate3d(0.8090169944, 0.5877852523, 0, 30deg);
- transform: rotate3d(0.8090169944, 0.5877852523, 0, 30deg);
- }
- 16% {
- -webkit-transform: rotate3d(0.8443279255, 0.535826795, 0, 30deg);
- transform: rotate3d(0.8443279255, 0.535826795, 0, 30deg);
- }
- 17% {
- -webkit-transform: rotate3d(0.87630668, 0.4817536741, 0, 30deg);
- transform: rotate3d(0.87630668, 0.4817536741, 0, 30deg);
- }
- 18% {
- -webkit-transform: rotate3d(0.9048270525, 0.4257792916, 0, 30deg);
- transform: rotate3d(0.9048270525, 0.4257792916, 0, 30deg);
- }
- 19% {
- -webkit-transform: rotate3d(0.9297764859, 0.3681245527, 0, 30deg);
- transform: rotate3d(0.9297764859, 0.3681245527, 0, 30deg);
- }
- 20% {
- -webkit-transform: rotate3d(0.9510565163, 0.3090169944, 0, 30deg);
- transform: rotate3d(0.9510565163, 0.3090169944, 0, 30deg);
- }
- 21% {
- -webkit-transform: rotate3d(0.9685831611, 0.2486898872, 0, 30deg);
- transform: rotate3d(0.9685831611, 0.2486898872, 0, 30deg);
- }
- 22% {
- -webkit-transform: rotate3d(0.9822872507, 0.1873813146, 0, 30deg);
- transform: rotate3d(0.9822872507, 0.1873813146, 0, 30deg);
- }
- 23% {
- -webkit-transform: rotate3d(0.9921147013, 0.1253332336, 0, 30deg);
- transform: rotate3d(0.9921147013, 0.1253332336, 0, 30deg);
- }
- 24% {
- -webkit-transform: rotate3d(0.9980267284, 0.0627905195, 0, 30deg);
- transform: rotate3d(0.9980267284, 0.0627905195, 0, 30deg);
- }
- 25% {
- -webkit-transform: rotate3d(1, 0, 0, 30deg);
- transform: rotate3d(1, 0, 0, 30deg);
- }
- 26% {
- -webkit-transform: rotate3d(0.9980267284, -0.0627905195, 0, 30deg);
- transform: rotate3d(0.9980267284, -0.0627905195, 0, 30deg);
- }
- 27% {
- -webkit-transform: rotate3d(0.9921147013, -0.1253332336, 0, 30deg);
- transform: rotate3d(0.9921147013, -0.1253332336, 0, 30deg);
- }
- 28% {
- -webkit-transform: rotate3d(0.9822872507, -0.1873813146, 0, 30deg);
- transform: rotate3d(0.9822872507, -0.1873813146, 0, 30deg);
- }
- 29% {
- -webkit-transform: rotate3d(0.9685831611, -0.2486898872, 0, 30deg);
- transform: rotate3d(0.9685831611, -0.2486898872, 0, 30deg);
- }
- 30% {
- -webkit-transform: rotate3d(0.9510565163, -0.3090169944, 0, 30deg);
- transform: rotate3d(0.9510565163, -0.3090169944, 0, 30deg);
- }
- 31% {
- -webkit-transform: rotate3d(0.9297764859, -0.3681245527, 0, 30deg);
- transform: rotate3d(0.9297764859, -0.3681245527, 0, 30deg);
- }
- 32% {
- -webkit-transform: rotate3d(0.9048270525, -0.4257792916, 0, 30deg);
- transform: rotate3d(0.9048270525, -0.4257792916, 0, 30deg);
- }
- 33% {
- -webkit-transform: rotate3d(0.87630668, -0.4817536741, 0, 30deg);
- transform: rotate3d(0.87630668, -0.4817536741, 0, 30deg);
- }
- 34% {
- -webkit-transform: rotate3d(0.8443279255, -0.535826795, 0, 30deg);
- transform: rotate3d(0.8443279255, -0.535826795, 0, 30deg);
- }
- 35% {
- -webkit-transform: rotate3d(0.8090169944, -0.5877852523, 0, 30deg);
- transform: rotate3d(0.8090169944, -0.5877852523, 0, 30deg);
- }
- 36% {
- -webkit-transform: rotate3d(0.7705132428, -0.6374239897, 0, 30deg);
- transform: rotate3d(0.7705132428, -0.6374239897, 0, 30deg);
- }
- 37% {
- -webkit-transform: rotate3d(0.7289686274, -0.6845471059, 0, 30deg);
- transform: rotate3d(0.7289686274, -0.6845471059, 0, 30deg);
- }
- 38% {
- -webkit-transform: rotate3d(0.6845471059, -0.7289686274, 0, 30deg);
- transform: rotate3d(0.6845471059, -0.7289686274, 0, 30deg);
- }
- 39% {
- -webkit-transform: rotate3d(0.6374239897, -0.7705132428, 0, 30deg);
- transform: rotate3d(0.6374239897, -0.7705132428, 0, 30deg);
- }
- 40% {
- -webkit-transform: rotate3d(0.5877852523, -0.8090169944, 0, 30deg);
- transform: rotate3d(0.5877852523, -0.8090169944, 0, 30deg);
- }
- 41% {
- -webkit-transform: rotate3d(0.535826795, -0.8443279255, 0, 30deg);
- transform: rotate3d(0.535826795, -0.8443279255, 0, 30deg);
- }
- 42% {
- -webkit-transform: rotate3d(0.4817536741, -0.87630668, 0, 30deg);
- transform: rotate3d(0.4817536741, -0.87630668, 0, 30deg);
- }
- 43% {
- -webkit-transform: rotate3d(0.4257792916, -0.9048270525, 0, 30deg);
- transform: rotate3d(0.4257792916, -0.9048270525, 0, 30deg);
- }
- 44% {
- -webkit-transform: rotate3d(0.3681245527, -0.9297764859, 0, 30deg);
- transform: rotate3d(0.3681245527, -0.9297764859, 0, 30deg);
- }
- 45% {
- -webkit-transform: rotate3d(0.3090169944, -0.9510565163, 0, 30deg);
- transform: rotate3d(0.3090169944, -0.9510565163, 0, 30deg);
- }
- 46% {
- -webkit-transform: rotate3d(0.2486898872, -0.9685831611, 0, 30deg);
- transform: rotate3d(0.2486898872, -0.9685831611, 0, 30deg);
- }
- 47% {
- -webkit-transform: rotate3d(0.1873813146, -0.9822872507, 0, 30deg);
- transform: rotate3d(0.1873813146, -0.9822872507, 0, 30deg);
- }
- 48% {
- -webkit-transform: rotate3d(0.1253332336, -0.9921147013, 0, 30deg);
- transform: rotate3d(0.1253332336, -0.9921147013, 0, 30deg);
- }
- 49% {
- -webkit-transform: rotate3d(0.0627905195, -0.9980267284, 0, 30deg);
- transform: rotate3d(0.0627905195, -0.9980267284, 0, 30deg);
- }
- 50% {
- -webkit-transform: rotate3d(0, -0.9999999999, 0, 30deg);
- transform: rotate3d(0, -0.9999999999, 0, 30deg);
- }
- 51% {
- -webkit-transform: rotate3d(-0.0627905195, -0.9980267283, 0, 30deg);
- transform: rotate3d(-0.0627905195, -0.9980267283, 0, 30deg);
- }
- 52% {
- -webkit-transform: rotate3d(-0.1253332335, -0.9921147011, 0, 30deg);
- transform: rotate3d(-0.1253332335, -0.9921147011, 0, 30deg);
- }
- 53% {
- -webkit-transform: rotate3d(-0.1873813145, -0.9822872505, 0, 30deg);
- transform: rotate3d(-0.1873813145, -0.9822872505, 0, 30deg);
- }
- 54% {
- -webkit-transform: rotate3d(-0.2486898871, -0.9685831607, 0, 30deg);
- transform: rotate3d(-0.2486898871, -0.9685831607, 0, 30deg);
- }
- 55% {
- -webkit-transform: rotate3d(-0.3090169943, -0.9510565157, 0, 30deg);
- transform: rotate3d(-0.3090169943, -0.9510565157, 0, 30deg);
- }
- 56% {
- -webkit-transform: rotate3d(-0.3681245525, -0.929776485, 0, 30deg);
- transform: rotate3d(-0.3681245525, -0.929776485, 0, 30deg);
- }
- 57% {
- -webkit-transform: rotate3d(-0.4257792914, -0.9048270511, 0, 30deg);
- transform: rotate3d(-0.4257792914, -0.9048270511, 0, 30deg);
- }
- 58% {
- -webkit-transform: rotate3d(-0.4817536738, -0.8763066781, 0, 30deg);
- transform: rotate3d(-0.4817536738, -0.8763066781, 0, 30deg);
- }
- 59% {
- -webkit-transform: rotate3d(-0.5358267945, -0.8443279226, 0, 30deg);
- transform: rotate3d(-0.5358267945, -0.8443279226, 0, 30deg);
- }
- 60% {
- -webkit-transform: rotate3d(-0.5877852516, -0.8090169902, 0, 30deg);
- transform: rotate3d(-0.5877852516, -0.8090169902, 0, 30deg);
- }
- 61% {
- -webkit-transform: rotate3d(-0.6374239888, -0.7705132368, 0, 30deg);
- transform: rotate3d(-0.6374239888, -0.7705132368, 0, 30deg);
- }
- 62% {
- -webkit-transform: rotate3d(-0.6845471045, -0.7289686189, 0, 30deg);
- transform: rotate3d(-0.6845471045, -0.7289686189, 0, 30deg);
- }
- 63% {
- -webkit-transform: rotate3d(-0.7289686253, -0.6845470938, 0, 30deg);
- transform: rotate3d(-0.7289686253, -0.6845470938, 0, 30deg);
- }
- 64% {
- -webkit-transform: rotate3d(-0.7705132398, -0.6374239727, 0, 30deg);
- transform: rotate3d(-0.7705132398, -0.6374239727, 0, 30deg);
- }
- 65% {
- -webkit-transform: rotate3d(-0.8090169901, -0.5877852283, 0, 30deg);
- transform: rotate3d(-0.8090169901, -0.5877852283, 0, 30deg);
- }
- 66% {
- -webkit-transform: rotate3d(-0.8443279194, -0.5358267614, 0, 30deg);
- transform: rotate3d(-0.8443279194, -0.5358267614, 0, 30deg);
- }
- 67% {
- -webkit-transform: rotate3d(-0.8763066715, -0.4817536274, 0, 30deg);
- transform: rotate3d(-0.8763066715, -0.4817536274, 0, 30deg);
- }
- 68% {
- -webkit-transform: rotate3d(-0.9048270404, -0.425779227, 0, 30deg);
- transform: rotate3d(-0.9048270404, -0.425779227, 0, 30deg);
- }
- 69% {
- -webkit-transform: rotate3d(-0.9297764691, -0.3681244637, 0, 30deg);
- transform: rotate3d(-0.9297764691, -0.3681244637, 0, 30deg);
- }
- 70% {
- -webkit-transform: rotate3d(-0.9510564929, -0.3090168724, 0, 30deg);
- transform: rotate3d(-0.9510564929, -0.3090168724, 0, 30deg);
- }
- 71% {
- -webkit-transform: rotate3d(-0.9685831287, -0.2486897207, 0, 30deg);
- transform: rotate3d(-0.9685831287, -0.2486897207, 0, 30deg);
- }
- 72% {
- -webkit-transform: rotate3d(-0.9822872061, -0.1873810883, 0, 30deg);
- transform: rotate3d(-0.9822872061, -0.1873810883, 0, 30deg);
- }
- 73% {
- -webkit-transform: rotate3d(-0.9921146401, -0.1253329274, 0, 30deg);
- transform: rotate3d(-0.9921146401, -0.1253329274, 0, 30deg);
- }
- 74% {
- -webkit-transform: rotate3d(-0.9980266448, -0.0627901069, 0, 30deg);
- transform: rotate3d(-0.9980266448, -0.0627901069, 0, 30deg);
- }
- 75% {
- -webkit-transform: rotate3d(-0.9999998862, 0.0000005537, 0, 30deg);
- transform: rotate3d(-0.9999998862, 0.0000005537, 0, 30deg);
- }
- 76% {
- -webkit-transform: rotate3d(-0.9980265742, 0.0627912598, 0, 30deg);
- transform: rotate3d(-0.9980265742, 0.0627912598, 0, 30deg);
- }
- 77% {
- -webkit-transform: rotate3d(-0.9921144932, 0.1253342195, 0, 30deg);
- transform: rotate3d(-0.9921144932, 0.1253342195, 0, 30deg);
- }
- 78% {
- -webkit-transform: rotate3d(-0.982286971, 0.1873826227, 0, 30deg);
- transform: rotate3d(-0.982286971, 0.1873826227, 0, 30deg);
- }
- 79% {
- -webkit-transform: rotate3d(-0.9685827866, 0.2486916166, 0, 30deg);
- transform: rotate3d(-0.9685827866, 0.2486916166, 0, 30deg);
- }
- 80% {
- -webkit-transform: rotate3d(-0.9510560166, 0.3090192726, 0, 30deg);
- transform: rotate3d(-0.9510560166, 0.3090192726, 0, 30deg);
- }
- 81% {
- -webkit-transform: rotate3d(-0.9297758216, 0.3681275437, 0, 30deg);
- transform: rotate3d(-0.9297758216, 0.3681275437, 0, 30deg);
- }
- 82% {
- -webkit-transform: rotate3d(-0.9048261725, 0.425783205, 0, 30deg);
- transform: rotate3d(-0.9048261725, 0.425783205, 0, 30deg);
- }
- 83% {
- -webkit-transform: rotate3d(-0.8763055184, 0.4817587777, 0, 30deg);
- transform: rotate3d(-0.8763055184, 0.4817587777, 0, 30deg);
- }
- 84% {
- -webkit-transform: rotate3d(-0.8443263971, 0.5358334293, 0, 30deg);
- transform: rotate3d(-0.8443263971, 0.5358334293, 0, 30deg);
- }
- 85% {
- -webkit-transform: rotate3d(-0.80901499, 0.5877938496, 0, 30deg);
- transform: rotate3d(-0.80901499, 0.5877938496, 0, 30deg);
- }
- 86% {
- -webkit-transform: rotate3d(-0.7705106226, 0.6374350969, 0, 30deg);
- transform: rotate3d(-0.7705106226, 0.6374350969, 0, 30deg);
- }
- 87% {
- -webkit-transform: rotate3d(-0.7289652129, 0.6845614127, 0, 30deg);
- transform: rotate3d(-0.7289652129, 0.6845614127, 0, 30deg);
- }
- 88% {
- -webkit-transform: rotate3d(-0.6845426698, 0.7289870018, 0, 30deg);
- transform: rotate3d(-0.6845426698, 0.7289870018, 0, 30deg);
- }
- 89% {
- -webkit-transform: rotate3d(-0.6374182434, 0.7705367741, 0, 30deg);
- transform: rotate3d(-0.6374182434, 0.7705367741, 0, 30deg);
- }
- 90% {
- -webkit-transform: rotate3d(-0.5877778306, 0.8090470459, 0, 30deg);
- transform: rotate3d(-0.5877778306, 0.8090470459, 0, 30deg);
- }
- 91% {
- -webkit-transform: rotate3d(-0.5358172367, 0.8443661994, 0, 30deg);
- transform: rotate3d(-0.5358172367, 0.8443661994, 0, 30deg);
- }
- 92% {
- -webkit-transform: rotate3d(-0.4817413984, 0.876355296, 0, 30deg);
- transform: rotate3d(-0.4817413984, 0.876355296, 0, 30deg);
- }
- 93% {
- -webkit-transform: rotate3d(-0.4257635689, 0.904888644, 0, 30deg);
- transform: rotate3d(-0.4257635689, 0.904888644, 0, 30deg);
- }
- 94% {
- -webkit-transform: rotate3d(-0.3681044689, 0.9298543169, 0, 30deg);
- transform: rotate3d(-0.3681044689, 0.9298543169, 0, 30deg);
- }
- 95% {
- -webkit-transform: rotate3d(-0.3089914068, 0.9511546228, 0, 30deg);
- transform: rotate3d(-0.3089914068, 0.9511546228, 0, 30deg);
- }
- 96% {
- -webkit-transform: rotate3d(-0.2486573708, 0.9687065223, 0, 30deg);
- transform: rotate3d(-0.2486573708, 0.9687065223, 0, 30deg);
- }
- 97% {
- -webkit-transform: rotate3d(-0.1873400968, 0.9824419959, 0, 30deg);
- transform: rotate3d(-0.1873400968, 0.9824419959, 0, 30deg);
- }
- 98% {
- -webkit-transform: rotate3d(-0.1252811139, 0.9923083591, 0, 30deg);
- transform: rotate3d(-0.1252811139, 0.9923083591, 0, 30deg);
- }
- 99% {
- -webkit-transform: rotate3d(-0.062724773, 0.9982685263, 0, 30deg);
- transform: rotate3d(-0.062724773, 0.9982685263, 0, 30deg);
- }
- 100% {
- -webkit-transform: rotate3d(0.000082741, 1.000301224, 0, 30deg);
- transform: rotate3d(0.000082741, 1.000301224, 0, 30deg);
- }
-}
\ No newline at end of file
diff --git a/src/com/fr/plugin/disable/disable-test.iml b/src/com/fr/plugin/disable/disable-test.iml
new file mode 100644
index 0000000..fa43896
--- /dev/null
+++ b/src/com/fr/plugin/disable/disable-test.iml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/com/fr/plugin/disable/test/CartUtils.java b/src/com/fr/plugin/disable/test/CartUtils.java
new file mode 100644
index 0000000..c2ee3aa
--- /dev/null
+++ b/src/com/fr/plugin/disable/test/CartUtils.java
@@ -0,0 +1,38 @@
+package com.fr.plugin.disable.test;
+
+import com.fr.base.io.BaseBook;
+import com.fr.design.mainframe.JTemplate;
+import com.fr.script.AbstractFunction;
+import com.fr.stable.ColumnRow;
+import com.fr.stable.fun.Authorize;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Authorize(callSignKey = CartUtils.PLUGIN_ID)
+public class CartUtils {
+ static final String PLUGIN_ID = "com.fr.plugin.disable.test";
+
+ private static Map gifData =new ConcurrentHashMap<>();
+
+ public static void setGifData(String k,String v){
+ gifData.put(k, v);
+ }
+ public static String getGifData(String k){
+ return gifData.get(k);
+ }
+
+
+ static String GetCellId(AbstractFunction calculator){
+ final ColumnRow currentColumnRow = calculator.getCalculator().getCurrentColumnRow();
+ int intRow=currentColumnRow.getRow();
+ int intCol=currentColumnRow.getColumn();
+ final String strCol = String.valueOf((char) (intCol + 65));
+ String id=strCol+intRow;
+ final JTemplate, ?> currentEditingTemplate = com.fanruan.api.design.DesignKit.getCurrentEditingTemplate();
+ BaseBook target = currentEditingTemplate.getTarget();
+ final String templateID = target.getTemplateID();
+ return templateID+"-"+System.currentTimeMillis()+"-"+id;
+ }
+
+}
diff --git a/src/com/fr/plugin/disable/test/FRCartnoonFunctions.java b/src/com/fr/plugin/disable/test/FRCartnoonFunctions.java
new file mode 100644
index 0000000..467c6b0
--- /dev/null
+++ b/src/com/fr/plugin/disable/test/FRCartnoonFunctions.java
@@ -0,0 +1,24 @@
+package com.fr.plugin.disable.test;
+
+import com.fr.intelli.record.Focus;
+import com.fr.record.analyzer.EnableMetrics;
+import com.fr.stable.fun.Authorize;
+import com.fr.stable.fun.impl.AbstractFunctionDefContainer;
+import com.fr.stable.script.FunctionDef;
+@EnableMetrics
+@Authorize(callSignKey = CartUtils.PLUGIN_ID)
+public class FRCartnoonFunctions extends AbstractFunctionDefContainer {
+ @Override
+ @Focus(id= CartUtils.PLUGIN_ID, text="字符动画函数测试 ")
+ public FunctionDef[] getFunctionDefs() {
+ return new FunctionDef[]{
+ new FunctionDef("FRTest", "生成打字机动画效果。\n参数说明:\n参数1:字符型,打字的文本。\")", FRTest.class.getName()),
+
+ };
+ }
+
+ @Override
+ public String getGroupName() {
+ return "字符动画函数测试";
+ }
+}
diff --git a/src/com/fr/plugin/cool/cartnoon/FRCountUp.java b/src/com/fr/plugin/disable/test/FRTest.java
similarity index 55%
rename from src/com/fr/plugin/cool/cartnoon/FRCountUp.java
rename to src/com/fr/plugin/disable/test/FRTest.java
index c3937ab..4896577 100644
--- a/src/com/fr/plugin/cool/cartnoon/FRCountUp.java
+++ b/src/com/fr/plugin/disable/test/FRTest.java
@@ -1,4 +1,4 @@
-package com.fr.plugin.cool.cartnoon;
+package com.fr.plugin.disable.test;
import com.fr.intelli.record.Focus;
import com.fr.intelli.record.Original;
@@ -9,43 +9,33 @@ import com.fr.plugin.context.PluginContext;
import com.fr.plugin.manage.PluginManager;
import com.fr.record.analyzer.EnableMetrics;
import com.fr.script.AbstractFunction;
-import com.fr.stable.Primitive;
import com.fr.stable.fun.Authorize;
-import java.awt.*;
@EnableMetrics
@Authorize(callSignKey = CartUtils.PLUGIN_ID)
-public class FRCountUp extends AbstractFunction {
+public class FRTest extends AbstractFunction {
@Override
- @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRCountUp", source = Original.PLUGIN)
+ @Focus(id = CartUtils.PLUGIN_ID, text = "Plugin-Function_FRPrintText", source = Original.PLUGIN)
public Object run(Object[] args) {
PluginLicense pluginLicense = PluginLicenseManager.getInstance().getPluginLicenseByID(CartUtils.PLUGIN_ID);
if (!pluginLicense.isAvailable()) {
return InterProviderFactory.getProvider().getLocText("Plugin.Function.CartNoon_AUTHOR_ERROR");
}
+
PluginContext contexts = PluginManager.getContext(CartUtils.PLUGIN_ID);
if(!contexts.isActive()){
return "插件已被禁用!";
}
- if(!CartUtils.CheckArgs(args,6)){
- return Primitive.ERROR_VALUE;
- }
- final Integer number = Integer.parseInt(args[0].toString());
- int width= Integer.parseInt(args[1].toString());
- int height= Integer.parseInt(args[2].toString());
- int fontSize= Integer.parseInt(args[3].toString());
- int rate= Integer.parseInt(args[4].toString());
- final Color color = CartUtils.TextToColor(args[5].toString());
+ final String text = args[0].toString();
final String id= CartUtils.GetCellId(this);
final String url="/webroot/decision/url/img?id="+id;
+ CartUtils.setGifData(id,text);
- CartUtils.CreateCountUpAnimate(id,number,fontSize,rate,color,width);
- return "";
+ return " aaa";
}
-
}
\ No newline at end of file
diff --git a/src/com/fr/plugin/cool/cartnoon/local/coolCartNoon.properties b/src/com/fr/plugin/disable/test/local/coolCartNoon.properties
similarity index 100%
rename from src/com/fr/plugin/cool/cartnoon/local/coolCartNoon.properties
rename to src/com/fr/plugin/disable/test/local/coolCartNoon.properties
diff --git a/src/com/fr/plugin/cool/cartnoon/local/coolCartNoon_zh_CN.properties b/src/com/fr/plugin/disable/test/local/coolCartNoon_zh_CN.properties
similarity index 100%
rename from src/com/fr/plugin/cool/cartnoon/local/coolCartNoon_zh_CN.properties
rename to src/com/fr/plugin/disable/test/local/coolCartNoon_zh_CN.properties
diff --git a/src/com/fr/plugin/cool/cartnoon/web/ImageRequestHandlerBridge.java b/src/com/fr/plugin/disable/test/web/ImageRequestHandlerBridge.java
similarity index 88%
rename from src/com/fr/plugin/cool/cartnoon/web/ImageRequestHandlerBridge.java
rename to src/com/fr/plugin/disable/test/web/ImageRequestHandlerBridge.java
index 06c9816..5998828 100644
--- a/src/com/fr/plugin/cool/cartnoon/web/ImageRequestHandlerBridge.java
+++ b/src/com/fr/plugin/disable/test/web/ImageRequestHandlerBridge.java
@@ -1,4 +1,4 @@
-package com.fr.plugin.cool.cartnoon.web;
+package com.fr.plugin.disable.test.web;
import com.fr.decision.fun.HttpHandler;
import com.fr.decision.fun.impl.AbstractHttpHandlerProvider;
diff --git a/src/com/fr/plugin/cool/cartnoon/web/ImageURLAliasBridge.java b/src/com/fr/plugin/disable/test/web/ImageURLAliasBridge.java
similarity index 91%
rename from src/com/fr/plugin/cool/cartnoon/web/ImageURLAliasBridge.java
rename to src/com/fr/plugin/disable/test/web/ImageURLAliasBridge.java
index ada3ae4..a0ebc69 100644
--- a/src/com/fr/plugin/cool/cartnoon/web/ImageURLAliasBridge.java
+++ b/src/com/fr/plugin/disable/test/web/ImageURLAliasBridge.java
@@ -1,4 +1,4 @@
-package com.fr.plugin.cool.cartnoon.web;
+package com.fr.plugin.disable.test.web;
import com.fr.decision.fun.impl.AbstractURLAliasProvider;
import com.fr.decision.webservice.url.alias.URLAlias;
diff --git a/src/com/fr/plugin/cool/cartnoon/web/ImageViewer.java b/src/com/fr/plugin/disable/test/web/ImageViewer.java
similarity index 79%
rename from src/com/fr/plugin/cool/cartnoon/web/ImageViewer.java
rename to src/com/fr/plugin/disable/test/web/ImageViewer.java
index ccf2cb5..ec6c9ce 100644
--- a/src/com/fr/plugin/cool/cartnoon/web/ImageViewer.java
+++ b/src/com/fr/plugin/disable/test/web/ImageViewer.java
@@ -1,8 +1,8 @@
-package com.fr.plugin.cool.cartnoon.web;
+package com.fr.plugin.disable.test.web;
import com.fr.decision.fun.impl.BaseHttpHandler;
import com.fr.log.FineLoggerFactory;
-import com.fr.plugin.cool.cartnoon.CartUtils;
+import com.fr.plugin.disable.test.CartUtils;
import com.fr.third.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletRequest;
@@ -30,13 +30,13 @@ public class ImageViewer extends BaseHttpHandler {
public void handle(HttpServletRequest request, HttpServletResponse response) throws Exception {
String id = request.getParameter("id");
- response.setHeader("Content-Type", "image/gif");
+// response.setHeader("Content-Type", "image/gif");
OutputStream output = response.getOutputStream();
// 回写
- response.setContentType("image/gif");
+// response.setContentType("image/gif");
FineLoggerFactory.getLogger().info("web-id:{}",id.hashCode()+":"+id);
- output.write(CartUtils.getGifData(id));
+ output.write(CartUtils.getGifData(id).getBytes());
output.flush();
output.close();