office-gobmx/editeng/inc/EditLine.hxx
Noel Grandin 11b1557147 convert KernArray from sal_Int32 to double
which allows us to eliminate a bunch of rounding at various layers, and
consequently maintain a lot more precision

Change-Id: I911dedd7c041c1d67396c082e5695346ea689acb
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/175814
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2024-10-31 12:10:52 +01:00

143 lines
5.2 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
#pragma once
#include <vector>
#include <sal/types.h>
#include <tools/gen.hxx>
#include <vcl/kernarray.hxx>
class ParaPortion;
class EditLine
{
private:
KernArray maPositions;
std::vector<sal_Bool> maKashidaPositions;
sal_Int32 mnTextWidth = 0;
sal_Int32 mnStartPosX = 0;
sal_Int32 mnNextLinePosXDiff = 0;
sal_Int32 mnStart = 0; // could be replaced by nStartPortion
sal_Int32 mnEnd = 0; // could be replaced by nEndPortion
sal_Int32 mnStartPortion = 0;
sal_Int32 mnEndPortion = 0;
sal_uInt16 mnHeight = 0; // Total height of the line
sal_uInt16 mnTextHeight = 0; // Pure Text height
sal_uInt16 mnMaxAscent = 0;
bool mbHangingPunctuation : 1 = false;
bool mbInvalid : 1 = true; // for skillful formatting
public:
EditLine() = default;
EditLine(const EditLine& rEditLine)
: mnStart(rEditLine.mnStart)
, mnEnd(rEditLine.mnEnd)
, mnStartPortion(rEditLine.mnStartPortion)
, mnEndPortion(rEditLine.mnEndPortion)
, mbHangingPunctuation(rEditLine.mbHangingPunctuation)
{
}
bool IsIn(sal_Int32 nIndex) const { return nIndex >= mnStart && nIndex < mnEnd; }
bool IsIn(sal_Int32 nIndex, bool bIncludeEnd) const
{
return nIndex >= mnStart && (bIncludeEnd ? nIndex <= mnEnd : nIndex < mnEnd);
}
void SetStart(sal_Int32 nStart) { mnStart = nStart; }
sal_Int32 GetStart() const { return mnStart; }
sal_Int32& GetStart() { return mnStart; }
void SetEnd(sal_Int32 nEnd) { mnEnd = nEnd; }
sal_Int32 GetEnd() const { return mnEnd; }
sal_Int32& GetEnd() { return mnEnd; }
void SetStartPortion(sal_Int32 nStartPortion) { mnStartPortion = nStartPortion; }
sal_Int32 GetStartPortion() const { return mnStartPortion; }
sal_Int32& GetStartPortion() { return mnStartPortion; }
void SetEndPortion(sal_Int32 nEndPortion) { mnEndPortion = nEndPortion; }
sal_Int32 GetEndPortion() const { return mnEndPortion; }
sal_Int32& GetEndPortion() { return mnEndPortion; }
void SetHeight(sal_uInt16 nHeight, sal_uInt16 nTextHeight = 0);
sal_uInt16 GetHeight() const { return mnHeight; }
sal_uInt16 GetTxtHeight() const { return mnTextHeight; }
void SetTextWidth(sal_Int32 nTextWidth) { mnTextWidth = nTextWidth; }
sal_Int32 GetTextWidth() const { return mnTextWidth; }
void SetMaxAscent(sal_uInt16 nMaxAscent) { mnMaxAscent = nMaxAscent; }
sal_uInt16 GetMaxAscent() const { return mnMaxAscent; }
void SetHangingPunctuation(bool bHangingPunctuation)
{
mbHangingPunctuation = bHangingPunctuation;
}
bool IsHangingPunctuation() const { return mbHangingPunctuation; }
sal_Int32 GetLen() const { return mnEnd - mnStart; }
sal_Int32 GetStartPosX() const { return mnStartPosX; }
void SetStartPosX(sal_Int32 nStart);
sal_Int32 GetNextLinePosXDiff() const { return mnNextLinePosXDiff; }
void SetNextLinePosXDiff(sal_Int32 nDiff) { mnNextLinePosXDiff = nDiff; }
Size CalcTextSize(ParaPortion& rParaPortion);
bool IsInvalid() const { return mbInvalid; }
bool IsValid() const { return !mbInvalid; }
void SetInvalid() { mbInvalid = true; }
void SetValid() { mbInvalid = false; }
bool IsEmpty() const { return mnEnd <= mnStart; }
KernArray& GetCharPosArray() { return maPositions; }
const KernArray& GetCharPosArray() const { return maPositions; }
std::vector<sal_Bool>& GetKashidaArray() { return maKashidaPositions; }
const std::vector<sal_Bool>& GetKashidaArray() const { return maKashidaPositions; }
EditLine* Clone() const;
EditLine& operator=(const EditLine& rLine)
{
mnEnd = rLine.mnEnd;
mnStart = rLine.mnStart;
mnEndPortion = rLine.mnEndPortion;
mnStartPortion = rLine.mnStartPortion;
return *this;
}
bool operator==(const EditLine& rLine) const
{
return mnStart == rLine.mnStart && mnEnd == rLine.mnEnd
&& mnStartPortion == rLine.mnStartPortion && mnEndPortion == rLine.mnEndPortion;
}
};
template <typename charT, typename traits>
inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& stream,
EditLine const& rLine)
{
return stream << "EditLine(" << rLine.GetStart() << ", " << rLine.GetEnd() << ")";
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */