ãã¹ãŠã®habrazhitelãžã®ãæšæ¶ïŒ
æåã«å°ãäœè«ã ãã®æçš¿ã¯ç§ã«ãã£ãŠæžãããã®ã§ã¯ãªãã
ãŸã åçã«
åºã¥ããŠã
ãªã updã«ãã£ãŠæžãããŸããïŒ
viklequickã¯ãã§ã«
é åºã§ ãç§ã®æèŠã§ã¯ããã¹ãŠã®çµæã§ããªãã®æ³šæã«å€ããŸãã ã ãã...
åå 
åãããããªå¬ã®å£ç¯ã«ãªããšã
èè
ã¯EPS圢åŒã®ãã¯ã¿ãŒç»åãšæŠãè¯ã仲éã«ããããããŸã
ã ã ãããŠã圌ã¯é²æç¶æ³ãææ¡ããSVGã®åœ¢åŒã§Adobe InDesignããã¥ã¡ã³ãã«ã°ã©ããšãã£ãŒããåã蟌ãããšã«ããŸããã ã¢ããã·ã¹ãã ãºã¯Adobe Flashã奜ãã§ãããAdobe InDesignã§ã¯SVGããµããŒããããŠããªãããã倧ããªå€±æã圌ã«éãããããŸããã ããããè¯ã仲éã¯InDesignã®ãã©ã°ã€ã³ãäœæããéã«é¡èãªçµéšãèç©ããŠããã圌ã¯åŒ·åãªè±éã䜿çšããŠ3é ã®ããã©ãæã«å
¥ããããšã«ããŸããã æŠå£«ã¯èšã£ã-æŠå£«ããã£ããã€ãŸã-圌ã¯ãããåã£ãã
ãã®éäºã®è©³çްã«ã€ããŠãç§ãã¡ã¯ç©èªããªãŒãããŸãã
ç©èªã¹ããã1ããŸãã¯äžè
äžé çã®è§£ååŠã®ç ç©¶
éå§ããã«ã¯ãInDesignãåçã§ã©ã®ããã«æ©èœããããç°¡åã«èª¬æããå¿
èŠããããŸãã
InDesignã®èгç¹ããèŠããšãç»åã¯èªåèªèº«ãæç»ããŠå°å·ã§ããç¹å¥ãªçš®é¡ã®PageItemã§ãã ãŸãããã®PageItemã¯ããã¬ãŒã å
ãŸãã¯ããŒãã«ã»ã«å
ã«ã€ã³ã©ã€ã³ã§ããŒãžã«é
眮ã§ããããããã¹ãŠãåŠçããå¿
èŠããããŸãã ããã§ãã3çš®é¡ã®ã¬ã³ããªã³ã°ããããŸã-é«éïŒäº€å·®ããé·æ¹åœ¢ãæãããŸãïŒãæé©ïŒã©ã¹ã¿ãŒãããã·ã€ã¡ãŒãžïŒãå®å
šïŒäœéïŒã§ãã ãã®ãã¹ãŠããµããŒãããããšãå¿
èŠã§ãã
ãããã£ãŠã次ã®ãããªImport Plug-inãPage Itemãããã³ããã€ãã®ãã«ããŒã¯ã©ã¹ããããŸãã
ã¯ã©ã¹
{
kSVGItemã
kDisplayListPageItemBossã
{
IID_ISHAPEãkSVGShapeImplã
IID_IINKRESOURCESãkAllProcessInkResourcesImplã
IID_IFLATTENERUSAGEãkSVGItemFlattenerUsageImplã
IID_IVISITORHELPERãkEPSItemVisitorHelperImplã
IID_ISCRIPTãkSVGItemScriptImplã
}
}ã
ãªã©ïŒ
Class
{
kSVGPlaceProviderBoss,
kInvalidClass,
{
IID_IK2SERVICEPROVIDER, kImportServiceImpl,
IID_IIMPORTPROVIDER, kSVGPlaceProviderImpl,
IID_IIMPORTPREVIEW, kSVGImportPreviewImpl,
}
},
ãããŠãã¡ãããèµ·å/ã·ã£ããããŠã³çšã®æšæºããããŒããããŸãããããã¯æå³ããªããªããã®ã§ãã
ãããäœã§ããªããªã®ãèŠãŠã¿ãŸãããã
â¢IID_ISHAPEã¯ãã¬ã³ããªã³ã°ãåŠçããå®éã®ããŒãžã¢ã€ãã ã®å®è£
ã§ãã
â¢IID_IINKRESOURCES-å€éšãã¡ã€ã«ïŒã€ã³ã¯ïŒãžã®ãªã³ã¯ãåŠçããŸãã
â¢IID_IFLATTENERUSAGE-ã¢ã«ãã¡ãã£ãã«ã©ã¹ã¿ã©ã€ãºãPDFã§åŠçããŸãã å®éãããã¯ãã©ããããŒãå«ããããšãæç¢ºã«èŠæ±ãã1è¡ã§ããããã以äžã¯äœããããŸããã
â¢IID_IVISITORHELPER-EPSããåçšããŠæšæºãç¶æããŸãã
â¢IID_ISCRIPT-ã¹ã¯ãªãããéããŠèŠçŽ ã®ãµããŒããæäŸããŸãã ãããéåžžã«åçŽãªéšåã§ããããªããžã§ã¯ãã®ã¿ã€ããæ£ããæå®ããã ãã§ãã
â¢IID_IK2SERVICEPROVIDERããã³IID_IIMPORTPROVIDER-Placeã³ãã³ãã®ãµããŒãã远å ããŸãã
â¢IID_IIMPORTPREVIEW-ãã¡ã€ã«éžæãã€ã¢ãã°ã§ãã¬ãã¥ãŒãæäŸããŸãïŒWindowsåºæïŒã
æãè峿·±ãã®ã¯å®éã«ã¯IID_ISHAPEã§ããããããã©ã°ã€ã³ã®äžå¿ã§ãã 圌ã¯ãIGraphicsPortã䜿çšããŠçŽæ¥æç»ããèœåãšãã©ã¹ã¿ãŒãããã·ã€ã¡ãŒãžãååŸããèœåãå¿
èŠãšããŸãã å°æ¥ãèŠæ®ããŠãç§ã¯æ³šæããã-ååãªé©ãããã£ãã
ã¹ããã2ããŸãã¯ããã€ãã¯ãœãŒããéžæ
ãšã¯ã¹ãã¬ã¹ã°ãŒã°ã«ãããã³OpenClipArtã®ãµã³ãã«ç»åã衚瀺ããããšã§ãApache Batikã«ãšã©ãŸãããšãèããŸããã ç§ã¯ããã«ããã£ãã¯èªäœãä¿®æ£ããããã«ããã€ãã®åªåãããªããã°ãªããªãã£ããšèšããªããã°ãªããªãããçµå±åœŒãã¯åãã«è¶³ããªããã®ã§ããããšã倿ããã åºæ¬çã«ã¯ãã³ã³ãã³ãããšã«SVGã®ããŒãžã§ã³ãæšæž¬ãããã«èŠçŽãããŸãã ãã ãããIGraphicsPortã䜿çšããŠçµµãæãæ¹æ³ããšããã¿ã¹ã¯ã¯ããã£ãã¯ã«ç»å Žããæãé£ãããã®ãšããŠçŠç¹ãåœãŠãŸãã ãããŠãéå±ãªC ++ã®ãã®ããæ¥œããJavaã¯ãªãšã€ãã£ããžããããŠãã®éã«ç§»è¡ããŸãã
ããããæ¥ãããããã³ã¹ãã¬ã«ã¯ç§ãã¡ã«æããŠãããŸã-ããªããããŒããŒãééã£ãç©èªã«ããŸãããŸããããããŠããªãã¯ãããšããªããºããæšªåããšããã€ãèµ·ããããã«ãããªãã¯5ã¡ãŒãã«ã®æåºéç·ã§çµããã§ãããã å°é£ãªéã¡ã®æ¯åã§ããçµéšãç§ãã¡ã«æããŠãããŸãããã®å Žåããã£ãšåœ¹ã«ç«ã€ãã®ãåŸãããŸãã
ã¹ããã3ããŸãã¯éå§åè¿°ã®ããã«ããã¶ã€ã³ã¹ããªãŒã ã®æäœæ¹æ³ãJavaã«æããå¿
èŠããããŸãã å®éãã¿ã¹ã¯ã¯æçœã§ãããJNIãä»ããŠè§£æ±ºãããŸãã

/**
* Class for reading from InDesign IPMStream
*/
public class PMInputStream extends InputStream
{
/**
* Creates PMInputStream object and attaches it to IPMStream* already
* opened by InDesign.
* @param iPMStreamPtr IPMStream* to attach to
* @throws IOException The stream has no ability to read.
*/
public PMInputStream(long iPMStreamPtr) throws IOException {
this.ownedStreamPtr = iPMStreamPtr;
this.retain();
}
@Override
public int read() throws IOException {
return readByte();
}
@Override
public int read(byte b[], int off, int len) throws IOException {
if (len == 0) return 0;
return readBytes(b, off, len);
}
@Override
public long skip(long n) throws IOException {
return performSeek(n, SeekFromCurrent);
}
public long seek(long numberOfBytes, int fromHere) throws IOException {
return performSeek(numberOfBytes, fromHere);
}
@Override
public int available() {
return availableBytes();
}
// native functions below
...
å®è£
ã¯ãã€ãã£ã颿°ãä»ããŠæ§ç¯ãããŸãããããããªã¹ãããŸãã ãããã¯èªæã§ãããç¹å¥ãªã³ã¡ã³ããå¿
èŠãšããŸããã è峿·±ãç¹ã1ã€ã ããããŸããããã«ãããŸãïŒ
/**
* 'Cause IPMStream is a COM-like object we gotta call AddRef() for it
* if we wanna save pointer in our class.
*/
private native void retain();
/**
* Once we called AddRef() we shouldn't forget calling corresponding
* Release(). Let's do it!
*/
private native void release();
ãããŠãªã¹ãèªäœïŒ
protected native int readByte();
protected native int readBytes(byte b[], int off, int len);
protected native long performSeek(long numberOfBytes, int fromHere);
protected native int availableBytes();
protected native String getFileName();
protected native long getLastModifiedTime();
æåŸã®2ã€ã®é¢æ°ã¯ãã¬ã³ããªã³ã°ããšã«DOMã¢ãã«ãåæ§ç¯ããªãããã«ãJavaã§çŽæ¥èŠçŽ ããã£ãã·ã¥ããããã«è¿œå ãããŸããã å¿
èŠãªã®ã¯ãããŒã¿ã®å€æŽã远跡ãã倿޿ã«ãããããã°ããèªã¿çŽãããšã ãã§ãã
ãããŠæåŸã®ä»äžãã¯ããã€ãã£ãã¡ãœããã®å®éã®å®è£
ã§ãã
class IPMStream; class PMInputStream
{
private:
IPMStream* fStream;
public:
PMInputStream(IPMStream* stream);
~PMInputStream() { close(); }
void close();
int read() {
unsigned char result;
return read(&result, 1) == 1? result: -1;
}
int read(unsigned char* buffer, int len){ return fStream->XferByte(buffer, len); }
XInt64 seek(XInt64 numberOfBytes, SeekFrom fromHere) {
return fStream->Seek((int32)numberOfBytes, fromHere);
}
public:
enum SeekFrom { SeekFromStart = kSeekFromStart,
SeekFromCurrent = kSeekFromCurrent,
SeekFromEnd = kSeekFromEnd
};
};
ãã§ã«SVGã«å°éããŠããŸãããä»ã®ä»äºã¯çµµãååŸããŠæãããšã§ãã å®éã«ãBufferedImageã§ãã¯ã¿ãŒç»åãæç»ããåŸããããã·ç»åãååŸããŸãã ããã£ãã¯ã®æšæºçãªäŸã¯ããããã©ã®ããã«ååŸãããããæç¢ºã«ç€ºããŠãããããã¹ããŒã¹ãç¯çŽããããã«ããã®ãããã¯ãã¹ãããã«æã¡èŸŒãŸãªãã§ãã ããã PixelGrabberã䜿çšããŠãBufferedImageããRGBã®ãã€ãé
åãååŸããããšãæããã§ãã çµæã®é
åããèšäºã®2çªç®ã®ããŒãã§èª¬æããã®ãšåãæ¹æ³ã§AGMImageRecordã«æž¡ããŸãã
è峿·±ãããšã«ãBufferedImageã§ã¯ãªãIGraphicsPortã§ã®ã¬ã³ããªã³ã°ã¯ãæšæºã®ãªãã¹ã¯ãªãŒã³Graphics2Dã§ã¯ãªããå®è£
ã眮ãæããå¿
èŠããã1è¡ã ãç°ãªããŸãã ãããç§ãã¡ãããããšã§ãã
4çªç®ã®ã¹ãããããŸãã¯æé»ã®ãã¡ã«é»æµãå£ã«æ¥ç¶ããŠç«è±ãé£ã¶ããã«ããGraphics2Dã®æèœãªç¶æ¿ã®ããã®ã³ãŒãã®éã¯å€§ãããéå±ã§ãããæããã§ãããåãApache Batikããç°¡åã«èŠãããšãã§ããŸãã ãã®ãããæãè峿·±ãéšåã«çŠç¹ãåœãŠãŸãããããã§ã¯
Paint getPaint(){ return paint; }
Paint getPaint(){ return paint; }
çç¥ããŸãã
äžè¬ã«ããã®çš®ã®ãã©ã°ãå®å
šã«æ¿å
¥ã§ããããšã«æ³šæããŠãã ããã
public void setXORMode(Color c1){ throw new RuntimeException("setXORMode: N/A"); }
ãªã©ïŒ
public void fillRect(int x, int y, int w, int h) { fill(new Rectangle(x, y, w, h)); }
ãã®ãããªåçŽåãšéè€ã®æé€ã®çµæã次ã®å®éã®æ©èœãåŸãããŸãã
public void draw(Shape s);
public void fill(Shape s);
public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer);
public void drawString(String str, float x, float y);
public void drawString(AttributedCharacterIterator iterator, float x, float y);
StrokeTextPainterã䜿çšããŠããã«é²ãããšãã§ãããã®ã»ããã¯3ã€ã®é¢æ°ã«åæžãããŸããããã¯è¯ãããšã§ãã
次ã«ãå察åŽã«ã¢ãããŒãããŠãIGraphicsPortããå¿
èŠãªãã®ãèŠãŠã¿ãŸãããã
private native void newpath();
private native void moveto(float x, float y);
private native void lineto(float x, float y);
private native void curveto(float x1, float y1, float x2, float y2, float x3, float y3);
private native void curvetov(float x2, float y2, float x3, float y3);
private native void closepath();
private native void gsave();
private native void grestore();
private native void setlinewidth(float width);
private native void setdash(int len, float[] dashArray, float offset);
private native void setopacity(float opacity, boolean bIsAlphaShape); // from 0 to 1.0
private native void setrgbcolor(float r, float g, float b);
private native void fill();
private native void eofill();
private native void stroke();
private native void image(int[] buffer, int x, int y, int width, int height, double[] transformMatrix);
private native void clip();
private native void eoclip();
çµéšè±å¯ãªå€èгã§ã¯ãã°ã©ããŒã·ã§ã³ãªã©ã®ã¬ã³ããªã³ã°ããŒã«ãæããã«ãªãããšãããããŸãã æ®å¿µãªãããAdobeã®APIã®ãã®éšåã®ããã¥ã¡ã³ãã¯éåžžã«å°ãªããããå©çšå¯èœãªæ©èœã䜿çšããããšã¯ã§ããŸããã§ããã
ã©ããããå°ãå¿
èŠã§ãã ãã ããæ°ããã¿ã¹ã¯ãçºçããŸãããã®å
šäœãäœããã®åœ¢ã§çµåããå¿
èŠããããŸãã åçŽãªãã®ããå§ããŸããã-幟äœåŠçãªåœ¢ã§ã
ããã§æãé£ããéšåã¯ãå³åœ¢ãJavaããäžé£ã®ãã€ãã£ã颿°ã«ãããã€ããããšã§ãã ãããè¡ãã«ã¯ãæšæºã®PathIteratorã䜿çšããŸãããåæã«Batikã¯AffineTransformãéåžžã«ç©æ¥µçã«äœ¿çšããããã倿ã«ã€ããŠãå¿ããªãã§ãã ããã
private void applyPath(PathIterator pi, int kind) {
float[] coord = new float[6];
int retSeg;
newpath();
while(!pi.isDone()) {
retSeg = pi.currentSegment(coord);
switch (retSeg) {
case SEG_LINETO:
lineto(coord[0], coord[1]);
break;
case SEG_CUBICTO:
curveto(coord[0], coord[1], coord[2], coord[3], coord[4], coord[5]);
break;
case SEG_MOVETO:
moveto(coord[0], coord[1]);
break;
case SEG_QUADTO:
curvetov(coord[0], coord[1], coord[2], coord[3]);
break;
case SEG_CLOSE:
closepath();
break;
}
pi.next();
}
if(kind == PATH_FILL) {
if(pi.getWindingRule() == PathIterator.WIND_EVEN_ODD) eofill();
else fill();
}
else if(kind == PATH_STROKE) stroke();
else if(kind == PATH_CLIP) {
if(pi.getWindingRule() == PathIterator.WIND_EVEN_ODD) eoclip();
else clip();
}
}
ããã§ãããªããã£ããç°¡åã«æç»ã§ããŸãã

public void draw(Shape s) {
PathIterator pi = s.getPathIterator(getTransform());
applyClip(getClip());
applyStroke(s);
applyStyles();
applyPath(pi, PATH_STROKE);
restoreClip();
}
ãããŸã§ã®ãšãããããããçš®é¡ã®é©çšã«çŠç¹ãåœãŠãããã§ã¯ãããŸãã*ããããã¯ããã«è°è«ãããŠããŸãã å³å¯ã«èšãã°ãfillïŒïŒã¯ãåŸé
ã«é¢ããããã€ãã®å°é£ãé€ããŠããŸã£ããåãã«èŠããŸãã ãæ³åã®ãšãããapplyClipïŒïŒãåæ§ã«å®è£
ãããŠããŸãã
private void applyClip(Shape xclip) {
gsave();
if(xclip != null) {
PathIterator pi = xclip.getPathIterator(getTransform());
applyPath(pi, PATH_CLIP);
}
}
å®éã®ã³ãŒãã¯ããå°ãè€éã§ããIGraphicsPortã®ãã©ããããŒå®è£
ã®æ©èœãèæ
®ãããã¹ãåæèšåãã«ãªãããã«å¿
èŠã«å¿ããŠãã€ãã¹ãåãå¿
èŠããããŸãã ãŸããåè¿°ã®ããã«ãBatikã¯ããã¹ããã°ãªãã®ã»ããã«ãã¯ãã«åããæ¹æ³ãç¥ã£ãŠããããããã©ã³ãã®æäœãå¿é
ããå¿
èŠã¯ãããŸããã ãããã£ãŠãç§ãã¡ã®ããã¹ãã¯å¿
ç¶çã«äžé£ã®å¹ŸäœåŠçå³åœ¢ã«ãªããŸãã
ç¶ç¶ããã«ã¯...