exp
Browse files- src/lib/services/picletExport.ts +10 -11
src/lib/services/picletExport.ts
CHANGED
|
@@ -10,27 +10,26 @@ export async function generateShareableImage(piclet: PicletInstance): Promise<Bl
|
|
| 10 |
const ctx = canvas.getContext('2d');
|
| 11 |
if (!ctx) throw new Error('Could not create canvas context');
|
| 12 |
|
| 13 |
-
// Set canvas size - narrower width to match content
|
| 14 |
const canvasWidth = 700;
|
| 15 |
-
const canvasHeight =
|
| 16 |
canvas.width = canvasWidth;
|
| 17 |
canvas.height = canvasHeight;
|
| 18 |
|
| 19 |
-
//
|
| 20 |
-
ctx.
|
| 21 |
-
ctx.fillRect(0, 0, canvasWidth, canvasHeight);
|
| 22 |
|
| 23 |
// Load piclet image first
|
| 24 |
const picletImg = await loadImage(piclet.imageData || piclet.imageUrl);
|
| 25 |
const picletSize = 512;
|
| 26 |
const picletX = (canvasWidth - picletSize) / 2;
|
| 27 |
-
const picletY =
|
| 28 |
|
| 29 |
// Load and draw grass platform positioned under the piclet
|
| 30 |
const grassImg = await loadImage('/assets/grass.PNG');
|
| 31 |
const platformSize = picletSize + 100; // Slightly larger than piclet
|
| 32 |
const platformX = (canvasWidth - platformSize) / 2;
|
| 33 |
-
const platformY = picletY + picletSize -
|
| 34 |
ctx.drawImage(grassImg, platformX, platformY, platformSize, platformSize);
|
| 35 |
|
| 36 |
// Draw piclet on top of platform
|
|
@@ -41,9 +40,9 @@ export async function generateShareableImage(piclet: PicletInstance): Promise<Bl
|
|
| 41 |
ctx.strokeStyle = '#1e3a8a'; // Dark blue outline
|
| 42 |
ctx.lineWidth = 8;
|
| 43 |
// Try to use a more gaming-style font, fallback to Impact
|
| 44 |
-
ctx.font = 'bold
|
| 45 |
ctx.textAlign = 'center';
|
| 46 |
-
ctx.shadowColor = 'rgba(0, 0, 0, 0.
|
| 47 |
ctx.shadowBlur = 10;
|
| 48 |
ctx.shadowOffsetX = 4;
|
| 49 |
ctx.shadowOffsetY = 4;
|
|
@@ -51,8 +50,8 @@ export async function generateShareableImage(piclet: PicletInstance): Promise<Bl
|
|
| 51 |
const nameText = piclet.nickname || piclet.typeId;
|
| 52 |
|
| 53 |
// Draw name with outline and shadow
|
| 54 |
-
ctx.strokeText(nameText, canvasWidth / 2,
|
| 55 |
-
ctx.fillText(nameText, canvasWidth / 2,
|
| 56 |
|
| 57 |
// Reset shadow
|
| 58 |
ctx.shadowColor = 'transparent';
|
|
|
|
| 10 |
const ctx = canvas.getContext('2d');
|
| 11 |
if (!ctx) throw new Error('Could not create canvas context');
|
| 12 |
|
| 13 |
+
// Set canvas size - narrower width to match content, tighter height
|
| 14 |
const canvasWidth = 700;
|
| 15 |
+
const canvasHeight = 700; // Square format, tighter
|
| 16 |
canvas.width = canvasWidth;
|
| 17 |
canvas.height = canvasHeight;
|
| 18 |
|
| 19 |
+
// Clear canvas for transparency (no background fill)
|
| 20 |
+
ctx.clearRect(0, 0, canvasWidth, canvasHeight);
|
|
|
|
| 21 |
|
| 22 |
// Load piclet image first
|
| 23 |
const picletImg = await loadImage(piclet.imageData || piclet.imageUrl);
|
| 24 |
const picletSize = 512;
|
| 25 |
const picletX = (canvasWidth - picletSize) / 2;
|
| 26 |
+
const picletY = 120; // Position piclet closer to top, leaving room for name
|
| 27 |
|
| 28 |
// Load and draw grass platform positioned under the piclet
|
| 29 |
const grassImg = await loadImage('/assets/grass.PNG');
|
| 30 |
const platformSize = picletSize + 100; // Slightly larger than piclet
|
| 31 |
const platformX = (canvasWidth - platformSize) / 2;
|
| 32 |
+
const platformY = picletY + picletSize - 200; // Platform overlaps bottom of piclet
|
| 33 |
ctx.drawImage(grassImg, platformX, platformY, platformSize, platformSize);
|
| 34 |
|
| 35 |
// Draw piclet on top of platform
|
|
|
|
| 40 |
ctx.strokeStyle = '#1e3a8a'; // Dark blue outline
|
| 41 |
ctx.lineWidth = 8;
|
| 42 |
// Try to use a more gaming-style font, fallback to Impact
|
| 43 |
+
ctx.font = 'bold 64px "Press Start 2P", "Courier New", Impact, monospace';
|
| 44 |
ctx.textAlign = 'center';
|
| 45 |
+
ctx.shadowColor = 'rgba(0, 0, 0, 0.8)';
|
| 46 |
ctx.shadowBlur = 10;
|
| 47 |
ctx.shadowOffsetX = 4;
|
| 48 |
ctx.shadowOffsetY = 4;
|
|
|
|
| 50 |
const nameText = piclet.nickname || piclet.typeId;
|
| 51 |
|
| 52 |
// Draw name with outline and shadow
|
| 53 |
+
ctx.strokeText(nameText, canvasWidth / 2, 80);
|
| 54 |
+
ctx.fillText(nameText, canvasWidth / 2, 80);
|
| 55 |
|
| 56 |
// Reset shadow
|
| 57 |
ctx.shadowColor = 'transparent';
|