Skip to content

Commit 0d3abd3

Browse files
committed
attempt to show differences by ctx.lang
1 parent a862af8 commit 0d3abd3

File tree

4 files changed

+46
-1
lines changed

4 files changed

+46
-1
lines changed

index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ export class CanvasRenderingContext2D {
291291
textAlign: CanvasTextAlign;
292292
canvas: Canvas;
293293
direction: 'ltr' | 'rtl';
294+
lang: string;
294295
}
295296

296297
export class CanvasGradient {

src/CanvasRenderingContext2d.cc

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,8 @@ Context2d::Initialize(Napi::Env& env, Napi::Object& exports) {
162162
InstanceAccessor<&Context2d::GetFont, &Context2d::SetFont>("font", napi_default_jsproperty),
163163
InstanceAccessor<&Context2d::GetTextBaseline, &Context2d::SetTextBaseline>("textBaseline", napi_default_jsproperty),
164164
InstanceAccessor<&Context2d::GetTextAlign, &Context2d::SetTextAlign>("textAlign", napi_default_jsproperty),
165-
InstanceAccessor<&Context2d::GetDirection, &Context2d::SetDirection>("direction", napi_default_jsproperty)
165+
InstanceAccessor<&Context2d::GetDirection, &Context2d::SetDirection>("direction", napi_default_jsproperty),
166+
InstanceAccessor<&Context2d::GetLanguage, &Context2d::SetLanguage>("lang", napi_default_jsproperty)
166167
});
167168

168169
exports.Set("CanvasRenderingContext2d", ctor);
@@ -786,6 +787,28 @@ Context2d::SetDirection(const Napi::CallbackInfo& info, const Napi::Value& value
786787
state->direction = dir;
787788
}
788789

790+
/*
791+
* Get language.
792+
*/
793+
Napi::Value
794+
Context2d::GetLanguage(const Napi::CallbackInfo& info) {
795+
return Napi::String::New(env, state->lang);
796+
}
797+
798+
/*
799+
* Set language.
800+
*/
801+
void
802+
Context2d::SetLanguage(const Napi::CallbackInfo& info, const Napi::Value& value) {
803+
if (!value.IsString()) return;
804+
805+
std::string lang = value.As<Napi::String>();
806+
state->lang = lang;
807+
808+
pango_context_set_language(pango_layout_get_context(_layout), pango_language_from_string(lang.c_str()));
809+
pango_cairo_update_layout(context(), _layout);
810+
}
811+
789812
/*
790813
* Put image data.
791814
*

src/CanvasRenderingContext2d.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ struct canvas_state_t {
3636
canvas_draw_mode_t textDrawingMode = TEXT_DRAW_PATHS;
3737
bool imageSmoothingEnabled = true;
3838
std::string direction = "ltr";
39+
std::string lang = "";
3940

4041
canvas_state_t() {
4142
fontDescription = pango_font_description_from_string("sans");
@@ -157,6 +158,7 @@ class Context2d : public Napi::ObjectWrap<Context2d> {
157158
Napi::Value GetFont(const Napi::CallbackInfo& info);
158159
Napi::Value GetTextBaseline(const Napi::CallbackInfo& info);
159160
Napi::Value GetTextAlign(const Napi::CallbackInfo& info);
161+
Napi::Value GetLanguage(const Napi::CallbackInfo& info);
160162
void SetPatternQuality(const Napi::CallbackInfo& info, const Napi::Value& value);
161163
void SetImageSmoothingEnabled(const Napi::CallbackInfo& info, const Napi::Value& value);
162164
void SetGlobalCompositeOperation(const Napi::CallbackInfo& info, const Napi::Value& value);
@@ -179,6 +181,7 @@ class Context2d : public Napi::ObjectWrap<Context2d> {
179181
void SetFont(const Napi::CallbackInfo& info, const Napi::Value& value);
180182
void SetTextBaseline(const Napi::CallbackInfo& info, const Napi::Value& value);
181183
void SetTextAlign(const Napi::CallbackInfo& info, const Napi::Value& value);
184+
void SetLanguage(const Napi::CallbackInfo& info, const Napi::Value& value);
182185
#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 16, 0)
183186
void BeginTag(const Napi::CallbackInfo& info);
184187
void EndTag(const Napi::CallbackInfo& info);

test/canvas.test.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,24 @@ describe('Canvas', function () {
486486
assert.equal(ctx.font, '15px Arial, sans-serif')
487487
})
488488

489+
it('Context2d#lang=', function () {
490+
const canvas1 = createCanvas(200, 200)
491+
const ctx1 = canvas1.getContext('2d')
492+
assert.equal(ctx1.lang, '')
493+
ctx1.font = '20px sans-serif';
494+
ctx1.lang = 'ja'
495+
assert.equal(ctx1.lang, 'ja')
496+
ctx1.fillText('门', 10, 10)
497+
498+
const canvas2 = createCanvas(200, 200)
499+
const ctx2 = canvas2.getContext('2d')
500+
ctx2.font = '20px sans-serif';
501+
ctx2.lang = 'zh'
502+
ctx2.fillText('门', 10, 10)
503+
504+
assert.notDeepEqual(ctx1.getImageData(10, 10, 40, 40), ctx2.getImageData(10, 10, 40, 40))
505+
})
506+
489507
it('Context2d#lineWidth=', function () {
490508
const canvas = createCanvas(200, 200)
491509
const ctx = canvas.getContext('2d')

0 commit comments

Comments
 (0)