经过一番研究,找到了底层的贴图函数之后,加入了一个写中文字符串的函数,
" [* C& @4 Q9 K- r4 o5 ]目前已经可以往屏幕上写中文字符串了。8 t$ H$ z& t. D+ X* e4 G
' w9 D' l' E7 n j- J" o( C% t汉化抓图
3 g" h5 `4 Q( X: t' E" i& k, ?1 J. _
$ z2 F9 P7 _) {% x代码
9 l' R& s: ]6 ^1 f4 N! ^backends\graphics\opengl\texture.cpp8 m/ c: l/ [) |0 e0 e
- void Surface::copyRectToTexture(uint x, uint y, uint w, uint h, const void *srcPtr, uint srcPitch) {
& q/ o% G% P* i0 F! K4 F. x - copyRectToTextureOld(x, y, w , h , srcPtr, srcPitch);4 b; c( z( x' H
- //add by shane007- Y: o( I" W, P% F. [
- drawStringToSurface();* U: Q$ k2 `4 M3 P$ A9 U: ^
- }5 ` ~5 s. X( X# H8 ^
- % Y) W4 Y* M# r
- //add by shane007
" G4 w0 c2 c. B6 ^7 P1 p - void Surface::drawStringToSurface() {
. y8 ^7 r# p1 |4 U+ v# g7 f7 ]
( v: P1 i& }( ], s. H# g1 A- Graphics::Surface *dstSurf = getSurface();
1 F8 ~: g2 |/ O - // 在Surface上显示字符串
9 N7 Z; \+ e) |4 l$ M$ s1 g0 l - int x = 100;# G4 b' G. F& j1 y. @8 {
- int y = 300;, {* r1 t! X/ S! ^; w2 s7 E9 \
- int charWidth = 16;
; x) I* m' H# {7 E5 \3 S& B$ D9 L - int charHeight = 16;2 [/ P4 F7 }+ a! h& l# E k
- int color = 0x0000ff; //0x00BBGGRR
+ c7 I) Z1 t9 ^& J! D* J) ^& X4 k - const uint pitch = dstSurf->pitch;
: [, q) x+ q6 f" \ - const uint bytesPerPixel = dstSurf->format.bytesPerPixel;8 k; C( Y( Z0 e7 `8 Y7 J3 `
- - Q: P6 c' v5 A: @1 e
- unsigned char *dst;
$ f0 c) d. }3 C) ` - const char *str = "中文测试";5 D* L0 |5 S# u$ Y6 H. l
- n( I, V2 y: L% n; b; u0 @; d6 I- for (int i = 0; str[i] != '\0'; i = i+2) {
+ G% O2 c7 ?- O8 c - int ch = (unsigned char)str[i];( z7 a. P. H& v' \1 f% E
- int ch2 = (unsigned char)str[i + 1];$ z& g5 h3 P) ~/ k% ]/ n+ h
- int idx = (ch - 0xa1) * 94 + (ch2 - 0xa1);
1 `3 n3 `5 c$ c - const unsigned char *fontData = hzk16_data + 32 * idx;* ]$ Z6 n( p/ o
- dst = (unsigned char *)dstSurf->getPixels() + y * pitch + (x + (i/2) * charWidth) * bytesPerPixel;
% r& b+ B6 T! f/ T - ' Y; f: t! r2 y0 q C) S' I
- for (int row = 0; row < charHeight; ++row) {9 V' @: q- J: }: G
- for (int col = 0; col < charWidth; ++col) {
& `8 T) S" } _; A9 { O; b - unsigned char pixelByte = fontData[row * 2 + col / 8]; // 每行对应2个字节
& W' o) f/ K# \0 A: _$ z1 i - unsigned char pixelBit = (pixelByte >> (7 - (col % 8))) & 0x01; // 提取像素对应的位. _5 C2 A( J7 k" U7 \' L1 Q
0 V8 P- `& |/ x2 s7 \0 T- if (pixelBit == 1) {
; f y8 u% ~7 y - // 设置像素颜色" z9 V8 P) g$ x3 |( l# Q2 i2 e. Q9 c2 ]
- uint32 *pixel = (uint32 *)dst;! |9 h$ N- G) _7 }/ E
- *pixel = color;
1 w: c$ R: }. ^0 U - }$ o& L7 P7 g: |" ^0 x3 i4 t8 Z4 v
- dst += bytesPerPixel;3 b5 [0 X/ Y* [( R1 T
- }9 J5 `5 m1 D# b& T8 V% p
- dst += pitch - charWidth * bytesPerPixel; // 跳到下一行的起始位置
1 r6 s3 A1 T+ }7 | - }% ?" h1 w E( q3 b
- }! P9 G8 f+ s! A+ E
- }
复制代码 2 Q8 ^% U0 z8 @) f2 W8 B D/ G
/ u6 M5 B8 w) Y% s/ Y. P7 z |