// 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 "../../../../third_party/base/numerics/safe_math.h"
#include "../../../include/fxcrt/fx_system.h"
#include "../../../include/fxge/fx_ge.h"

CFX_ClipRgn::CFX_ClipRgn(int width, int height)
{
    m_Type = RectI;
    m_Box.left = m_Box.top = 0;
    m_Box.right = width;
    m_Box.bottom = height;
}
CFX_ClipRgn::CFX_ClipRgn(const FX_RECT& rect)
{
    m_Type = RectI;
    m_Box = rect;
}
CFX_ClipRgn::CFX_ClipRgn(const CFX_ClipRgn& src)
{
    m_Type = src.m_Type;
    m_Box = src.m_Box;
    m_Mask = src.m_Mask;
}
CFX_ClipRgn::~CFX_ClipRgn()
{
}
void CFX_ClipRgn::Reset(const FX_RECT& rect)
{
    m_Type = RectI;
    m_Box = rect;
    m_Mask.SetNull();
}
void CFX_ClipRgn::IntersectRect(const FX_RECT& rect)
{
    if (m_Type == RectI) {
        m_Box.Intersect(rect);
        return;
    }
    if (m_Type == MaskF) {
        IntersectMaskRect(rect, m_Box, m_Mask);
        return;
    }
}
void CFX_ClipRgn::IntersectMaskRect(FX_RECT rect, FX_RECT mask_rect, CFX_DIBitmapRef Mask)
{
    const CFX_DIBitmap* mask_dib = Mask;
    m_Type = MaskF;
    m_Box = rect;
    m_Box.Intersect(mask_rect);
    if (m_Box.IsEmpty()) {
        m_Type = RectI;
        return;
    }
    if (m_Box == mask_rect) {
        m_Mask = Mask;
        return;
    }
    CFX_DIBitmap* new_dib = m_Mask.New();
    if (!new_dib) {
        return;
    }
    new_dib->Create(m_Box.Width(), m_Box.Height(), FXDIB_8bppMask);
    for (int row = m_Box.top; row < m_Box.bottom; row ++) {
        uint8_t* dest_scan = new_dib->GetBuffer() + new_dib->GetPitch() * (row - m_Box.top);
        uint8_t* src_scan = mask_dib->GetBuffer() + mask_dib->GetPitch() * (row - mask_rect.top);
        for (int col = m_Box.left; col < m_Box.right; col ++) {
            dest_scan[col - m_Box.left] = src_scan[col - mask_rect.left];
        }
    }
}
void CFX_ClipRgn::IntersectMaskF(int left, int top, CFX_DIBitmapRef Mask)
{
    const CFX_DIBitmap* mask_dib = Mask;
    ASSERT(mask_dib->GetFormat() == FXDIB_8bppMask);
    FX_RECT mask_box(left, top, left + mask_dib->GetWidth(), top + mask_dib->GetHeight());
    if (m_Type == RectI) {
        IntersectMaskRect(m_Box, mask_box, Mask);
        return;
    }
    if (m_Type == MaskF) {
        FX_RECT new_box = m_Box;
        new_box.Intersect(mask_box);
        if (new_box.IsEmpty()) {
            m_Type = RectI;
            m_Mask.SetNull();
            m_Box = new_box;
            return;
        }
        CFX_DIBitmapRef new_mask;
        CFX_DIBitmap* new_dib = new_mask.New();
        if (!new_dib) {
            return;
        }
        new_dib->Create(new_box.Width(), new_box.Height(), FXDIB_8bppMask);
        const CFX_DIBitmap* old_dib = m_Mask;
        for (int row = new_box.top; row < new_box.bottom; row ++) {
            uint8_t* old_scan = old_dib->GetBuffer() + (row - m_Box.top) * old_dib->GetPitch();
            uint8_t* mask_scan = mask_dib->GetBuffer() + (row - top) * mask_dib->GetPitch();
            uint8_t* new_scan = new_dib->GetBuffer() + (row - new_box.top) * new_dib->GetPitch();
            for (int col = new_box.left; col < new_box.right; col ++) {
                new_scan[col - new_box.left] = old_scan[col - m_Box.left] * mask_scan[col - left] / 255;
            }
        }
        m_Box = new_box;
        m_Mask = new_mask;
        return;
    }
    ASSERT(false);
}
CFX_PathData::CFX_PathData()
{
    m_PointCount = m_AllocCount = 0;
    m_pPoints = NULL;
}
CFX_PathData::~CFX_PathData()
{
    if (m_pPoints) {
        FX_Free(m_pPoints);
    }
}
void CFX_PathData::SetPointCount(int nPoints)
{
    m_PointCount = nPoints;
    if (m_AllocCount < nPoints) {
        if (m_pPoints) {
            FX_Free(m_pPoints);
            m_pPoints = NULL;
        }
        m_pPoints = FX_Alloc(FX_PATHPOINT, nPoints);
        m_AllocCount = nPoints;
    }
}
void CFX_PathData::AllocPointCount(int nPoints)
{
    if (m_AllocCount < nPoints) {
        FX_PATHPOINT* pNewBuf = FX_Alloc(FX_PATHPOINT, nPoints);
        if (m_PointCount) {
            FXSYS_memcpy(pNewBuf, m_pPoints, m_PointCount * sizeof(FX_PATHPOINT));
        }
        if (m_pPoints) {
            FX_Free(m_pPoints);
        }
        m_pPoints = pNewBuf;
        m_AllocCount = nPoints;
    }
}
CFX_PathData::CFX_PathData(const CFX_PathData& src)
{
    m_PointCount = m_AllocCount = src.m_PointCount;
    m_pPoints = FX_Alloc(FX_PATHPOINT, src.m_PointCount);
    FXSYS_memcpy(m_pPoints, src.m_pPoints, sizeof(FX_PATHPOINT) * m_PointCount);
}
void CFX_PathData::TrimPoints(int nPoints)
{
    if (m_PointCount <= nPoints) {
        return;
    }
    SetPointCount(nPoints);
}
void CFX_PathData::AddPointCount(int addPoints)
{
    pdfium::base::CheckedNumeric<int> safe_new_count = m_PointCount;
    safe_new_count += addPoints;
    int new_count = safe_new_count.ValueOrDie();
    AllocPointCount(new_count);
    m_PointCount = new_count;
}
void CFX_PathData::Append(const CFX_PathData* pSrc, const CFX_AffineMatrix* pMatrix)
{
    int old_count = m_PointCount;
    AddPointCount(pSrc->m_PointCount);
    FXSYS_memcpy(m_pPoints + old_count, pSrc->m_pPoints, pSrc->m_PointCount * sizeof(FX_PATHPOINT));
    if (pMatrix) {
        for (int i = 0; i < pSrc->m_PointCount; i ++) {
            pMatrix->Transform(m_pPoints[old_count + i].m_PointX, m_pPoints[old_count + i].m_PointY);
        }
    }
}
void CFX_PathData::SetPoint(int index, FX_FLOAT x, FX_FLOAT y, int flag)
{
    ASSERT(index < m_PointCount);
    m_pPoints[index].m_PointX = x;
    m_pPoints[index].m_PointY = y;
    m_pPoints[index].m_Flag = flag;
}
void CFX_PathData::AppendRect(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top)
{
    int old_count = m_PointCount;
    AddPointCount(5);
    FX_PATHPOINT* pPoints = m_pPoints + old_count;
    pPoints[0].m_PointX = pPoints[1].m_PointX = pPoints[4].m_PointX = left;
    pPoints[2].m_PointX = pPoints[3].m_PointX = right;
    pPoints[0].m_PointY = pPoints[3].m_PointY = pPoints[4].m_PointY = bottom;
    pPoints[1].m_PointY = pPoints[2].m_PointY = top;
    pPoints[0].m_Flag = FXPT_MOVETO;
    pPoints[1].m_Flag = pPoints[2].m_Flag = pPoints[3].m_Flag = FXPT_LINETO;
    pPoints[4].m_Flag = FXPT_LINETO | FXPT_CLOSEFIGURE;
}
CFX_FloatRect CFX_PathData::GetBoundingBox() const
{
    CFX_FloatRect rect;
    if (m_PointCount) {
        rect.InitRect(m_pPoints[0].m_PointX, m_pPoints[0].m_PointY);
        for (int i = 1; i < m_PointCount; i ++) {
            rect.UpdateRect(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY);
        }
    }
    return rect;
}
static void _UpdateLineEndPoints(CFX_FloatRect& rect, FX_FLOAT start_x, FX_FLOAT start_y, FX_FLOAT end_x, FX_FLOAT end_y,
                                 FX_FLOAT hw)
{
    if (start_x == end_x) {
        if (start_y == end_y) {
            rect.UpdateRect(end_x + hw, end_y + hw);
            rect.UpdateRect(end_x - hw, end_y - hw);
            return;
        }
        FX_FLOAT point_y;
        if (end_y < start_y) {
            point_y = end_y - hw;
        } else {
            point_y = end_y + hw;
        }
        rect.UpdateRect(end_x + hw, point_y);
        rect.UpdateRect(end_x - hw, point_y);
        return;
    }
    if (start_y == end_y) {
        FX_FLOAT point_x;
        if (end_x < start_x) {
            point_x = end_x - hw;
        } else {
            point_x = end_x + hw;
        }
        rect.UpdateRect(point_x, end_y + hw);
        rect.UpdateRect(point_x, end_y - hw);
        return;
    }
    FX_FLOAT dx = end_x - start_x;
    FX_FLOAT dy = end_y - start_y;
    FX_FLOAT ll = FXSYS_sqrt2(dx, dy);
    FX_FLOAT mx = end_x + hw * dx / ll;
    FX_FLOAT my = end_y + hw * dy / ll;
    FX_FLOAT dx1 = hw * dy / ll;
    FX_FLOAT dy1 = hw * dx / ll;
    rect.UpdateRect(mx - dx1, my + dy1);
    rect.UpdateRect(mx + dx1, my - dy1);
}
static void _UpdateLineJoinPoints(CFX_FloatRect& rect, FX_FLOAT start_x, FX_FLOAT start_y,
                                  FX_FLOAT middle_x, FX_FLOAT middle_y, FX_FLOAT end_x, FX_FLOAT end_y,
                                  FX_FLOAT half_width, FX_FLOAT miter_limit)
{
    FX_FLOAT start_k = 0, start_c = 0, end_k = 0, end_c = 0, start_len = 0, start_dc = 0, end_len = 0, end_dc = 0;
    bool bStartVert = FXSYS_fabs(start_x - middle_x) < 1.0f / 20;
    bool bEndVert = FXSYS_fabs(middle_x - end_x) < 1.0f / 20;
    if (bStartVert && bEndVert) {
        int start_dir = middle_y > start_y ? 1 : -1;
        FX_FLOAT point_y = middle_y + half_width * start_dir;
        rect.UpdateRect(middle_x + half_width, point_y);
        rect.UpdateRect(middle_x - half_width, point_y);
        return;
    }
    if (!bStartVert) {
        start_k = FXSYS_Div(middle_y - start_y, middle_x - start_x);
        start_c = middle_y - FXSYS_Mul(start_k, middle_x);
        start_len = FXSYS_sqrt2(start_x - middle_x, start_y - middle_y);
        start_dc = (FX_FLOAT)FXSYS_fabs(FXSYS_MulDiv(half_width, start_len, start_x - middle_x));
    }
    if (!bEndVert) {
        end_k = FXSYS_Div(end_y - middle_y, end_x - middle_x);
        end_c = middle_y - FXSYS_Mul(end_k, middle_x);
        end_len = FXSYS_sqrt2(end_x - middle_x, end_y - middle_y);
        end_dc = (FX_FLOAT)FXSYS_fabs(FXSYS_MulDiv(half_width, end_len, end_x - middle_x));
    }
    if (bStartVert) {
        FX_FLOAT outside_x = start_x;
        if (end_x < start_x) {
            outside_x += half_width;
        } else {
            outside_x -= half_width;
        }
        FX_FLOAT outside_y;
        if (start_y < FXSYS_Mul(end_k, start_x) + end_c) {
            outside_y = FXSYS_Mul(end_k, outside_x) + end_c + end_dc;
        } else {
            outside_y = FXSYS_Mul(end_k, outside_x) + end_c - end_dc;
        }
        rect.UpdateRect(outside_x, outside_y);
        return;
    }
    if (bEndVert) {
        FX_FLOAT outside_x = end_x;
        if (start_x < end_x) {
            outside_x += half_width;
        } else {
            outside_x -= half_width;
        }
        FX_FLOAT outside_y;
        if (end_y < FXSYS_Mul(start_k, end_x) + start_c) {
            outside_y = FXSYS_Mul(start_k, outside_x) + start_c + start_dc;
        } else {
            outside_y = FXSYS_Mul(start_k, outside_x) + start_c - start_dc;
        }
        rect.UpdateRect(outside_x, outside_y);
        return;
    }
    if (FXSYS_fabs(start_k - end_k) < 1.0f / 20) {
        int start_dir = middle_x > start_x ? 1 : -1;
        int end_dir = end_x > middle_x ? 1 : -1;
        if (start_dir == end_dir) {
            _UpdateLineEndPoints(rect, middle_x, middle_y, end_x, end_y, half_width);
        } else {
            _UpdateLineEndPoints(rect, start_x, start_y, middle_x, middle_y, half_width);
        }
        return;
    }
    FX_FLOAT start_outside_c = start_c;
    if (end_y < FXSYS_Mul(start_k, end_x) + start_c) {
        start_outside_c += start_dc;
    } else {
        start_outside_c -= start_dc;
    }
    FX_FLOAT end_outside_c = end_c;
    if (start_y < FXSYS_Mul(end_k, start_x) + end_c) {
        end_outside_c += end_dc;
    } else {
        end_outside_c -= end_dc;
    }
    FX_FLOAT join_x = FXSYS_Div(end_outside_c - start_outside_c, start_k - end_k);
    FX_FLOAT join_y = FXSYS_Mul(start_k, join_x) + start_outside_c;
    rect.UpdateRect(join_x, join_y);
}
CFX_FloatRect CFX_PathData::GetBoundingBox(FX_FLOAT line_width, FX_FLOAT miter_limit) const
{
    CFX_FloatRect rect(100000 * 1.0f, 100000 * 1.0f, -100000 * 1.0f, -100000 * 1.0f);
    int iPoint = 0;
    FX_FLOAT half_width = line_width;
    int iStartPoint, iEndPoint, iMiddlePoint;
    bool bJoin;
    while (iPoint < m_PointCount) {
        if (m_pPoints[iPoint].m_Flag == FXPT_MOVETO) {
            iStartPoint = iPoint + 1;
            iEndPoint = iPoint;
            bJoin = false;
        } else {
            if (m_pPoints[iPoint].m_Flag == FXPT_BEZIERTO) {
                rect.UpdateRect(m_pPoints[iPoint].m_PointX, m_pPoints[iPoint].m_PointY);
                rect.UpdateRect(m_pPoints[iPoint + 1].m_PointX, m_pPoints[iPoint + 1].m_PointY);
                iPoint += 2;
            }
            if (iPoint == m_PointCount - 1 || m_pPoints[iPoint + 1].m_Flag == FXPT_MOVETO) {
                iStartPoint = iPoint - 1;
                iEndPoint = iPoint;
                bJoin = false;
            } else {
                iStartPoint = iPoint - 1;
                iMiddlePoint = iPoint;
                iEndPoint = iPoint + 1;
                bJoin = true;
            }
        }
        FX_FLOAT start_x = m_pPoints[iStartPoint].m_PointX;
        FX_FLOAT start_y = m_pPoints[iStartPoint].m_PointY;
        FX_FLOAT end_x = m_pPoints[iEndPoint].m_PointX;
        FX_FLOAT end_y = m_pPoints[iEndPoint].m_PointY;
        if (bJoin) {
            FX_FLOAT middle_x = m_pPoints[iMiddlePoint].m_PointX;
            FX_FLOAT middle_y = m_pPoints[iMiddlePoint].m_PointY;
            _UpdateLineJoinPoints(rect, start_x, start_y, middle_x, middle_y, end_x, end_y, half_width, miter_limit);
        } else {
            _UpdateLineEndPoints(rect, start_x, start_y, end_x, end_y, half_width);
        }
        iPoint ++;
    }
    return rect;
}
void CFX_PathData::Transform(const CFX_AffineMatrix* pMatrix)
{
    if (pMatrix == NULL) {
        return;
    }
    for (int i = 0; i < m_PointCount; i ++) {
        pMatrix->Transform(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY);
    }
}
bool CFX_PathData::GetZeroAreaPath(CFX_PathData& NewPath, CFX_AffineMatrix* pMatrix, bool&bThin, bool bAdjust) const
{
    if (m_PointCount < 3) {
        return false;
    }
    if (m_PointCount == 3 && (m_pPoints[0].m_Flag & FXPT_TYPE) == FXPT_MOVETO &&
            (m_pPoints[1].m_Flag & FXPT_TYPE) == FXPT_LINETO && (m_pPoints[2].m_Flag & FXPT_TYPE) == FXPT_LINETO
            && m_pPoints[0].m_PointX == m_pPoints[2].m_PointX && m_pPoints[0].m_PointY == m_pPoints[2].m_PointY) {
        NewPath.AddPointCount(2);
        if (bAdjust) {
            if (pMatrix) {
                FX_FLOAT x = m_pPoints[0].m_PointX, y = m_pPoints[0].m_PointY;
                pMatrix->TransformPoint(x, y);
                x = (int)x + 0.5f;
                y = (int)y + 0.5f;
                NewPath.SetPoint(0, x, y, FXPT_MOVETO);
                x = m_pPoints[1].m_PointX, y = m_pPoints[1].m_PointY;
                pMatrix->TransformPoint(x, y);
                x = (int)x + 0.5f;
                y = (int)y + 0.5f;
                NewPath.SetPoint(1, x, y, FXPT_LINETO);
                pMatrix->SetIdentity();
            } else {
                FX_FLOAT x = (int)m_pPoints[0].m_PointX + 0.5f, y = (int)m_pPoints[0].m_PointY + 0.5f;
                NewPath.SetPoint(0, x, y, FXPT_MOVETO);
                x = (int)m_pPoints[1].m_PointX + 0.5f, y = (int)m_pPoints[1].m_PointY + 0.5f;
                NewPath.SetPoint(1, x, y, FXPT_LINETO);
            }
        } else {
            NewPath.SetPoint(0, m_pPoints[0].m_PointX, m_pPoints[0].m_PointY, FXPT_MOVETO);
            NewPath.SetPoint(1, m_pPoints[1].m_PointX, m_pPoints[1].m_PointY, FXPT_LINETO);
        }
        if (m_pPoints[0].m_PointX != m_pPoints[1].m_PointX && m_pPoints[0].m_PointY != m_pPoints[1].m_PointY) {
            bThin = true;
        }
        return true;
    }
    if (((m_PointCount > 3) && (m_PointCount % 2))) {
        int mid = m_PointCount / 2;
        bool bZeroArea = false;
        CFX_PathData t_path;
        for (int i = 0; i < mid; i++) {
            if (!(m_pPoints[mid - i - 1].m_PointX == m_pPoints[mid + i + 1].m_PointX
                    && m_pPoints[mid - i - 1].m_PointY == m_pPoints[mid + i + 1].m_PointY &&
                    ((m_pPoints[mid - i - 1].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO && (m_pPoints[mid + i + 1].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO))) {
                bZeroArea = true;
                break;
            }
            int new_count = t_path.GetPointCount();
            t_path.AddPointCount(2);
            t_path.SetPoint(new_count, m_pPoints[mid - i].m_PointX, m_pPoints[mid - i].m_PointY, FXPT_MOVETO);
            t_path.SetPoint(new_count + 1, m_pPoints[mid - i - 1].m_PointX, m_pPoints[mid - i - 1].m_PointY, FXPT_LINETO);
        }
        if (!bZeroArea) {
            NewPath.Append(&t_path, NULL);
            bThin = true;
            return true;
        }
    }
    int stratPoint = 0;
    int next = 0, i;
    for (i = 0; i < m_PointCount; i++) {
        int point_type = m_pPoints[i].m_Flag & FXPT_TYPE;
        if (point_type == FXPT_MOVETO) {
            stratPoint = i;
        } else if (point_type == FXPT_LINETO) {
            next = (i + 1 - stratPoint) % (m_PointCount - stratPoint) + stratPoint;
            if ((m_pPoints[next].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO && (m_pPoints[next].m_Flag & FXPT_TYPE) != FXPT_MOVETO) {
                if((m_pPoints[i - 1].m_PointX == m_pPoints[i].m_PointX && m_pPoints[i].m_PointX == m_pPoints[next].m_PointX)
                        && ((m_pPoints[i].m_PointY - m_pPoints[i - 1].m_PointY) * (m_pPoints[i].m_PointY - m_pPoints[next].m_PointY) > 0)) {
                    int pre = i;
                    if (FXSYS_fabs(m_pPoints[i].m_PointY - m_pPoints[i - 1].m_PointY)
                            < FXSYS_fabs(m_pPoints[i].m_PointY - m_pPoints[next].m_PointY)) {
                        pre --;
                        next--;
                    }
                    int new_count = NewPath.GetPointCount();
                    NewPath.AddPointCount(2);
                    NewPath.SetPoint(new_count, m_pPoints[pre].m_PointX, m_pPoints[pre].m_PointY, FXPT_MOVETO);
                    NewPath.SetPoint(new_count + 1, m_pPoints[next].m_PointX, m_pPoints[next].m_PointY, FXPT_LINETO);
                } else if((m_pPoints[i - 1].m_PointY == m_pPoints[i].m_PointY && m_pPoints[i].m_PointY == m_pPoints[next].m_PointY)
                          && ((m_pPoints[i].m_PointX - m_pPoints[i - 1].m_PointX) * (m_pPoints[i].m_PointX - m_pPoints[next].m_PointX) > 0)) {
                    int pre = i;
                    if (FXSYS_fabs(m_pPoints[i].m_PointX - m_pPoints[i - 1].m_PointX)
                            < FXSYS_fabs(m_pPoints[i].m_PointX - m_pPoints[next].m_PointX)) {
                        pre --;
                        next--;
                    }
                    int new_count = NewPath.GetPointCount();
                    NewPath.AddPointCount(2);
                    NewPath.SetPoint(new_count, m_pPoints[pre].m_PointX, m_pPoints[pre].m_PointY, FXPT_MOVETO);
                    NewPath.SetPoint(new_count + 1, m_pPoints[next].m_PointX, m_pPoints[next].m_PointY, FXPT_LINETO);
                } else if ((m_pPoints[i - 1].m_Flag & FXPT_TYPE) == FXPT_MOVETO && (m_pPoints[next].m_Flag & FXPT_TYPE) == FXPT_LINETO &&
                           m_pPoints[i - 1].m_PointX == m_pPoints[next].m_PointX && m_pPoints[i - 1].m_PointY == m_pPoints[next].m_PointY
                           && m_pPoints[next].m_Flag & FXPT_CLOSEFIGURE) {
                    int new_count = NewPath.GetPointCount();
                    NewPath.AddPointCount(2);
                    NewPath.SetPoint(new_count, m_pPoints[i - 1].m_PointX, m_pPoints[i - 1].m_PointY, FXPT_MOVETO);
                    NewPath.SetPoint(new_count + 1, m_pPoints[i].m_PointX, m_pPoints[i].m_PointY, FXPT_LINETO);
                    bThin = true;
                }
            }
        } else if (point_type == FXPT_BEZIERTO) {
            i += 2;
            continue;
        }
    }
    if (m_PointCount > 3 && NewPath.GetPointCount()) {
        bThin = true;
    }
    if (NewPath.GetPointCount() == 0) {
        return false;
    }
    return true;
}
bool CFX_PathData::IsRect() const
{
    if (m_PointCount != 5 && m_PointCount != 4) {
        return false;
    }
    if ((m_PointCount == 5 && (m_pPoints[0].m_PointX != m_pPoints[4].m_PointX ||
                               m_pPoints[0].m_PointY != m_pPoints[4].m_PointY)) ||
            (m_pPoints[0].m_PointX == m_pPoints[2].m_PointX && m_pPoints[0].m_PointY == m_pPoints[2].m_PointY) ||
            (m_pPoints[1].m_PointX == m_pPoints[3].m_PointX && m_pPoints[1].m_PointY == m_pPoints[3].m_PointY)) {
        return false;
    }
    if (m_pPoints[0].m_PointX != m_pPoints[3].m_PointX && m_pPoints[0].m_PointY != m_pPoints[3].m_PointY) {
        return false;
    }
    for (int i = 1; i < 4; i ++) {
        if ((m_pPoints[i].m_Flag & FXPT_TYPE) != FXPT_LINETO) {
            return false;
        }
        if (m_pPoints[i].m_PointX != m_pPoints[i - 1].m_PointX && m_pPoints[i].m_PointY != m_pPoints[i - 1].m_PointY) {
            return false;
        }
    }
    return m_PointCount == 5 || (m_pPoints[3].m_Flag & FXPT_CLOSEFIGURE);
}
bool CFX_PathData::IsRect(const CFX_AffineMatrix* pMatrix, CFX_FloatRect* pRect) const
{
    if (pMatrix == NULL) {
        if (!IsRect()) {
            return false;
        }
        if (pRect) {
            pRect->left = m_pPoints[0].m_PointX;
            pRect->right = m_pPoints[2].m_PointX;
            pRect->bottom = m_pPoints[0].m_PointY;
            pRect->top = m_pPoints[2].m_PointY;
            pRect->Normalize();
        }
        return true;
    }
    if (m_PointCount != 5 && m_PointCount != 4) {
        return false;
    }
    if ((m_PointCount == 5 && (m_pPoints[0].m_PointX != m_pPoints[4].m_PointX || m_pPoints[0].m_PointY != m_pPoints[4].m_PointY)) ||
            (m_pPoints[1].m_PointX == m_pPoints[3].m_PointX && m_pPoints[1].m_PointY == m_pPoints[3].m_PointY)) {
        return false;
    }
    if (m_PointCount == 4 && m_pPoints[0].m_PointX != m_pPoints[3].m_PointX && m_pPoints[0].m_PointY != m_pPoints[3].m_PointY) {
        return false;
    }
    FX_FLOAT x[5], y[5];
    for (int i = 0; i < m_PointCount; i ++) {
        pMatrix->Transform(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY, x[i], y[i]);
        if (i) {
            if ((m_pPoints[i].m_Flag & FXPT_TYPE) != FXPT_LINETO) {
                return false;
            }
            if (x[i] != x[i - 1] && y[i] != y[i - 1]) {
                return false;
            }
        }
    }
    if (pRect) {
        pRect->left = x[0];
        pRect->right = x[2];
        pRect->bottom = y[0];
        pRect->top = y[2];
        pRect->Normalize();
    }
    return true;
}
void CFX_PathData::Copy(const CFX_PathData &src)
{
    SetPointCount(src.m_PointCount);
    FXSYS_memcpy(m_pPoints, src.m_pPoints, sizeof(FX_PATHPOINT) * m_PointCount);
}
CFX_GraphStateData::CFX_GraphStateData()
{
    m_LineCap = LineCapButt;
    m_DashCount = 0;
    m_DashArray = NULL;
    m_DashPhase = 0;
    m_LineJoin = LineJoinMiter;
    m_MiterLimit = 10 * 1.0f;
    m_LineWidth = 1.0f;
}
CFX_GraphStateData::CFX_GraphStateData(const CFX_GraphStateData& src)
{
    m_DashArray = NULL;
    Copy(src);
}
void CFX_GraphStateData::Copy(const CFX_GraphStateData& src)
{
    m_LineCap = src.m_LineCap;
    m_DashCount = src.m_DashCount;
    if (m_DashArray) {
        FX_Free(m_DashArray);
    }
    m_DashArray = NULL;
    m_DashPhase = src.m_DashPhase;
    m_LineJoin = src.m_LineJoin;
    m_MiterLimit = src.m_MiterLimit;
    m_LineWidth = src.m_LineWidth;
    if (m_DashCount) {
        m_DashArray = FX_Alloc(FX_FLOAT, m_DashCount);
        FXSYS_memcpy(m_DashArray, src.m_DashArray, m_DashCount * sizeof(FX_FLOAT));
    }
}
CFX_GraphStateData::~CFX_GraphStateData()
{
    if (m_DashArray) {
        FX_Free(m_DashArray);
    }
}
void CFX_GraphStateData::SetDashCount(int count)
{
    if (m_DashArray) {
        FX_Free(m_DashArray);
    }
    m_DashArray = NULL;
    m_DashCount = count;
    if (count == 0) {
        return;
    }
    m_DashArray = FX_Alloc(FX_FLOAT, count);
}
