/** * @fileoverview 指定領域の背景に画像を入れる * @author Kenshi Muto <kmuto@debian.org> * @requires libCommon.jsx * @requires libGetBoundsOfPage.jsx * @version 2,3 */ /* Copyright: 2008 Kenshi Muto ---------------------------------------------------------------------- ソフトウェア使用許諾同意書 本ソフトウェアの利用・変更・再配布にあたっては、下記の使用許諾同意書に 同意する必要があります。 1. 本使用許諾同意書における「ソフトウェア」とは、機械可読の資料 (ライブ ラリ、スクリプト、ソースファイル、データファイル)、実行形式、および 文書を意味します。 2. 本ソフトウェアの使用許諾同意書に同意する限りにおいて、使用者は 本ソフトウェアを自由に利用、変更することができます。 3. 本ソフトウェアに変更を加えない限りにおいて、使用者は本ソフトウェアを 自由にコピー、再配布することができます。 4. 本ソフトウェアは無保証です。作者およびそれに関連する組織、配布者は、 本ソフトウェアの使用に起因する一切の直接損害、間接損害、偶発的損害、 特別損害、懲戒的損害、派生的損害について何らの責任・保証も負いません。 5. 本ソフトウェアを変更した上で再配布するときには、下記の事項すべてに 従わなければなりません。 - 使用許諾同意書の内容に変更を加えてはなりません。技術上の理由で 文字エンコーディングの変換を行うことは許可しますが、その使用者が 特殊な技術的措置なしに可読な形でなければなりません。 - 技術上の理由でバイナリ化・難読化を行う場合も、変更箇所を含めた ソフトウェアを、その使用者が可読可能な形式の形で同一のメディアで 提供しなければなりません。本使用許諾同意書の2条および3条により、 使用者が可読形式の該当ソフトウェアを変更、コピー、再配布することを 妨げてはなりません。 - ソフトウェア構成物の所定の作者名の欄に、変更者のクレジット (個人名、企業名、所属、連絡先など)を「追加」しなければなりません。 6. 本ソフトウェアを変更した上で再配布するときには、変更理由および その内容を明記することが推奨されます。 7. 使用者がソフトウェアに適用可能な特許に対して特許侵害にかかわる何らか の行動を開始した時点で、この使用許諾同意書は自動的に終了し、以降 使用者はこの使用許諾書によって与えられた一切の権利を放棄するものと します。 著作権所有者 Copyright (C) 2008 Kenshi Muto. All rights reserved. 使用許諾同意書バージョン1.0 著作権所有者による書面での事前の許可がない限り、この使用許諾同意書 に変更を加えてはなりません。 ---------------------------------------------------------------------- */ #include "../libs/libCommon.jsx" #include "../libs/libGetBoundsOfPage.jsx" /** * 指定の画像をストーリーの開始オフセットから終了オフセットのボックス範囲の背景に配置する。オブジェクトオフセットおよび画像ファイルオブジェクトはページごとに指定できる。配列がページ数に満たなかった場合、その最後のオブジェクトが使われる。オフセットとファイルは別個に指定できる * @param {Object} obj パラメータ引き渡しオブジェクト * @param {String} obj.layername 配置レイヤー。nullのときには現在のレイヤーを使う * @param {Story} obj.story ストーリーオブジェクト * @param {Long} obj.startpoint 開始オフセット * @param {Long} obj.endpoint 終了オフセット * @param {Long[][4]} obj.offsetunits 各ページごとのオフセット値 * @param {File[]} obj.files 各ページごとの画像ファイルオブジェクト * @param {Long[]} obj.minheight 各ページごとの画像ファイル最小高さ * @param {ObjectStyle} obj.ostyle オブジェクトスタイルオブジェクト * @param {boolean} obj.lfit 左端を版面に合わせるか(true=合わせる、false=合わせずに先頭文字から判定) * @param {Float} obj.width ボックスの幅。nullの場合には文字位置から算出 * @param {boolean} obj.fit ページをまたぐときにオフセット前の下の位置を版面に合わせる(true=合わせる、false=合わせない) * @param {boolean} obj.white ページをまたぐときに白マスクをかける(true=かける、false=かけない) * @param {ObjectStyle} obj.wstyle 白マスクのオブジェクトスタイルオブジェクト * @param {Long[][2][4]} obj.woffsetunits 白マスクのオフセット。上側オフセットと下側オフセットを指定する * @type Nothing */ function backGroundImage3(obj) { var startpage, endpage; // タグの開始/終了位置のページを取得 if (getCSVersion() == 2) { startpage = obj.story.characters[obj.startpoint].insertionPoints[0].parentTextFrames[0].parent; endpage = obj.story.characters[obj.endpoint].insertionPoints[0].parentTextFrames[0].parent; } else { // XXX: CS3 startpage = obj.startpoint.parentTextFrames[0].parent; endpage = obj.endpoint.parentTextFrames[0].parent; } var blocks = new Array(); var unit = new Array(4); var backunit = toMmMode(obj.story.parent); var backruler = obj.story.parent.viewPreferences.rulerOrigin; obj.story.parent.viewPreferences.rulerOrigin = RulerOrigin.pageOrigin; var backunit2 = obj.story.parent.viewPreferences.horizontalMeasurementUnits; obj.story.parent.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.millimeters; if (getCSVersion() == 2) { unit[1] = obj.story.characters[obj.startpoint].insertionPoints[0].horizontalOffset; // X1 unit[0] = obj.story.characters[obj.startpoint].insertionPoints[0].baseline - pttomm(obj.story.characters[obj.startpoint].insertionPoints[0].pointSize * 0.8); // Y1 unit[3] = obj.story.characters[obj.endpoint].insertionPoints[0].horizontalOffset; // X2 unit[2] = obj.story.characters[obj.endpoint].insertionPoints[0].baseline + pttomm(obj.story.characters[obj.endpoint].insertionPoints[0].pointSize * 0.2); // Y2 } else { // XXX: CS3 unit[1] = obj.startpoint.horizontalOffset; // X1 unit[0] = obj.startpoint.baseline - pttomm(obj.startpoint.pointSize * 0.8); // Y1 unit[3] = obj.endpoint.horizontalOffset; // X2 unit[2] = obj.endpoint.baseline + pttomm(obj.endpoint.pointSize * 0.2); // Y2 } var point, prevpoint = null; var page = startpage; var sp, ep; if (getCSVersion() == 2) { sp = obj.startpoint; ep = obj.endpoint; } else { // XXX: CS3 sp = obj.startpoint.index; ep = obj.endpoint.index; } for (var i = sp; i <= ep; i++) { point = obj.story.characters[i].insertionPoints[0]; if (prevpoint != null && prevpoint.parentTextFrames[0].parent.documentOffset < point.parentTextFrames[0].parent.documentOffset) { // 上に移動、ページが変わる blocks.push([page, unit[0], unit[2], unit[1]]); // unit[0] = point.baseline - pttomm(point.pointSize * 0.8); unit[0] = point.parentTextFrames[0].geometricBounds[0]; unit[1] = point.horizontalOffset; } if (point.horizontalOffset < unit[1]) unit[1] = point.horizontalOffset; // 左にもっと移動 if (point.horizontalOffset > unit[3]) unit[3] = point.horizontalOffset; // 右に移動 if (point.baseline + pttomm(point.pointSize * 0.2) > unit[2]) unit[2] = point.baseline + pttomm(point.pointSize * 0.2); // 下に移動 くるはずはないが… page = point.parentTextFrames[0].parent; prevpoint = point; } unit[2] = obj.story.characters[ep].insertionPoints[0].baseline + pttomm(obj.story.characters[ep].insertionPoints[0].pointSize * 0.2); // Y2 blocks.push([point.parentTextFrames[0].parent, unit[0], unit[2], unit[1]]); var offsetunit; var hasfile = null; for (var i = 0; i < blocks.length; i++) { unit[0] = blocks[i][1]; unit[2] = blocks[i][2]; unit[1] = blocks[i][3]; if (getCSVersion() == 2) { page = obj.story.parent.pages[startpage.documentOffset + i - 1]; } else { // XXX: CS3 page = obj.story.parent.pages[startpage.documentOffset + i]; } if (i < obj.offsetunits.length - 1) { offsetunit = obj.offsetunits[i]; } else { offsetunit = obj.offsetunits[obj.offsetunits.length - 1]; } if (obj.fit == true && i < blocks.length - 1) { // obj.fitオプションがtrueでページ途中であれば下を合わせる unit[2] = getBoundsOfPage(obj.story.parent, page)[2]; } if (obj.lfit == true) { // obj.lfitオプションがtrueであれば左を合わせる unit[1] = getBoundsOfPage(obj.story.parent, page)[1]; } if (obj.width != null) { unit[3] = unit[1] + obj.width; } var rect; if (obj.layername != null) { var layer = obj.story.parent.layers.item(obj.layername); if (layer == null) { layer = obj.story.parent.layers.add(); layer.label = obj.layername; layer.name = obj.layername; layer.move(LocationOptions.atEnd); } rect = blocks[i][0].rectangles.add({itemLayer: layer}); } else { rect = blocks[i][0].rectangles.add(); } rect.contentType = ContentType.graphicType; rect.appliedObjectStyle = obj.ostyle; rect.geometricBounds = [unit[0] + offsetunit[0], unit[1] + offsetunit[1], unit[2] + offsetunit[2], unit[3] + offsetunit[3]]; var file = null; if (obj.files.length - 1 > i) { file = obj.files[i]; } else { file = obj.files[obj.files.length - 1]; } var minheight = null; if (obj.minheight != null) { if (obj.minheight.length - 1 > i) { minheight = obj.minheight[i]; } else { minheight = obj.minheight[obj.minheight.length - 1]; } } if (file != null) { hasfile = file; rect.place(file); var rectheight = rect.geometricBounds[2] - rect.geometricBounds[0]; if (minheight != null && rectheight < minheight) { var munit = rect.geometricBounds; munit[2] = munit[0] + minheight; rect.geometricBounds = munit; } var gheight = rect.graphics[0].geometricBounds[2] - rect.graphics[0].geometricBounds[0]; if (rectheight > gheight) { rect.fit(FitOptions.frameToContent); } } else if (file == null && hasfile != null) { rect.remove(); continue; } if (obj.white) { // 白マスク woffsets = [[-5, -2, 0, 2], [0, -2, 5, 2]]; if (obj.woffsetunits != null) woffsets = obj.woffsetunits; if (i > 0) { // 上に白マスク入れる wrect = blocks[i][0].rectangles.add({itemLayer: rect.itemLayer}); gunit = getBoundsOfPage(obj.story.parent, page); wrect.geometricBounds = [gunit[0] + woffsets[0][0], gunit[1] + woffsets[0][1], gunit[0] + woffsets[0][2], gunit[3] + woffsets[0][3]]; wrect.appliedObjectStyle = obj.wstyle; wrect.clearObjectStyleOverrides(); } if (i < blocks.length - 1) { // 下に白マスク入れる wrect = blocks[i][0].rectangles.add({itemLayer: rect.itemLayer}); gunit = getBoundsOfPage(obj.story.parent, page); wrect.geometricBounds = [gunit[2] + woffsets[1][0], gunit[1] + woffsets[1][1], gunit[2] + woffsets[1][2], gunit[3] + woffsets[1][3]]; wrect.appliedObjectStyle = obj.wstyle; wrect.clearObjectStyleOverrides(); } } rect.sendToBack(); if (getCSVersion() == 2) { try { with(rect) { // 上書きされたオブジェクトスタイルを戻す for CS2 appliedParagraphStyle = obj.ostyle.appliedParagraphStyle; applyNextParagraphStyle = obj.ostyle.applyNextParagraphStyle; basedOn = obj.ostyle.basedOn; blendMode = obj.ostyle.blendMode; cornerEffect = obj.ostyle.cornerEffect; cornerRadius = obj.ostyle.cornerRadius; endcap = obj.ostyle.endCap; endJoin = obj.ostyle.endJoin; featherCornerType = obj.ostyle.featherCornerType; featherMode = obj.ostyle.featherMode; featherNoise = obj.ostyle.featherNoise; featherWidth = obj.ostyle.featherWidth; defaultFrameGridObjectStyle = obj.ostyle.defaultFrameGridObjectStyle; defaultObjectStyle = obj.ostyle.defaultObjectStyle; defaultTextObjectStyle = obj.ostyle.defaultTextObjectStyle; enableAnchoredObjectOptions = obj.ostyle.enableAnchoredObjectOptions; // FIXME fillColor = obj.ostyle.fillColor; fillTint = obj.ostyle.fillTint; gapColor = obj.ostyle.gapColor; gapTint = obj.ostyle.gapTint; gradientFillAngle = obj.ostyle.gradientFillAngle; strokeColor = obj.ostyle.strokeColor; strokeTint = obj.ostyle.strokeTint; strokeWeight = obj.ostyle.strokeWeight; strokeType = obj.ostyle.strokeType; // FIXME } } catch (e) { continue; }; } else { // XXX: CS3 rect.clearObjectStyleOverrides(); } } obj.story.parent.viewPreferences.horizontalMeasurementUnits = backunit2; obj.story.parent.viewPreferences.rulerOrigin = backruler; revertMmMode(obj.story.parent, backunit); }