apexify.js 4.5.54 → 4.5.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/ai/ApexAI.d.ts +1 -164
- package/dist/cjs/ai/ApexAI.d.ts.map +1 -1
- package/dist/cjs/ai/ApexAI.js +190 -373
- package/dist/cjs/ai/ApexAI.js.map +1 -1
- package/dist/cjs/ai/ApexModules.d.ts +1 -1
- package/dist/cjs/ai/ApexModules.d.ts.map +1 -1
- package/dist/cjs/ai/ApexModules.js +6 -18
- package/dist/cjs/ai/ApexModules.js.map +1 -1
- package/dist/cjs/ai/functions/draw.d.ts.map +1 -1
- package/dist/cjs/ai/functions/draw.js +6 -6
- package/dist/cjs/ai/functions/draw.js.map +1 -1
- package/dist/cjs/ai/modals-chat/electronHub/imageModels.d.ts +1 -1
- package/dist/cjs/ai/modals-chat/electronHub/imageModels.d.ts.map +1 -1
- package/dist/cjs/ai/modals-chat/electronHub/imageModels.js +1 -4
- package/dist/cjs/ai/modals-chat/electronHub/imageModels.js.map +1 -1
- package/dist/cjs/ai/utils.d.ts +1 -4
- package/dist/cjs/ai/utils.d.ts.map +1 -1
- package/dist/cjs/ai/utils.js +1 -7
- package/dist/cjs/ai/utils.js.map +1 -1
- package/dist/cjs/canvas/ApexPainter.d.ts +17 -14
- package/dist/cjs/canvas/ApexPainter.d.ts.map +1 -1
- package/dist/cjs/canvas/ApexPainter.js +29 -11
- package/dist/cjs/canvas/ApexPainter.js.map +1 -1
- package/dist/cjs/canvas/utils/Background/bg.d.ts +24 -0
- package/dist/cjs/canvas/utils/Background/bg.d.ts.map +1 -0
- package/dist/{esm/canvas/utils → cjs/canvas/utils/Background}/bg.js +27 -52
- package/dist/cjs/canvas/utils/Background/bg.js.map +1 -0
- package/dist/cjs/canvas/utils/Background/circular.d.ts +3 -0
- package/dist/cjs/canvas/utils/Background/circular.d.ts.map +1 -0
- package/dist/{esm/canvas/utils → cjs/canvas/utils/Background}/circular.js +0 -8
- package/dist/cjs/canvas/utils/{circular.js.map → Background/circular.js.map} +1 -1
- package/dist/cjs/canvas/utils/Background/radius.d.ts +18 -0
- package/dist/cjs/canvas/utils/Background/radius.d.ts.map +1 -0
- package/dist/cjs/canvas/utils/Background/radius.js +115 -0
- package/dist/cjs/canvas/utils/Background/radius.js.map +1 -0
- package/dist/cjs/canvas/utils/{charts.d.ts → Charts/charts.d.ts} +1 -1
- package/dist/cjs/canvas/utils/Charts/charts.d.ts.map +1 -0
- package/dist/cjs/canvas/utils/Charts/charts.js.map +1 -0
- package/dist/cjs/canvas/utils/Custom/customLines.d.ts +3 -0
- package/dist/cjs/canvas/utils/Custom/customLines.d.ts.map +1 -0
- package/dist/cjs/canvas/utils/Custom/customLines.js.map +1 -0
- package/dist/cjs/canvas/utils/General/conversion.d.ts.map +1 -0
- package/dist/cjs/canvas/utils/General/conversion.js.map +1 -0
- package/dist/cjs/canvas/utils/{general functions.d.ts → General/general functions.d.ts } +18 -4
- package/dist/cjs/canvas/utils/General/general functions.d.ts.map +1 -0
- package/dist/{esm/canvas/utils → cjs/canvas/utils/General}/general functions.js +89 -58
- package/dist/cjs/canvas/utils/General/general functions.js.map +1 -0
- package/dist/cjs/canvas/utils/Image/imageProperties.d.ts +81 -0
- package/dist/cjs/canvas/utils/Image/imageProperties.d.ts.map +1 -0
- package/dist/{esm/canvas/utils → cjs/canvas/utils/Image}/imageProperties.js +224 -45
- package/dist/cjs/canvas/utils/Image/imageProperties.js.map +1 -0
- package/dist/{esm/canvas/utils → cjs/canvas/utils/Texts}/textProperties.d.ts +1 -1
- package/dist/cjs/canvas/utils/Texts/textProperties.d.ts.map +1 -0
- package/dist/cjs/canvas/utils/Texts/textProperties.js.map +1 -0
- package/dist/cjs/canvas/utils/types.d.ts +41 -1
- package/dist/cjs/canvas/utils/types.d.ts.map +1 -1
- package/dist/cjs/canvas/utils/types.js.map +1 -1
- package/dist/cjs/canvas/utils/utils.d.ts +11 -11
- package/dist/cjs/canvas/utils/utils.d.ts.map +1 -1
- package/dist/cjs/canvas/utils/utils.js +11 -10
- package/dist/cjs/canvas/utils/utils.js.map +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/ai/ApexAI.d.ts +1 -164
- package/dist/esm/ai/ApexAI.d.ts.map +1 -1
- package/dist/esm/ai/ApexAI.js +190 -373
- package/dist/esm/ai/ApexAI.js.map +1 -1
- package/dist/esm/ai/ApexModules.d.ts +1 -1
- package/dist/esm/ai/ApexModules.d.ts.map +1 -1
- package/dist/esm/ai/ApexModules.js +6 -18
- package/dist/esm/ai/ApexModules.js.map +1 -1
- package/dist/esm/ai/functions/draw.d.ts.map +1 -1
- package/dist/esm/ai/functions/draw.js +6 -6
- package/dist/esm/ai/functions/draw.js.map +1 -1
- package/dist/esm/ai/modals-chat/electronHub/imageModels.d.ts +1 -1
- package/dist/esm/ai/modals-chat/electronHub/imageModels.d.ts.map +1 -1
- package/dist/esm/ai/modals-chat/electronHub/imageModels.js +1 -4
- package/dist/esm/ai/modals-chat/electronHub/imageModels.js.map +1 -1
- package/dist/esm/ai/utils.d.ts +1 -4
- package/dist/esm/ai/utils.d.ts.map +1 -1
- package/dist/esm/ai/utils.js +1 -7
- package/dist/esm/ai/utils.js.map +1 -1
- package/dist/esm/canvas/ApexPainter.d.ts +17 -14
- package/dist/esm/canvas/ApexPainter.d.ts.map +1 -1
- package/dist/esm/canvas/ApexPainter.js +29 -11
- package/dist/esm/canvas/ApexPainter.js.map +1 -1
- package/dist/esm/canvas/utils/Background/bg.d.ts +24 -0
- package/dist/esm/canvas/utils/Background/bg.d.ts.map +1 -0
- package/dist/{cjs/canvas/utils → esm/canvas/utils/Background}/bg.js +27 -52
- package/dist/esm/canvas/utils/Background/bg.js.map +1 -0
- package/dist/esm/canvas/utils/Background/circular.d.ts +3 -0
- package/dist/esm/canvas/utils/Background/circular.d.ts.map +1 -0
- package/dist/{cjs/canvas/utils → esm/canvas/utils/Background}/circular.js +0 -8
- package/dist/esm/canvas/utils/{circular.js.map → Background/circular.js.map} +1 -1
- package/dist/esm/canvas/utils/Background/radius.d.ts +18 -0
- package/dist/esm/canvas/utils/Background/radius.d.ts.map +1 -0
- package/dist/esm/canvas/utils/Background/radius.js +115 -0
- package/dist/esm/canvas/utils/Background/radius.js.map +1 -0
- package/dist/esm/canvas/utils/{charts.d.ts → Charts/charts.d.ts} +1 -1
- package/dist/esm/canvas/utils/Charts/charts.d.ts.map +1 -0
- package/dist/esm/canvas/utils/Charts/charts.js.map +1 -0
- package/dist/esm/canvas/utils/Custom/customLines.d.ts +3 -0
- package/dist/esm/canvas/utils/Custom/customLines.d.ts.map +1 -0
- package/dist/esm/canvas/utils/Custom/customLines.js.map +1 -0
- package/dist/esm/canvas/utils/General/conversion.d.ts.map +1 -0
- package/dist/esm/canvas/utils/General/conversion.js.map +1 -0
- package/dist/esm/canvas/utils/{general functions.d.ts → General/general functions.d.ts } +18 -4
- package/dist/esm/canvas/utils/General/general functions.d.ts.map +1 -0
- package/dist/{cjs/canvas/utils → esm/canvas/utils/General}/general functions.js +89 -58
- package/dist/esm/canvas/utils/General/general functions.js.map +1 -0
- package/dist/esm/canvas/utils/Image/imageProperties.d.ts +81 -0
- package/dist/esm/canvas/utils/Image/imageProperties.d.ts.map +1 -0
- package/dist/{cjs/canvas/utils → esm/canvas/utils/Image}/imageProperties.js +224 -45
- package/dist/esm/canvas/utils/Image/imageProperties.js.map +1 -0
- package/dist/{cjs/canvas/utils → esm/canvas/utils/Texts}/textProperties.d.ts +1 -1
- package/dist/esm/canvas/utils/Texts/textProperties.d.ts.map +1 -0
- package/dist/esm/canvas/utils/Texts/textProperties.js.map +1 -0
- package/dist/esm/canvas/utils/types.d.ts +41 -1
- package/dist/esm/canvas/utils/types.d.ts.map +1 -1
- package/dist/esm/canvas/utils/types.js.map +1 -1
- package/dist/esm/canvas/utils/utils.d.ts +11 -11
- package/dist/esm/canvas/utils/utils.d.ts.map +1 -1
- package/dist/esm/canvas/utils/utils.js +11 -10
- package/dist/esm/canvas/utils/utils.js.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/lib/ai/ApexAI.ts +195 -697
- package/lib/ai/ApexModules.ts +7 -17
- package/lib/ai/functions/draw.ts +6 -8
- package/lib/ai/modals-chat/electronHub/imageModels.ts +2 -5
- package/lib/ai/utils.ts +0 -6
- package/lib/canvas/ApexPainter.ts +73 -38
- package/lib/canvas/utils/Background/bg.ts +97 -0
- package/lib/canvas/utils/Background/circular.ts +17 -0
- package/lib/canvas/utils/Background/radius.ts +113 -0
- package/lib/canvas/utils/{charts.ts → Charts/charts.ts} +1 -1
- package/lib/canvas/utils/{customLines.ts → Custom/customLines.ts} +1 -1
- package/lib/canvas/utils/{conversion.ts → General/conversion.ts} +1 -1
- package/lib/canvas/utils/{general functions.ts → General/general functions.ts } +143 -121
- package/lib/canvas/utils/Image/imageProperties.ts +631 -0
- package/lib/canvas/utils/{textProperties.ts → Texts/textProperties.ts} +1 -1
- package/lib/canvas/utils/types.ts +45 -2
- package/lib/canvas/utils/utils.ts +14 -11
- package/package.json +1 -4
- package/dist/cjs/ai/functions/generateVoiceResponse.d.ts +0 -10
- package/dist/cjs/ai/functions/generateVoiceResponse.d.ts.map +0 -1
- package/dist/cjs/ai/functions/generateVoiceResponse.js +0 -161
- package/dist/cjs/ai/functions/generateVoiceResponse.js.map +0 -1
- package/dist/cjs/ai/modals-chat/gemini/Gemini-flash.d.ts +0 -13
- package/dist/cjs/ai/modals-chat/gemini/Gemini-flash.d.ts.map +0 -1
- package/dist/cjs/ai/modals-chat/gemini/Gemini-flash.js +0 -185
- package/dist/cjs/ai/modals-chat/gemini/Gemini-flash.js.map +0 -1
- package/dist/cjs/ai/modals-chat/gemini/Gemini-pro.d.ts +0 -13
- package/dist/cjs/ai/modals-chat/gemini/Gemini-pro.d.ts.map +0 -1
- package/dist/cjs/ai/modals-chat/gemini/Gemini-pro.js +0 -185
- package/dist/cjs/ai/modals-chat/gemini/Gemini-pro.js.map +0 -1
- package/dist/cjs/ai/modals-chat/gemini/config.d.ts +0 -5
- package/dist/cjs/ai/modals-chat/gemini/config.d.ts.map +0 -1
- package/dist/cjs/ai/modals-chat/gemini/config.js +0 -13
- package/dist/cjs/ai/modals-chat/gemini/config.js.map +0 -1
- package/dist/cjs/ai/modals-chat/gemini/geminiFast.d.ts +0 -15
- package/dist/cjs/ai/modals-chat/gemini/geminiFast.d.ts.map +0 -1
- package/dist/cjs/ai/modals-chat/gemini/geminiFast.js +0 -146
- package/dist/cjs/ai/modals-chat/gemini/geminiFast.js.map +0 -1
- package/dist/cjs/canvas/utils/bg.d.ts +0 -23
- package/dist/cjs/canvas/utils/bg.d.ts.map +0 -1
- package/dist/cjs/canvas/utils/bg.js.map +0 -1
- package/dist/cjs/canvas/utils/charts.d.ts.map +0 -1
- package/dist/cjs/canvas/utils/charts.js.map +0 -1
- package/dist/cjs/canvas/utils/circular.d.ts +0 -10
- package/dist/cjs/canvas/utils/circular.d.ts.map +0 -1
- package/dist/cjs/canvas/utils/conversion.d.ts.map +0 -1
- package/dist/cjs/canvas/utils/conversion.js.map +0 -1
- package/dist/cjs/canvas/utils/customLines.d.ts +0 -3
- package/dist/cjs/canvas/utils/customLines.d.ts.map +0 -1
- package/dist/cjs/canvas/utils/customLines.js.map +0 -1
- package/dist/cjs/canvas/utils/general functions.d.ts.map +0 -1
- package/dist/cjs/canvas/utils/general functions.js.map +0 -1
- package/dist/cjs/canvas/utils/imageProperties.d.ts +0 -62
- package/dist/cjs/canvas/utils/imageProperties.d.ts.map +0 -1
- package/dist/cjs/canvas/utils/imageProperties.js.map +0 -1
- package/dist/cjs/canvas/utils/radius.d.ts +0 -10
- package/dist/cjs/canvas/utils/radius.d.ts.map +0 -1
- package/dist/cjs/canvas/utils/radius.js +0 -30
- package/dist/cjs/canvas/utils/radius.js.map +0 -1
- package/dist/cjs/canvas/utils/textProperties.d.ts.map +0 -1
- package/dist/cjs/canvas/utils/textProperties.js.map +0 -1
- package/dist/esm/ai/functions/generateVoiceResponse.d.ts +0 -10
- package/dist/esm/ai/functions/generateVoiceResponse.d.ts.map +0 -1
- package/dist/esm/ai/functions/generateVoiceResponse.js +0 -161
- package/dist/esm/ai/functions/generateVoiceResponse.js.map +0 -1
- package/dist/esm/ai/modals-chat/gemini/Gemini-flash.d.ts +0 -13
- package/dist/esm/ai/modals-chat/gemini/Gemini-flash.d.ts.map +0 -1
- package/dist/esm/ai/modals-chat/gemini/Gemini-flash.js +0 -185
- package/dist/esm/ai/modals-chat/gemini/Gemini-flash.js.map +0 -1
- package/dist/esm/ai/modals-chat/gemini/Gemini-pro.d.ts +0 -13
- package/dist/esm/ai/modals-chat/gemini/Gemini-pro.d.ts.map +0 -1
- package/dist/esm/ai/modals-chat/gemini/Gemini-pro.js +0 -185
- package/dist/esm/ai/modals-chat/gemini/Gemini-pro.js.map +0 -1
- package/dist/esm/ai/modals-chat/gemini/config.d.ts +0 -5
- package/dist/esm/ai/modals-chat/gemini/config.d.ts.map +0 -1
- package/dist/esm/ai/modals-chat/gemini/config.js +0 -13
- package/dist/esm/ai/modals-chat/gemini/config.js.map +0 -1
- package/dist/esm/ai/modals-chat/gemini/geminiFast.d.ts +0 -15
- package/dist/esm/ai/modals-chat/gemini/geminiFast.d.ts.map +0 -1
- package/dist/esm/ai/modals-chat/gemini/geminiFast.js +0 -146
- package/dist/esm/ai/modals-chat/gemini/geminiFast.js.map +0 -1
- package/dist/esm/canvas/utils/bg.d.ts +0 -23
- package/dist/esm/canvas/utils/bg.d.ts.map +0 -1
- package/dist/esm/canvas/utils/bg.js.map +0 -1
- package/dist/esm/canvas/utils/charts.d.ts.map +0 -1
- package/dist/esm/canvas/utils/charts.js.map +0 -1
- package/dist/esm/canvas/utils/circular.d.ts +0 -10
- package/dist/esm/canvas/utils/circular.d.ts.map +0 -1
- package/dist/esm/canvas/utils/conversion.d.ts.map +0 -1
- package/dist/esm/canvas/utils/conversion.js.map +0 -1
- package/dist/esm/canvas/utils/customLines.d.ts +0 -3
- package/dist/esm/canvas/utils/customLines.d.ts.map +0 -1
- package/dist/esm/canvas/utils/customLines.js.map +0 -1
- package/dist/esm/canvas/utils/general functions.d.ts.map +0 -1
- package/dist/esm/canvas/utils/general functions.js.map +0 -1
- package/dist/esm/canvas/utils/imageProperties.d.ts +0 -62
- package/dist/esm/canvas/utils/imageProperties.d.ts.map +0 -1
- package/dist/esm/canvas/utils/imageProperties.js.map +0 -1
- package/dist/esm/canvas/utils/radius.d.ts +0 -10
- package/dist/esm/canvas/utils/radius.d.ts.map +0 -1
- package/dist/esm/canvas/utils/radius.js +0 -30
- package/dist/esm/canvas/utils/radius.js.map +0 -1
- package/dist/esm/canvas/utils/textProperties.d.ts.map +0 -1
- package/dist/esm/canvas/utils/textProperties.js.map +0 -1
- package/lib/ai/functions/generateVoiceResponse.ts +0 -186
- package/lib/ai/modals-chat/gemini/Gemini-flash.ts +0 -200
- package/lib/ai/modals-chat/gemini/Gemini-pro.ts +0 -203
- package/lib/ai/modals-chat/gemini/config.ts +0 -11
- package/lib/ai/modals-chat/gemini/geminiFast.ts +0 -169
- package/lib/canvas/utils/bg.ts +0 -120
- package/lib/canvas/utils/circular.ts +0 -17
- package/lib/canvas/utils/imageProperties.ts +0 -418
- package/lib/canvas/utils/radius.ts +0 -26
- /package/dist/cjs/canvas/utils/{charts.js → Charts/charts.js} +0 -0
- /package/dist/cjs/canvas/utils/{customLines.js → Custom/customLines.js} +0 -0
- /package/dist/cjs/canvas/utils/{conversion.d.ts → General/conversion.d.ts} +0 -0
- /package/dist/cjs/canvas/utils/{conversion.js → General/conversion.js} +0 -0
- /package/dist/cjs/canvas/utils/{textProperties.js → Texts/textProperties.js} +0 -0
- /package/dist/esm/canvas/utils/{charts.js → Charts/charts.js} +0 -0
- /package/dist/esm/canvas/utils/{customLines.js → Custom/customLines.js} +0 -0
- /package/dist/esm/canvas/utils/{conversion.d.ts → General/conversion.d.ts} +0 -0
- /package/dist/esm/canvas/utils/{conversion.js → General/conversion.js} +0 -0
- /package/dist/esm/canvas/utils/{textProperties.js → Texts/textProperties.js} +0 -0
package/lib/ai/ApexModules.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { Hercai } from 'hercai';
|
|
2
|
-
import translate from "@iamtraction/google-translate";
|
|
3
2
|
import { validateModels } from "./functions/validOptions";
|
|
4
3
|
import { whisper } from './modals-chat/groq/whisper';
|
|
5
4
|
import { connect } from 'verse.db';
|
|
6
5
|
import { otherChatModels } from './modals-chat/others/otherModels';
|
|
7
6
|
import { chatGroq } from './modals-chat/groq/chatgroq';
|
|
8
|
-
import { geminiFast } from './modals-chat/gemini/geminiFast';
|
|
9
7
|
import { groqAnalyzer } from './utils';
|
|
10
8
|
import { electronImagine } from './modals-chat/electronHub/imageModels';
|
|
11
9
|
import { electronChat } from './modals-chat/electronHub/chatmodels';
|
|
@@ -30,7 +28,7 @@ export interface ApexImagineOptions {
|
|
|
30
28
|
image_style?: any;
|
|
31
29
|
width?: number;
|
|
32
30
|
height?: number;
|
|
33
|
-
format?: "jpeg" | "png"
|
|
31
|
+
format?: "jpeg" | "png";
|
|
34
32
|
quality?: number;
|
|
35
33
|
steps?: number;
|
|
36
34
|
seed?: number;
|
|
@@ -48,10 +46,7 @@ async function ApexImagine(model: string, prompt: string, options?: ApexImagineO
|
|
|
48
46
|
const imageType = await validateModels();
|
|
49
47
|
const { Api_Key = 'eaebff6e-c7b2-477c-8edd-9aa91becf1e3', nsfw = false, deepCheck = false, nsfwWords = [], count = 2, negative_prompt = "", sampler = "DPM++ 2M Karras", height = 1024, width = 1024, cfg_scale = 9, steps = 20, seed = -1, image_style = "cinematic" } = options ?? {};
|
|
50
48
|
|
|
51
|
-
const translatedText = await
|
|
52
|
-
from: "auto",
|
|
53
|
-
to: "en"
|
|
54
|
-
});
|
|
49
|
+
const translatedText = await electronChat({ modelName: 'gpt-4o', prompt: `Translate The text below into english:\n\n${prompt}` }) as string;
|
|
55
50
|
|
|
56
51
|
if (count > 4 || count <= 0) throw new Error("Inavlid usage. Count can't be less than 0 or more than 4.");
|
|
57
52
|
if ((width || height) <= 0) throw new Error("Inavlid usage. Image width/height can't be less than 0 or more than 1024.");
|
|
@@ -60,7 +55,7 @@ async function ApexImagine(model: string, prompt: string, options?: ApexImagineO
|
|
|
60
55
|
if (imageType.validHercaiModels.includes(model)) {
|
|
61
56
|
if (model === 'prodia-v2') {
|
|
62
57
|
imageURL = (await hercai.betaDrawImage({
|
|
63
|
-
prompt: translatedText
|
|
58
|
+
prompt: translatedText,
|
|
64
59
|
negative_prompt: negative_prompt,
|
|
65
60
|
sampler: "DPM-Solver",
|
|
66
61
|
image_style: image_style,
|
|
@@ -72,12 +67,12 @@ async function ApexImagine(model: string, prompt: string, options?: ApexImagineO
|
|
|
72
67
|
} else {
|
|
73
68
|
imageURL = (await hercai.drawImage({
|
|
74
69
|
model: model as hercmodals,
|
|
75
|
-
prompt: translatedText
|
|
70
|
+
prompt: translatedText,
|
|
76
71
|
negative_prompt: negative_prompt
|
|
77
72
|
})).url;
|
|
78
73
|
}
|
|
79
74
|
} else if (imageType.validElectronModels.includes(model)) {
|
|
80
|
-
const gen = await electronImagine({ ApiKey: Api_Key as string, prompt: translatedText
|
|
75
|
+
const gen = await electronImagine({ ApiKey: Api_Key as string, prompt: translatedText, modelName: model, resizeOptions: { height, width, format: options?.format, quality: options?.quality } });
|
|
81
76
|
if (gen === null) throw new Error('this model reached rate limit. Provide your own api key from: "https://discord.gg/94qUZWhwFE"');
|
|
82
77
|
imageURL = gen as string
|
|
83
78
|
} else {
|
|
@@ -582,9 +577,9 @@ async function ApexImagine(model: string, prompt: string, options?: ApexImagineO
|
|
|
582
577
|
}
|
|
583
578
|
|
|
584
579
|
if (deepCheck === true) {
|
|
585
|
-
shouldExclude = shouldExclude || NSFWWORDS.some(word => translatedText.
|
|
580
|
+
shouldExclude = shouldExclude || NSFWWORDS.some(word => translatedText.includes(word));
|
|
586
581
|
shouldExclude = shouldExclude || NSFWWORDS.some(word => prompt.includes(word));
|
|
587
|
-
shouldExclude = shouldExclude || nsfwWords.some(word => translatedText.
|
|
582
|
+
shouldExclude = shouldExclude || nsfwWords.some(word => translatedText.includes(word));
|
|
588
583
|
shouldExclude = shouldExclude || nsfwWords.some(word => prompt.includes(word));
|
|
589
584
|
}
|
|
590
585
|
|
|
@@ -600,11 +595,6 @@ async function ApexImagine(model: string, prompt: string, options?: ApexImagineO
|
|
|
600
595
|
async function ApexChat(model: string, prompt: string, { userId, memory, limit, instruction, Api_key }: { userId?: string, memory?: boolean, limit?: number, instruction?: string, Api_key?: string }): Promise<string> {
|
|
601
596
|
try {
|
|
602
597
|
|
|
603
|
-
if (model === 'gemini-flash' || model === 'gemini-pro') {
|
|
604
|
-
const geminiResponse = await geminiFast({ Api_key, modal: model, user: userId, memory, instruction, limit, prompt })
|
|
605
|
-
return geminiResponse
|
|
606
|
-
}
|
|
607
|
-
|
|
608
598
|
let enhancedPrompt: string = prompt;
|
|
609
599
|
let historyChat: string = `- This is Previous chat history between you (System) and the user (User)\n`;
|
|
610
600
|
let commandString: string = ''
|
package/lib/ai/functions/draw.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import translate from "@iamtraction/google-translate";
|
|
2
1
|
import {
|
|
3
2
|
ButtonBuilder,
|
|
4
3
|
StringSelectMenuBuilder,
|
|
@@ -52,9 +51,7 @@ async function aiImagine(
|
|
|
52
51
|
|
|
53
52
|
await message.channel?.sendTyping();
|
|
54
53
|
|
|
55
|
-
const translatedText = await
|
|
56
|
-
translate(textToDraw, { from: "auto", to: "en" })
|
|
57
|
-
);
|
|
54
|
+
const translatedText = await electronChat({ modelName: 'gpt-4o', prompt: `Translate The text below into english:\n\n${prompt}` }) as string;
|
|
58
55
|
|
|
59
56
|
const nsfwWords: string[] = nsfwKeyWords || [
|
|
60
57
|
"2g1c",
|
|
@@ -539,7 +536,7 @@ async function aiImagine(
|
|
|
539
536
|
"ass",
|
|
540
537
|
];
|
|
541
538
|
if (deepCheck) {
|
|
542
|
-
if (translatedText
|
|
539
|
+
if (translatedText && nsfwWords.some(word => translatedText.includes(word))) {
|
|
543
540
|
return message.reply("Warning ⚠️. Your prompt contains **`NSFW/Illegal/Prohibited`** words. Please refrain from doing this.");
|
|
544
541
|
}
|
|
545
542
|
|
|
@@ -553,11 +550,11 @@ async function aiImagine(
|
|
|
553
550
|
|
|
554
551
|
try {
|
|
555
552
|
if (imageModal === 'prodia-v2') {
|
|
556
|
-
response = await retry(() => hercai.betaDrawImage({ prompt: translatedText
|
|
553
|
+
response = await retry(() => hercai.betaDrawImage({ prompt: translatedText, ...enhancer }));
|
|
557
554
|
} else if (imageType.validHercaiModels.includes(imageModal)) {
|
|
558
|
-
response = await retry(() => hercai.drawImage({ model: imageModal, prompt: translatedText
|
|
555
|
+
response = await retry(() => hercai.drawImage({ model: imageModal, prompt: translatedText }));
|
|
559
556
|
} else if (imageType.validElectronModels.includes(imageModal)) {
|
|
560
|
-
response = await electronImagine({ ApiKey: imageAPIS?.electronHubKey as any, prompt: translatedText
|
|
557
|
+
response = await electronImagine({ ApiKey: imageAPIS?.electronHubKey as any, prompt: translatedText, modelName: imageModal, resizeOptions: { width: enhancer.width , height: enhancer.height, format: enhancer.format, quality: enhancer.quality } });
|
|
561
558
|
} else {
|
|
562
559
|
throw new Error("Invalid modal name.");
|
|
563
560
|
}
|
|
@@ -629,6 +626,7 @@ export { aiImagine };
|
|
|
629
626
|
|
|
630
627
|
|
|
631
628
|
import { createCanvas, loadImage } from "@napi-rs/canvas";
|
|
629
|
+
import { electronChat } from "../modals-chat/electronHub/chatmodels";
|
|
632
630
|
|
|
633
631
|
export async function resizeAndSharpen(imageBuffer: Buffer) {
|
|
634
632
|
const originalImage = await loadImage(imageBuffer);
|
|
@@ -15,7 +15,7 @@ export async function electronImagine({
|
|
|
15
15
|
resizeOptions?: {
|
|
16
16
|
width?: number;
|
|
17
17
|
height?: number;
|
|
18
|
-
format?: "jpeg" | "png"
|
|
18
|
+
format?: "jpeg" | "png" ;
|
|
19
19
|
quality?: number;
|
|
20
20
|
};
|
|
21
21
|
}): Promise<string | undefined> {
|
|
@@ -84,11 +84,8 @@ export async function electronImagine({
|
|
|
84
84
|
case "png":
|
|
85
85
|
imageProcessor = imageProcessor.png({ quality });
|
|
86
86
|
break;
|
|
87
|
-
case "webp":
|
|
88
|
-
imageProcessor = imageProcessor.webp({ quality });
|
|
89
|
-
break;
|
|
90
87
|
default:
|
|
91
|
-
|
|
88
|
+
throw Error('We dont support this format only png and jpeg');
|
|
92
89
|
}
|
|
93
90
|
}
|
|
94
91
|
|
package/lib/ai/utils.ts
CHANGED
|
@@ -1,21 +1,17 @@
|
|
|
1
1
|
import { imageReader } from "./functions/imageReader";
|
|
2
2
|
import { chunkString } from "./functions/chunkString";
|
|
3
3
|
import { toDraw } from "./functions/shouldDrawImage";
|
|
4
|
-
import { aiVoice } from "./functions/generateVoiceResponse";
|
|
5
4
|
import { aiImagine } from "./functions/draw";
|
|
6
5
|
import { readFile } from "./functions/readFiles";
|
|
7
6
|
import { ApexChat, ApexImagine, ApexListener, ApexVideo, ApexText2Speech } from "./ApexModules";
|
|
8
7
|
import { typeWriter } from "./functions/typeWriter" ;
|
|
9
8
|
import { groqAnalyzer } from "./modals-chat/groq/imageAnalyzer";
|
|
10
|
-
import { geminiFlash } from "./modals-chat/gemini/Gemini-flash";
|
|
11
|
-
import { geminiPro } from "./modals-chat/gemini/Gemini-pro";
|
|
12
9
|
|
|
13
10
|
|
|
14
11
|
export {
|
|
15
12
|
chunkString,
|
|
16
13
|
imageReader,
|
|
17
14
|
toDraw,
|
|
18
|
-
aiVoice,
|
|
19
15
|
aiImagine,
|
|
20
16
|
readFile,
|
|
21
17
|
ApexChat,
|
|
@@ -23,8 +19,6 @@ export {
|
|
|
23
19
|
ApexListener,
|
|
24
20
|
typeWriter,
|
|
25
21
|
groqAnalyzer,
|
|
26
|
-
geminiFlash,
|
|
27
|
-
geminiPro,
|
|
28
22
|
ApexVideo,
|
|
29
23
|
ApexText2Speech
|
|
30
24
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createCanvas, loadImage, GlobalFonts, Image,
|
|
1
|
+
import { createCanvas, loadImage, GlobalFonts, Image, SKRSContext2D } from "@napi-rs/canvas";
|
|
2
2
|
import GIFEncoder from "gifencoder";
|
|
3
3
|
import ffmpeg from 'fluent-ffmpeg';
|
|
4
4
|
import { PassThrough} from "stream";
|
|
@@ -9,7 +9,9 @@ import { OutputFormat, CanvasConfig, TextObject, ImageProperties, GIFOptions, GI
|
|
|
9
9
|
drawBackgroundGradient, drawBackgroundColor, customBackground, circularBorder, radiusBorder, customLines, applyRotation, applyStroke,
|
|
10
10
|
applyShadow, imageRadius, drawShape, drawText, converter, resizingImg, applyColorFilters, imgEffects,verticalBarChart, pieChart,
|
|
11
11
|
lineChart, cropInner, cropOuter, bgRemoval, detectColors, removeColor, dataURL, base64, arrayBuffer, blob, url, GradientConfig, Frame,
|
|
12
|
-
PatternOptions, ExtractFramesOptions
|
|
12
|
+
PatternOptions, ExtractFramesOptions,
|
|
13
|
+
applyZoom,
|
|
14
|
+
ResizeOptions
|
|
13
15
|
} from "./utils/utils";
|
|
14
16
|
|
|
15
17
|
interface CanvasResults {
|
|
@@ -24,42 +26,75 @@ export class ApexPainter {
|
|
|
24
26
|
this.format = { type: type || 'buffer' };
|
|
25
27
|
}
|
|
26
28
|
|
|
29
|
+
/**
|
|
30
|
+
* Creates a canvas with the given configuration.
|
|
31
|
+
* Applies rotation, shadow, border effects, background, and stroke.
|
|
32
|
+
*
|
|
33
|
+
* @param canvas - The configuration options for the canvas.
|
|
34
|
+
* @returns A promise that resolves to an object containing the image buffer and the canvas config.
|
|
35
|
+
* @throws If the 2D context cannot be retrieved.
|
|
36
|
+
*/
|
|
27
37
|
async createCanvas(canvas: CanvasConfig): Promise<CanvasResults> {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
38
|
+
const {
|
|
39
|
+
width = 500,
|
|
40
|
+
height = 500,
|
|
41
|
+
x = 0,
|
|
42
|
+
y = 0,
|
|
43
|
+
rotation = 0,
|
|
44
|
+
borderRadius = 0,
|
|
45
|
+
customBg,
|
|
46
|
+
gradientBg,
|
|
47
|
+
stroke,
|
|
48
|
+
shadow,
|
|
49
|
+
borderPosition = 'all',
|
|
50
|
+
opacity = 1,
|
|
51
|
+
zoom
|
|
52
|
+
} = canvas;
|
|
53
|
+
|
|
54
|
+
const canvasInstance = createCanvas(width, height);
|
|
55
|
+
const ctx = canvasInstance.getContext('2d') as SKRSContext2D | null;
|
|
35
56
|
if (!ctx) {
|
|
36
|
-
|
|
57
|
+
throw new Error('Unable to get 2D rendering context from canvas');
|
|
37
58
|
}
|
|
59
|
+
|
|
60
|
+
// Set the global opacity for all drawing operations.
|
|
61
|
+
ctx.globalAlpha = opacity;
|
|
38
62
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
applyShadow(ctx,
|
|
42
|
-
|
|
63
|
+
// Apply rotation and shadow.
|
|
64
|
+
applyRotation(ctx, rotation, x, y, width, height);
|
|
65
|
+
applyShadow(ctx, shadow, x, y, width, height);
|
|
66
|
+
|
|
67
|
+
// --- Draw Background With Clipping ---
|
|
68
|
+
// Save state before applying the clip.
|
|
69
|
+
ctx.save();
|
|
43
70
|
if (typeof borderRadius === 'string') {
|
|
44
|
-
|
|
71
|
+
circularBorder(ctx, width, height);
|
|
45
72
|
} else if (typeof borderRadius === 'number') {
|
|
46
|
-
|
|
73
|
+
radiusBorder(ctx, x, y, width, height, borderRadius, borderPosition);
|
|
47
74
|
}
|
|
48
75
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
} else if (canvas.gradientBg) {
|
|
52
|
-
await drawBackgroundGradient(ctx, canvas);
|
|
53
|
-
} else {
|
|
54
|
-
await drawBackgroundColor(ctx, canvas);
|
|
55
|
-
}
|
|
76
|
+
// Option 1: translate context to (x, y) before drawing the background.
|
|
77
|
+
ctx.translate(x, y);
|
|
56
78
|
|
|
57
|
-
|
|
79
|
+
applyZoom(ctx, zoom);
|
|
58
80
|
|
|
59
|
-
|
|
81
|
+
if (customBg) {
|
|
82
|
+
await customBackground(ctx, canvas);
|
|
83
|
+
} else if (gradientBg) {
|
|
84
|
+
await drawBackgroundGradient(ctx, canvas);
|
|
85
|
+
} else {
|
|
86
|
+
await drawBackgroundColor(ctx, canvas);
|
|
87
|
+
}
|
|
88
|
+
// Restore state to remove the clipping region so that stroke is not clipped.
|
|
89
|
+
ctx.restore();
|
|
90
|
+
|
|
91
|
+
// --- Draw Stroke (Outline) ---
|
|
92
|
+
applyStroke(ctx, stroke, x, y, width, height);
|
|
93
|
+
|
|
94
|
+
return { buffer: canvasInstance.toBuffer('image/png'), canvas };
|
|
60
95
|
}
|
|
61
96
|
|
|
62
|
-
|
|
97
|
+
async createImage(images: ImageProperties[], canvasBuffer: CanvasResults | Buffer): Promise<Buffer> {
|
|
63
98
|
|
|
64
99
|
if (!Array.isArray(images)) {
|
|
65
100
|
images = [images];
|
|
@@ -301,7 +336,7 @@ async createGIF(gifFrames: { background: string; duration: number }[], options:
|
|
|
301
336
|
}
|
|
302
337
|
}
|
|
303
338
|
|
|
304
|
-
async resize(resizeOptions:
|
|
339
|
+
async resize(resizeOptions: ResizeOptions) {
|
|
305
340
|
return resizingImg(resizeOptions)
|
|
306
341
|
}
|
|
307
342
|
|
|
@@ -433,7 +468,7 @@ async createGIF(gifFrames: { background: string; duration: number }[], options:
|
|
|
433
468
|
}
|
|
434
469
|
}
|
|
435
470
|
|
|
436
|
-
private async drawImage(ctx:
|
|
471
|
+
private async drawImage(ctx: SKRSContext2D, image: ImageProperties): Promise<void> {
|
|
437
472
|
const { source, x, y, width, height, rotation, borderRadius, stroke, shadow, isFilled, color, gradient, borderPosition, opacity } = image;
|
|
438
473
|
|
|
439
474
|
if (!source || typeof x !== 'number' || typeof y !== 'number' || typeof width !== 'number' || typeof height !== 'number') {
|
|
@@ -562,7 +597,7 @@ async setPatternBackground(buffer:Buffer, options: PatternOptions) {
|
|
|
562
597
|
|
|
563
598
|
const img = await loadImage(buffer);
|
|
564
599
|
const canvas = createCanvas(img.width, img.height);
|
|
565
|
-
const ctx:
|
|
600
|
+
const ctx: SKRSContext2D = canvas.getContext('2d');
|
|
566
601
|
ctx.drawImage(img, 0, 0);
|
|
567
602
|
|
|
568
603
|
const x = options.x || 0;
|
|
@@ -618,7 +653,7 @@ async setPatternBackground(buffer:Buffer, options: PatternOptions) {
|
|
|
618
653
|
* @param y The y offset of the area.
|
|
619
654
|
*/
|
|
620
655
|
async fillWithGradient(
|
|
621
|
-
ctx:
|
|
656
|
+
ctx: SKRSContext2D,
|
|
622
657
|
width: number,
|
|
623
658
|
height: number,
|
|
624
659
|
gradient: GradientConfig,
|
|
@@ -663,7 +698,7 @@ async setPatternBackground(buffer:Buffer, options: PatternOptions) {
|
|
|
663
698
|
* @param y The y offset of the area.
|
|
664
699
|
*/
|
|
665
700
|
async drawDotsPattern(
|
|
666
|
-
ctx:
|
|
701
|
+
ctx: SKRSContext2D,
|
|
667
702
|
width: number,
|
|
668
703
|
height: number,
|
|
669
704
|
options: PatternOptions,
|
|
@@ -695,7 +730,7 @@ async setPatternBackground(buffer:Buffer, options: PatternOptions) {
|
|
|
695
730
|
* @param y The y offset of the area.
|
|
696
731
|
*/
|
|
697
732
|
async drawStripesPattern(
|
|
698
|
-
ctx:
|
|
733
|
+
ctx: SKRSContext2D,
|
|
699
734
|
width: number,
|
|
700
735
|
height: number,
|
|
701
736
|
options: PatternOptions,
|
|
@@ -731,7 +766,7 @@ async setPatternBackground(buffer:Buffer, options: PatternOptions) {
|
|
|
731
766
|
* @param y The y offset of the area.
|
|
732
767
|
*/
|
|
733
768
|
async drawGridPattern(
|
|
734
|
-
ctx:
|
|
769
|
+
ctx: SKRSContext2D,
|
|
735
770
|
width: number,
|
|
736
771
|
height: number,
|
|
737
772
|
options: PatternOptions,
|
|
@@ -769,7 +804,7 @@ async setPatternBackground(buffer:Buffer, options: PatternOptions) {
|
|
|
769
804
|
* @param y The y offset of the area.
|
|
770
805
|
*/
|
|
771
806
|
async drawCheckerboardPattern(
|
|
772
|
-
ctx:
|
|
807
|
+
ctx: SKRSContext2D,
|
|
773
808
|
width: number,
|
|
774
809
|
height: number,
|
|
775
810
|
options: PatternOptions,
|
|
@@ -798,7 +833,7 @@ async setPatternBackground(buffer:Buffer, options: PatternOptions) {
|
|
|
798
833
|
* @param y The y offset of the area.
|
|
799
834
|
*/
|
|
800
835
|
async drawCustomPattern(
|
|
801
|
-
ctx:
|
|
836
|
+
ctx: SKRSContext2D,
|
|
802
837
|
width: number,
|
|
803
838
|
height: number,
|
|
804
839
|
options: PatternOptions,
|
|
@@ -857,7 +892,7 @@ async animate(
|
|
|
857
892
|
const width = frame.width || defaultWidth;
|
|
858
893
|
const height = frame.height || defaultHeight;
|
|
859
894
|
const canvas = createCanvas(width, height);
|
|
860
|
-
const ctx:
|
|
895
|
+
const ctx: SKRSContext2D = canvas.getContext('2d');
|
|
861
896
|
|
|
862
897
|
if (!isNode) {
|
|
863
898
|
canvas.width = width;
|
|
@@ -923,7 +958,7 @@ async animate(
|
|
|
923
958
|
}
|
|
924
959
|
|
|
925
960
|
if (frame.onDrawCustom) {
|
|
926
|
-
frame.onDrawCustom(ctx, canvas);
|
|
961
|
+
frame.onDrawCustom(ctx as unknown as CanvasRenderingContext2D, canvas);
|
|
927
962
|
}
|
|
928
963
|
|
|
929
964
|
if (frame.transformations) {
|
|
@@ -937,7 +972,7 @@ async animate(
|
|
|
937
972
|
|
|
938
973
|
const frameDuration = frame.duration || defaultDuration;
|
|
939
974
|
encoder.setDelay(frameDuration);
|
|
940
|
-
encoder.addFrame(ctx);
|
|
975
|
+
encoder.addFrame(ctx as unknown as CanvasRenderingContext2D);
|
|
941
976
|
}
|
|
942
977
|
|
|
943
978
|
if (options?.onFrame) options.onFrame(i);
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { loadImage, SKRSContext2D } from "@napi-rs/canvas";
|
|
2
|
+
import { CanvasConfig } from '../types';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Draws a gradient background on the canvas.
|
|
8
|
+
* No zoom logic is applied.
|
|
9
|
+
* @param ctx The canvas rendering context.
|
|
10
|
+
* @param canvas The canvas configuration object.
|
|
11
|
+
*/
|
|
12
|
+
export async function drawBackgroundGradient(ctx: SKRSContext2D, canvas: CanvasConfig): Promise<void> {
|
|
13
|
+
if (canvas.gradientBg) {
|
|
14
|
+
const {
|
|
15
|
+
type,
|
|
16
|
+
startX = 0,
|
|
17
|
+
startY = 0,
|
|
18
|
+
endX = canvas.width || 500,
|
|
19
|
+
endY = canvas.height || 500,
|
|
20
|
+
startRadius = 0,
|
|
21
|
+
endRadius = 0,
|
|
22
|
+
colors
|
|
23
|
+
} = canvas.gradientBg;
|
|
24
|
+
|
|
25
|
+
if (!colors || colors.length === 0) {
|
|
26
|
+
throw new Error('You need to provide colors for the gradient.');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let gradient;
|
|
30
|
+
if (type === 'linear' || type === undefined) {
|
|
31
|
+
gradient = ctx.createLinearGradient(startX, startY, endX, endY);
|
|
32
|
+
} else if (type === 'radial') {
|
|
33
|
+
gradient = ctx.createRadialGradient(startX, startY, startRadius, endX, endY, endRadius);
|
|
34
|
+
} else {
|
|
35
|
+
throw new Error('Unsupported gradient type.');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
for (const { stop, color } of colors) {
|
|
39
|
+
gradient.addColorStop(stop as number, color as string);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const canvasWidth = canvas.width || 500;
|
|
43
|
+
const canvasHeight = canvas.height || 500;
|
|
44
|
+
ctx.fillStyle = gradient;
|
|
45
|
+
ctx.fillRect(0, 0, canvasWidth, canvasHeight);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Draws a solid background color on the canvas.
|
|
51
|
+
* No zoom logic is applied.
|
|
52
|
+
* @param ctx The canvas rendering context.
|
|
53
|
+
* @param canvas The canvas configuration object.
|
|
54
|
+
*/
|
|
55
|
+
export async function drawBackgroundColor(ctx: SKRSContext2D, canvas: CanvasConfig): Promise<void> {
|
|
56
|
+
const canvasWidth = canvas.width || 500;
|
|
57
|
+
const canvasHeight = canvas.height || 500;
|
|
58
|
+
|
|
59
|
+
// Fill the entire area starting at (0,0) (assuming translation is handled elsewhere)
|
|
60
|
+
if (canvas.colorBg !== 'transparent') {
|
|
61
|
+
ctx.fillStyle = canvas.colorBg as string;
|
|
62
|
+
ctx.fillRect(0, 0, canvasWidth, canvasHeight);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Draws a custom background image on the canvas.
|
|
68
|
+
* No zoom logic is applied.
|
|
69
|
+
* @param ctx The canvas rendering context.
|
|
70
|
+
* @param canvas The canvas configuration object.
|
|
71
|
+
*/
|
|
72
|
+
export async function customBackground(ctx: SKRSContext2D, canvas: CanvasConfig): Promise<void> {
|
|
73
|
+
if (canvas.customBg) {
|
|
74
|
+
try {
|
|
75
|
+
let imageBuffer: string;
|
|
76
|
+
|
|
77
|
+
if (canvas.customBg.startsWith('http')) {
|
|
78
|
+
imageBuffer = canvas.customBg;
|
|
79
|
+
} else {
|
|
80
|
+
imageBuffer = path.join(process.cwd(), canvas.customBg);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const image = await loadImage(imageBuffer);
|
|
84
|
+
|
|
85
|
+
// Use canvas dimensions without additional x/y translation,
|
|
86
|
+
// because createCanvas already translated the context.
|
|
87
|
+
const canvasWidth = canvas.width || image.width;
|
|
88
|
+
const canvasHeight = canvas.height || image.height;
|
|
89
|
+
|
|
90
|
+
// Draw the image so that it fills the canvas area relative to (0,0)
|
|
91
|
+
ctx.drawImage(image, 0, 0, canvasWidth, canvasHeight);
|
|
92
|
+
|
|
93
|
+
} catch (error: any) {
|
|
94
|
+
console.error('Error loading custom background image:', error.message);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SKRSContext2D } from "@napi-rs/canvas";
|
|
2
|
+
|
|
3
|
+
export function circularBorder(
|
|
4
|
+
ctx: SKRSContext2D,
|
|
5
|
+
width: number,
|
|
6
|
+
height: number,
|
|
7
|
+
radius: number = 0
|
|
8
|
+
): void {
|
|
9
|
+
const minDimension = Math.min(width, height);
|
|
10
|
+
const clipRadius = minDimension / 2 + radius;
|
|
11
|
+
ctx.save();
|
|
12
|
+
ctx.beginPath();
|
|
13
|
+
ctx.arc(width / 2, height / 2, clipRadius, 0, Math.PI * 2);
|
|
14
|
+
ctx.closePath();
|
|
15
|
+
ctx.clip();
|
|
16
|
+
}
|
|
17
|
+
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { SKRSContext2D } from "@napi-rs/canvas";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Applies a radius border (clipping path) to the canvas context with support for selective corner rounding.
|
|
5
|
+
*
|
|
6
|
+
* @param ctx The canvas rendering context.
|
|
7
|
+
* @param x The x-coordinate of the rectangle.
|
|
8
|
+
* @param y The y-coordinate of the rectangle.
|
|
9
|
+
* @param width The width of the rectangle.
|
|
10
|
+
* @param height The height of the rectangle.
|
|
11
|
+
* @param radius The radius for rounding the corners.
|
|
12
|
+
* @param borderPosition Which corners to round. Valid values include:
|
|
13
|
+
* - "all" (default)
|
|
14
|
+
* - "top", "bottom", "left", "right"
|
|
15
|
+
* - "top-left", "top-right", "bottom-left", "bottom-right"
|
|
16
|
+
* - A comma-separated list, e.g. "top, left, bottom" (for three sides) or "top-left, bottom-right"
|
|
17
|
+
*/
|
|
18
|
+
export function radiusBorder(
|
|
19
|
+
ctx: SKRSContext2D,
|
|
20
|
+
x: number = 0,
|
|
21
|
+
y: number = 0,
|
|
22
|
+
width: number,
|
|
23
|
+
height: number,
|
|
24
|
+
radius: number = 0,
|
|
25
|
+
borderPosition: string = 'all'
|
|
26
|
+
): void {
|
|
27
|
+
// Limit the radius to at most half the smallest dimension.
|
|
28
|
+
const minDimension = Math.min(width, height);
|
|
29
|
+
const maxRadius = minDimension / 2;
|
|
30
|
+
const clipRadius = Math.min(radius, maxRadius);
|
|
31
|
+
|
|
32
|
+
// Determine which corners should be rounded.
|
|
33
|
+
let roundTopLeft = false;
|
|
34
|
+
let roundTopRight = false;
|
|
35
|
+
let roundBottomRight = false;
|
|
36
|
+
let roundBottomLeft = false;
|
|
37
|
+
|
|
38
|
+
const bp = borderPosition.trim().toLowerCase();
|
|
39
|
+
|
|
40
|
+
// Simple keyword cases.
|
|
41
|
+
if (bp === 'all') {
|
|
42
|
+
roundTopLeft = roundTopRight = roundBottomRight = roundBottomLeft = true;
|
|
43
|
+
} else if (bp === 'top') {
|
|
44
|
+
roundTopLeft = roundTopRight = true;
|
|
45
|
+
} else if (bp === 'bottom') {
|
|
46
|
+
roundBottomLeft = roundBottomRight = true;
|
|
47
|
+
} else if (bp === 'left') {
|
|
48
|
+
roundTopLeft = roundBottomLeft = true;
|
|
49
|
+
} else if (bp === 'right') {
|
|
50
|
+
roundTopRight = roundBottomRight = true;
|
|
51
|
+
} else if (bp === 'top-left') {
|
|
52
|
+
roundTopLeft = true;
|
|
53
|
+
} else if (bp === 'top-right') {
|
|
54
|
+
roundTopRight = true;
|
|
55
|
+
} else if (bp === 'bottom-left') {
|
|
56
|
+
roundBottomLeft = true;
|
|
57
|
+
} else if (bp === 'bottom-right') {
|
|
58
|
+
roundBottomRight = true;
|
|
59
|
+
} else {
|
|
60
|
+
// For comma-separated lists.
|
|
61
|
+
const positions = bp.split(',').map(s => s.trim());
|
|
62
|
+
roundTopLeft =
|
|
63
|
+
positions.includes('top-left') || (positions.includes('top') && positions.includes('left'));
|
|
64
|
+
roundTopRight =
|
|
65
|
+
positions.includes('top-right') || (positions.includes('top') && positions.includes('right'));
|
|
66
|
+
roundBottomRight =
|
|
67
|
+
positions.includes('bottom-right') || (positions.includes('bottom') && positions.includes('right'));
|
|
68
|
+
roundBottomLeft =
|
|
69
|
+
positions.includes('bottom-left') || (positions.includes('bottom') && positions.includes('left'));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Determine the effective radius for each corner.
|
|
73
|
+
const tl = roundTopLeft ? clipRadius : 0;
|
|
74
|
+
const tr = roundTopRight ? clipRadius : 0;
|
|
75
|
+
const br = roundBottomRight ? clipRadius : 0;
|
|
76
|
+
const bl = roundBottomLeft ? clipRadius : 0;
|
|
77
|
+
|
|
78
|
+
ctx.save();
|
|
79
|
+
ctx.beginPath();
|
|
80
|
+
// Start at top-left.
|
|
81
|
+
ctx.moveTo(x + tl, y);
|
|
82
|
+
// Top edge: move to top-right.
|
|
83
|
+
ctx.lineTo(x + width - tr, y);
|
|
84
|
+
if (tr > 0) {
|
|
85
|
+
ctx.quadraticCurveTo(x + width, y, x + width, y + tr);
|
|
86
|
+
} else {
|
|
87
|
+
ctx.lineTo(x + width, y);
|
|
88
|
+
}
|
|
89
|
+
// Right edge: move to bottom-right.
|
|
90
|
+
ctx.lineTo(x + width, y + height - br);
|
|
91
|
+
if (br > 0) {
|
|
92
|
+
ctx.quadraticCurveTo(x + width, y + height, x + width - br, y + height);
|
|
93
|
+
} else {
|
|
94
|
+
ctx.lineTo(x + width, y + height);
|
|
95
|
+
}
|
|
96
|
+
// Bottom edge: move to bottom-left.
|
|
97
|
+
ctx.lineTo(x + bl, y + height);
|
|
98
|
+
if (bl > 0) {
|
|
99
|
+
ctx.quadraticCurveTo(x, y + height, x, y + height - bl);
|
|
100
|
+
} else {
|
|
101
|
+
ctx.lineTo(x, y + height);
|
|
102
|
+
}
|
|
103
|
+
// Left edge: move back to top-left.
|
|
104
|
+
ctx.lineTo(x, y + tl);
|
|
105
|
+
if (tl > 0) {
|
|
106
|
+
ctx.quadraticCurveTo(x, y, x + tl, y);
|
|
107
|
+
} else {
|
|
108
|
+
ctx.lineTo(x, y);
|
|
109
|
+
}
|
|
110
|
+
ctx.closePath();
|
|
111
|
+
ctx.clip();
|
|
112
|
+
// Note: We do not call ctx.restore() here because we want the clipping region to remain.
|
|
113
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createCanvas, loadImage } from '@napi-rs/canvas';
|
|
2
|
-
import { barChart_1, bgConfig, DataItem, KeyBoxConfig, PieDataConfig, PieChartData, LineChartConfig, DataPoint } from "
|
|
2
|
+
import { barChart_1, bgConfig, DataItem, KeyBoxConfig, PieDataConfig, PieChartData, LineChartConfig, DataPoint } from "../types";
|
|
3
3
|
import path from 'path';
|
|
4
4
|
|
|
5
5
|
|