example.cpp revision 8920e81717c6e51b92ff8f4479a1f959af260556
1/* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17// This is a test program that uses Minikin to layout and draw some text. 18// At the moment, it just draws a string into /data/local/tmp/foo.pgm. 19 20#include <stdio.h> 21#include <vector> 22#include <fstream> 23 24#include <unicode/unistr.h> 25#include <unicode/utf16.h> 26 27#include <minikin/MinikinFontFreeType.h> 28#include <minikin/Layout.h> 29 30using std::vector; 31using namespace android; 32using namespace minikin; 33 34FT_Library library; // TODO: this should not be a global 35 36FontCollection *makeFontCollection() { 37 vector<FontFamily *>typefaces; 38 const char *fns[] = { 39 "/system/fonts/Roboto-Regular.ttf", 40 "/system/fonts/Roboto-Italic.ttf", 41 "/system/fonts/Roboto-BoldItalic.ttf", 42 "/system/fonts/Roboto-Light.ttf", 43 "/system/fonts/Roboto-Thin.ttf", 44 "/system/fonts/Roboto-Bold.ttf", 45 "/system/fonts/Roboto-ThinItalic.ttf", 46 "/system/fonts/Roboto-LightItalic.ttf" 47 }; 48 49 FontFamily *family = new FontFamily(); 50 FT_Face face; 51 FT_Error error; 52 for (size_t i = 0; i < sizeof(fns)/sizeof(fns[0]); i++) { 53 const char *fn = fns[i]; 54 printf("adding %s\n", fn); 55 error = FT_New_Face(library, fn, 0, &face); 56 if (error != 0) { 57 printf("error loading %s, %d\n", fn, error); 58 } 59 MinikinFont *font = new MinikinFontFreeType(face); 60 family->addFont(font); 61 } 62 typefaces.push_back(family); 63 64#if 1 65 family = new FontFamily(); 66 const char *fn = "/system/fonts/DroidSansDevanagari-Regular.ttf"; 67 error = FT_New_Face(library, fn, 0, &face); 68 MinikinFont *font = new MinikinFontFreeType(face); 69 family->addFont(font); 70 typefaces.push_back(family); 71#endif 72 73 return new FontCollection(typefaces); 74} 75 76int runMinikinTest() { 77 FT_Error error = FT_Init_FreeType(&library); 78 if (error) { 79 return -1; 80 } 81 Layout::init(); 82 83 FontCollection *collection = makeFontCollection(); 84 Layout layout; 85 layout.setFontCollection(collection); 86 const char *text = "fine world \xe0\xa4\xa8\xe0\xa4\xae\xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa5\x87"; 87 int bidiFlags = 0; 88 FontStyle fontStyle; 89 MinikinPaint paint; 90 paint.size = 32; 91 icu::UnicodeString icuText = icu::UnicodeString::fromUTF8(text); 92 layout.doLayout(icuText.getBuffer(), 0, icuText.length(), icuText.length(), bidiFlags, fontStyle, paint); 93 layout.dump(); 94 Bitmap bitmap(250, 50); 95 layout.draw(&bitmap, 10, 40, 32); 96 std::ofstream o; 97 o.open("/data/local/tmp/foo.pgm", std::ios::out | std::ios::binary); 98 bitmap.writePnm(o); 99 return 0; 100} 101 102int main(int argc, const char** argv) { 103 return runMinikinTest(); 104} 105