Exemplo n.º 1
0
 void VisitExpr( const  SymbolicExpr& v) 
         { switch (v.GetOpType()) { 
            case SYMOP_MULTIPLY:
            case SYMOP_PLUS:
                  Default0(); break;
            case SYMOP_MIN:
            case SYMOP_MAX:
                  Default1(v1,v2);
                  if (result == REL_UNKNOWN)
                     result = (index == 1)? SelectCompare(v1,v,GetFunc())(v2)
                                 : Reverse(SelectCompare(v2,v,GetFunc())(v1)); 
                     break;
            default: 
                  assert(false);
           }  
         }
// ==================== Test Code ====================
ListNode* Test(char* testName, ListNode* pHead, unsigned int k)
{
    if(testName != NULL)
        printf("====%s begins: ====\n", testName);

    printf("The original list is: ");
    PrintList(pHead);
    
    printf("The reversed list is: ");
    ListNode* pReversedHead = Reverse(pHead, k);
    PrintList(pReversedHead);

    printf("\n\n");

    return pReversedHead;
}
Exemplo n.º 3
0
int main(int argc, const char *argv[])
{
    char array[100] = "I am a student";
    char *pbegin, *pend;
    char *pdate;
    pbegin = pend = array;

    Reverse(pbegin, pend);
    printf("Now, the string is :\n");
    printf("%s\n", array);
    pdate = array;
    Reverse_sentense(pdate);
    
    printf("%s\n", array);
    return 0;
}
Exemplo n.º 4
0
Arquivo: main.cpp Projeto: mboghiu/try
int main()
{
    AreEqual("dcba", Reverse("abcd"));
    AreEqual("cba", Reverse("abc"));
    AreEqual("aA", Reverse("Aa"));
    AreEqual("airaM", Reverse("Maria"));
    AreEqual("xelA", Reverse("Alex"));
    AreEqual("", Reverse(""));

    return 0;
}
Exemplo n.º 5
0
int main() {
	struct Node* head; // local variable
	int n, i, x;

	printf("Enter the number of elements in the list> ");
	scanf("%d", &n);

	for(i = 0; i < n; i++) {
		printf("\nEnter element %d> ", i + 1);
		scanf("%d", &x);
		head = Insert(head, x);
	}
	Print(head);
	head = Reverse(head);
	Print(head);
return 0;
}
Exemplo n.º 6
0
int main(){
	int i;
	Node * sFirst=NULL;
	Node * sHead=sFirst;
	for (i = 0; i < 9; ++i)
	{
		sFirst=Insert(i,sFirst);
	}
	printf("Before Reversing;\n");
	Myprint(sFirst);
	printf("After Reversing;\n");
	sFirst=Reverse(sFirst,NULL);
	Myprint(sFirst);



}
void ReverseSentence (char* str) {
    if (NULL == str || *str == 0) {
        return;
    }
    char* pBegin = str;
    char* pEnd = str;

    while (*pBegin != '\0') {
        if (*pBegin == ' ') {
            ++pBegin, ++pEnd;
        } else if (*pEnd == ' ' || *pEnd == '\0') {
            Reverse(pBegin, pEnd - 1);
            pBegin = pEnd;
        } else {
            ++pEnd;
        }
    }
}
Exemplo n.º 8
0
int main()
{
  List L = Create();
  ElementType e;

  e = 3;
  InsertAtHead(e, L);
  e = 2;
  InsertAtHead(e, L);
  e = 1;
  InsertAtHead(e, L);

  PrintList(L);
  L = Reverse(L);
  PrintList(L);

  return 0;
}
Exemplo n.º 9
0
void itoa(int n,char s[],int b)
{
	void Reverse(char s[]);
	int i,sign;
	sign=n;
	i=0;
	do
	{
		s[i++]=abs(n%10)+'0';
	}
	while((n/=10)!=0);
	if(sign<0)
		s[i++]='-';
	while(i<b)
		s[i++]=' ';
	s[i]='\0';
	Reverse(s);
}
Exemplo n.º 10
0
void RelayForwarder::IncomingData(const Request &notification)
{
    QVariantHash msg = notification.GetData().toHash();

    Id destination = Id(msg.value("to").toString());
    if(destination == Id::Zero()) {
        qWarning() << "Received a forwarded message without a destination.";
        return;
    }

    QStringList been = msg.value("been").toStringList();
    if(destination == _local_id) {
        if(been.size() == 0) {
            qWarning() << "Received a forwarded message without any history.";
            return;
        }

        Id source = Id(been[0]);
        if(source == Id::Zero()) {
            qWarning() << "Received a forwarded message without a valid source.";
        }

        QSharedPointer<ForwardingSender> *psender = _cache.take(source);
        if(!psender || (*psender)->GetReverse().isEmpty()) {
            if(psender) {
                delete psender;
            }
            psender = new QSharedPointer<ForwardingSender>(
                new ForwardingSender(GetSharedPointer(), _local_id, source, been));
        }

        QSharedPointer<ForwardingSender> sender(*psender);
        _cache.insert(source, psender);

        _rpc->HandleData(sender, msg.value("data").toByteArray());
        return;
    }

    QStringList reverse = msg.value("reverse").toStringList();
    QByteArray data = msg.value("data").toByteArray();
    if(reverse.isEmpty() || !Reverse(destination, data, been, reverse)) {
        Forward(destination, data, been);
    }
}
Exemplo n.º 11
0
void FFT1DOnce(long direction, long M, long N, double *u, double *x)
{
  long j; 
  long k; 
  long q; 
  long L; 
  long r; 
  long Lstar;
  double *u1; 
  double *x1; 
  double *x2;
  double omega_r; 
  double omega_c; 
  double tau_r; 
  double tau_c; 
  double x_r; 
  double x_c;

  Reverse(N, M, x);

  for (q=1; q<=M; q++) {
    L = 1<<q; r = N/L; Lstar = L/2;
    u1 = &u[2*(Lstar-1)];
    for (k=0; k<r; k++) {
      x1 = &x[2*(k*L)];
      x2 = &x[2*(k*L+Lstar)];
      for (j=0; j<Lstar; j++) {
	omega_r = u1[2*j]; 
        omega_c = direction*u1[2*j+1];
	x_r = x2[2*j]; 
        x_c = x2[2*j+1];
	tau_r = omega_r*x_r - omega_c*x_c;
	tau_c = omega_r*x_c + omega_c*x_r;
	x_r = x1[2*j]; 
        x_c = x1[2*j+1];
	x2[2*j] = x_r - tau_r;
	x2[2*j+1] = x_c - tau_c;
	x1[2*j] = x_r + tau_r;
	x1[2*j+1] = x_c + tau_c;
      }
    }
  }
}
int main()
{
	int i,n;
	char s[80],key[12],encrypt[80];              //输入串,密钥,加密后的串
	scanf("%s",key);
	getchar();                                            //吃掉输入密钥后的那个回车
	GeneAlphabet();                                  //产生字母表
	Reverse(key);                                       //将密钥key反转
	GetCharMap(key);                               //得到字母表的加密字符的对应表
	while(1)
	{
		gets(s);                                            //得到每行要加密的串
		if(strcmp(s,"#") == 0) break;            //如果输入#号则终止程序
		strcpy(encrypt,"");                            //将加密后的串先清空
		Encrypt(s,key,encrypt);                     //加密
		puts(encrypt);                                  //输出
	}
	return 0;
}
Exemplo n.º 13
0
void Reverse (Stack *L) 
{
    assert(L != NULL); //precondition for empty list
    
    StackNode *head, *remainder;
    Stack tempRest; //temporary list for recursion function
    
    head = L->first;
    remainder = head->next; //rest of list to be reversed
    if (remainder == NULL)
        return;
    tempRest.first = remainder;
    
    Reverse(&tempRest); //calls itself with remainder of list
    
    head->next->next = head;
    head->next = NULL;    
    L->first = tempRest.first; //attaches head
}
Exemplo n.º 14
0
int main()
{
//	freopen("1.in","r",stdin);
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
		scanf("%d",a+i);
	a[0]=a[n+1]=INF;
	root=build(0,n+2);
	root->p=null;
	scanf("%d",&m);
	while(m--)
	{
		int x,y,k;
		char s[20];
		scanf("%s",s);
		switch(s[0])
		{
			case 'A':scanf("%d%d%d",&x,&y,&k);
					 Add(x,y,k);
					 break;
			case 'I':scanf("%d%d",&x,&k);
					 Insert(x,k);
					 break;
			case 'D':scanf("%d",&x);
					 Delete(x);
					 break;
			case 'M':scanf("%d%d",&x,&y);
					 printf("%d\n",Min(x,y));
					 break;
			case 'R':if(s[3]=='E')
					 {
					 	scanf("%d%d",&x,&y);
						Reverse(x,y);
					 }
					 else
					 {
					 	scanf("%d%d%d",&x,&y,&k);
						Revolve(x,y,k);
					 }
		}
	}
	return 0;
}
Exemplo n.º 15
0
struct ListNode* swapPairs(struct ListNode* head) {
    
    if(!head || head->next == NULL)
    {
        return head;
    }
    
    struct ListNode* rest;
    struct ListNode* last;
    
    rest = head->next->next;
    
    last = Reverse(&head);
    
    last->next = swapPairs(rest);
    
    return head;
    
}
Exemplo n.º 16
0
bool Permutations::NextPermutation()
{
    if (n < 2)
        return false;
    qint8 pos = /*pos =*/ n - 2;
    while (pos >= 0)
    {
        if (st[pos] < n - 1 - pos)
        {
            Reverse(v, pos + 1);
            for (quint8 i = pos + 1; i < n; )
                st[i++] = 0;
            st[pos]++;
            Swap(v[pos], v[pos + st[pos]]);
            return true;
        }
        pos--;
    }
    return false;
}
Exemplo n.º 17
0
struct node* Reverse (struct node *current, struct node *parent){
  if (current == NULL)
    return NULL;
  else if (current->NEXT == NULL){
    root = current;
    current->NEXT = parent;
    if (parent != NULL)
      return parent;
    else
      return root;
  }
  else {
    current = Reverse (current->NEXT, current);
    current->NEXT = parent;
  if (parent == NULL)
    return root;
  else
    return (parent);
  }
}
Exemplo n.º 18
0
int main()
{
    Node *head = NULL;

    head = add_node(head, 1);
    head = add_node(head, 2);
    head = add_node(head, 3);
    head = add_node(head, 4);
    head = add_node(head, 5);
    head = add_node(head, 6);
    head = add_node(head, 7);

    print_list(head);

    Node *reversed_list = Reverse(head);

    print_list(reversed_list);

    return 0;
}
Exemplo n.º 19
0
void BuildAstTreeDepGraph :: TranslateCtrlDeps()
{
  const GraphAccessInterface* g = graph->Access();
  for (StmtStackType::Iterator p(stmtNodes); !p.ReachEnd(); ++p) {
    StmtNodeInfo &info = *p;
    GraphAccessInterface::Node *n1 = info.node;
    for (GraphAccessInterface::EdgeIterator p1 = g->GetNodeEdgeIterator(n1, GraphAccess::EdgeIn);
         !p1.ReachEnd(); ++p1) {
       GraphAccessInterface::Edge *e1 = p1.Current();
       DepInfoConstIterator depIter1 = 
              graph->GetDepInfoIteratorImpl(e1, DEPTYPE_CTRL);
       if (depIter1.ReachEnd())
           continue;
       GraphAccessInterface::Node *ctrl = g->GetEdgeEndPoint(e1, GraphAccess::EdgeOut);
       DepInfo cd = depIter1.Current();
       DepInfo cd1 = Reverse( cd );
       GraphAccessInterface::EdgeIterator p2 = g->GetNodeEdgeIterator(ctrl,GraphAccess::EdgeOut);
       for ( ; !p2.ReachEnd(); ++p2) {
         GraphAccessInterface::Edge *e2 = p2.Current();
         GraphAccessInterface::Node *n2 = g->GetEdgeEndPoint(e2, GraphAccess::EdgeIn);
         for (DepInfoConstIterator depIter2 = 
                             graph->GetDepInfoIteratorImpl(e2, DEPTYPE_DATA);
              ! depIter2.ReachEnd(); depIter2++) {
             DepInfo tmpd = cd1 * depIter2.Current();
             graph->CreateEdgeImpl(n1,n2,tmpd);
         }
       }
       for (p2 = g->GetNodeEdgeIterator(ctrl, GraphAccess::EdgeIn);
            !p2.ReachEnd(); ++p2) {
         GraphAccessInterface::Edge *e2 = p2.Current();
         GraphAccessInterface::Node *n2 = g->GetEdgeEndPoint(e2, GraphAccess::EdgeOut);
         for (DepInfoConstIterator depIter2 = 
                     graph->GetDepInfoIteratorImpl(e2, DEPTYPE_DATA);
              ! depIter2.ReachEnd(); depIter2++)  {
             DepInfo tmpd = depIter2.Current() * cd;
             graph->CreateEdgeImpl(n2,n1, tmpd);
         }
       }
    }
  }
}
Exemplo n.º 20
0
int main()
{
  while(scanf("%d%d",&n,&q) == 2)
  {
    Init();
    char op[20];
    int x,y,z;
    while(q--)
    {
      scanf("%s",op);
      if(strcmp(op,"INSERT") == 0)
      {
        scanf("%d%d",&x,&y);
        Insert(x,y);
      }
      else if(strcmp(op,"DELETE") == 0)
      {
        scanf("%d%d",&x,&y);
        Delete(x,y);
      }
      else if(strcmp(op,"MAKE-SAME") == 0)
      {
        scanf("%d%d%d",&x,&y,&z);
        Make_Same(x,y,z);
      }
      else if(strcmp(op,"REVERSE") == 0)
      {
        scanf("%d%d",&x,&y);
        Reverse(x,y);
      }
      else if(strcmp(op,"GET-SUM") == 0)
      {
        scanf("%d%d",&x,&y);
        printf("%d\n",Get_Sum(x,y));
      }
      else if(strcmp(op,"MAX-SUM") == 0)
        printf("%d\n",Get_MaxSum(1,size[root]-2));
    }
  }
  return 0;
}
Exemplo n.º 21
0
	ListNode *reverseBetween(ListNode *head, int m, int n)
	{
		if (m == n)
			return head;
		ListNode dummy(0);
		dummy.next = head;
		ListNode * first = &dummy;
		for (int i = 1; i < m; i++)
			first = first->next;
		ListNode * last = first;
		for (int i = 1; i <= n - m + 2; i++)
		{
			last = last->next;
			if (last == NULL)
				break;
		}
		ListNode * newSecond = first->next;
		ListNode *newFirst = Reverse(first->next, last);
		first->next = newFirst;
		newSecond->next = last;
		return dummy.next;
	}
Exemplo n.º 22
0
 virtual void VisitExpr( const  SymbolicExpr& e2) 
          {  SymOpType t1 = e1.GetOpType(), t2 = e2.GetOpType(); 
             unsigned c1 = e1.NumOfOpds(), c2 = e2.NumOfOpds();
             if (t2 == SYMOP_MULTIPLY || t2 == SYMOP_PLUS )
                    Default0(); 
             else if (t1 == t2) {
                 Matrix<CompareRel> rel(c1,c2,0);
                 ExprTermCompare(e1,e2,rel,GetFunc()); 
                 MatchCompare(rel,c2);
             }
             else if (t1 == SYMOP_MIN && t2 == SYMOP_MAX) {
                size_t le = 0, lt = 0, ge = 0, gt = 0;
                SymbolicExpr::OpdIterator p2 = e2.GetOpdIterator();
                for ( ; !p2.ReachEnd(); ++p2) {
                    CompareRel r = CompareValHelp(v1, e2.Term2Val(p2.Current()),GetFunc());
                    if (CountLE(r)) 
                        ++le; 
                    if (CountGE(r)) 
                        ++ge;
                    if (CountLT(r))
                        ++lt;
                    if (CountGT(r))
                        ++gt;
                } 
                if (gt == e2.NumOfOpds()) 
                     result = REL_GT;
                else if (lt > 0)
                      result = REL_LT;
                else if (ge == e2.NumOfOpds()) 
                     result = REL_GE;
                else if (le > 0)
                      result = REL_LE;
             } 
             else if (t1 == SYMOP_MAX && t2 == SYMOP_MIN) 
                 result = Reverse( SelectCompare(v2, e2, GetFunc())(v1) );
             else
                 assert(false);
          }
Exemplo n.º 23
0
Arquivo: Lab5.c Projeto: Yuwain/School
int main()
{
	//Declares a char array Buffer1 and initializes to "This is the first buffer"
	char Buffer1[] = {'T', 'h', 'i', 's', ' ', 'i', 's', ' ', 't', 'h',
			 		  'e', ' ', 'f', 'i', 'r', 's', 't', ' ', 'b', 'u', 
			  	  	  'f', 'f', 'e', 'r', '\0'};
	
	//Declares a char array Buffer2 and initializes to "This is the second buffer"
	char Buffer2[] = "This is the second buffer";

	//Declares a char array Buffer3
	char Buffer3[80]; 
	char Parse[] = "hello world, how are you today.";
	char* pBuffer;
	int a, b = 0;

	pBuffer = Buffer3;

	scanf("%[^\n]s", Buffer3);
	printf("\nBuffer 1: %s\nBuffer 2: %s\nBuffer 3: ", Buffer1, Buffer2);

	//Prints contents of Buffer3 via while loop 
	while (*pBuffer != '\0')
	{
		printf("%c", *pBuffer);
		pBuffer++;
	}
	printf("\n");

	pBuffer = Buffer3;
	a = (int)strlen(pBuffer) - 1;

	Reverse(pBuffer);
	RecursiveReverse(pBuffer, a, b);
	ParseSentence(Parse);

	return 0;
}
Exemplo n.º 24
0
int wc_Des3_SetKey(Des3* des, const byte* key, const byte* iv, int dir)
{
    int ret;

#ifdef HAVE_CAVIUM
    if (des->magic == WOLFSSL_3DES_CAVIUM_MAGIC)
        return wc_Des3_CaviumSetKey(des, key, iv);
#endif

    ret = DesSetKey(key + (dir == DES_ENCRYPTION ? 0:16), dir, des->key[0]);
    if (ret != 0)
        return ret;

    ret = DesSetKey(key + 8, Reverse(dir), des->key[1]);
    if (ret != 0)
        return ret;

    ret = DesSetKey(key + (dir == DES_DECRYPTION ? 0:16), dir, des->key[2]);
    if (ret != 0)
        return ret;

    return wc_Des3_SetIV(des, iv);
}
Exemplo n.º 25
0
// duplicate for right now
void ac::ReverseFrameBlend(cv::Mat &frame) {
    cv::Mat frame_copy = frame.clone();
    Reverse(frame_copy);
    MedianBlend(frame_copy);
    int index = 0;
    for(int z = 0; z < frame.rows; ++z) {
        for(int i = 0; i < frame.cols; ++i) {
            cv::Vec3b &pixel = frame.at<cv::Vec3b>(z, i);
            cv::Vec3b pix = frame_copy.at<cv::Vec3b>(z, i);
            switch(index) {
                case 0:
                    break;
                case 1:
                    pixel = pix;
                    break;
            }
            ++index;
            if(index > 1)
                index = 0;
        }
    }
    AddInvert(frame);
}
Exemplo n.º 26
0
int _tmain(int argc, _TCHAR* argv[])
{
	LinkNode **pHead;
	LinkNode *head = new LinkNode;
	LinkNode *tail = head;
	head->value = 0;
	head->next = NULL;
	pHead = &head;

	for (int i=1;i<10;i++)
	{
		LinkNode *node =  new LinkNode;
		node->value = i;
		node->next = NULL;
		tail->next = node;
		tail =  node;
	}
	
	print(pHead);
	LinkNode *node = *pHead;
	srand((unsigned int)time(NULL));
	int index = rand()%10;
	std::cout << "删除第"<<index<<"个节点" <<std::endl;
	for (int i=0;i<index;i++)
	{
		node = node->next;
	}
	DeleteNode(pHead,node);
	print(pHead);
	std::cout << "Reverse LinkList" <<std::endl;
	//(*pHead)->next=NULL;
	head = Reverse(*pHead);
	pHead = &head;
	print(pHead);

	return 0;
}
Exemplo n.º 27
0
void CBezierPatch::BuildBezierPoints_Sub(int nStartOfLongest, bool bFirst)
{
    int a[3], b[3];
    switch (nStartOfLongest)
    {
    case 0:
    {
        a[0] = a[1] = a[2] = 3;
        b[0] = b[1] = b[2] = 0;
        break;
    }
    case 1:
    {
        a[0] = a[1] = a[2] = 0;
        b[0] = b[1] = b[2] = 3;
        break;
    }
    case 2:
    {
        a[0] = a[1] = a[2] = 0;
        b[0] = b[1] = b[2] = 0;
        break;
    }
    }

    int pos1 = (2 + nStartOfLongest)%3;

    CUtils::GetNextPoint(a[1], b[1], nStartOfLongest, -3);
    CUtils::GetNextPoint(a[2], b[2], pos1, 3);

    CBezierPatch& ParentPatch = *m_pParent_SubTriangle->GetParentSubTriangle()->GetBezierPatch();

    //003
    Point(a[2], b[2]) = ParentPatch.GetPoint(a[2],b[2]);
    //    qDebug() << a[2] << b[2] << (bFirst?"Left":"Right");

    std::vector<int> c;
    std::vector<int> d;
    CVector3DF t[4];
    //102 &012
    c.assign(2, a[2]);
    d.assign(2, b[2]);
    CUtils::GetNextPoint(c[0], d[0], (2 + nStartOfLongest)%3, -1);
    CUtils::GetNextPoint(c[1], d[1], (1 + nStartOfLongest)%3, 1);

    if (!bFirst)
    {
        Reverse(c, d);
    }

    //    qDebug() << c[0] << d[0] << "," << c[1] << d[1];

    t[0] = ParentPatch.GetPoint(c[0],d[0]);
    t[1] = ParentPatch.GetPoint(c[1],d[1]);
    Point(c[0], d[0]) = t[0];
    Point(c[1], d[1]) = (t[0] + t[1]) * 0.5f;

    //201 & 111 & 021
    c.clear();
    d.clear();
    c.assign(3, a[2]);
    d.assign(3, b[2]);
    CUtils::GetNextPoint(c[0], d[0], (2 + nStartOfLongest)%3, -2);
    c[1] = 1; d[1] = 1;
    CUtils::GetNextPoint(c[2], d[2], (1 + nStartOfLongest)%3, 2);

    if (!bFirst)
    {
        Reverse(c, d);
    }

    //    qDebug() << c[0] << d[0] << "," << c[1] << d[1] << "," << c[2] << d[2];

    t[0] = ParentPatch.GetPoint(c[0],d[0]);
    t[1] = ParentPatch.GetPoint(c[1],d[1]);
    t[2] = ParentPatch.GetPoint(c[2],d[2]);
    Point(c[0], d[0]) = t[0];
    t[0] = (t[0]+t[1]) * 0.5f;
    t[1] = (t[1]+t[2]) * 0.5f;
    Point(c[1], d[1]) = t[0];
    t[0] = (t[0]+t[1]) * 0.5f;
    Point(c[2], d[2]) = t[0];

    //030 & 210 & 120 & 030
    c.clear();
    d.clear();
    c.assign(4, a[0]);
    d.assign(4, b[0]);
    CUtils::GetNextPoint(c[1], d[1], nStartOfLongest, -1);
    CUtils::GetNextPoint(c[2], d[2], nStartOfLongest, -2);
    c[3] = a[1]; d[3]= b[1];

    if (!bFirst)
    {
        Reverse(c, d);
    }

    //    qDebug() << c[0] << d[0] << "," << c[1] << d[1] << "," << c[2] << d[2] << "," << c[3] << d[3];

    t[0] = ParentPatch.GetPoint(c[0],d[0]);
    t[1] = ParentPatch.GetPoint(c[1],d[1]);
    t[2] = ParentPatch.GetPoint(c[2],d[2]);
    t[3] = ParentPatch.GetPoint(c[3],d[3]);

    Point(c[0], d[0]) = t[0];
    t[0] = (t[0]+t[1]) * 0.5f;
    t[1] = (t[1]+t[2]) * 0.5f;
    t[2] = (t[2] + ParentPatch.GetPoint(c[3],d[3])) * 0.5f;
    Point(c[1], d[1]) = t[0];
    t[0] = (t[0]+t[1]) * 0.5f;
    t[1] = (t[1]+t[2]) * 0.5f;
    Point(c[2], d[2]) = t[0];
    t[0] = (t[0]+t[1]) * 0.5f;
    Point(c[3], d[3]) = t[0];
    BuildBezierPoints_Internal();
}
Exemplo n.º 28
0
void CRay::Flip()
{
	m_oPos += m_oDir;
	Reverse();
}
Exemplo n.º 29
0
void fun3(char* str, int num, int length)
{
	Reverse(str, str+num-1);
	Reverse(str+num, str+length-1);
	Reverse(str, str+length-1);
}
Exemplo n.º 30
0
/*
 *  Load texture from BMP file
 */
unsigned int Texture::LoadTexBMP(const char* file) {
   unsigned int   texture;    // Texture name
   FILE*          f;          // File pointer
   unsigned short magic;      // Image magic
   unsigned int   dx,dy,size; // Image dimensions
   unsigned short nbp,bpp;    // Planes and bits per pixel
   unsigned char* image;      // Image data
   unsigned int   k;          // Counter

   //  Open file
   f = fopen(file,"rb");
   if (!f) Fatal("Cannot open file %s\n",file);
   //  Check image magic
   if (fread(&magic,2,1,f)!=1) Fatal("Cannot read magic from %s\n",file);
   if (magic!=0x4D42 && magic!=0x424D) Fatal("Image magic not BMP in %s\n",file);
   //  Seek to and read header
   if (fseek(f,16,SEEK_CUR) || fread(&dx ,4,1,f)!=1 || fread(&dy ,4,1,f)!=1 ||
       fread(&nbp,2,1,f)!=1 || fread(&bpp,2,1,f)!=1 || fread(&k,4,1,f)!=1)
     Fatal("Cannot read header from %s\n",file);
   //  Reverse bytes on big endian hardware (detected by backwards magic)
   if (magic==0x424D)
   {
      Reverse(&dx,4);
      Reverse(&dy,4);
      Reverse(&nbp,2);
      Reverse(&bpp,2);
      Reverse(&k,4);
   }
   //  Check image parameters
   if (dx<1 || dx>65536) Fatal("%s image width out of range: %d\n",file,dx);
   if (dy<1 || dy>65536) Fatal("%s image height out of range: %d\n",file,dy);
   if (nbp!=1)  Fatal("%s bit planes is not 1: %d\n",file,nbp);
   if (bpp!=24) Fatal("%s bits per pixel is not 24: %d\n",file,bpp);
   if (k!=0)    Fatal("%s compressed files not supported\n",file);
#ifndef GL_VERSION_2_0
   //  OpenGL 2.0 lifts the restriction that texture size must be a power of two
 /*  for (k=1;k<dx;k*=2);
   if (k!=dx) Fatal("%s image width not a power of two: %d\n",file,dx);
   for (k=1;k<dy;k*=2);
   if (k!=dy) Fatal("%s image height not a power of two: %d\n",file,dy);*/
#endif

   //  Allocate image memory
   size = 3*dx*dy;
   image = (unsigned char*) malloc(size);
   if (!image) Fatal("Cannot allocate %d bytes of memory for image %s\n",size,file);
   //  Seek to and read image
   if (fseek(f,20,SEEK_CUR) || fread(image,size,1,f)!=1) Fatal("Error reading data from image %s\n",file);
   fclose(f);
   //  Reverse colors (BGR -> RGB)
   for (k=0;k<size;k+=3)
   {
      unsigned char temp = image[k];
      image[k]   = image[k+2];
      image[k+2] = temp;
   }

   //  Sanity check
   ErrCheck("LoadTexBMP");
   //  Generate 2D texture
   glGenTextures(1,&texture);
   glBindTexture(GL_TEXTURE_2D,texture);
   //  Copy image
   glTexImage2D(GL_TEXTURE_2D,0,3,dx,dy,0,GL_RGB,GL_UNSIGNED_BYTE,image);
   if (glGetError()) Fatal("Error in glTexImage2D %s %dx%d\n",file,dx,dy);
   //  Scale linearly when image size doesn't match
   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
   //  Free image memory
   free(image);
   //  Return texture name
   return texture;
}