经过一番研究,找到了底层的贴图函数之后,加入了一个写中文字符串的函数,! O, ` d7 s+ |9 `( ]7 ~" |' c
目前已经可以往屏幕上写中文字符串了。7 N6 A2 R* i# h" f3 P2 N
' k6 u9 u, W% u# t0 X汉化抓图
7 ^; v) |8 }4 l3 [, |7 G5 b3 @! X, V7 [2 `
! `7 |! i- F7 w" Q+ }) `/ s
代码4 V1 c5 ^: S3 R D9 W
backends\graphics\opengl\texture.cpp
_2 {' v* A8 J0 _- void Surface::copyRectToTexture(uint x, uint y, uint w, uint h, const void *srcPtr, uint srcPitch) {& b9 _& O) n- W! r4 n
- copyRectToTextureOld(x, y, w , h , srcPtr, srcPitch);
. N6 B8 l2 |! U7 d* w4 ?% W - //add by shane007
$ c$ P- E2 o I# Y2 s+ q - drawStringToSurface();
. m6 y5 j. _9 _- p; h6 r1 o - }
$ m2 ?1 W& I: p' D - 7 {; S) P, X& u, L
- //add by shane007* x, \, \" i, q4 f3 E) J
- void Surface::drawStringToSurface() {+ l, ?; k/ K7 F0 E0 u
- ) a2 D. _" _( \4 T6 k# i
- Graphics::Surface *dstSurf = getSurface();) j i( X! \4 m) s6 W9 O7 L
- // 在Surface上显示字符串" x- O, L2 `2 i' W- v$ N
- int x = 100;
; H8 C0 ? x( H9 I( M% M - int y = 300;/ E- |- h5 g9 F7 }4 z( g; ^
- int charWidth = 16;
5 B; X% X- w3 W* [/ A n3 ]8 @6 O; U - int charHeight = 16;
+ b: ]1 @, P4 N" }$ v% X7 K - int color = 0x0000ff; //0x00BBGGRR
5 U! `* X- B# i8 |- i+ @1 h - const uint pitch = dstSurf->pitch;
- g4 X) W# I- ?& n9 W - const uint bytesPerPixel = dstSurf->format.bytesPerPixel;! _" }* O# ]" ^
- ! c5 g$ T# ?0 C& R S5 J
- unsigned char *dst;
) ?6 i+ m; U) T4 b - const char *str = "中文测试";
# \; u% L4 z/ I. g# `* q - & n i1 ]: [$ M1 V) d
- for (int i = 0; str[i] != '\0'; i = i+2) {0 I6 a: D& W! O
- int ch = (unsigned char)str[i];" V% C: B2 B& w% u% Y9 K
- int ch2 = (unsigned char)str[i + 1];$ t" A1 s E# C# X
- int idx = (ch - 0xa1) * 94 + (ch2 - 0xa1);
' x# l" R3 q8 ^ - const unsigned char *fontData = hzk16_data + 32 * idx;
: i8 o; n( ^1 x8 v! Q& E. L - dst = (unsigned char *)dstSurf->getPixels() + y * pitch + (x + (i/2) * charWidth) * bytesPerPixel;
" {- r3 G/ [ V( u; s/ u
0 O. n+ h. j& F; u- for (int row = 0; row < charHeight; ++row) {
! m, ^3 J0 z& X4 c. t - for (int col = 0; col < charWidth; ++col) {
! d: M0 N& \: Z5 J% c/ \ - unsigned char pixelByte = fontData[row * 2 + col / 8]; // 每行对应2个字节
0 A; I2 p" y" d9 O - unsigned char pixelBit = (pixelByte >> (7 - (col % 8))) & 0x01; // 提取像素对应的位. q! x) \: N! H. f) g. n9 t
- 6 z) t' u) f+ N- d. g6 ^) r$ _" ]" m
- if (pixelBit == 1) {% X# a, d7 t: a, p2 x
- // 设置像素颜色
$ [2 \; o; D" Z: ?1 x: `* m - uint32 *pixel = (uint32 *)dst;
1 m* q: M4 k% q3 v - *pixel = color;) v. c5 ?; ?0 u) y, \3 O: I; |5 i
- }# R: q. F4 M! |( B2 O0 T
- dst += bytesPerPixel;
* n E) |4 a! t; Q+ S. _ - }
3 z7 P! A' N: v& K - dst += pitch - charWidth * bytesPerPixel; // 跳到下一行的起始位置
. w3 b# E1 Y8 ?) _ - }1 A6 r. {# l' G% V& H
- }
/ Q& A. L. E% z% ]( Q' S8 d5 [ - }
复制代码
; J, h$ Y G: Y! F7 w/ b$ T
4 y D4 c1 [; B y" ] |