When it comes to design software there were many options over the years, many being released with a lot of hype and others disappearing not long after they released. There are few which lasted long enough to not be gobbled up by big names such as Adobe. One of those is Canvas by Deneba Systems.
First released in 1987, it is still available over at Canvas GFX. It’s amazing it was never bought by one of the big names, Adobe, Corel, Aldus, etc and remained under Deneba Systems until 2003 when it was bought by ACD Systems, but kept the name Deneba Canvas for a time. The later versions were not popular to all, and Mac support was dropped, but the software continued. Awhile back I was looking through a few of my old ZIP disks and found some software my father used in the mid 1980’s. He had a copy of Canvas version 2 for Macintosh. At that time I was more interested in playing games on our family’s Macintosh 128k than using design software.
Over the years I have come across many Canvas documents. With each version released, changes were made to the file format used to store the drawings and artwork. There were many file format changes as well as the extensions used with each version. Some are easily identifiable and others have some confusing structures. Lets look into it.
Version | Platform | Extension | Description |
---|---|---|---|
Canvas 1-3 & artWORKS | Macintosh | none | no strong pattern |
Canvas 3.5 | Mac & Windows | CVS | Similar to v1-3 |
Canvas 5 | Mac & Windows | CV5 | CANVAS5 string |
Canvas 6-8 | Mac & Windows | CNV | CANVAS6 string |
Canvas 9-X | Mac & Windows | CVX | Similar to 6-8 |
Canvas Draw | Mac | CVD | Different than others |
Canvas Image File | CVI | DAD5PROX |
The first three versions of Canvas were Macintosh only and in those early days there was no extension, just a Type / Creator indicating to the Finder how to open them. Deneba Systems used the Creator codes DAD2, DAD5, through DADX.
The first versions are quite frustrating. I have gathered samples from Version 2, 3, 3.5 and artWORKS version 1. Even with numerous samples, there are no patterns I can discern from them. I even reached out to the current CanvasX technical support for answers. They wanted to be helpful, but their answers didn’t offer much help.
With âCVSâ or ‘drw2’ for mac, the header contains ranges inside a structure, and other data like if it was compressed. When we see if it’s a valid file we check the ranges. There is no easy way to determine what hex values would be written because of flipping, Intel vs (PPC or 68K). Unfortunately, the research needed to identify the Hex value will require the original code for version 3.5 which we do not have access to easily. Canvas 3.5 code is 16 bit… this would also be an issue.
Let’s take a look at a couple samples:
hexdump -C Canvas2.1-Sample | head 00000000 00 00 03 06 00 00 3d 9c 00 00 00 2a 00 00 00 0a |......=....*....| 00000010 00 00 00 76 00 00 00 36 00 00 00 2e 00 00 00 1e |...v...6........| 00000020 00 00 00 12 00 00 00 42 00 00 00 1a 00 00 00 82 |.......B........| 00000030 00 00 00 3c 00 66 00 01 00 00 3d 9c 00 48 00 00 |...<.f....=..H..| 00000040 40 02 90 00 00 00 00 00 00 00 00 00 00 00 00 00 |@...............| 00000050 00 01 00 00 01 00 00 00 00 20 00 40 00 60 00 80 |......... .@.`..| 00000060 00 c0 01 40 01 80 01 c0 02 40 02 80 00 00 00 00 |...@.....@......| 00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 |................| 00000080 00 00 00 00 00 01 00 10 00 00 00 01 00 03 3f fc |..............?.| 00000090 80 00 00 00 00 00 00 00 00 07 00 01 00 01 00 0b |................| hexdump -C Canvas2-s02 | head 00000000 00 00 03 b2 00 00 07 ec 00 00 00 2a 00 00 00 0a |...........*....| 00000010 00 00 00 76 00 00 00 36 00 00 00 2e 00 00 00 1e |...v...6........| 00000020 00 00 00 12 00 00 00 42 00 00 00 1a 00 00 00 82 |.......B........| 00000030 00 00 00 3c 00 66 00 01 00 00 07 ec 00 48 00 00 |...<.f.......H..| 00000040 40 02 90 00 00 00 00 00 00 00 00 00 00 00 00 00 |@...............| 00000050 00 01 01 00 01 00 00 00 00 20 00 40 00 60 00 80 |......... .@.`..| 00000060 00 c0 01 40 01 80 01 c0 02 40 02 80 00 00 00 00 |...@.....@......| 00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 |................| 00000080 00 00 00 00 00 01 00 10 00 00 00 01 00 03 3f fc |..............?.| 00000090 80 00 00 00 00 00 00 00 00 07 00 01 00 01 00 0b |................| hexdump -C Canvas3.04 | head 00000000 00 00 02 5a 00 00 00 1c 00 00 00 2a 00 00 00 0a |...Z.......*....| 00000010 00 00 00 76 00 00 00 36 00 00 00 2e 00 00 00 1e |...v...6........| 00000020 00 00 00 12 00 00 00 42 00 00 00 1a 00 00 00 82 |.......B........| 00000030 00 00 00 3c 00 68 00 02 00 00 00 1c 00 48 00 00 |...<.h.......H..| 00000040 40 02 90 00 00 00 00 00 00 00 00 00 00 00 00 00 |@...............| 00000050 00 01 01 00 01 03 00 00 00 20 00 40 00 60 00 80 |......... .@.`..| 00000060 00 c0 01 40 01 80 01 c0 02 40 02 80 00 00 00 00 |...@.....@......| 00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000080 00 01 00 00 00 01 00 10 00 00 00 01 00 03 3f fc |..............?.| 00000090 80 00 00 00 00 00 00 00 00 07 00 01 00 01 00 0b |................| hexdump -C Canvas5-3.5-Sample1.CVS | head 00000000 00 00 01 58 00 00 01 30 00 00 00 2a 00 00 00 00 |...X...0...*....| 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000030 00 00 00 00 00 69 00 02 00 00 01 30 00 48 00 00 |.....i.....0.H..| 00000040 40 02 90 00 00 00 00 00 00 00 00 00 00 00 00 00 |@...............| 00000050 00 01 01 01 00 00 00 00 00 20 00 40 00 60 00 80 |......... .@.`..| 00000060 00 c0 01 40 01 80 01 c0 02 40 02 80 00 00 00 00 |...@.....@......| 00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000080 00 01 00 00 00 01 00 10 00 00 00 01 00 03 3f fc |..............?.| 00000090 80 00 00 00 00 00 00 00 00 07 00 01 00 01 00 01 |................| hexdump -C C3-5-S01.CVS | head 00000000 78 11 00 00 10 00 00 00 2a 00 00 00 0a 00 00 00 |x.......*.......| 00000010 26 00 00 00 26 00 00 00 26 00 00 00 26 00 00 00 |&...&...&...&...| 00000020 96 00 00 00 2a 00 00 00 2e 00 00 00 32 00 00 00 |....*.......2...| 00000030 00 00 00 00 01 6b 01 00 50 14 00 00 28 00 00 00 |.....k..P...(...| 00000040 6e 00 00 00 5b 00 00 00 01 00 04 00 00 00 00 00 |n...[...........| 00000050 e8 13 00 00 12 0b 00 00 12 0b 00 00 00 00 00 00 |................| 00000060 00 00 00 00 00 00 00 00 00 00 80 00 00 80 00 00 |................| 00000070 00 80 80 00 80 00 00 00 80 00 80 00 80 80 00 00 |................| 00000080 c0 c0 c0 00 80 80 80 00 00 00 ff 00 00 ff 00 00 |................| 00000090 00 ff ff 00 ff 00 00 00 ff 00 ff 00 ff ff 00 00 |................|
In the version 2 & 3 samples you can see some patterns, which I thought would allow for proper identification, but looking at more samples I found differences. One pattern I was hopeful might be consistent was the hex values “002000400060008000C00140018001C002400280”, but there are some which don’t match this pattern. If the file is truly compressed, it will be hard to know which values would be consistent among all files. I have over 8,000 samples and have a signature that only excludes around 20, so it will have to do for now.
When we start with Version 5 we get into some more identifiable headers, there is some oddness with some samples. But with an ascii string like “CANVAS5”, it should be easy, right? Not so fast, in version 5 you can compress the file structure. This removes the easily identifiable “CANVAS5” string. But some have a small string at the tail end, but others do not.
hexdump -C Canvas5-Sample1.CV5 | head 00000000 02 00 00 80 00 00 00 00 00 00 00 4e 96 00 00 4e |...........N...N| 00000010 96 18 02 00 00 00 0e a8 da 43 41 4e 56 41 53 35 |.........CANVAS5| 00000020 00 01 00 00 00 00 00 05 03 00 00 00 00 00 00 00 |................| 00000030 00 00 00 00 00 21 00 00 00 21 00 00 00 79 00 00 |.....!...!...y..| 00000040 00 03 00 00 01 6b 00 00 00 03 00 00 00 01 ff ff |.....k..........| 00000050 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| hexdump -C Canvas5-Sample3-cmp.CV5 | head 00000000 02 00 00 80 00 00 00 00 08 00 00 80 00 00 00 03 |................| 00000010 5c ff ff ff ff 00 00 40 22 00 00 03 50 10 00 89 |\......@"...P...| 00000020 07 60 bd 0f f0 00 00 10 03 04 10 56 00 20 05 00 |.`.........V. ..| 00000030 e0 18 02 10 35 04 30 4e 05 30 72 07 f0 a8 0d a1 |....5.0N.0r.....| 00000040 17 11 81 19 05 50 5c 00 60 0f 00 10 80 02 90 80 |.....P\.`.......| 00000050 03 f0 56 05 50 55 05 b0 75 12 51 29 05 e0 55 05 |..V.PU..u.Q)..U.| hexdump -C Canvas5-Sample3-cmp.CV5 | tail 00001ff0 00 00 00 01 08 a5 ab c0 00 00 00 00 3f 89 2c 58 |............?.,X| 00002000 00 00 00 00 08 a5 ab 80 00 00 00 00 ff d4 11 e4 |................| 00002010 00 00 00 00 08 a5 ab 90 00 02 3e d8 ff d3 12 cc |..........>.....| 00002020 00 00 00 00 00 00 00 00 00 02 3e d8 00 01 00 09 |..........>.....| 00002030 00 00 00 00 00 00 00 00 00 00 00 00 08 a5 ab f8 |................| 00002040 00 00 00 00 43 4e 56 35 |....CNV5|
Canvas 6 uses a new extension, but has a similar structure to the file format. With compression as an option. But some of the compressed files on Windows has a reversed string, “5VNC“. So many Canvas 5 compressed look identical to Canvas 6 compressed, complicating identification.
hexdump -C Canvas6-Sample.CNV | head 00000000 01 00 80 00 00 90 07 cd 07 00 80 00 00 00 80 00 |................| 00000010 00 17 01 00 00 59 f5 0e 00 43 41 4e 56 41 53 36 |.....Y...CANVAS6| 00000020 00 01 00 00 00 00 06 00 00 00 00 00 00 00 00 00 |................| 00000030 00 00 00 00 00 21 7a 00 00 00 7a 00 00 00 03 00 |.....!z...z.....| 00000040 00 00 6e 01 00 00 03 00 00 00 01 00 00 00 ff ff |..n.............| 00000050 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| hexdump -C Canvas6-Sample1-c.CNV | head 00000000 01 00 80 00 00 58 ea 2b 00 c2 1d 00 00 d0 09 00 |.....X.+........| 00000010 00 00 00 0f 2e 00 00 0b 07 00 00 09 c4 10 00 01 |................| 00000020 00 00 03 00 20 04 00 70 ff 00 80 05 00 c0 06 06 |.... ..p........| 00000030 50 20 03 00 0f 06 10 6b 00 a0 12 01 00 48 07 20 |P .....k.....H. | 00000040 6d 07 30 40 06 40 11 06 00 0b 05 00 10 00 10 71 |m.0@.@.........q| 00000050 01 40 21 00 00 59 01 00 0f 05 10 00 00 e1 14 00 |.@!..Y..........| hexdump -C Canvas6-Sample1-c.CNV | tail 000016a0 00 00 00 12 f6 00 00 c0 f0 12 00 3c d0 80 7c 58 |...........<..|X| 000016b0 2f 14 00 00 00 00 00 bc f4 8d 00 0f 00 00 00 00 |/...............| 000016c0 f1 12 00 7f 00 00 00 f8 2e 14 00 bc f4 8d 00 1c |................| 000016d0 f2 12 00 04 f3 12 00 fc d1 80 7c 09 04 00 00 00 |..........|.....| 000016e0 00 00 40 00 f2 12 00 ff ff ff ff 00 f1 12 00 1c |..@.............| 000016f0 f1 12 00 bc f4 8d 00 00 00 00 40 35 56 4e 43 |..........@5VNC|
While most have the “CANVAS6” string near the beginning, quite a few are missing the CNV5/5VNC string at the end. Instead, many have the string “%SI-0200” near the end, which I use in my signature suggestion. This structure remained the same from version 6 to 8.
hexdump -C Canvas8-S01.CNV | head 00000000 02 00 00 80 00 00 12 b8 80 00 00 11 19 00 00 11 |................| 00000010 19 18 02 00 00 00 0e f5 59 43 41 4e 56 41 53 36 |........YCANVAS6| 00000020 00 01 00 00 00 00 00 08 01 00 00 00 00 00 00 00 |................| 00000030 00 00 00 00 00 21 00 00 00 00 00 00 00 00 00 00 |.....!..........| 00000040 00 03 00 00 00 00 00 00 00 03 00 00 00 01 00 00 |................| 00000050 00 01 ff ff ff ff 00 00 00 02 00 00 00 02 00 00 |................|
But…….. There are plenty without these strings, just the “%SI-0200” near the end.
hexdump -C TELEGRPH.CNV | head 00000000 02 00 00 80 00 00 00 00 08 00 00 80 00 00 00 3d |...............=| 00000010 f2 ff ff ff ff 00 00 75 76 00 00 3d e6 10 00 ff |.......uv..=....| 00000020 00 00 b3 0d 90 a9 03 b0 8a 07 f0 98 07 60 80 08 |.............`..| 00000030 d0 35 01 c0 58 01 e0 59 04 80 b8 03 90 38 02 f0 |.5..X..Y.....8..| 00000040 e2 00 20 0b 03 70 1d 03 20 36 0f 30 00 01 80 09 |.. ..p.. 6.0....| hexdump -C TELEGRPH.CNV | tail 00006850 2b 2c f9 ae 30 00 00 00 20 00 00 00 01 00 00 00 |+,..0... .......| 00006860 0f 00 00 00 10 00 00 00 1e 00 00 00 07 00 00 00 |................| 00006870 64 65 6e 65 62 61 00 00 00 00 01 4c 25 53 49 2d |deneba.....L%SI-| 00006880 30 32 30 30 6d 61 63 00 00 00 00 00 00 00 00 00 |0200mac.........| 00006890 00 00 00 00 |....|
In version 9 and forward we have an extension change to CVX, but the format is similar with the “CANVAS6” string, but is a slightly different offset. It is still used with the current version of Canvas X.
hexdump -C Canvas9-Sample1.cvx | head 00000000 00 00 00 00 00 00 00 00 00 00 02 00 00 80 00 07 |................| 00000010 d1 84 d0 00 00 80 00 00 00 80 00 18 02 00 00 00 |................| 00000020 0f b7 ef 43 41 4e 56 41 53 36 00 01 00 00 00 00 |...CANVAS6......| 00000030 00 09 00 00 00 03 34 00 00 00 04 00 00 00 00 00 |......4.........| 00000040 00 00 00 3c 42 45 47 49 4e 5f 50 52 45 56 49 45 |...<BEGIN_PREVIE| 00000050 57 5f 54 41 47 3e 21 00 00 00 75 00 00 00 79 00 |W_TAG>!...u...y.| 00000060 00 00 03 00 00 01 6b 00 00 00 03 00 00 00 01 ff |......k.........| 00000070 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| hexdump -C Canvas9-Sample1-compressed.cvx | tail 00004090 00 00 e0 20 00 57 80 00 00 00 00 00 0a 13 00 09 |... .W..........| 000040a0 00 00 04 00 00 00 00 01 00 00 00 00 bf ff e0 80 |................| 000040b0 bf ff e0 40 01 8c 5e 00 02 4a 22 d0 00 00 01 60 |...@..^..J"....`| 000040c0 bf ff e0 40 00 5c 08 18 00 00 00 00 00 0d 84 80 |...@.\..........| 000040d0 43 61 6e 76 61 73 39 2d 53 61 6d 70 6c 65 31 2d |Canvas9-Sample1-| 000040e0 63 6f 6d 70 72 65 73 73 65 64 2e 63 76 78 00 18 |compressed.cvx..| 000040f0 bf ff e0 70 0a 12 6a a0 02 43 22 b4 00 0c aa 9c |...p..j..C".....| 00004100 bf ff e0 80 00 00 00 01 00 00 00 00 00 0d 84 80 |................| 00004110 bf ff e0 b0 43 4e 56 35 |....CNV5| hexdump -C CanvasX2019-S01.cvx | head 00000000 00 00 00 00 00 00 00 00 00 00 01 00 80 00 00 00 |................| 00000010 6e ab 03 00 80 00 00 00 80 00 00 17 01 00 00 ef |n...............| 00000020 b7 0f 00 43 41 4e 56 41 53 36 00 01 00 00 00 00 |...CANVAS6......| 00000030 09 00 00 4d 01 00 00 eb 4c 00 00 41 00 00 00 31 |...M....L..A...1| 00000040 52 45 56 03 00 00 00 01 00 00 00 00 00 00 00 00 |REV.............| 00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
This collection of file formats is very hard to make sense of. Some really great consistent patterns on many samples, with lots of exceptions. Super confusing. This software has had a long run, with the latter years staying pretty stagnate in terms of new development. It is worth defining and creating a signature for the consistent patterns, then we can dial in the variants over time?
The signatures I have built miss about 23 files in versions 1-3 out of the ~9000 samples I have and for Canvas 5, only some of the compressed files are currently not identified. But so far all my CNV and CVX files identify correctly, so probably good for now.
CanvasX dropped supported for the Macintosh, but did release an entirely different product called Canvas X Draw, which does support the Macintosh. Here is what a CVD file looks like:
hexdump -C CanvasXDraw7-Sample1.cvd | head 00000000 25 43 61 6e 76 61 73 43 56 44 09 31 2e 30 25 bb |%CanvasCVD.1.0%.| 00000010 54 48 65 61 64 65 72 00 00 00 00 00 00 00 00 00 |THeader.........| 00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000030 00 bb 52 4d 61 63 4f 53 56 65 72 73 69 6f 6e 20 |..RMacOSVersion | 00000040 31 30 2e 31 33 2e 36 20 28 42 75 69 6c 64 20 31 |10.13.6 (Build 1| 00000050 37 47 31 34 30 34 32 29 31 30 2e 32 33 30 34 08 |7G14042)10.2304.| 00000060 00 00 00 70 6c 61 74 66 6f 72 6d 0a 73 00 00 00 |...platform.s...| 00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000080 00 00 00 00 00 05 00 00 00 02 00 00 00 00 00 00 |................| 00000090 00 08 00 00 00 6f 73 0a 73 00 00 00 00 00 00 00 |.....os.s.......|
There is also the matter of a Canvas Image, which the User Guide calls proxy images. They are Raster images used in placements within Canvas Documents. Should be easy to identify.
hexdump -C Canvas5-Sample1.CVI | head 00000000 00 00 00 01 44 41 44 35 50 52 4f 58 00 00 09 99 |....DAD5PROX....| 00000010 00 00 00 11 00 00 00 2d 00 00 00 03 00 00 00 08 |.......-........| 00000020 00 48 00 00 00 00 00 06 00 03 00 08 00 00 00 11 |.H..............| 00000030 00 00 00 2d 00 03 00 03 00 48 00 00 00 48 00 00 |...-.....H...H..| 00000040 00 00 00 00 00 00 00 00 00 00 00 11 00 00 00 2d |...............-| 00000050 00 00 00 02 00 00 00 08 00 00 00 01 00 00 00 11 |................| 00000060 00 00 00 2d ff ff ff ff ff ff ff ff ff ff ff ff |...-............| 00000070 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
Phew, if you held on for this whole post you must really like confusing file format structures. This format has been on my mind on and off for about 6 years. Hopefully these signatures will work for the vast majority of the Canvas files found in archives and personal systems. As always here is my GitHub with the signatures I am proposing and a few samples to get you confused.