经过一番研究,找到了底层的贴图函数之后,加入了一个写中文字符串的函数,
3 _! {1 S8 |7 q/ x目前已经可以往屏幕上写中文字符串了。
9 c2 _, Q2 p" t2 n9 [- E1 z9 [5 h1 [, A3 \
汉化抓图
# e( ~ i3 p) m4 a
. b" d* C/ s7 ]6 d) B/ s, B$ H7 i
代码
% W0 t& J2 X' Z9 r' \9 r0 _' Qbackends\graphics\opengl\texture.cpp
: k" ?8 A" t/ ~, W- void Surface::copyRectToTexture(uint x, uint y, uint w, uint h, const void *srcPtr, uint srcPitch) {
' B( I! y% l8 e9 L% B7 s - copyRectToTextureOld(x, y, w , h , srcPtr, srcPitch);6 P# V, Z' d7 K7 _0 S2 E% d
- //add by shane0073 P) O0 `8 D6 H1 y
- drawStringToSurface();4 b& V: @" U9 r8 t; P
- }
1 w8 [8 I, I$ `+ X
M6 l' {) {' u3 y/ M- //add by shane007( \- L- ~+ }) Q
- void Surface::drawStringToSurface() {$ @7 D9 [/ \& V1 b
- ; R, V. B. P9 l
- Graphics::Surface *dstSurf = getSurface();* \% t, ?6 f8 X# T6 l! @
- // 在Surface上显示字符串
8 Q% \/ _! c8 v5 _) y - int x = 100;9 F" U+ V* v# [ e5 T( ]' Y
- int y = 300;9 z( Y, Z4 B s. | g3 i* Z- u' g: W+ c
- int charWidth = 16;( l4 g ^2 [* H5 N
- int charHeight = 16;9 R; T6 q' \8 v) j3 j: {: a( o1 O
- int color = 0x0000ff; //0x00BBGGRR% B; ^$ @% s) j; v: F
- const uint pitch = dstSurf->pitch;6 E9 e1 z8 a% s& c) ~/ Y0 e
- const uint bytesPerPixel = dstSurf->format.bytesPerPixel;8 |% u% S: Z( A+ x% f% p. ~, S
- 1 J& p5 S1 t0 W! N( d; f9 G1 K
- unsigned char *dst; G( W1 q% }/ U: ]* R; w! @. q
- const char *str = "中文测试";
6 `% }4 q( v: {$ n1 o; }
3 |; j |5 }( L7 v! H- for (int i = 0; str[i] != '\0'; i = i+2) {
+ ?6 n; \7 l/ B8 y3 V - int ch = (unsigned char)str[i];. b- ^: T; @, L8 E7 J' G
- int ch2 = (unsigned char)str[i + 1];( Z: \$ E1 G3 k
- int idx = (ch - 0xa1) * 94 + (ch2 - 0xa1);5 P4 |. |7 |/ F# x. g5 U4 y
- const unsigned char *fontData = hzk16_data + 32 * idx;9 ?; M# A8 P1 L% \( @; i
- dst = (unsigned char *)dstSurf->getPixels() + y * pitch + (x + (i/2) * charWidth) * bytesPerPixel;
' E. W0 Q! E& n
/ u2 r& W' j* H% p* Z- for (int row = 0; row < charHeight; ++row) {4 u$ x% G: z" Q" U0 N
- for (int col = 0; col < charWidth; ++col) {2 K6 _3 j0 ^, E1 L3 ~9 X
- unsigned char pixelByte = fontData[row * 2 + col / 8]; // 每行对应2个字节$ G' `: v8 a8 ~. z$ t
- unsigned char pixelBit = (pixelByte >> (7 - (col % 8))) & 0x01; // 提取像素对应的位0 C( e) o/ W+ x, S: x
4 E5 d# W8 y/ Z% ^- if (pixelBit == 1) {* y2 P1 \8 Y, m1 Z2 t% X
- // 设置像素颜色% h0 m% s+ c! I/ z2 X
- uint32 *pixel = (uint32 *)dst;
$ C9 _) h7 T* s& Y: Q - *pixel = color;6 {6 c( A+ h) L7 P
- }! H: n7 p. u5 t: o8 @
- dst += bytesPerPixel;
& y, d! v0 P. h$ V( v, ^2 M0 y, M - }1 h+ _1 j3 A G' z$ k4 P$ G1 M1 H% X4 B
- dst += pitch - charWidth * bytesPerPixel; // 跳到下一行的起始位置
) j" t1 h- s$ i) i% t/ z4 ? - }
% E+ B4 u, N, W2 B - }
8 |$ G8 Z' U# S) N- v5 w0 Z - }
复制代码 4 b3 w% D3 D" l5 i
% `( k! o1 b+ W
|