/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_vcl.hxx" // We need this to enable namespace support in libgrengine headers. #define GR_NAMESPACE // Header files // // Standard Library #include #include #include "graphite_textsrc.hxx" #include // class TextSourceAdaptor implementation. // TextSourceAdaptor::~TextSourceAdaptor() { delete mpFeatures; } gr::UtfType TextSourceAdaptor::utfEncodingForm() { return gr::kutf16; } size_t TextSourceAdaptor::getLength() { return maLayoutArgs.mnLength; } size_t TextSourceAdaptor::fetch(gr::toffset, size_t, gr::utf32 *) { assert(false); return 0; } size_t TextSourceAdaptor::fetch(gr::toffset offset, size_t char_count, gr::utf16 * char_buffer) { assert(char_buffer); size_t copy_count = std::min(size_t(maLayoutArgs.mnLength), char_count); std::copy(maLayoutArgs.mpStr + offset, maLayoutArgs.mpStr + offset + copy_count, char_buffer); return copy_count; } size_t TextSourceAdaptor::fetch(gr::toffset, size_t, gr::utf8 *) { assert(false); return 0; } inline void TextSourceAdaptor::getCharProperties(const int nCharIdx, int & min, int & lim, size_t & depth) { maLayoutArgs.ResetPos(); bool rtl = maLayoutArgs.mnFlags & SAL_LAYOUT_BIDI_RTL; for(depth = ((rtl)? 1:0); maLayoutArgs.maRuns.GetRun(&min, &lim, &rtl); maLayoutArgs.maRuns.NextRun()) { if (min > nCharIdx) break; // Only increase the depth when a change of direction occurs. depth += int(rtl ^ bool(depth & 0x1)); if (min <= nCharIdx && nCharIdx < lim) break; } // If there is no run for this position increment the depth, but don't // change if this is out of bounds context if (lim > 0 && nCharIdx >= lim && nCharIdx < maLayoutArgs.mnEndCharPos) depth++; } bool TextSourceAdaptor::getRightToLeft(gr::toffset nCharIdx) { size_t depth; int min, lim = 0; getCharProperties(nCharIdx, min, lim, depth); //printf("getRtl %d,%x=%d\n", nCharIdx, maLayoutArgs.mpStr[nCharIdx], depth & 0x1); return depth & 0x1; } unsigned int TextSourceAdaptor::getDirectionDepth(gr::toffset nCharIdx) { size_t depth; int min, lim; getCharProperties(nCharIdx, min, lim, depth); //printf("getDirectionDepth %d,%x=%d\n", nCharIdx, maLayoutArgs.mpStr[nCharIdx], depth); return depth; } float TextSourceAdaptor::getVerticalOffset(gr::toffset) { return 0.0f; //TODO: Implement correctly } gr::isocode TextSourceAdaptor::getLanguage(gr::toffset) { if (mpFeatures && mpFeatures->hasLanguage()) return mpFeatures->getLanguage(); gr::isocode unknown = {{0,0,0,0}}; return unknown; } ext_std::pair TextSourceAdaptor::propertyRange(gr::toffset nCharIdx) { if (nCharIdx < unsigned(maLayoutArgs.mnMinCharPos)) return ext_std::make_pair(0, maLayoutArgs.mnMinCharPos); if (nCharIdx < mnEnd) return ext_std::make_pair(maLayoutArgs.mnMinCharPos, mnEnd); return ext_std::make_pair(mnEnd, maLayoutArgs.mnLength); } size_t TextSourceAdaptor::getFontFeatures(gr::toffset, gr::FeatureSetting * settings) { if (mpFeatures) return mpFeatures->getFontFeatures(settings); return 0; } bool TextSourceAdaptor::sameSegment(gr::toffset char_idx1, gr::toffset char_idx2) { const ext_std::pair range1 = propertyRange(char_idx1), range2 = propertyRange(char_idx2); return range1 == range2; } void TextSourceAdaptor::setFeatures(const grutils::GrFeatureParser * pFeatures) { mpFeatures = new grutils::GrFeatureParser(*pFeatures); }