1*9f62ea84SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*9f62ea84SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*9f62ea84SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*9f62ea84SAndrew Rist * distributed with this work for additional information 6*9f62ea84SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*9f62ea84SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*9f62ea84SAndrew Rist * "License"); you may not use this file except in compliance 9*9f62ea84SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*9f62ea84SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*9f62ea84SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*9f62ea84SAndrew Rist * software distributed under the License is distributed on an 15*9f62ea84SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*9f62ea84SAndrew Rist * KIND, either express or implied. See the License for the 17*9f62ea84SAndrew Rist * specific language governing permissions and limitations 18*9f62ea84SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*9f62ea84SAndrew Rist *************************************************************/ 21*9f62ea84SAndrew Rist 22*9f62ea84SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_vcl.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir // We need this to enable namespace support in libgrengine headers. 28cdf0e10cSrcweir #define GR_NAMESPACE 29cdf0e10cSrcweir 30cdf0e10cSrcweir // Header files 31cdf0e10cSrcweir // 32cdf0e10cSrcweir // Standard Library 33cdf0e10cSrcweir #include <string> 34cdf0e10cSrcweir #include <cassert> 35cdf0e10cSrcweir #include "graphite_textsrc.hxx" 36cdf0e10cSrcweir #include <graphite_features.hxx> 37cdf0e10cSrcweir 38cdf0e10cSrcweir // class TextSourceAdaptor implementation. 39cdf0e10cSrcweir // 40cdf0e10cSrcweir TextSourceAdaptor::~TextSourceAdaptor() 41cdf0e10cSrcweir { 42cdf0e10cSrcweir delete mpFeatures; 43cdf0e10cSrcweir } 44cdf0e10cSrcweir 45cdf0e10cSrcweir gr::UtfType TextSourceAdaptor::utfEncodingForm() { 46cdf0e10cSrcweir return gr::kutf16; 47cdf0e10cSrcweir } 48cdf0e10cSrcweir 49cdf0e10cSrcweir 50cdf0e10cSrcweir size_t TextSourceAdaptor::getLength() 51cdf0e10cSrcweir { 52cdf0e10cSrcweir return maLayoutArgs.mnLength; 53cdf0e10cSrcweir } 54cdf0e10cSrcweir 55cdf0e10cSrcweir 56cdf0e10cSrcweir size_t TextSourceAdaptor::fetch(gr::toffset, size_t, gr::utf32 *) 57cdf0e10cSrcweir { 58cdf0e10cSrcweir assert(false); 59cdf0e10cSrcweir return 0; 60cdf0e10cSrcweir } 61cdf0e10cSrcweir 62cdf0e10cSrcweir 63cdf0e10cSrcweir size_t TextSourceAdaptor::fetch(gr::toffset offset, size_t char_count, gr::utf16 * char_buffer) 64cdf0e10cSrcweir { 65cdf0e10cSrcweir assert(char_buffer); 66cdf0e10cSrcweir 67cdf0e10cSrcweir size_t copy_count = std::min(size_t(maLayoutArgs.mnLength), char_count); 68cdf0e10cSrcweir std::copy(maLayoutArgs.mpStr + offset, maLayoutArgs.mpStr + offset + copy_count, char_buffer); 69cdf0e10cSrcweir 70cdf0e10cSrcweir return copy_count; 71cdf0e10cSrcweir } 72cdf0e10cSrcweir 73cdf0e10cSrcweir 74cdf0e10cSrcweir size_t TextSourceAdaptor::fetch(gr::toffset, size_t, gr::utf8 *) 75cdf0e10cSrcweir { 76cdf0e10cSrcweir assert(false); 77cdf0e10cSrcweir return 0; 78cdf0e10cSrcweir } 79cdf0e10cSrcweir 80cdf0e10cSrcweir 81cdf0e10cSrcweir inline void TextSourceAdaptor::getCharProperties(const int nCharIdx, int & min, int & lim, size_t & depth) 82cdf0e10cSrcweir { 83cdf0e10cSrcweir maLayoutArgs.ResetPos(); 84cdf0e10cSrcweir bool rtl = maLayoutArgs.mnFlags & SAL_LAYOUT_BIDI_RTL; 85cdf0e10cSrcweir for(depth = ((rtl)? 1:0); maLayoutArgs.maRuns.GetRun(&min, &lim, &rtl); maLayoutArgs.maRuns.NextRun()) 86cdf0e10cSrcweir { 87cdf0e10cSrcweir if (min > nCharIdx) 88cdf0e10cSrcweir break; 89cdf0e10cSrcweir // Only increase the depth when a change of direction occurs. 90cdf0e10cSrcweir depth += int(rtl ^ bool(depth & 0x1)); 91cdf0e10cSrcweir if (min <= nCharIdx && nCharIdx < lim) 92cdf0e10cSrcweir break; 93cdf0e10cSrcweir } 94cdf0e10cSrcweir // If there is no run for this position increment the depth, but don't 95cdf0e10cSrcweir // change if this is out of bounds context 96cdf0e10cSrcweir if (lim > 0 && nCharIdx >= lim && nCharIdx < maLayoutArgs.mnEndCharPos) 97cdf0e10cSrcweir depth++; 98cdf0e10cSrcweir } 99cdf0e10cSrcweir 100cdf0e10cSrcweir 101cdf0e10cSrcweir bool TextSourceAdaptor::getRightToLeft(gr::toffset nCharIdx) 102cdf0e10cSrcweir { 103cdf0e10cSrcweir size_t depth; 104cdf0e10cSrcweir int min, lim = 0; 105cdf0e10cSrcweir getCharProperties(nCharIdx, min, lim, depth); 106cdf0e10cSrcweir //printf("getRtl %d,%x=%d\n", nCharIdx, maLayoutArgs.mpStr[nCharIdx], depth & 0x1); 107cdf0e10cSrcweir return depth & 0x1; 108cdf0e10cSrcweir } 109cdf0e10cSrcweir 110cdf0e10cSrcweir 111cdf0e10cSrcweir unsigned int TextSourceAdaptor::getDirectionDepth(gr::toffset nCharIdx) 112cdf0e10cSrcweir { 113cdf0e10cSrcweir size_t depth; 114cdf0e10cSrcweir int min, lim; 115cdf0e10cSrcweir getCharProperties(nCharIdx, min, lim, depth); 116cdf0e10cSrcweir //printf("getDirectionDepth %d,%x=%d\n", nCharIdx, maLayoutArgs.mpStr[nCharIdx], depth); 117cdf0e10cSrcweir return depth; 118cdf0e10cSrcweir } 119cdf0e10cSrcweir 120cdf0e10cSrcweir 121cdf0e10cSrcweir float TextSourceAdaptor::getVerticalOffset(gr::toffset) 122cdf0e10cSrcweir { 123cdf0e10cSrcweir return 0.0f; //TODO: Implement correctly 124cdf0e10cSrcweir } 125cdf0e10cSrcweir 126cdf0e10cSrcweir gr::isocode TextSourceAdaptor::getLanguage(gr::toffset) 127cdf0e10cSrcweir { 128cdf0e10cSrcweir if (mpFeatures && mpFeatures->hasLanguage()) 129cdf0e10cSrcweir return mpFeatures->getLanguage(); 130cdf0e10cSrcweir gr::isocode unknown = {{0,0,0,0}}; 131cdf0e10cSrcweir return unknown; 132cdf0e10cSrcweir } 133cdf0e10cSrcweir 134cdf0e10cSrcweir ext_std::pair<gr::toffset, gr::toffset> TextSourceAdaptor::propertyRange(gr::toffset nCharIdx) 135cdf0e10cSrcweir { 136cdf0e10cSrcweir 137cdf0e10cSrcweir if (nCharIdx < unsigned(maLayoutArgs.mnMinCharPos)) 138cdf0e10cSrcweir return ext_std::make_pair(0, maLayoutArgs.mnMinCharPos); 139cdf0e10cSrcweir 140cdf0e10cSrcweir if (nCharIdx < mnEnd) 141cdf0e10cSrcweir return ext_std::make_pair(maLayoutArgs.mnMinCharPos, mnEnd); 142cdf0e10cSrcweir 143cdf0e10cSrcweir return ext_std::make_pair(mnEnd, maLayoutArgs.mnLength); 144cdf0e10cSrcweir } 145cdf0e10cSrcweir 146cdf0e10cSrcweir size_t TextSourceAdaptor::getFontFeatures(gr::toffset, gr::FeatureSetting * settings) 147cdf0e10cSrcweir { 148cdf0e10cSrcweir if (mpFeatures) return mpFeatures->getFontFeatures(settings); 149cdf0e10cSrcweir return 0; 150cdf0e10cSrcweir } 151cdf0e10cSrcweir 152cdf0e10cSrcweir 153cdf0e10cSrcweir bool TextSourceAdaptor::sameSegment(gr::toffset char_idx1, gr::toffset char_idx2) 154cdf0e10cSrcweir { 155cdf0e10cSrcweir const ext_std::pair<gr::toffset, gr::toffset> 156cdf0e10cSrcweir range1 = propertyRange(char_idx1), 157cdf0e10cSrcweir range2 = propertyRange(char_idx2); 158cdf0e10cSrcweir 159cdf0e10cSrcweir return range1 == range2; 160cdf0e10cSrcweir } 161cdf0e10cSrcweir 162cdf0e10cSrcweir void TextSourceAdaptor::setFeatures(const grutils::GrFeatureParser * pFeatures) 163cdf0e10cSrcweir { 164cdf0e10cSrcweir mpFeatures = new grutils::GrFeatureParser(*pFeatures); 165cdf0e10cSrcweir } 166