// Copyright 2014 PDFium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #include "fpdfsdk/pdfwindow/cpwl_utils.h" #include #include #include #include "core/fpdfdoc/cpvt_word.h" #include "fpdfsdk/fxedit/fxet_edit.h" #include "fpdfsdk/pdfwindow/cpwl_icon.h" CFX_ByteString CPWL_Utils::GetRectFillAppStream(const CFX_FloatRect& rect, const CFX_Color& color) { std::ostringstream sAppStream; CFX_ByteString sColor = GetColorAppStream(color, true); if (sColor.GetLength() > 0) { sAppStream << "q\n" << sColor; sAppStream << rect.left << " " << rect.bottom << " " << rect.right - rect.left << " " << rect.top - rect.bottom << " re f\nQ\n"; } return CFX_ByteString(sAppStream); } CFX_ByteString CPWL_Utils::GetEditAppStream(CFX_Edit* pEdit, const CFX_PointF& ptOffset, const CPVT_WordRange* pRange, bool bContinuous, uint16_t SubWord) { return CFX_Edit::GetEditAppearanceStream(pEdit, ptOffset, pRange, bContinuous, SubWord); } CFX_ByteString CPWL_Utils::GetEditSelAppStream(CFX_Edit* pEdit, const CFX_PointF& ptOffset, const CPVT_WordRange* pRange) { return CFX_Edit::GetSelectAppearanceStream(pEdit, ptOffset, pRange); } CFX_ByteString CPWL_Utils::GetColorAppStream(const CFX_Color& color, const bool& bFillOrStroke) { std::ostringstream sColorStream; switch (color.nColorType) { case COLORTYPE_RGB: sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " " << (bFillOrStroke ? "rg" : "RG") << "\n"; break; case COLORTYPE_GRAY: sColorStream << color.fColor1 << " " << (bFillOrStroke ? "g" : "G") << "\n"; break; case COLORTYPE_CMYK: sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " " << color.fColor4 << " " << (bFillOrStroke ? "k" : "K") << "\n"; break; } return CFX_ByteString(sColorStream); } CFX_ByteString CPWL_Utils::GetBorderAppStream(const CFX_FloatRect& rect, float fWidth, const CFX_Color& color, const CFX_Color& crLeftTop, const CFX_Color& crRightBottom, BorderStyle nStyle, const CPWL_Dash& dash) { std::ostringstream sAppStream; CFX_ByteString sColor; float fLeft = rect.left; float fRight = rect.right; float fTop = rect.top; float fBottom = rect.bottom; if (fWidth > 0.0f) { float fHalfWidth = fWidth / 2.0f; sAppStream << "q\n"; switch (nStyle) { default: case BorderStyle::SOLID: sColor = CPWL_Utils::GetColorAppStream(color, true); if (sColor.GetLength() > 0) { sAppStream << sColor; sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n"; sAppStream << fLeft + fWidth << " " << fBottom + fWidth << " " << fRight - fLeft - fWidth * 2 << " " << fTop - fBottom - fWidth * 2 << " re\n"; sAppStream << "f*\n"; } break; case BorderStyle::DASH: sColor = CPWL_Utils::GetColorAppStream(color, false); if (sColor.GetLength() > 0) { sAppStream << sColor; sAppStream << fWidth << " w" << " [" << dash.nDash << " " << dash.nGap << "] " << dash.nPhase << " d\n"; sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " m\n"; sAppStream << fLeft + fWidth / 2 << " " << fTop - fWidth / 2 << " l\n"; sAppStream << fRight - fWidth / 2 << " " << fTop - fWidth / 2 << " l\n"; sAppStream << fRight - fWidth / 2 << " " << fBottom + fWidth / 2 << " l\n"; sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " l S\n"; } break; case BorderStyle::BEVELED: case BorderStyle::INSET: sColor = CPWL_Utils::GetColorAppStream(crLeftTop, true); if (sColor.GetLength() > 0) { sAppStream << sColor; sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " m\n"; sAppStream << fLeft + fHalfWidth << " " << fTop - fHalfWidth << " l\n"; sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " l\n"; sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n"; sAppStream << fLeft + fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n"; sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l f\n"; } sColor = CPWL_Utils::GetColorAppStream(crRightBottom, true); if (sColor.GetLength() > 0) { sAppStream << sColor; sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " m\n"; sAppStream << fRight - fHalfWidth << " " << fBottom + fHalfWidth << " l\n"; sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " l\n"; sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n"; sAppStream << fRight - fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n"; sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l f\n"; } sColor = CPWL_Utils::GetColorAppStream(color, true); if (sColor.GetLength() > 0) { sAppStream << sColor; sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n"; sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " " << fRight - fLeft - fHalfWidth * 2 << " " << fTop - fBottom - fHalfWidth * 2 << " re f*\n"; } break; case BorderStyle::UNDERLINE: sColor = CPWL_Utils::GetColorAppStream(color, false); if (sColor.GetLength() > 0) { sAppStream << sColor; sAppStream << fWidth << " w\n"; sAppStream << fLeft << " " << fBottom + fWidth / 2 << " m\n"; sAppStream << fRight << " " << fBottom + fWidth / 2 << " l S\n"; } break; } sAppStream << "Q\n"; } return CFX_ByteString(sAppStream); }