1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     font_Font.cpp
4 
5   Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Revision: 21906 $
14  *---------------------------------------------------------------------------*/
15 
16 #include "precompiled.h"
17 
18 #include <GLES2/gl2.h>
19 #include <GLES2/gl2ext.h>
20 #include <nn/assert.h>
21 #include <nn/gx.h>
22 #ifdef NW_PLATFORM_CTR
23     #include <nn/gx/CTR/gx_CommandAccess.h>
24 #endif
25 #include <nw/font/font_Font.h>
26 
27 
28 namespace nw {
29 namespace font {
30 
31 namespace internal {
32 
33 void
LoadTexture(u16 texWidth,u16 texHeight,TexFmt texFormat,const void * pImage,bool isSmallLinearFilter,bool isLargeLinearFilter)34 LoadTexture(
35     u16         texWidth,
36     u16         texHeight,
37     TexFmt      texFormat,
38     const void* pImage,
39     bool        isSmallLinearFilter,
40     bool        isLargeLinearFilter
41 )
42 {
43     GLenum format = GL_ALPHA_NATIVE_DMP;
44     GLenum type = GL_UNSIGNED_BYTE;
45     switch (texFormat)
46     {
47     case FONT_SHEET_FORMAT_A4:          format = GL_ALPHA_NATIVE_DMP;           type = GL_UNSIGNED_4BITS_DMP;       break;
48     case FONT_SHEET_FORMAT_A8:          format = GL_ALPHA_NATIVE_DMP;           type = GL_UNSIGNED_BYTE;            break;
49     case FONT_SHEET_FORMAT_LA4:         format = GL_LUMINANCE_ALPHA_NATIVE_DMP; type = GL_UNSIGNED_BYTE_4_4_DMP;    break;
50     case FONT_SHEET_FORMAT_LA8:         format = GL_LUMINANCE_ALPHA_NATIVE_DMP; type = GL_UNSIGNED_BYTE;            break;
51 
52     case FONT_SHEET_FORMAT_RGBA4:       format = GL_RGBA_NATIVE_DMP;            type = GL_UNSIGNED_SHORT_4_4_4_4;   break;
53     case FONT_SHEET_FORMAT_RGB5A1:      format = GL_RGBA_NATIVE_DMP;            type = GL_UNSIGNED_SHORT_5_5_5_1;   break;
54     case FONT_SHEET_FORMAT_RGBA8:       format = GL_RGBA_NATIVE_DMP;            type = GL_UNSIGNED_BYTE;            break;
55     case FONT_SHEET_FORMAT_RGB565:      format = GL_RGB_NATIVE_DMP;             type = GL_UNSIGNED_SHORT_5_6_5;     break;
56     case FONT_SHEET_FORMAT_RGB8:        format = GL_RGB_NATIVE_DMP;             type = GL_UNSIGNED_BYTE;            break;
57     default:
58         NN_ASSERTMSG(false,
59             "CharWriter::LoadTexture() : Unknown font sheet format(=%d)",
60             texFormat);
61     }
62     const GLint mipLevel = 0;
63 
64     // テクスチャのメモリへの読み込み指定
65     int texLoadFlag =
66 #ifdef NW_PLATFORM_CTR
67             // フォントリソースがメモリに存在していることが前提であるため、
68             // FCRAMのものを直接参照してもらい、コピーしない。
69             NN_GX_MEM_FCRAM | GL_NO_COPY_FCRAM_DMP
70 #else
71             0
72 #endif
73         ;
74 
75     glTexImage2D(GL_TEXTURE_2D | texLoadFlag, mipLevel, format, texWidth, texHeight, 0, format, type, pImage);
76 
77     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
78     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
79     GLint filter = isSmallLinearFilter ? GL_LINEAR: GL_NEAREST;
80     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
81     filter = isLargeLinearFilter ? GL_LINEAR: GL_NEAREST;
82     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
83     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, 0.0f);
84     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, -1000);
85 }
86 
TextureObject()87 TextureObject::TextureObject()
88 {
89     Reset();
90 }
91 
92 void
Set(u32 name,const Font * pFont,const void * pImage,TexFmt format,u16 width,u16 height)93 TextureObject::Set(
94     u32         name,
95     const Font* pFont,
96     const void* pImage,
97     TexFmt      format,
98     u16         width,
99     u16         height
100 )
101 {
102     m_Name          = name;
103     m_pFont         = pFont;
104 
105     m_pImage        = pImage == NULL ?
106         0:
107 #ifdef NW_PLATFORM_CTR
108         (nngxGetPhysicalAddr(reinterpret_cast<uptr>(pImage)) / 8)
109 #else
110         reinterpret_cast<uptr>(pImage)
111 #endif
112         ;
113 
114     m_Format        = static_cast<u8>(format);
115     m_Size.width    = width;
116     m_Size.height   = height;
117 }
118 
119 }   // namespace internal
120 
Glyph()121 Glyph::Glyph()
122 :   isSheetUpdated(false)
123 {
124 }
125 
~Font()126 Font::~Font()
127 {
128 }
129 
130 const CharStrmReader
GetCharStrmReader(char) const131 Font::GetCharStrmReader(char /* dummy */) const
132 {
133     CharStrmReader::ReadNextCharFunc func = NULL;
134 
135     switch (GetCharacterCode())
136     {
137     case CHARACTER_CODE_UNICODE:    func = &CharStrmReader::ReadNextCharUTF8;   break;
138     case CHARACTER_CODE_SJIS:       func = &CharStrmReader::ReadNextCharSJIS;   break;
139     case CHARACTER_CODE_CP1252:     func = &CharStrmReader::ReadNextCharCP1252; break;
140 
141     default:
142         NN_ASSERT(false);
143         break;
144     }
145 
146     return CharStrmReader(func);
147 }
148 
149 const CharStrmReader
GetCharStrmReader(wchar_t) const150 Font::GetCharStrmReader(wchar_t /* dummy */) const
151 {
152     CharStrmReader::ReadNextCharFunc func = NULL;
153 
154     switch (GetCharacterCode())
155     {
156     case CHARACTER_CODE_UNICODE:    func = &CharStrmReader::ReadNextCharUTF16;  break;
157 
158     default:
159         NN_ASSERT(false);
160         break;
161     }
162 
163     return CharStrmReader(func);
164 }
165 
166 }   // namespace font
167 }   // namespace nw
168