### paper-pen.js

> canvas、 annotation、annotate、Rect、Polygon、Line、Dot、Text、Matrix.

- Quick start

> npm i paper-pen --save

> `<script src='https://unpkg.com/paper-pen@0.0.5/dist/paper-pen.esm.min.js'></script>`

[online example](https://fwt-1025.github.io/paper-pen/test/)

- features (待实现)

  - mask 超像素标注
  - group 编组
  - text editor

- demo

```js
//demo.html
<canvas id="c"></canvas>;
// demo.js
import { Canvas } from "paper-pen";
let paperPen = new Canvas(
  "#c", // id 、class string (#c, .c)| HTMLCanvasElement
  {
    // options
    width: 1600, // canvas width
    height: 700, // canvas height
    preventDefault: true, // prevent right click
    selection: true, // can or not renderTop
    skipFindTarget: false, // skip find target， default false
  }
);
paperPen.setBackground("Your Image Url"); // set background
paperPen.on("img:load", () => {
  // do anything
});
```

> Now you hava a `1600 * 700` canvas and set a background image for it.

- 是否开启滚轮缩放 (Whether to enable wheel scaling)

> `wheel: {scale: true}`

```js
    import { Canvas } from 'paper-pen'
    let canvas = new Canvas({
        '#c',
        {
            wheel: {
                scale: true, // 开启此项，会使滚轮支持画布缩放
                scroll: true, // 开启此项，会使鼠标滚轮在画布中禁用滚动条
            }
        }
    })

```

- 是否开启鼠标右键拖动画布(Do you want to enable the right mouse button to drag the canvas)

> `rightMove: true`

```js
import { Canvas } from 'paper-pen'
    let canvas = new Canvas({
        '#c',
        {
            rightMove: true
        }
    })
```

- How to draw other shape(Rect、Polygon、Line、Point、and so on.)

  - For example --- Rect

  ```js
  import { Rect, Polygon } from "paper-pen";
  let rect = new Rect({
    left: 300,
    top: 300,
    width: 100,
    height: 100,
    stroke: "#000",
    opacity: 0.5,
  });
  paperPen.add(rect);

  let poly = new Polygon({
    points: [
      { x: 100, y: 100 },
      { x: 200, y: 100 },
      { x: 150, y: 350 },
    ],
    stroke: "#0f0",
    opacity: 0.5,
    fill: "#00f",
    lineWidth: 5,
  });
  paperPen.add(poly);
  ```

  > Now you get a Rect

  this Library provide (Rect、Polygon、Line、Point、CrossLine、Text、Ruler、Arrow), Of course you can custom other Shapes by this Library.

#### API

- class
  > need to call with 'new' `new Rect()` `new Line()`...

| name      | description              |
| :-------- | :----------------------- |
| Canvas    | Canvas Instance          |
| Rect      | draw Rectangle, Instance |
| Polygon   | draw Polygon, Instance   |
| Point     | draw Point, Instance     |
| Line      | draw Line, Instance      |
| CrossLine | draw CrossLine, Instance |
| Text      | draw Text, Instance      |
| Ruler     | draw Ruler, Instance     |
| Arrow     | draw Arrow, Instance     |
| Matrix    | Matrix transform         |

- Canvas properties

| name            | type    | description                              |
| :-------------- | :------ | :--------------------------------------- |
| width           | number  | canvas width                             |
| height          | number  | canvas height                            |
| skipFindTarget  | boolean | skip find element                        |
| preventDefault  | boolean | prevent right click                      |
| selection       | boolean | can or not renderTop                     |
| transformMatrix | object  | matrix {a,b,c,d,e,f}                     |
| \_objects       | array   | [shape, shape]                           |
| imageFillMode   | string  | 'contain'、'cover',针对 backgroundImage  |
| wheel           | object  | 鼠标滚轮相关                             |
| wheel.scale     | boolean | 是否开启滚轮缩放，default false          |
| wheel.scroll    | boolean | 是否缩放时禁用浏览器滚动条 default false |
| wheel.max       | number  | 缩放最大范围                             |
| wheel.min       | number  | 缩放最小范围                             |
| rightMove       | boolean | 右键移动画布 default false               |

- shape common properties

| name              | type    | description                           |
| :---------------- | :------ | :------------------------------------ | ------- |
| stroke            | string  | canvas strokeStyle                    |
| fill              | string  | canvas fillStyle                      |
| lineWidth         | number  | lineWidth                             |
| opacity           | number  | 0-1 globalAlpha                       |
| cornerSize        | number  |
| cornerStyle       | string  | 'square                               | circle' |
| cornerBorderColor | string  | color                                 |
| cornerColor       | string  |
| cornerOpacity     | number  | 0 - 1                                 |
| lockMove          | boolean |
| displayGraph      | boolean | 用来决定是否显示当前图形 default true |
| needControl       | boolean | 是否显示控制点 default true           |

- shape common methods

| name            | type | description        |
| :-------------- | :--- | :----------------- |
| getBoundingBox  |      | 获取包围盒         |
| getCommonConfig |      | 获取控制点默认配置 |

- rect properties

| name   | type   | description |
| :----- | :----- | :---------- |
| left   | number |             |
| top    | number |             |
| width  | number | width       |
| height | number | height      |

-polygon properties

| name               | type                          | description                                                      |
| :----------------- | :---------------------------- | :--------------------------------------------------------------- |
| points             | Array<{x: number, y: number}> |                                                                  |
| needArrow          | boolean                       | 是否需要起始箭头                                                 |
| needCenterControl  | boolean                       | 是否需要线段中点                                                 |
| centerPointsStyle  | string                        | 'square'\| 'circle' 中点样式                                     |
| centerPointsSize   | number                        | 中点大小                                                         |
| centerPointsStroke | string                        | 中点描边颜色                                                     |
| centerPointsFill   | string                        | 中点填充颜色                                                     |
| isDouble           | Array<number>                 | 是否绘制双线, 传一个值，就是单线，两个就是双线,取值范围[0-1]     |
| isDash             | Array<number>                 | 是否绘制虚线, 传一个值，就是单虚线，两个就是双虚线,取值范围[0-1] |
| doubleLineDistance | number                        | 两线间距离                                                       |

- instance methods

| name                       | description                                                             | parameter                                                 | return                                                     |
| :------------------------- | :---------------------------------------------------------------------- | :-------------------------------------------------------- | :--------------------------------------------------------- |
| setBackground              | set canvas background                                                   | imgUrl\|Image\|Video\|Canvas\|bitmap                      |
| getPointer                 | Obtain the coordinates of the mouse on the canvas                       | null                                                      | {x number, y:number}                                       |
| add                        | Add elements to object list                                             | DrawObject                                                |                                                            |
| remove                     | remove elements from object list                                        | DrawObject                                                |                                                            |
| setActiveObject            | set the current object to active                                        | DrawObject                                                |                                                            |
| setCursor                  | set the cursor of canvas                                                | css cursor                                                |                                                            |
| resetActive                | Deactivate all objects                                                  | null                                                      |                                                            |
| toJSON                     | get all elements on the canvas                                          | null                                                      | [{},{}]                                                    |
| requestRenderAll           | clear all Objects on the canvas, draw all objects on the canvas         | null                                                      |
| toDataUrl                  | 将画布转换为图片（Convert Canvas to Pictures）                          | null                                                      | {imgData, imgUrl}                                          |
| toBitMap                   | 将画布转换为单通道位图（Convert the canvas to a single channel bitmap） | [{r:number,g: number,b:number,a?:number},...]\|null       | new Promise (ImageBitmap) 不传参数，默认转为二值图（黑白） |
| off                        | 卸载指定事件                                                            | (事件名称，回调函数)                                      |                                                            |
| offAll                     | 卸载监听事件， 不传参，卸载所有实例监听事件                             | 事件名称，如：'mouse:down',将会卸载所有的 mouse:down 事件 |                                                            |
| removeUpperCanvasMoveEvent | 卸载画布移动事件, 应用于鼠标在画布外时                                  | null                                                      |

- eventListener

| name          | description                                  | callback |
| :------------ | :------------------------------------------- | :------- |
| mouse:down    | 鼠标按下事件                                 |
| mouse:move    | 鼠标移动事件                                 |
| mouse:wheel   | 鼠标滚轮事件                                 |
| mouse:up      | 鼠标抬起事件                                 |
| img:load      | 当背景图是在线地址时，等图片加载完成后的回调 |
| render:before | 画布元素渲染前                               |
| render:after  | 画布元素渲染后                               |
| obj:add       | 元素被添加到画布后                           |
| obj:remove    | 元素从画布中删除后                           |
| obj:edit      | 元素被编辑后                                 |
| obj:move      | 元素被移动后                                 |

```js
// paper-pen为开发者提供了mouse:down 、mouse:move、mouse:up、img:load、after:render事件回调。
paperPen.on("mouse:down", (opt) => {
  let pos = paperPen.getPointer(opt); // 获取鼠标按下的点映射到当前画布的真实坐标位置。
  console.log(pos);
  // 您能在此处做想要做的业务。
});
paperPen.off("mouse:down"); // 此方法会去掉画布上所有的mouse:down事件, 最好指定第二个参数来删除对应的事件。
paperPen.on("mouse:down", handleMouseDown);
paperPen.off("mouse:down", handleMouseDown);
```

- Matrix， Support chain operation（支持链式操作）

| name         | decription                                           | params      | type   |
| :----------- | :--------------------------------------------------- | :---------- | :----- |
| translate    | translate matrix                                     | x , y       | number |
| scale        | Multiples corresponding to x-axis and y-axis scaling | x, y        | number |
| scaleU       | scale Matrix                                         | scaler      | number |
| rotate       | rotate matrix                                        | radian      | number |
| transform    | transform matrix                                     | a,b,c,d,e,f | number |
| applyToPoint | Apply the current matrix to point                    | x, y        | number |

```js
import { Matrix } from "paper-pen";
let mat = new Matrix(); /*
        默认生成单位矩阵
        1, 0, 0,
        0, 1, 0,
        0, 0, 1
    */
mat.translate(10, 10); // (1, 0, 0, 1, 10, 10) 返回新的矩阵
mat.translate(100, 100).scale(1.5, 2); // 这里的换算都是用矩阵的叉乘。
```
