Skip to content

Commit

Permalink
feat: embed scene support for png export in npm package (#5047)
Browse files Browse the repository at this point in the history
* feat: embed scene support for png export in npm package

* move logic to the callback function

* add exportEmbedScene checkbox in package example

* update readme and changelog

* add PR link in changelog

* reverse sort changelog items
  • Loading branch information
pomdtr committed Apr 16, 2022
1 parent 52d10bb commit 3840e2f
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 3 deletions.
3 changes: 2 additions & 1 deletion src/packages/excalidraw/CHANGELOG.md
Expand Up @@ -17,7 +17,8 @@ Please add the latest change on the top under the correct section.

#### Features

- Exported [`restoreLibraryItems`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#restoreLibraryItems) API useful when dealing with libraries [#4995](https://github.com/excalidraw/excalidraw/pull/4995).
- The `exportToBlob` utility now supports the `exportEmbedScene` option when generating a png image [#5047](https://github.com/excalidraw/excalidraw/pull/5047).
- Exported [`restoreLibraryItems`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#restoreLibraryItems) API [#4995](https://github.com/excalidraw/excalidraw/pull/4995).

#### Fixes

Expand Down
2 changes: 1 addition & 1 deletion src/packages/excalidraw/README_NEXT.md
Expand Up @@ -907,7 +907,7 @@ This function returns a promise which resolves to svg of the exported drawing.
| exportBackground | boolean | true | Indicates whether background should be exported |
| viewBackgroundColor | string | #fff | The default background color |
| exportWithDarkMode | boolean | false | Indicates whether to export with dark mode |
| exportEmbedScene | boolean | false | Indicates whether scene data should be embedded in svg. This will increase the svg size. |
| exportEmbedScene | boolean | false | Indicates whether scene data should be embedded in svg/png. This will increase the image size. |

### Extra API's

Expand Down
11 changes: 11 additions & 0 deletions src/packages/excalidraw/example/App.js
Expand Up @@ -51,6 +51,7 @@ export default function App() {
const [blobUrl, setBlobUrl] = useState(null);
const [canvasUrl, setCanvasUrl] = useState(null);
const [exportWithDarkMode, setExportWithDarkMode] = useState(false);
const [exportEmbedScene, setExportEmbedScene] = useState(false);
const [theme, setTheme] = useState("light");

const initialStatePromiseRef = useRef({ promise: null });
Expand Down Expand Up @@ -245,13 +246,22 @@ export default function App() {
/>
Export with dark mode
</label>
<label className="export-wrapper__checkbox">
<input
type="checkbox"
checked={exportEmbedScene}
onChange={() => setExportEmbedScene(!exportEmbedScene)}
/>
Export with embed scene
</label>
<button
onClick={async () => {
const svg = await exportToSvg({
elements: excalidrawRef.current.getSceneElements(),
appState: {
...initialData.appState,
exportWithDarkMode,
exportEmbedScene,
width: 300,
height: 100,
},
Expand All @@ -272,6 +282,7 @@ export default function App() {
mimeType: "image/png",
appState: {
...initialData.appState,
exportEmbedScene,
exportWithDarkMode,
},
files: excalidrawRef.current.getFiles(),
Expand Down
19 changes: 18 additions & 1 deletion src/packages/utils.ts
Expand Up @@ -8,6 +8,8 @@ import { ExcalidrawElement, NonDeleted } from "../element/types";
import { getNonDeletedElements } from "../element";
import { restore } from "../data/restore";
import { MIME_TYPES } from "../constants";
import { encodePngMetadata } from "../data/image";
import { serializeAsJSON } from "../data/json";

type ExportOpts = {
elements: readonly NonDeleted<ExcalidrawElement>[];
Expand Down Expand Up @@ -107,7 +109,22 @@ export const exportToBlob = async (

return new Promise((resolve) => {
canvas.toBlob(
(blob: Blob | null) => {
async (blob: Blob | null) => {
if (
blob &&
mimeType === MIME_TYPES.png &&
opts.appState?.exportEmbedScene
) {
blob = await encodePngMetadata({
blob,
metadata: serializeAsJSON(
opts.elements,
opts.appState,
opts.files || {},
"local",
),
});
}
resolve(blob);
},
mimeType,
Expand Down

2 comments on commit 3840e2f

@vercel
Copy link

@vercel vercel bot commented on 3840e2f Apr 16, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@vercel
Copy link

@vercel vercel bot commented on 3840e2f Apr 16, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Successfully deployed to the following URLs:

excalidraw-package-example – ./src/packages/excalidraw

excalidraw-package-example-excalidraw.vercel.app
excalidraw-package-example-git-master-excalidraw.vercel.app
excalidraw-package-example.vercel.app

Please sign in to comment.