├── .gitignore ├── LICENSE ├── README.md ├── rastafont.h ├── rastafont6x8.c ├── rastafont8x12.c ├── rastafont8x8.c ├── rastafontgpu.cpp └── rastafontgpu.hlsl /.gitignore: -------------------------------------------------------------------------------- 1 | *.exe 2 | *.obj 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013 Yuriy O'Donnell 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Rastafont 2 | ========= 3 | 4 | This library is intended for embedding simple raster font rendering into applications. 5 | It comes with 3 sizes of Terminal font: 6x8, 8x8 and 12x8 pixels. 6 | Characters are composited into the target 32bpp RGBA image using a 1-bit mask (not alpha blended). 7 | Only code page 437 characters ' ' (32) to '~' (126) are supported. 8 | Tabs, line breaks, etc. are not handled. An empty space will be emitted for unsupported characters. 9 | No bounds checking or other error handling is performed, so the output buffer must be big enough. 10 | 11 | Example usage: 12 | 13 | const unsigned width = 5*8; // 5 characters, 8 pixels each 14 | const unsigned height = 12; // image must be at least 12 pixels high 15 | const unsigned pitch = width*sizeof(unsigned); // size in bytes of pixel row in target image 16 | unsigned pixels[width*height] = {0}; // allocate and clear a 32bpp RGBA output buffer 17 | rastafont8x12_blit_string(pixels, pitch, 0xFFFFFFFF, "Hello"); 18 | -------------------------------------------------------------------------------- /rastafont.h: -------------------------------------------------------------------------------- 1 | #ifndef __RASTAFONT_H__20131108__ 2 | #define __RASTAFONT_H__20131108__ 3 | 4 | #ifdef __cplusplus 5 | extern "C" { 6 | #endif 7 | 8 | void rastafont6x8_blit_string(unsigned* output, unsigned pitch, unsigned colour, const char* str); 9 | void rastafont8x8_blit_string(unsigned* output, unsigned pitch, unsigned colour, const char* str); 10 | void rastafont8x12_blit_string(unsigned* output, unsigned pitch, unsigned colour, const char* str); 11 | 12 | #ifdef __cplusplus 13 | }; 14 | #endif 15 | 16 | #endif //__RASTAFONT_H__20131108__ 17 | -------------------------------------------------------------------------------- /rastafont6x8.c: -------------------------------------------------------------------------------- 1 | #include "rastafont.h" 2 | 3 | #if defined(_MSC_VER) 4 | #elif defined(__GNUC__) 5 | #define __forceinline inline __attribute__((always_inline)) 6 | #else 7 | #define __forceinline 8 | #endif 9 | 10 | static const unsigned rastafont6x8_bitmap[] = 11 | { 12 | 0xffffffff,0xffffffff,0xfbf1f1fb,0xfffbfffb,0xfff6e4e4,0xffffffff,0xf5e0f5ff,0xfff5e0f5, 13 | 0xf9fef1fd,0xfffbf8f7,0xfbf7ecec,0xffe6e6fd,0xfdfafafd,0xffe9f6ea,0xfffdf9f9,0xffffffff, 14 | 0xfdfdfdfb,0xfffbfdfd,0xfbfbfbfd,0xfffdfbfb,0xe0f1f5ff,0xfffff5f1,0xe0fbfbff,0xfffffbfb, 15 | 0xffffffff,0xfdf9f9ff,0xe0ffffff,0xffffffff,0xffffffff,0xfff9f9ff,0xfbf7efff,0xfffffefd, 16 | 0xeae6eef1,0xfff1eeec,0xfbfbf9fb,0xfff1fbfb,0xf3efeef1,0xffe0fefd,0xf1efeef1,0xfff1eeef, 17 | 0xf6f5f3f7,0xfff7f7e0,0xf0fefee0,0xfff1eeef,0xf0fefdf3,0xfff1eeee,0xfbf7efe0,0xfffdfdfd, 18 | 0xf1eeeef1,0xfff1eeee,0xe1eeeef1,0xfff9f7ef,0xf9f9ffff,0xfff9f9ff,0xf9f9ffff,0xfdf9f9ff, 19 | 0xfefdfbf7,0xfff7fbfd,0xffe0ffff,0xffffe0ff,0xeff7fbfd,0xfffdfbf7,0xf3efeef1,0xfffbfffb, 20 | 0xeae2eef1,0xfff1fee2,0xeeeeeef1,0xffeeeee0,0xf0eeeef0,0xfff0eeee,0xfefeeef1,0xfff1eefe, 21 | 0xeeeeeef0,0xfff0eeee,0xf0fefee0,0xffe0fefe,0xf0fefee0,0xfffefefe,0xe2feeef1,0xffe1eeee, 22 | 0xe0eeeeee,0xffeeeeee,0xfbfbfbf1,0xfff1fbfb,0xefefefef,0xfff1eeee,0xfcfaf6ee,0xffeef6fa, 23 | 0xfefefefe,0xffe0fefe,0xeeeae4ee,0xffeeeeee,0xe6eaecee,0xffeeeeee,0xeeeeeef1,0xfff1eeee, 24 | 0xf0eeeef0,0xfffefefe,0xeeeeeef1,0xffe9f6ea,0xf0eeeef0,0xffeeeef6,0xf1feeef1,0xfff1eeef, 25 | 0xfbfbfbe0,0xfffbfbfb,0xeeeeeeee,0xfff1eeee,0xeeeeeeee,0xfffbf5ee,0xeaeaeeee,0xfff5eaea, 26 | 0xfbf5eeee,0xffeeeef5,0xf5eeeeee,0xfffbfbfb,0xfdfbf7f0,0xfff0fefe,0xfdfdfdf1,0xfff1fdfd, 27 | 0xfbfdfeff,0xffffeff7,0xf7f7f7f1,0xfff1f7f7,0xffeef5fb,0xdfffffff,0xffffffff,0xe0ffffff, 28 | 0xfffbf9f9,0xffffffff,0xeff1ffff,0xffe1eee1,0xeef0fefe,0xfff0eeee,0xeef1ffff,0xfff1eefe, 29 | 0xeee1efef,0xffe1eeee,0xeef1ffff,0xfff1fef0,0xf0fdfdf3,0xfffdfdfd,0xeee1ffff,0xf1efe1ee, 30 | 0xf6f8fefe,0xfff6f6f6,0xfbfbfffb,0xfff3fbfb,0xf7f3fff7,0xf9f6f7f7,0xfaf6fefe,0xfff6fafc, 31 | 0xfbfbfbfb,0xfff3fbfb,0xeaf4ffff,0xffeeeeea,0xf6f8ffff,0xfff6f6f6,0xeef1ffff,0xfff1eeee, 32 | 0xeef0ffff,0xfef0eeee,0xeee1ffff,0xefe1eeee,0xedf2ffff,0xfff8fdfd,0xfef1ffff,0xfff1eff1, 33 | 0xfdf0fdff,0xfffbf5fd,0xf6f6ffff,0xfff5f2f6,0xeeeeffff,0xfffbf5ee,0xeeeeffff,0xfff5e0ea, 34 | 0xf6f6ffff,0xfff6f6f9,0xf6f6ffff,0xfcfbf1f6,0xf7f0ffff,0xfff0fef9,0xfcfdfdf3,0xfff3fdfd, 35 | 0xfffbfbfb,0xfffbfbfb,0xe7f7f7f9,0xfff9f7f7,0xfffffaf5,0xffffffff, 36 | }; 37 | 38 | __forceinline static unsigned rastafont6x8_select(unsigned a, unsigned b, unsigned m) { return ((b^a)&m)^b; } 39 | 40 | __forceinline static void rastafont6x8_blit6(unsigned* output, unsigned colour, unsigned m, unsigned b) 41 | { 42 | output[0] = rastafont6x8_select(output[0], colour, (int)(m<<(31-b))>>31); 43 | output[1] = rastafont6x8_select(output[1], colour, (int)(m<<(30-b))>>31); 44 | output[2] = rastafont6x8_select(output[2], colour, (int)(m<<(29-b))>>31); 45 | output[3] = rastafont6x8_select(output[3], colour, (int)(m<<(28-b))>>31); 46 | output[4] = rastafont6x8_select(output[4], colour, (int)(m<<(27-b))>>31); 47 | output[5] = rastafont6x8_select(output[5], colour, (int)(m<<(26-b))>>31); 48 | } 49 | 50 | void rastafont6x8_blit_string(unsigned* output, unsigned pitch, unsigned colour, const char* str) 51 | { 52 | unsigned id, m0, m1; 53 | while(*str) 54 | { 55 | id = *str-' '; 56 | if( id <= '~'-' ' ) 57 | { 58 | m0 = rastafont6x8_bitmap[id*2 + 0]; 59 | m1 = rastafont6x8_bitmap[id*2 + 1]; 60 | rastafont6x8_blit6(output+0*pitch/4, colour, m0, 0); 61 | rastafont6x8_blit6(output+1*pitch/4, colour, m0, 8); 62 | rastafont6x8_blit6(output+2*pitch/4, colour, m0, 16); 63 | rastafont6x8_blit6(output+3*pitch/4, colour, m0, 24); 64 | rastafont6x8_blit6(output+4*pitch/4, colour, m1, 0); 65 | rastafont6x8_blit6(output+5*pitch/4, colour, m1, 8); 66 | rastafont6x8_blit6(output+6*pitch/4, colour, m1, 16); 67 | rastafont6x8_blit6(output+7*pitch/4, colour, m1, 24); 68 | } 69 | str += 1; 70 | output += 6; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /rastafont8x12.c: -------------------------------------------------------------------------------- 1 | #include "rastafont.h" 2 | 3 | #if defined(_MSC_VER) 4 | #elif defined(__GNUC__) 5 | #define __forceinline inline __attribute__((always_inline)) 6 | #else 7 | #define __forceinline 8 | #endif 9 | 10 | static const unsigned rastafont8x12_bitmap[] = 11 | { 12 | 0xffffffff,0xffffffff,0xffffffff,0xe1e1f3ff,0xfff3f3e1,0xfffff3f3,0x999999ff,0xffffffdb, 13 | 0xffffffff,0x80c9c9ff,0x80c9c9c9,0xffffc9c9,0xfcc1f3f3,0xcfcfe1fc,0xfff3f3e0,0xdcffffff, 14 | 0xf9f3e7cc,0xffffcecc,0xe4e4f1ff,0xcc84a0f1,0xffff91c4,0xf3f3f3ff,0xfffffff9,0xffffffff, 15 | 0xf3e7cfff,0xf3f9f9f9,0xffffcfe7,0xe7f3f9ff,0xe7cfcfcf,0xfffff9f3,0x99ffffff,0x99c300c3, 16 | 0xffffffff,0xe7ffffff,0xe7e781e7,0xffffffff,0xffffffff,0xffffffff,0xfff9e3e3,0xffffffff, 17 | 0xffff80ff,0xffffffff,0xffffffff,0xffffffff,0xffffe3e3,0x9fbfffff,0xf9f3e7cf,0xfffffefc, 18 | 0x8c9cc1ff,0x98909484,0xffffc19c,0xf0f3f7ff,0xf3f3f3f3,0xffffc0f3,0xcccce1ff,0xf9f3e7cf, 19 | 0xffffc0cc,0xcfcce1ff,0xcfcfe3cf,0xffffe1cc,0xc3c7cfff,0xcf80ccc9,0xffff87cf,0xfcfcc0ff, 20 | 0xcfcfe0fc,0xffffe1cc,0xfcf9e3ff,0xcccce0fc,0xffffe1cc,0x9c9c80ff,0xf3e7cf9f,0xfffff3f3, 21 | 0xcccce1ff,0xcccce1cc,0xffffe1cc,0xcccce1ff,0xe7e7c1cc,0xfffff1f3,0xe3ffffff,0xe3ffffe3, 22 | 0xffffffe3,0xe3ffffff,0xe3ffffe3,0xfff3e7e3,0xf3e7cfff,0xf3f9fcf9,0xffffcfe7,0xffffffff, 23 | 0xff81ff81,0xffffffff,0xe7f3f9ff,0xe7cf9fcf,0xfffff9f3,0xcfcce1ff,0xfff3f3e7,0xfffff3f3, 24 | 0x9c9cc1ff,0xfc848484,0xffffc1fc,0xcce1f3ff,0xccc0cccc,0xffffcccc,0x9999c0ff,0x9999c199, 25 | 0xffffc099,0x9c99c3ff,0x9cfcfcfc,0xffffc399,0x99c9e0ff,0x99999999,0xffffe0c9,0xf9b980ff, 26 | 0xf9d9c1d9,0xffff80b9,0xb99980ff,0xf9d9c1d9,0xfffff0f9,0x9c99c3ff,0x9c8cfcfc,0xffff8399, 27 | 0xccccccff,0xccccc0cc,0xffffcccc,0xf3f3e1ff,0xf3f3f3f3,0xffffe1f3,0xcfcf87ff,0xcccccfcf, 28 | 0xffffe1cc,0xc99998ff,0xc9c9e1c9,0xffff9899,0xf9f9f0ff,0x99b9f9f9,0xffff8099,0x80889cff, 29 | 0x9c9c9480,0xffff9c9c,0x989c9cff,0x8c848090,0xffff9c9c,0x9cc9e3ff,0x9c9c9c9c,0xffffe3c9, 30 | 0x9999c0ff,0xf9f9c199,0xfffff0f9,0x9cc9e3ff,0x848c9c9c,0xff87cfc1,0x9999c0ff,0x99c9c199, 31 | 0xffff9899,0xcccce1ff,0xcce7f1fc,0xffffe1cc,0xf3d2c0ff,0xf3f3f3f3,0xffffe1f3,0xccccccff, 32 | 0xcccccccc,0xffffe1cc,0xccccccff,0xcccccccc,0xfffff3e1,0x9c9c9cff,0xc994949c,0xffffc9c9, 33 | 0xccccccff,0xcce1f3e1,0xffffcccc,0xccccccff,0xf3f3e1cc,0xffffe1f3,0xe68c80ff,0xb9f9f3e7, 34 | 0xffff809c,0xf3f3c3ff,0xf3f3f3f3,0xffffc3f3,0xfcfeffff,0xcfe7f3f9,0xffffbf9f,0xcfcfc3ff, 35 | 0xcfcfcfcf,0xffffc3cf,0x9cc9e3f7,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xff00ffff, 36 | 0xffe7f3f3,0xffffffff,0xffffffff,0xffffffff,0xccc1cfe1,0xffff91cc,0xf9f9f8ff,0x999999c1, 37 | 0xffffc499,0xffffffff,0xfcfccce1,0xffffe1cc,0xcfcfc7ff,0xccccccc1,0xffff91cc,0xffffffff, 38 | 0xfcc0cce1,0xffffe1cc,0xf9c9e3ff,0xf9f9e0f9,0xfffff0f9,0xffffffff,0xcccccc91,0xe1cccfc1, 39 | 0xf9f9f8ff,0x999991c9,0xffff9899,0xffe7e7ff,0xe7e7e7e1,0xffff81e7,0xffcfcfff,0xcfcfcfc3, 40 | 0xe1cccccf,0xf9f9f8ff,0xc9e1c999,0xffff9899,0xe7e7e1ff,0xe7e7e7e7,0xffff81e7,0xffffffff, 41 | 0x949494c0,0xffff9c94,0xffffffff,0xcccccce0,0xffffcccc,0xffffffff,0xcccccce1,0xffffe1cc, 42 | 0xffffffff,0x999999c4,0xf0f9c199,0xffffffff,0xcccccc91,0x87cfc1cc,0xffffffff,0xf99189c8, 43 | 0xfffff0f9,0xffffffff,0xe7f9cce1,0xffffe1cc,0xf9fbffff,0xf9f9f9c0,0xffffe3c9,0xffffffff, 44 | 0xcccccccc,0xffff91cc,0xffffffff,0xcccccccc,0xfffff3e1,0xffffffff,0x94949c9c,0xffffc9c9, 45 | 0xffffffff,0xe3e3c99c,0xffff9cc9,0xffffffff,0x99999999,0xf0e7cfc3,0xffffffff,0xf9e7cec0, 46 | 0xffffc0dc,0xf3f3c7ff,0xf3f9fcf9,0xffffc7f3,0xe7e7e7ff,0xe7e7ffe7,0xffffe7e7,0xf3f3f8ff, 47 | 0xf3e7cfe7,0xfffff8f3,0x8ca431ff,0xffffffff,0xffffffff, 48 | }; 49 | 50 | __forceinline static unsigned rastafont8x12_select(unsigned a, unsigned b, unsigned m) { return ((b^a)&m)^b; } 51 | 52 | __forceinline static void rastafont8x12_blit8(unsigned* output, unsigned colour, unsigned m, unsigned b) 53 | { 54 | output[0] = rastafont8x12_select(output[0], colour, (int)(m<<(31-b))>>31); 55 | output[1] = rastafont8x12_select(output[1], colour, (int)(m<<(30-b))>>31); 56 | output[2] = rastafont8x12_select(output[2], colour, (int)(m<<(29-b))>>31); 57 | output[3] = rastafont8x12_select(output[3], colour, (int)(m<<(28-b))>>31); 58 | output[4] = rastafont8x12_select(output[4], colour, (int)(m<<(27-b))>>31); 59 | output[5] = rastafont8x12_select(output[5], colour, (int)(m<<(26-b))>>31); 60 | output[6] = rastafont8x12_select(output[6], colour, (int)(m<<(25-b))>>31); 61 | output[7] = rastafont8x12_select(output[7], colour, (int)(m<<(24-b))>>31); 62 | } 63 | 64 | void rastafont8x12_blit_string(unsigned* output, unsigned pitch, unsigned colour, const char* str) 65 | { 66 | unsigned id, m0, m1, m2; 67 | while(*str) 68 | { 69 | id = *str-' '; 70 | if( id <= '~'-' ' ) 71 | { 72 | m0 = rastafont8x12_bitmap[id*3 + 0]; 73 | m1 = rastafont8x12_bitmap[id*3 + 1]; 74 | m2 = rastafont8x12_bitmap[id*3 + 2]; 75 | rastafont8x12_blit8(output+0*pitch/4, colour, m0, 0); 76 | rastafont8x12_blit8(output+1*pitch/4, colour, m0, 8); 77 | rastafont8x12_blit8(output+2*pitch/4, colour, m0, 16); 78 | rastafont8x12_blit8(output+3*pitch/4, colour, m0, 24); 79 | rastafont8x12_blit8(output+4*pitch/4, colour, m1, 0); 80 | rastafont8x12_blit8(output+5*pitch/4, colour, m1, 8); 81 | rastafont8x12_blit8(output+6*pitch/4, colour, m1, 16); 82 | rastafont8x12_blit8(output+7*pitch/4, colour, m1, 24); 83 | rastafont8x12_blit8(output+8*pitch/4, colour, m2, 0); 84 | rastafont8x12_blit8(output+9*pitch/4, colour, m2, 8); 85 | rastafont8x12_blit8(output+10*pitch/4, colour, m2, 16); 86 | rastafont8x12_blit8(output+11*pitch/4, colour, m2, 24); 87 | } 88 | str += 1; 89 | output += 8; 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /rastafont8x8.c: -------------------------------------------------------------------------------- 1 | #include "rastafont.h" 2 | 3 | #if defined(_MSC_VER) 4 | #elif defined(__GNUC__) 5 | #define __forceinline inline __attribute__((always_inline)) 6 | #else 7 | #define __forceinline 8 | #endif 9 | 10 | static const unsigned rastafont8x8_bitmap[] = 11 | { 12 | 0xffffffff,0xffffffff,0xf3e1e1f3,0xfff3fff3,0xffc9c9c9,0xffffffff,0xc980c9c9,0xffc9c980, 13 | 0xe1fcc1f3,0xfff3e0cf,0xe7cc9cff,0xff9c99f3,0x91e3c9e3,0xff91ccc4,0xfffcf9f9,0xffffffff, 14 | 0xf9f9f3e7,0xffe7f3f9,0xe7e7f3f9,0xfff9f3e7,0x00c399ff,0xffff99c3,0xc0f3f3ff,0xfffff3f3, 15 | 0xffffffff,0xf9f3f1ff,0xc0ffffff,0xffffffff,0xffffffff,0xfff3f3ff,0xf3e7cf9f,0xfffefcf9, 16 | 0xc0c4cce1,0xffe1ccc8,0xf3f3f0f3,0xffc0f3f3,0xe3cfcce1,0xffc0ccf9,0xe3cfcce1,0xffe1cccf, 17 | 0xccc9c3c7,0xffcfcf80,0xcfe0fcc0,0xffe1cccf,0xe0fcf9e3,0xffe1cccc,0xe7cfccc0,0xfff9f9f3, 18 | 0xe1cccce1,0xffe1cccc,0xc1cccce1,0xfff1e7cf,0xf3f3ffff,0xfff3f3ff,0xf3f3ffff,0xf9f3f1ff, 19 | 0xfcf9f3e7,0xffe7f3f9,0xffc0ffff,0xffffffc0,0xcfe7f3f9,0xfff9f3e7,0xe7cfcce1,0xfff3fff3, 20 | 0x84849cc1,0xffe1fc84,0xcccce1f3,0xffccccc0,0xc19999c0,0xffc09999,0xfcfc99c3,0xffc399fc, 21 | 0x9999c9c0,0xffc0c999,0xe1e9b980,0xff80b9e9,0xe1e9b980,0xfff0f9e9,0xfcfc99c3,0xff83998c, 22 | 0xc0cccccc,0xffcccccc,0xf3f3f3e1,0xffe1f3f3,0xcfcfcf87,0xffe1cccc,0xe1c99998,0xff9899c9, 23 | 0xf9f9f9f0,0xff8099b9,0x9480889c,0xff9c9c9c,0x8490989c,0xff9c9c8c,0x9c9cc9e3,0xffe3c99c, 24 | 0xc19999c0,0xfff0f9f9,0xcccccce1,0xffc7e1c4,0xc19999c0,0xff98c9e1,0xe3f8cce1,0xffe1ccc7, 25 | 0xf3f3d2c0,0xffe1f3f3,0xcccccccc,0xffc0cccc,0xcccccccc,0xfff3e1cc,0x949c9c9c,0xff9c8880, 26 | 0xe3c99c9c,0xff9c9cc9,0xe1cccccc,0xffe1f3f3,0xf3e6cc80,0xff809cb9,0xf9f9f9e1,0xffe1f9f9, 27 | 0xe7f3f9fc,0xffbf9fcf,0xe7e7e7e1,0xffe1e7e7,0x9cc9e3f7,0xffffffff,0xffffffff,0x00ffffff, 28 | 0xffe7f3f3,0xffffffff,0xcfe1ffff,0xff91ccc1,0x99c1f9f8,0xffc29999,0xcce1ffff,0xffe1ccfc, 29 | 0xc1cfcfc7,0xff91cccc,0xcce1ffff,0xffe1fcc0,0xf0f9c9e3,0xfff0f9f9,0xcc91ffff,0xe0cfc1cc, 30 | 0x91c9f9f8,0xff989999,0xf3f1fff3,0xffe1f3f3,0xe7e1ffe7,0xf1e4e7e7,0xc999f9f8,0xff98c9e1, 31 | 0xf3f3f3f1,0xffe1f3f3,0x80c8ffff,0xff9c9c94,0xcce0ffff,0xffcccccc,0xcce1ffff,0xffe1cccc, 32 | 0x99c4ffff,0xf0f9c199,0xcc91ffff,0x87cfc1cc,0xc9e4ffff,0xfff0f9c9,0xfcc1ffff,0xffe0cfe1, 33 | 0xf3c1f3f7,0xffe7d3f3,0xccccffff,0xff91cccc,0xccccffff,0xfff3e1cc,0x9c9cffff,0xffc98094, 34 | 0xc99cffff,0xff9cc9e3,0xccccffff,0xe0cfc1cc,0xe6c0ffff,0xffc0d9f3,0xf8f3f3c7,0xffc7f3f3, 35 | 0xffe7e7e7,0xffe7e7e7,0xc7f3f3f8,0xfff8f3f3,0xffffc491,0xffffffff, 36 | }; 37 | 38 | __forceinline static unsigned rastafont8x8_select(unsigned a, unsigned b, unsigned m) { return ((b^a)&m)^b; } 39 | 40 | __forceinline static void rastafont8x8_blit8(unsigned* output, unsigned colour, unsigned m, unsigned b) 41 | { 42 | output[0] = rastafont8x8_select(output[0], colour, (int)(m<<(31-b))>>31); 43 | output[1] = rastafont8x8_select(output[1], colour, (int)(m<<(30-b))>>31); 44 | output[2] = rastafont8x8_select(output[2], colour, (int)(m<<(29-b))>>31); 45 | output[3] = rastafont8x8_select(output[3], colour, (int)(m<<(28-b))>>31); 46 | output[4] = rastafont8x8_select(output[4], colour, (int)(m<<(27-b))>>31); 47 | output[5] = rastafont8x8_select(output[5], colour, (int)(m<<(26-b))>>31); 48 | output[6] = rastafont8x8_select(output[6], colour, (int)(m<<(25-b))>>31); 49 | output[7] = rastafont8x8_select(output[7], colour, (int)(m<<(24-b))>>31); 50 | } 51 | 52 | void rastafont8x8_blit_string(unsigned* output, unsigned pitch, unsigned colour, const char* str) 53 | { 54 | unsigned id, m0, m1; 55 | while(*str) 56 | { 57 | id = *str-' '; 58 | if( id <= '~'-' ' ) 59 | { 60 | m0 = rastafont8x8_bitmap[id*2 + 0]; 61 | m1 = rastafont8x8_bitmap[id*2 + 1]; 62 | rastafont8x8_blit8(output+0*pitch/4, colour, m0, 0); 63 | rastafont8x8_blit8(output+1*pitch/4, colour, m0, 8); 64 | rastafont8x8_blit8(output+2*pitch/4, colour, m0, 16); 65 | rastafont8x8_blit8(output+3*pitch/4, colour, m0, 24); 66 | rastafont8x8_blit8(output+4*pitch/4, colour, m1, 0); 67 | rastafont8x8_blit8(output+5*pitch/4, colour, m1, 8); 68 | rastafont8x8_blit8(output+6*pitch/4, colour, m1, 16); 69 | rastafont8x8_blit8(output+7*pitch/4, colour, m1, 24); 70 | } 71 | str += 1; 72 | output += 8; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /rastafontgpu.cpp: -------------------------------------------------------------------------------- 1 | // cl /nologo /I "%DXSDK_DIR%\Include" rastafontgpu.cpp /link /LIBPATH:"%DXSDK_DIR%\Lib\x86" 2 | 3 | #define _CRT_SECURE_NO_WARNINGS 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #pragma warning(push) 11 | #pragma warning(disable: 4005) // macro redefinition 12 | #include 13 | #pragma warning(pop) 14 | 15 | #pragma comment(lib, "kernel32.lib") 16 | #pragma comment(lib, "gdi32.lib") 17 | #pragma comment(lib, "user32.lib") 18 | #pragma comment(lib, "d3d11.lib") 19 | 20 | static const int32_t WindowWidth = 1280; 21 | static const int32_t WindowHeight = 720; 22 | static const char* WindowName = "Rastafont GPU"; 23 | 24 | static const int32_t WindowWidthChars = WindowWidth / 8; 25 | static const int32_t WindowHeightChars = WindowHeight / 8; 26 | 27 | #define CHECKHR(hr) {if(FAILED(hr)){printf("D3D Error at line %d: 0x%08X\n", __LINE__,(int)hr); DebugBreak();}} 28 | 29 | // Precompiled version of rastafontgpu.hlsl 30 | const unsigned char g_rastaforn8x8_cs[] = { 31 | 0x44,0x58,0x42,0x43,0x6D,0x33,0x91,0xEC,0x26,0x3D,0x44,0x71,0x0E,0x0C,0x9E,0xCC, 32 | 0xC7,0x56,0xFF,0xA1,0x01,0x00,0x00,0x00,0x50,0x0F,0x00,0x00,0x05,0x00,0x00,0x00, 33 | 0x34,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x18,0x01,0x00,0x00, 34 | 0xB4,0x0E,0x00,0x00,0x52,0x44,0x45,0x46,0xBC,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 35 | 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x05,0x53,0x43, 36 | 0x00,0x01,0x00,0x00,0x89,0x00,0x00,0x00,0x52,0x44,0x31,0x31,0x3C,0x00,0x00,0x00, 37 | 0x18,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x24,0x00,0x00,0x00, 38 | 0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x02,0x00,0x00,0x00, 39 | 0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, 40 | 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x04,0x00,0x00,0x00, 41 | 0x05,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, 42 | 0x01,0x00,0x00,0x00,0x0D,0x00,0x00,0x00,0x69,0x6E,0x70,0x75,0x74,0x00,0x6F,0x75, 43 | 0x74,0x70,0x75,0x74,0x00,0x4D,0x69,0x63,0x72,0x6F,0x73,0x6F,0x66,0x74,0x20,0x28, 44 | 0x52,0x29,0x20,0x48,0x4C,0x53,0x4C,0x20,0x53,0x68,0x61,0x64,0x65,0x72,0x20,0x43, 45 | 0x6F,0x6D,0x70,0x69,0x6C,0x65,0x72,0x20,0x39,0x2E,0x32,0x39,0x2E,0x39,0x35,0x32, 46 | 0x2E,0x33,0x31,0x31,0x31,0x00,0xAB,0xAB,0x49,0x53,0x47,0x4E,0x08,0x00,0x00,0x00, 47 | 0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x4F,0x53,0x47,0x4E,0x08,0x00,0x00,0x00, 48 | 0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x53,0x48,0x45,0x58,0x94,0x0D,0x00,0x00, 49 | 0x50,0x00,0x05,0x00,0x65,0x03,0x00,0x00,0x6A,0x08,0x00,0x01,0x35,0x18,0x00,0x00, 50 | 0xFA,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 51 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 52 | 0x00,0x00,0x00,0x00,0x0C,0x1E,0x1E,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 53 | 0x00,0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 54 | 0x00,0x00,0x00,0x00,0x36,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 55 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 56 | 0x00,0x00,0x00,0x00,0x36,0x36,0x7F,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 57 | 0x00,0x00,0x00,0x00,0x7F,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 58 | 0x00,0x00,0x00,0x00,0x0C,0x3E,0x03,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 59 | 0x00,0x00,0x00,0x00,0x30,0x1F,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 60 | 0x00,0x00,0x00,0x00,0x00,0x63,0x33,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 61 | 0x00,0x00,0x00,0x00,0x0C,0x66,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 62 | 0x00,0x00,0x00,0x00,0x1C,0x36,0x1C,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 63 | 0x00,0x00,0x00,0x00,0x3B,0x33,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 64 | 0x00,0x00,0x00,0x00,0x06,0x06,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 65 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 66 | 0x00,0x00,0x00,0x00,0x18,0x0C,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 67 | 0x00,0x00,0x00,0x00,0x06,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 68 | 0x00,0x00,0x00,0x00,0x06,0x0C,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 69 | 0x00,0x00,0x00,0x00,0x18,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 70 | 0x00,0x00,0x00,0x00,0x00,0x66,0x3C,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 71 | 0x00,0x00,0x00,0x00,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 72 | 0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 73 | 0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 74 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 75 | 0x00,0x00,0x00,0x00,0x00,0x0E,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 76 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 77 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 78 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 79 | 0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 80 | 0x00,0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 81 | 0x00,0x00,0x00,0x00,0x06,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 82 | 0x00,0x00,0x00,0x00,0x1E,0x33,0x3B,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 83 | 0x00,0x00,0x00,0x00,0x37,0x33,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 84 | 0x00,0x00,0x00,0x00,0x0C,0x0F,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 85 | 0x00,0x00,0x00,0x00,0x0C,0x0C,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 86 | 0x00,0x00,0x00,0x00,0x1E,0x33,0x30,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 87 | 0x00,0x00,0x00,0x00,0x06,0x33,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 88 | 0x00,0x00,0x00,0x00,0x1E,0x33,0x30,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 89 | 0x00,0x00,0x00,0x00,0x30,0x33,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 90 | 0x00,0x00,0x00,0x00,0x38,0x3C,0x36,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 91 | 0x00,0x00,0x00,0x00,0x7F,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 92 | 0x00,0x00,0x00,0x00,0x3F,0x03,0x1F,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 93 | 0x00,0x00,0x00,0x00,0x30,0x33,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 94 | 0x00,0x00,0x00,0x00,0x1C,0x06,0x03,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 95 | 0x00,0x00,0x00,0x00,0x33,0x33,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 96 | 0x00,0x00,0x00,0x00,0x3F,0x33,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 97 | 0x00,0x00,0x00,0x00,0x0C,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 98 | 0x00,0x00,0x00,0x00,0x1E,0x33,0x33,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 99 | 0x00,0x00,0x00,0x00,0x33,0x33,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 100 | 0x00,0x00,0x00,0x00,0x1E,0x33,0x33,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 101 | 0x00,0x00,0x00,0x00,0x30,0x18,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 102 | 0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 103 | 0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 104 | 0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 105 | 0x00,0x00,0x00,0x00,0x00,0x0E,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 106 | 0x00,0x00,0x00,0x00,0x18,0x0C,0x06,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 107 | 0x00,0x00,0x00,0x00,0x06,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 108 | 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 109 | 0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 110 | 0x00,0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 111 | 0x00,0x00,0x00,0x00,0x18,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 112 | 0x00,0x00,0x00,0x00,0x1E,0x33,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 113 | 0x00,0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 114 | 0x00,0x00,0x00,0x00,0x3E,0x63,0x7B,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 115 | 0x00,0x00,0x00,0x00,0x7B,0x03,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 116 | 0x00,0x00,0x00,0x00,0x0C,0x1E,0x33,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 117 | 0x00,0x00,0x00,0x00,0x3F,0x33,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 118 | 0x00,0x00,0x00,0x00,0x3F,0x66,0x66,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 119 | 0x00,0x00,0x00,0x00,0x66,0x66,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 120 | 0x00,0x00,0x00,0x00,0x3C,0x66,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 121 | 0x00,0x00,0x00,0x00,0x03,0x66,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 122 | 0x00,0x00,0x00,0x00,0x3F,0x36,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 123 | 0x00,0x00,0x00,0x00,0x66,0x36,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 124 | 0x00,0x00,0x00,0x00,0x7F,0x46,0x16,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 125 | 0x00,0x00,0x00,0x00,0x16,0x46,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 126 | 0x00,0x00,0x00,0x00,0x7F,0x46,0x16,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 127 | 0x00,0x00,0x00,0x00,0x16,0x06,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 128 | 0x00,0x00,0x00,0x00,0x3C,0x66,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 129 | 0x00,0x00,0x00,0x00,0x73,0x66,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 130 | 0x00,0x00,0x00,0x00,0x33,0x33,0x33,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 131 | 0x00,0x00,0x00,0x00,0x33,0x33,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 132 | 0x00,0x00,0x00,0x00,0x1E,0x0C,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 133 | 0x00,0x00,0x00,0x00,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 134 | 0x00,0x00,0x00,0x00,0x78,0x30,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 135 | 0x00,0x00,0x00,0x00,0x33,0x33,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 136 | 0x00,0x00,0x00,0x00,0x67,0x66,0x36,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 137 | 0x00,0x00,0x00,0x00,0x36,0x66,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 138 | 0x00,0x00,0x00,0x00,0x0F,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 139 | 0x00,0x00,0x00,0x00,0x46,0x66,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 140 | 0x00,0x00,0x00,0x00,0x63,0x77,0x7F,0x6B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 141 | 0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 142 | 0x00,0x00,0x00,0x00,0x63,0x67,0x6F,0x7B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 143 | 0x00,0x00,0x00,0x00,0x73,0x63,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 144 | 0x00,0x00,0x00,0x00,0x1C,0x36,0x63,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 145 | 0x00,0x00,0x00,0x00,0x63,0x36,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 146 | 0x00,0x00,0x00,0x00,0x3F,0x66,0x66,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 147 | 0x00,0x00,0x00,0x00,0x06,0x06,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 148 | 0x00,0x00,0x00,0x00,0x1E,0x33,0x33,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 149 | 0x00,0x00,0x00,0x00,0x3B,0x1E,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 150 | 0x00,0x00,0x00,0x00,0x3F,0x66,0x66,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 151 | 0x00,0x00,0x00,0x00,0x1E,0x36,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 152 | 0x00,0x00,0x00,0x00,0x1E,0x33,0x07,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 153 | 0x00,0x00,0x00,0x00,0x38,0x33,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 154 | 0x00,0x00,0x00,0x00,0x3F,0x2D,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 155 | 0x00,0x00,0x00,0x00,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 156 | 0x00,0x00,0x00,0x00,0x33,0x33,0x33,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 157 | 0x00,0x00,0x00,0x00,0x33,0x33,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 158 | 0x00,0x00,0x00,0x00,0x33,0x33,0x33,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 159 | 0x00,0x00,0x00,0x00,0x33,0x1E,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 160 | 0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x6B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 161 | 0x00,0x00,0x00,0x00,0x7F,0x77,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 162 | 0x00,0x00,0x00,0x00,0x63,0x63,0x36,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 163 | 0x00,0x00,0x00,0x00,0x36,0x63,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 164 | 0x00,0x00,0x00,0x00,0x33,0x33,0x33,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 165 | 0x00,0x00,0x00,0x00,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 166 | 0x00,0x00,0x00,0x00,0x7F,0x33,0x19,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 167 | 0x00,0x00,0x00,0x00,0x46,0x63,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 168 | 0x00,0x00,0x00,0x00,0x1E,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 169 | 0x00,0x00,0x00,0x00,0x06,0x06,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 170 | 0x00,0x00,0x00,0x00,0x03,0x06,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 171 | 0x00,0x00,0x00,0x00,0x30,0x60,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 172 | 0x00,0x00,0x00,0x00,0x1E,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 173 | 0x00,0x00,0x00,0x00,0x18,0x18,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 174 | 0x00,0x00,0x00,0x00,0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 175 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 176 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 177 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 178 | 0x00,0x00,0x00,0x00,0x0C,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 179 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 180 | 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 181 | 0x00,0x00,0x00,0x00,0x3E,0x33,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 182 | 0x00,0x00,0x00,0x00,0x07,0x06,0x3E,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 183 | 0x00,0x00,0x00,0x00,0x66,0x66,0x3D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 184 | 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 185 | 0x00,0x00,0x00,0x00,0x03,0x33,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 186 | 0x00,0x00,0x00,0x00,0x38,0x30,0x30,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 187 | 0x00,0x00,0x00,0x00,0x33,0x33,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 188 | 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 189 | 0x00,0x00,0x00,0x00,0x3F,0x03,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 190 | 0x00,0x00,0x00,0x00,0x1C,0x36,0x06,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 191 | 0x00,0x00,0x00,0x00,0x06,0x06,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 192 | 0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 193 | 0x00,0x00,0x00,0x00,0x33,0x3E,0x30,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 194 | 0x00,0x00,0x00,0x00,0x07,0x06,0x36,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 195 | 0x00,0x00,0x00,0x00,0x66,0x66,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 196 | 0x00,0x00,0x00,0x00,0x0C,0x00,0x0E,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 197 | 0x00,0x00,0x00,0x00,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 198 | 0x00,0x00,0x00,0x00,0x18,0x00,0x1E,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 199 | 0x00,0x00,0x00,0x00,0x18,0x18,0x1B,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 200 | 0x00,0x00,0x00,0x00,0x07,0x06,0x66,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 201 | 0x00,0x00,0x00,0x00,0x1E,0x36,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 202 | 0x00,0x00,0x00,0x00,0x0E,0x0C,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 203 | 0x00,0x00,0x00,0x00,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 204 | 0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 205 | 0x00,0x00,0x00,0x00,0x6B,0x63,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 206 | 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 207 | 0x00,0x00,0x00,0x00,0x33,0x33,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 208 | 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 209 | 0x00,0x00,0x00,0x00,0x33,0x33,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 210 | 0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 211 | 0x00,0x00,0x00,0x00,0x66,0x3E,0x06,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 212 | 0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 213 | 0x00,0x00,0x00,0x00,0x33,0x3E,0x30,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 214 | 0x00,0x00,0x00,0x00,0x00,0x00,0x1B,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 215 | 0x00,0x00,0x00,0x00,0x36,0x06,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 216 | 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 217 | 0x00,0x00,0x00,0x00,0x1E,0x30,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 218 | 0x00,0x00,0x00,0x00,0x08,0x0C,0x3E,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 219 | 0x00,0x00,0x00,0x00,0x0C,0x2C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 220 | 0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 221 | 0x00,0x00,0x00,0x00,0x33,0x33,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 222 | 0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 223 | 0x00,0x00,0x00,0x00,0x33,0x1E,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 224 | 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 225 | 0x00,0x00,0x00,0x00,0x6B,0x7F,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 226 | 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 227 | 0x00,0x00,0x00,0x00,0x1C,0x36,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 228 | 0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 229 | 0x00,0x00,0x00,0x00,0x33,0x3E,0x30,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 230 | 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 231 | 0x00,0x00,0x00,0x00,0x0C,0x26,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 232 | 0x00,0x00,0x00,0x00,0x38,0x0C,0x0C,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 233 | 0x00,0x00,0x00,0x00,0x0C,0x0C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 234 | 0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 235 | 0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 236 | 0x00,0x00,0x00,0x00,0x07,0x0C,0x0C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 237 | 0x00,0x00,0x00,0x00,0x0C,0x0C,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 238 | 0x00,0x00,0x00,0x00,0x6E,0x3B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 239 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 240 | 0x00,0x00,0x00,0x00,0x58,0x18,0x00,0x04,0x00,0x70,0x10,0x00,0x00,0x00,0x00,0x00, 241 | 0x44,0x44,0x00,0x00,0x9C,0x18,0x00,0x04,0x00,0xE0,0x11,0x00,0x00,0x00,0x00,0x00, 242 | 0x55,0x55,0x00,0x00,0x5F,0x00,0x00,0x02,0x32,0x10,0x02,0x00,0x5F,0x00,0x00,0x02, 243 | 0x32,0x20,0x02,0x00,0x5F,0x00,0x00,0x02,0x32,0x00,0x02,0x00,0x68,0x00,0x00,0x02, 244 | 0x01,0x00,0x00,0x00,0x9B,0x00,0x00,0x04,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00, 245 | 0x01,0x00,0x00,0x00,0x36,0x00,0x00,0x04,0x32,0x00,0x10,0x00,0x00,0x00,0x00,0x00, 246 | 0x46,0x10,0x02,0x00,0x36,0x00,0x00,0x08,0xC2,0x00,0x10,0x00,0x00,0x00,0x00,0x00, 247 | 0x02,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 248 | 0x00,0x00,0x00,0x00,0x2D,0x00,0x00,0x89,0xC2,0x00,0x00,0x80,0x03,0x11,0x11,0x00, 249 | 0x12,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x46,0x0E,0x10,0x00,0x00,0x00,0x00,0x00, 250 | 0x46,0x7E,0x10,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0x07,0x12,0x00,0x10,0x00, 251 | 0x00,0x00,0x00,0x00,0x0A,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x40,0x00,0x00, 252 | 0x01,0x00,0x00,0x00,0x1E,0x00,0x00,0x07,0x12,0x00,0x10,0x00,0x00,0x00,0x00,0x00, 253 | 0x0A,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x40,0x00,0x00,0xC0,0xFF,0xFF,0xFF, 254 | 0x55,0x00,0x00,0x06,0x22,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x1A,0x20,0x02,0x00, 255 | 0x01,0x40,0x00,0x00,0x02,0x00,0x00,0x00,0x1E,0x00,0x00,0x07,0x12,0x00,0x10,0x00, 256 | 0x00,0x00,0x00,0x00,0x1A,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x0A,0x00,0x10,0x00, 257 | 0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x07,0x22,0x00,0x10,0x00,0x00,0x00,0x00,0x00, 258 | 0x1A,0x20,0x02,0x00,0x01,0x40,0x00,0x00,0x08,0x00,0x00,0x00,0x0A,0x20,0x02,0x00, 259 | 0x29,0x00,0x00,0x07,0x22,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x40,0x00,0x00, 260 | 0x01,0x00,0x00,0x00,0x1A,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x08, 261 | 0x12,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x1A,0x00,0x10,0x00,0x00,0x00,0x00,0x00, 262 | 0x0A,0x90,0x90,0x00,0x0A,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x04,0x03, 263 | 0x0A,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0xA4,0x00,0x00,0x09,0xF2,0xE0,0x11,0x00, 264 | 0x00,0x00,0x00,0x00,0x46,0x05,0x02,0x00,0x02,0x40,0x00,0x00,0x00,0x00,0x80,0x3F, 265 | 0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F,0x15,0x00,0x00,0x01, 266 | 0x3E,0x00,0x00,0x01,0x53,0x54,0x41,0x54,0x94,0x00,0x00,0x00,0x0E,0x00,0x00,0x00, 267 | 0x01,0x00,0x00,0x00,0xBE,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 268 | 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, 269 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 270 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 271 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 272 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 273 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 274 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 275 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 276 | }; 277 | 278 | struct Context 279 | { 280 | HWND hwnd; 281 | bool finished; 282 | 283 | ID3D11Device* device; 284 | ID3D11DeviceContext* device_context; 285 | IDXGISwapChain* swap_chain; 286 | 287 | ID3D11Texture2D* backbuffer_tex; 288 | ID3D11RenderTargetView* backbuffer_rtv; 289 | ID3D11UnorderedAccessView* backbuffer_uav; 290 | 291 | ID3D11Texture2D* text_tex; 292 | ID3D11ShaderResourceView* text_srv; 293 | 294 | ID3D11ComputeShader* font_cs; 295 | }; 296 | 297 | template 298 | inline void safe_release(T& x) 299 | { 300 | if(x) 301 | { 302 | x->Release(); 303 | x=NULL; 304 | } 305 | } 306 | 307 | LRESULT APIENTRY WndProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam ) 308 | { 309 | Context* ctx = reinterpret_cast(GetWindowLongPtr(hwnd, GWLP_USERDATA)); 310 | 311 | switch(msg) 312 | { 313 | case WM_CLOSE: 314 | ctx->finished = true; 315 | 316 | default: 317 | return (LONG)DefWindowProc(hwnd, msg, wparam, lparam); 318 | } 319 | } 320 | 321 | Context* Init() 322 | { 323 | Context* ctx = new Context; 324 | ZeroMemory(ctx, sizeof(*ctx)); 325 | 326 | ctx->finished = false; 327 | 328 | // register window class 329 | 330 | WNDCLASSEX wc = {0}; 331 | 332 | HINSTANCE hInst = GetModuleHandle(NULL); 333 | 334 | wc.cbSize = sizeof(WNDCLASSEX); 335 | wc.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW |CS_VREDRAW; 336 | wc.lpfnWndProc = WndProc; 337 | wc.cbClsExtra = 0; 338 | wc.cbWndExtra = 0; 339 | wc.hInstance = hInst; 340 | wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); 341 | wc.hCursor = LoadCursor (NULL, IDC_ARROW); 342 | wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); 343 | wc.lpszMenuName = NULL; 344 | wc.lpszClassName = _T("BoilerplateWindowClass"); 345 | wc.hIconSm = wc.hIcon; 346 | 347 | RegisterClassEx(&wc); 348 | 349 | uint32_t window_style = WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; 350 | 351 | // find screen center and create our window there 352 | 353 | int32_t pos_x = GetSystemMetrics(SM_CXSCREEN) / 2 - WindowWidth/2; 354 | int32_t pos_y = GetSystemMetrics(SM_CYSCREEN) / 2 - WindowHeight/2; 355 | 356 | // calculate window size for required client area 357 | 358 | RECT client_rect = { pos_x, pos_y, pos_x+WindowWidth, pos_y+WindowHeight}; 359 | AdjustWindowRect(&client_rect, window_style, FALSE); 360 | 361 | // create window 362 | 363 | ctx->hwnd = CreateWindowA("BoilerplateWindowClass", WindowName, window_style, 364 | client_rect.left, client_rect.top, 365 | client_rect.right-client_rect.left, client_rect.bottom-client_rect.top, 366 | NULL, NULL, hInst, NULL); 367 | 368 | // setup window owner for message handling 369 | 370 | SetWindowLongPtr(ctx->hwnd, GWLP_USERDATA, (LONG_PTR)ctx); 371 | 372 | ShowWindow(ctx->hwnd, SW_SHOWNORMAL); 373 | UpdateWindow(ctx->hwnd); 374 | 375 | // Create D3D11 376 | 377 | DXGI_SWAP_CHAIN_DESC sd = {0}; 378 | ZeroMemory( &sd, sizeof( sd ) ); 379 | sd.BufferCount = 1; 380 | sd.BufferDesc.Width = WindowWidth; 381 | sd.BufferDesc.Height = WindowHeight; 382 | sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 383 | sd.BufferDesc.RefreshRate.Numerator = 60; 384 | sd.BufferDesc.RefreshRate.Denominator = 1; 385 | sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_UNORDERED_ACCESS; 386 | sd.OutputWindow = ctx->hwnd; 387 | sd.SampleDesc.Count = 1; 388 | sd.SampleDesc.Quality = 0; 389 | sd.Windowed = TRUE; 390 | 391 | D3D_DRIVER_TYPE type = D3D_DRIVER_TYPE_HARDWARE; 392 | 393 | IDXGIAdapter* adapter = NULL; 394 | 395 | D3D_FEATURE_LEVEL features[] = { D3D_FEATURE_LEVEL_11_0 }; 396 | const uint32_t num_features = sizeof(features) / sizeof(features[0]); 397 | 398 | // Create device 399 | 400 | D3D_FEATURE_LEVEL supported_features; 401 | CHECKHR(D3D11CreateDeviceAndSwapChain(adapter, type, NULL, D3D11_CREATE_DEVICE_SINGLETHREADED, features, num_features, 402 | D3D11_SDK_VERSION, &sd, &ctx->swap_chain, &ctx->device, 403 | &supported_features, &ctx->device_context)); 404 | 405 | // Get default back buffer 406 | 407 | CHECKHR(ctx->swap_chain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&ctx->backbuffer_tex)); 408 | 409 | CHECKHR(ctx->device->CreateRenderTargetView(ctx->backbuffer_tex, NULL, &ctx->backbuffer_rtv)); 410 | 411 | D3D11_UNORDERED_ACCESS_VIEW_DESC uav; 412 | uav.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 413 | uav.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D; 414 | uav.Texture2D.MipSlice = 0; 415 | CHECKHR(ctx->device->CreateUnorderedAccessView(ctx->backbuffer_tex, &uav, &ctx->backbuffer_uav)); 416 | 417 | // Create compute shader 418 | 419 | CHECKHR(ctx->device->CreateComputeShader(g_rastaforn8x8_cs, sizeof(g_rastaforn8x8_cs), NULL, &ctx->font_cs)); 420 | 421 | // Create texture with text 422 | char text[WindowWidthChars*WindowHeightChars] = {0}; 423 | sprintf(text + WindowWidthChars*2 + 2, "the quick brown fox jumps over the lazy dog"); 424 | sprintf(text + WindowWidthChars*4 + 2, "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG"); 425 | sprintf(text + WindowWidthChars*6 + 2, "0 1 2 3 4 5 6 7 8 9"); 426 | sprintf(text + WindowWidthChars*8 + 2, "! \" # $ %% & ' ( ) * + , - ."); 427 | sprintf(text + WindowWidthChars*10 + 2, ": ; < = > ? @ ^ _ ` { | } ~"); 428 | 429 | D3D11_SUBRESOURCE_DATA tex_data = {0}; 430 | tex_data.pSysMem = text; 431 | tex_data.SysMemPitch = WindowWidthChars; 432 | 433 | D3D11_TEXTURE2D_DESC tex = CD3D11_TEXTURE2D_DESC(DXGI_FORMAT_R8_UINT, WindowWidthChars, WindowHeightChars, 1, 1); 434 | CHECKHR(ctx->device->CreateTexture2D(&tex, &tex_data, &ctx->text_tex)); 435 | CHECKHR(ctx->device->CreateShaderResourceView(ctx->text_tex, NULL, &ctx->text_srv)); 436 | 437 | // Set-up default Colour and Depth surfaces 438 | 439 | ctx->device_context->OMSetRenderTargets(1, &ctx->backbuffer_rtv, NULL); 440 | 441 | // All done, ready to rock 442 | 443 | return ctx; 444 | } 445 | 446 | void Update(Context* ctx) 447 | { 448 | const float colour_array[4] = { 0.1f, 0.2f, 0.3f, 1.0f }; 449 | ctx->device_context->ClearRenderTargetView(ctx->backbuffer_rtv, colour_array); 450 | 451 | ctx->device_context->CSSetShaderResources(0, 1, &ctx->text_srv); 452 | ctx->device_context->CSSetUnorderedAccessViews(0, 1, &ctx->backbuffer_uav, NULL); 453 | ctx->device_context->CSSetShader(ctx->font_cs, NULL, 0); 454 | ctx->device_context->Dispatch(WindowWidth/8, WindowHeight/8, 1); 455 | 456 | // All done, now swap 457 | CHECKHR(ctx->swap_chain->Present(0, 0)); 458 | } 459 | 460 | void Shutdown(Context* ctx) 461 | { 462 | safe_release(ctx->font_cs); 463 | safe_release(ctx->backbuffer_uav); 464 | safe_release(ctx->backbuffer_rtv); 465 | safe_release(ctx->backbuffer_tex); 466 | safe_release(ctx->text_tex); 467 | safe_release(ctx->text_srv); 468 | safe_release(ctx->swap_chain); 469 | safe_release(ctx->device_context); 470 | safe_release(ctx->device); 471 | 472 | delete ctx; 473 | } 474 | 475 | int main() 476 | { 477 | Context* ctx = Init(); 478 | 479 | while(ctx->finished == false) 480 | { 481 | MSG msg; 482 | 483 | while( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ) 484 | { 485 | TranslateMessage(&msg); 486 | DispatchMessage(&msg); 487 | } 488 | 489 | Update(ctx); 490 | } 491 | 492 | Shutdown(ctx); 493 | 494 | return 0; 495 | } 496 | -------------------------------------------------------------------------------- /rastafontgpu.hlsl: -------------------------------------------------------------------------------- 1 | Texture2D input : register( t0 ); 2 | RWTexture2D output : register( u0 ); 3 | 4 | static const uint rastafont8x8_bitmap[] = 5 | { 6 | 0x00000000,0x00000000,0x0c1e1e0c,0x000c000c,0x00363636,0x00000000,0x367f3636,0x0036367f, 7 | 0x1e033e0c,0x000c1f30,0x18336300,0x0063660c,0x6e1c361c,0x006e333b,0x00030606,0x00000000, 8 | 0x06060c18,0x00180c06,0x18180c06,0x00060c18,0xff3c6600,0x0000663c,0x3f0c0c00,0x00000c0c, 9 | 0x00000000,0x060c0e00,0x3f000000,0x00000000,0x00000000,0x000c0c00,0x0c183060,0x00010306, 10 | 0x3f3b331e,0x001e3337,0x0c0c0f0c,0x003f0c0c,0x1c30331e,0x003f3306,0x1c30331e,0x001e3330, 11 | 0x33363c38,0x0030307f,0x301f033f,0x001e3330,0x1f03061c,0x001e3333,0x1830333f,0x0006060c, 12 | 0x1e33331e,0x001e3333,0x3e33331e,0x000e1830,0x0c0c0000,0x000c0c00,0x0c0c0000,0x060c0e00, 13 | 0x03060c18,0x00180c06,0x003f0000,0x0000003f,0x30180c06,0x00060c18,0x1830331e,0x000c000c, 14 | 0x7b7b633e,0x001e037b,0x33331e0c,0x0033333f,0x3e66663f,0x003f6666,0x0303663c,0x003c6603, 15 | 0x6666363f,0x003f3666,0x1e16467f,0x007f4616,0x1e16467f,0x000f0616,0x0303663c,0x007c6673, 16 | 0x3f333333,0x00333333,0x0c0c0c1e,0x001e0c0c,0x30303078,0x001e3333,0x1e366667,0x00676636, 17 | 0x0606060f,0x007f6646,0x6b7f7763,0x00636363,0x7b6f6763,0x00636373,0x6363361c,0x001c3663, 18 | 0x3e66663f,0x000f0606,0x3333331e,0x00381e3b,0x3e66663f,0x0067361e,0x1c07331e,0x001e3338, 19 | 0x0c0c2d3f,0x001e0c0c,0x33333333,0x003f3333,0x33333333,0x000c1e33,0x6b636363,0x0063777f, 20 | 0x1c366363,0x00636336,0x1e333333,0x001e0c0c,0x0c19337f,0x007f6346,0x0606061e,0x001e0606, 21 | 0x180c0603,0x00406030,0x1818181e,0x001e1818,0x63361c08,0x00000000,0x00000000,0xff000000, 22 | 0x00180c0c,0x00000000,0x301e0000,0x006e333e,0x663e0607,0x003d6666,0x331e0000,0x001e3303, 23 | 0x3e303038,0x006e3333,0x331e0000,0x001e033f,0x0f06361c,0x000f0606,0x336e0000,0x1f303e33, 24 | 0x6e360607,0x00676666,0x0c0e000c,0x001e0c0c,0x181e0018,0x0e1b1818,0x36660607,0x0067361e, 25 | 0x0c0c0c0e,0x001e0c0c,0x7f370000,0x0063636b,0x331f0000,0x00333333,0x331e0000,0x001e3333, 26 | 0x663b0000,0x0f063e66,0x336e0000,0x78303e33,0x361b0000,0x000f0636,0x033e0000,0x001f301e, 27 | 0x0c3e0c08,0x00182c0c,0x33330000,0x006e3333,0x33330000,0x000c1e33,0x63630000,0x00367f6b, 28 | 0x36630000,0x0063361c,0x33330000,0x1f303e33,0x193f0000,0x003f260c,0x070c0c38,0x00380c0c, 29 | 0x00181818,0x00181818,0x380c0c07,0x00070c0c,0x00003b6e,0x00000000, 30 | }; 31 | 32 | [numthreads(8, 8, 1)] 33 | void main(const uint3 dtid : SV_DispatchThreadID, const uint3 gtid : SV_GroupThreadID, const uint3 gid : SV_GroupID) 34 | { 35 | uint i = input[gid.xy].r - ' '; 36 | uint m = rastafont8x8_bitmap[i*2 + gtid.y/4]; 37 | if( m & (1<<((gtid.y*8 + gtid.x)&31)) ) 38 | { 39 | output[dtid.xy] = 1; 40 | } 41 | } 42 | --------------------------------------------------------------------------------