经过一番研究,找到了底层的贴图函数之后,加入了一个写中文字符串的函数,8 H5 I- w+ ? `! [
目前已经可以往屏幕上写中文字符串了。
T# u! u2 r8 G, s3 D& X* G% p5 `
4 `" w' @/ C/ k3 \汉化抓图
4 d' a4 z2 w. K* e# d2 H
/ k, |! @! w. [1 L. c, _$ G9 v3 v. d$ ~
代码1 N7 {2 q( y0 ^
backends\graphics\opengl\texture.cpp9 K4 ~9 E, `" }8 v' r
- void Surface::copyRectToTexture(uint x, uint y, uint w, uint h, const void *srcPtr, uint srcPitch) {
% h9 O3 d3 X% P! {2 X - copyRectToTextureOld(x, y, w , h , srcPtr, srcPitch);
& u# F: S% a5 F, z9 I4 e: t - //add by shane007
( N' \. n/ ?( G% E - drawStringToSurface(); _7 }( w* ~1 e/ R d, P
- }
$ L' V5 S: E5 ?& w5 _; s. E) y
1 Z5 d' d, F; z2 e% \& g/ D- //add by shane007
4 Q. o( r, u/ M - void Surface::drawStringToSurface() {
: P8 N! j1 T' x5 n0 y+ E" y
* ~7 d" M5 ]) a& q# ]- Graphics::Surface *dstSurf = getSurface();# D+ |# y ^' r- ^
- // 在Surface上显示字符串1 Q) P; a& ?/ ^2 t0 _
- int x = 100;
. O3 W1 D1 @. e/ n4 U - int y = 300;4 e. G! a. K+ x% c
- int charWidth = 16;
9 ?7 e. r5 J! f+ D! q - int charHeight = 16;
! i4 Q' N1 _! }( X+ Z7 g - int color = 0x0000ff; //0x00BBGGRR
, U: M, `8 [: d: I- ]0 h; \' A. J" _ - const uint pitch = dstSurf->pitch;1 j$ s% \/ F; H7 N ]( _
- const uint bytesPerPixel = dstSurf->format.bytesPerPixel;
1 k( j+ ?9 C' G3 X8 S- N9 J
$ I: v0 h' w# l C8 M! S- unsigned char *dst;6 C/ g6 ~4 r% v* h/ \: D* P
- const char *str = "中文测试";8 u, ^! v$ Q, n
0 C+ w1 E( q/ S; T$ d. i- for (int i = 0; str[i] != '\0'; i = i+2) {
9 p Y% B1 z& N8 P" ]( r4 u/ H( R - int ch = (unsigned char)str[i];
$ z; w" O6 S( q9 r* E7 z& U - int ch2 = (unsigned char)str[i + 1];3 C7 L6 h, L8 j; P
- int idx = (ch - 0xa1) * 94 + (ch2 - 0xa1);
' T; [7 `0 ~9 r6 W/ }: J4 | u - const unsigned char *fontData = hzk16_data + 32 * idx;* A. j7 t" J3 }6 m9 ?
- dst = (unsigned char *)dstSurf->getPixels() + y * pitch + (x + (i/2) * charWidth) * bytesPerPixel;
0 r% J& [; D9 J- S - 7 i9 p6 i8 P8 s( H; n
- for (int row = 0; row < charHeight; ++row) {5 ?8 m7 p/ B" b: L
- for (int col = 0; col < charWidth; ++col) {
! d: M( r# ~9 R" F3 a - unsigned char pixelByte = fontData[row * 2 + col / 8]; // 每行对应2个字节1 y) W5 a0 v" q! w9 j+ _- f
- unsigned char pixelBit = (pixelByte >> (7 - (col % 8))) & 0x01; // 提取像素对应的位+ p, ~7 Q5 {( U9 Q" I) o
" P3 U/ p! T$ s' ?; ]- if (pixelBit == 1) {
3 T: t3 O: R; z% c5 p - // 设置像素颜色
; T U1 l1 J/ ?4 r - uint32 *pixel = (uint32 *)dst;& i6 k% _0 X# I' u+ r
- *pixel = color;
" T- K$ S2 F/ l( C0 _. ? - }
4 a! t. F' Q* g$ A+ u# z1 C - dst += bytesPerPixel;- H9 }2 N8 B' @% n( d6 f# h% P7 {; J3 @
- }1 R0 b" P a6 T {2 I
- dst += pitch - charWidth * bytesPerPixel; // 跳到下一行的起始位置3 W$ x5 X" H- K. Z" |
- }% @) a+ q+ l5 C h
- }* P: l+ M z* T
- }
复制代码 $ B8 }& u7 u( C# ]3 H( o5 ]2 u
* J' l4 i' q% }. o1 ?" [, q
|